diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..01ffdf898 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Sphinx build artefacts +*/.buildinfo +*/.doctrees/ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/README.md b/README.md new file mode 100644 index 000000000..23f650013 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# WEC-Sim Documentation + +This branch is auto-generated by GitHub Actions upon pushes to the main or +dev branches. See the README.md file in the main branch for instructions +regarding building the docs locally. diff --git a/dev/_images/AdjustableRodHPTO.png b/dev/_images/AdjustableRodHPTO.png new file mode 100644 index 000000000..0eb091104 Binary files /dev/null and b/dev/_images/AdjustableRodHPTO.png differ diff --git a/dev/_images/DirectDrivePorts.png b/dev/_images/DirectDrivePorts.png new file mode 100644 index 000000000..6f71673be Binary files /dev/null and b/dev/_images/DirectDrivePorts.png differ diff --git a/dev/_images/GeneratorSpeedControl.png b/dev/_images/GeneratorSpeedControl.png new file mode 100644 index 000000000..82047be13 Binary files /dev/null and b/dev/_images/GeneratorSpeedControl.png differ diff --git a/dev/_images/HYDPHYMODEL.PNG b/dev/_images/HYDPHYMODEL.PNG new file mode 100644 index 000000000..4517f4bea Binary files /dev/null and b/dev/_images/HYDPHYMODEL.PNG differ diff --git a/dev/_images/HorizontalVerticalOrbitalVelocity.jpg b/dev/_images/HorizontalVerticalOrbitalVelocity.jpg new file mode 100644 index 000000000..a2ffc5652 Binary files /dev/null and b/dev/_images/HorizontalVerticalOrbitalVelocity.jpg differ diff --git a/dev/_images/IMAGE_Aeroload_Control_Submodel.png b/dev/_images/IMAGE_Aeroload_Control_Submodel.png new file mode 100644 index 000000000..6a53fd442 Binary files /dev/null and b/dev/_images/IMAGE_Aeroload_Control_Submodel.png differ diff --git a/dev/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png b/dev/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png new file mode 100644 index 000000000..38ed9e9ec Binary files /dev/null and b/dev/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png differ diff --git a/dev/_images/IMAGE_Baseline_Torque_Law.png b/dev/_images/IMAGE_Baseline_Torque_Law.png new file mode 100644 index 000000000..199a373ca Binary files /dev/null and b/dev/_images/IMAGE_Baseline_Torque_Law.png differ diff --git a/dev/_images/IMAGE_Body_Block_example.png b/dev/_images/IMAGE_Body_Block_example.png new file mode 100644 index 000000000..21761b676 Binary files /dev/null and b/dev/_images/IMAGE_Body_Block_example.png differ diff --git a/dev/_images/IMAGE_LogoMOREnergyLab.png b/dev/_images/IMAGE_LogoMOREnergyLab.png new file mode 100644 index 000000000..3d91f7af3 Binary files /dev/null and b/dev/_images/IMAGE_LogoMOREnergyLab.png differ diff --git a/dev/_images/IMAGE_LogoPolitecnicodiTorino.jpg b/dev/_images/IMAGE_LogoPolitecnicodiTorino.jpg new file mode 100644 index 000000000..94cfe9c13 Binary files /dev/null and b/dev/_images/IMAGE_LogoPolitecnicodiTorino.jpg differ diff --git a/dev/_images/IMAGE_MOST_Library.png b/dev/_images/IMAGE_MOST_Library.png new file mode 100644 index 000000000..a7b6b9b24 Binary files /dev/null and b/dev/_images/IMAGE_MOST_Library.png differ diff --git a/dev/_images/IMAGE_ROSCO_Power_Curve.png b/dev/_images/IMAGE_ROSCO_Power_Curve.png new file mode 100644 index 000000000..be117c07d Binary files /dev/null and b/dev/_images/IMAGE_ROSCO_Power_Curve.png differ diff --git a/dev/_images/IMAGE_Results_Plots_example.png b/dev/_images/IMAGE_Results_Plots_example.png new file mode 100644 index 000000000..4f390b428 Binary files /dev/null and b/dev/_images/IMAGE_Results_Plots_example.png differ diff --git a/dev/_images/IMAGE_Steady_States.png b/dev/_images/IMAGE_Steady_States.png new file mode 100644 index 000000000..1faa8a7a1 Binary files /dev/null and b/dev/_images/IMAGE_Steady_States.png differ diff --git a/dev/_images/IMAGE_Volturn15MW_Simulink_example.png b/dev/_images/IMAGE_Volturn15MW_Simulink_example.png new file mode 100644 index 000000000..b33207eb8 Binary files /dev/null and b/dev/_images/IMAGE_Volturn15MW_Simulink_example.png differ diff --git a/dev/_images/IMAGE_blade_geom.png b/dev/_images/IMAGE_blade_geom.png new file mode 100644 index 000000000..5b881833d Binary files /dev/null and b/dev/_images/IMAGE_blade_geom.png differ diff --git a/dev/_images/IMAGE_geometry.png b/dev/_images/IMAGE_geometry.png new file mode 100644 index 000000000..e31f9652c Binary files /dev/null and b/dev/_images/IMAGE_geometry.png differ diff --git a/dev/_images/IMAGE_wind_Choice.png b/dev/_images/IMAGE_wind_Choice.png new file mode 100644 index 000000000..e719af5e0 Binary files /dev/null and b/dev/_images/IMAGE_wind_Choice.png differ diff --git a/dev/_images/IMAGE_workflow.png b/dev/_images/IMAGE_workflow.png new file mode 100644 index 000000000..90d00a615 Binary files /dev/null and b/dev/_images/IMAGE_workflow.png differ diff --git a/dev/_images/MECHANICALPTO.PNG b/dev/_images/MECHANICALPTO.PNG new file mode 100644 index 000000000..7a14f728f Binary files /dev/null and b/dev/_images/MECHANICALPTO.PNG differ diff --git a/dev/_images/MagAngleOrbitalVelocity.jpg b/dev/_images/MagAngleOrbitalVelocity.jpg new file mode 100644 index 000000000..8e7814ef1 Binary files /dev/null and b/dev/_images/MagAngleOrbitalVelocity.jpg differ diff --git a/dev/_images/MoorDyn_Graphic.png b/dev/_images/MoorDyn_Graphic.png new file mode 100644 index 000000000..7db247629 Binary files /dev/null and b/dev/_images/MoorDyn_Graphic.png differ diff --git a/dev/_images/MotionConversionLib.png b/dev/_images/MotionConversionLib.png new file mode 100644 index 000000000..75ca70259 Binary files /dev/null and b/dev/_images/MotionConversionLib.png differ diff --git a/dev/_images/Nwave.png b/dev/_images/Nwave.png new file mode 100644 index 000000000..52ef4f2b4 Binary files /dev/null and b/dev/_images/Nwave.png differ diff --git a/dev/_images/OSWECPHYMODEL.PNG b/dev/_images/OSWECPHYMODEL.PNG new file mode 100644 index 000000000..101bff6bf Binary files /dev/null and b/dev/_images/OSWECPHYMODEL.PNG differ diff --git a/dev/_images/OSWECPTOSimExample.png b/dev/_images/OSWECPTOSimExample.png new file mode 100644 index 000000000..300361cf0 Binary files /dev/null and b/dev/_images/OSWECPTOSimExample.png differ diff --git a/dev/_images/OSWEC_Geom.png b/dev/_images/OSWEC_Geom.png new file mode 100644 index 000000000..15a94455e Binary files /dev/null and b/dev/_images/OSWEC_Geom.png differ diff --git a/dev/_images/OSWEC_Model.png b/dev/_images/OSWEC_Model.png new file mode 100644 index 000000000..ed4b95a85 Binary files /dev/null and b/dev/_images/OSWEC_Model.png differ diff --git a/dev/_images/OSWEC_WECSim.JPG b/dev/_images/OSWEC_WECSim.JPG new file mode 100644 index 000000000..2a8ba5797 Binary files /dev/null and b/dev/_images/OSWEC_WECSim.JPG differ diff --git a/dev/_images/OSWEC_WECSim_Body.jpg b/dev/_images/OSWEC_WECSim_Body.jpg new file mode 100644 index 000000000..97165ee5e Binary files /dev/null and b/dev/_images/OSWEC_WECSim_Body.jpg differ diff --git a/dev/_images/OSWEC_WECSim_GUI.jpg b/dev/_images/OSWEC_WECSim_GUI.jpg new file mode 100644 index 000000000..084edab6c Binary files /dev/null and b/dev/_images/OSWEC_WECSim_GUI.jpg differ diff --git a/dev/_images/OSWEC_WECSim_GlobalRef.jpg b/dev/_images/OSWEC_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..5a354f2c3 Binary files /dev/null and b/dev/_images/OSWEC_WECSim_GlobalRef.jpg differ diff --git a/dev/_images/OSWEC_heaveForces.PNG b/dev/_images/OSWEC_heaveForces.PNG new file mode 100644 index 000000000..e7a120cc9 Binary files /dev/null and b/dev/_images/OSWEC_heaveForces.PNG differ diff --git a/dev/_images/OSWEC_pitchResponse.PNG b/dev/_images/OSWEC_pitchResponse.PNG new file mode 100644 index 000000000..0d9e8ea82 Binary files /dev/null and b/dev/_images/OSWEC_pitchResponse.PNG differ diff --git a/dev/_images/OSWEC_plotEta.PNG b/dev/_images/OSWEC_plotEta.PNG new file mode 100644 index 000000000..88abeda03 Binary files /dev/null and b/dev/_images/OSWEC_plotEta.PNG differ diff --git a/dev/_images/OSWEC_plotSpectrum.PNG b/dev/_images/OSWEC_plotSpectrum.PNG new file mode 100644 index 000000000..66bcf5191 Binary files /dev/null and b/dev/_images/OSWEC_plotSpectrum.PNG differ diff --git a/dev/_images/OSWEC_plotWaves.PNG b/dev/_images/OSWEC_plotWaves.PNG new file mode 100644 index 000000000..1e7bff1b4 Binary files /dev/null and b/dev/_images/OSWEC_plotWaves.PNG differ diff --git a/dev/_images/OSWEC_with_ptosim.png b/dev/_images/OSWEC_with_ptosim.png new file mode 100644 index 000000000..5a6c0d754 Binary files /dev/null and b/dev/_images/OSWEC_with_ptosim.png differ diff --git a/dev/_images/PTOSimBlock1.png b/dev/_images/PTOSimBlock1.png new file mode 100644 index 000000000..1393f9459 Binary files /dev/null and b/dev/_images/PTOSimBlock1.png differ diff --git a/dev/_images/PTOSimBlock1OSWEC.png b/dev/_images/PTOSimBlock1OSWEC.png new file mode 100644 index 000000000..5d1e82468 Binary files /dev/null and b/dev/_images/PTOSimBlock1OSWEC.png differ diff --git a/dev/_images/PTOSimClass_diagram.png b/dev/_images/PTOSimClass_diagram.png new file mode 100644 index 000000000..ecd60f274 Binary files /dev/null and b/dev/_images/PTOSimClass_diagram.png differ diff --git a/dev/_images/Physics.png b/dev/_images/Physics.png new file mode 100644 index 000000000..0100030f2 Binary files /dev/null and b/dev/_images/Physics.png differ diff --git a/dev/_images/RM3_Geom.png b/dev/_images/RM3_Geom.png new file mode 100644 index 000000000..1de3a4352 Binary files /dev/null and b/dev/_images/RM3_Geom.png differ diff --git a/dev/_images/RM3_WECSim.JPG b/dev/_images/RM3_WECSim.JPG new file mode 100644 index 000000000..ab64bcdf7 Binary files /dev/null and b/dev/_images/RM3_WECSim.JPG differ diff --git a/dev/_images/RM3_WECSim_Body.jpg b/dev/_images/RM3_WECSim_Body.jpg new file mode 100644 index 000000000..fae29f724 Binary files /dev/null and b/dev/_images/RM3_WECSim_Body.jpg differ diff --git a/dev/_images/RM3_WECSim_GUI.JPG b/dev/_images/RM3_WECSim_GUI.JPG new file mode 100644 index 000000000..547dfc6d5 Binary files /dev/null and b/dev/_images/RM3_WECSim_GUI.JPG differ diff --git a/dev/_images/RM3_WECSim_GlobalRef.jpg b/dev/_images/RM3_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..6e2d92413 Binary files /dev/null and b/dev/_images/RM3_WECSim_GlobalRef.jpg differ diff --git a/dev/_images/RM3_vizMarker.jpg b/dev/_images/RM3_vizMarker.jpg new file mode 100644 index 000000000..e5f3ef8d6 Binary files /dev/null and b/dev/_images/RM3_vizMarker.jpg differ diff --git a/dev/_images/RM3withPTOSimBlocks.png b/dev/_images/RM3withPTOSimBlocks.png new file mode 100644 index 000000000..e614f7fc4 Binary files /dev/null and b/dev/_images/RM3withPTOSimBlocks.png differ diff --git a/dev/_images/SliderandCrankMechanism.png b/dev/_images/SliderandCrankMechanism.png new file mode 100644 index 000000000..e40f9e69e Binary files /dev/null and b/dev/_images/SliderandCrankMechanism.png differ diff --git a/dev/_images/WEC-Sim_Lib.PNG b/dev/_images/WEC-Sim_Lib.PNG new file mode 100644 index 000000000..350ce8ccc Binary files /dev/null and b/dev/_images/WEC-Sim_Lib.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_PTOSim.png b/dev/_images/WEC-Sim_Lib_PTOSim.png new file mode 100644 index 000000000..90b75bb6f Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_PTOSim.png differ diff --git a/dev/_images/WEC-Sim_Lib_bodies.PNG b/dev/_images/WEC-Sim_Lib_bodies.PNG new file mode 100644 index 000000000..d97c1fdc5 Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_bodies.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_cable.PNG b/dev/_images/WEC-Sim_Lib_cable.PNG new file mode 100644 index 000000000..591a3aa1f Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_cable.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_constraints.PNG b/dev/_images/WEC-Sim_Lib_constraints.PNG new file mode 100644 index 000000000..beea4c8a4 Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_constraints.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_frames.PNG b/dev/_images/WEC-Sim_Lib_frames.PNG new file mode 100644 index 000000000..0ccd6a7bc Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_frames.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_mooring.PNG b/dev/_images/WEC-Sim_Lib_mooring.PNG new file mode 100644 index 000000000..95f9a9462 Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_mooring.PNG differ diff --git a/dev/_images/WEC-Sim_Lib_pto.PNG b/dev/_images/WEC-Sim_Lib_pto.PNG new file mode 100644 index 000000000..b430fe8a5 Binary files /dev/null and b/dev/_images/WEC-Sim_Lib_pto.PNG differ diff --git a/dev/_images/WEC-Sim_flowChart.png b/dev/_images/WEC-Sim_flowChart.png new file mode 100644 index 000000000..ed0b95b60 Binary files /dev/null and b/dev/_images/WEC-Sim_flowChart.png differ diff --git a/dev/_images/WECCCOMP_PTO_Extension.png b/dev/_images/WECCCOMP_PTO_Extension.png new file mode 100644 index 000000000..9ed26f563 Binary files /dev/null and b/dev/_images/WECCCOMP_PTO_Extension.png differ diff --git a/dev/_images/WECSimMoorDyn.png b/dev/_images/WECSimMoorDyn.png new file mode 100644 index 000000000..17d54eaeb Binary files /dev/null and b/dev/_images/WECSimMoorDyn.png differ diff --git a/dev/_images/b2b_comparison2.png b/dev/_images/b2b_comparison2.png new file mode 100644 index 000000000..e7abc408a Binary files /dev/null and b/dev/_images/b2b_comparison2.png differ diff --git a/dev/_images/body_diagram.PNG b/dev/_images/body_diagram.PNG new file mode 100644 index 000000000..4876850ac Binary files /dev/null and b/dev/_images/body_diagram.PNG differ diff --git a/dev/_images/cable_diagram.PNG b/dev/_images/cable_diagram.PNG new file mode 100644 index 000000000..aaf9d9c0d Binary files /dev/null and b/dev/_images/cable_diagram.PNG differ diff --git a/dev/_images/codeFeatures.png b/dev/_images/codeFeatures.png new file mode 100644 index 000000000..0624a15aa Binary files /dev/null and b/dev/_images/codeFeatures.png differ diff --git a/dev/_images/compPerformanceBetweenOption1Option2.png b/dev/_images/compPerformanceBetweenOption1Option2.png new file mode 100644 index 000000000..b78ec6d13 Binary files /dev/null and b/dev/_images/compPerformanceBetweenOption1Option2.png differ diff --git a/dev/_images/constraint_diagram.PNG b/dev/_images/constraint_diagram.PNG new file mode 100644 index 000000000..b5aa83cc1 Binary files /dev/null and b/dev/_images/constraint_diagram.PNG differ diff --git a/dev/_images/coordinateSystem.png b/dev/_images/coordinateSystem.png new file mode 100644 index 000000000..e0cf3018a Binary files /dev/null and b/dev/_images/coordinateSystem.png differ diff --git a/dev/_images/declutchTimeSweep.png b/dev/_images/declutchTimeSweep.png new file mode 100644 index 000000000..9fbd26f93 Binary files /dev/null and b/dev/_images/declutchTimeSweep.png differ diff --git a/dev/_images/declutching.png b/dev/_images/declutching.png new file mode 100644 index 000000000..106c326f6 Binary files /dev/null and b/dev/_images/declutching.png differ diff --git a/dev/_images/ellipsoid_iso_side.png b/dev/_images/ellipsoid_iso_side.png new file mode 100644 index 000000000..e9020ae58 Binary files /dev/null and b/dev/_images/ellipsoid_iso_side.png differ diff --git a/dev/_images/extractMaskVariables.PNG b/dev/_images/extractMaskVariables.PNG new file mode 100644 index 000000000..e1ec9d240 Binary files /dev/null and b/dev/_images/extractMaskVariables.PNG differ diff --git a/dev/_images/gbm_iso_side.png b/dev/_images/gbm_iso_side.png new file mode 100644 index 000000000..08615f7cf Binary files /dev/null and b/dev/_images/gbm_iso_side.png differ diff --git a/dev/_images/impedance.png b/dev/_images/impedance.png new file mode 100644 index 000000000..b196202b2 Binary files /dev/null and b/dev/_images/impedance.png differ diff --git a/dev/_images/latchTimeSweep.png b/dev/_images/latchTimeSweep.png new file mode 100644 index 000000000..35a97d5c9 Binary files /dev/null and b/dev/_images/latchTimeSweep.png differ diff --git a/dev/_images/latching.png b/dev/_images/latching.png new file mode 100644 index 000000000..0a14666c4 Binary files /dev/null and b/dev/_images/latching.png differ diff --git a/dev/_images/library_format.png b/dev/_images/library_format.png new file mode 100644 index 000000000..fc183a741 Binary files /dev/null and b/dev/_images/library_format.png differ diff --git a/dev/_images/mask_dev_body.png b/dev/_images/mask_dev_body.png new file mode 100644 index 000000000..9a04dfc51 Binary files /dev/null and b/dev/_images/mask_dev_body.png differ diff --git a/dev/_images/mask_dev_grf.png b/dev/_images/mask_dev_grf.png new file mode 100644 index 000000000..25ca2a742 Binary files /dev/null and b/dev/_images/mask_dev_grf.png differ diff --git a/dev/_images/mask_user_grf.png b/dev/_images/mask_user_grf.png new file mode 100644 index 000000000..ef40295c5 Binary files /dev/null and b/dev/_images/mask_user_grf.png differ diff --git a/dev/_images/mask_user_grf_waveOptions.png b/dev/_images/mask_user_grf_waveOptions.png new file mode 100644 index 000000000..6ab65356d Binary files /dev/null and b/dev/_images/mask_user_grf_waveOptions.png differ diff --git a/dev/_images/mcr_powerMatrix.png b/dev/_images/mcr_powerMatrix.png new file mode 100644 index 000000000..43b1cd7fa Binary files /dev/null and b/dev/_images/mcr_powerMatrix.png differ diff --git a/dev/_images/mcr_waveElev-heaveResp.png b/dev/_images/mcr_waveElev-heaveResp.png new file mode 100644 index 000000000..be88f3072 Binary files /dev/null and b/dev/_images/mcr_waveElev-heaveResp.png differ diff --git a/dev/_images/moorDynInput.png b/dev/_images/moorDynInput.png new file mode 100644 index 000000000..b3baaf681 Binary files /dev/null and b/dev/_images/moorDynInput.png differ diff --git a/dev/_images/mooring_diagram.PNG b/dev/_images/mooring_diagram.PNG new file mode 100644 index 000000000..1ba6570fc Binary files /dev/null and b/dev/_images/mooring_diagram.PNG differ diff --git a/dev/_images/mpcForce.png b/dev/_images/mpcForce.png new file mode 100644 index 000000000..e1930456c Binary files /dev/null and b/dev/_images/mpcForce.png differ diff --git a/dev/_images/mpcForceChange.png b/dev/_images/mpcForceChange.png new file mode 100644 index 000000000..dcad50b7b Binary files /dev/null and b/dev/_images/mpcForceChange.png differ diff --git a/dev/_images/mpcPos.png b/dev/_images/mpcPos.png new file mode 100644 index 000000000..a80b4b5d1 Binary files /dev/null and b/dev/_images/mpcPos.png differ diff --git a/dev/_images/mpcSimulink.png b/dev/_images/mpcSimulink.png new file mode 100644 index 000000000..8caae4a8b Binary files /dev/null and b/dev/_images/mpcSimulink.png differ diff --git a/dev/_images/mpcVel.png b/dev/_images/mpcVel.png new file mode 100644 index 000000000..c04d46f79 Binary files /dev/null and b/dev/_images/mpcVel.png differ diff --git a/dev/_images/nlhydro_comparison4.png b/dev/_images/nlhydro_comparison4.png new file mode 100644 index 000000000..692f5a553 Binary files /dev/null and b/dev/_images/nlhydro_comparison4.png differ diff --git a/dev/_images/nonlinearEllipsoid.png b/dev/_images/nonlinearEllipsoid.png new file mode 100644 index 000000000..b59779910 Binary files /dev/null and b/dev/_images/nonlinearEllipsoid.png differ diff --git a/dev/_images/nonlinearMesh.png b/dev/_images/nonlinearMesh.png new file mode 100644 index 000000000..cf32d35ac Binary files /dev/null and b/dev/_images/nonlinearMesh.png differ diff --git a/dev/_images/nonlinearWEC.png b/dev/_images/nonlinearWEC.png new file mode 100644 index 000000000..fd4b9622d Binary files /dev/null and b/dev/_images/nonlinearWEC.png differ diff --git a/dev/_images/numOpt_comparison.png b/dev/_images/numOpt_comparison.png new file mode 100644 index 000000000..5df3e0a9a Binary files /dev/null and b/dev/_images/numOpt_comparison.png differ diff --git a/dev/_images/oc6_iso_side.png b/dev/_images/oc6_iso_side.png new file mode 100644 index 000000000..44d62bd21 Binary files /dev/null and b/dev/_images/oc6_iso_side.png differ diff --git a/dev/_images/oceanCurrentProfiles.png b/dev/_images/oceanCurrentProfiles.png new file mode 100644 index 000000000..ea817b8fc Binary files /dev/null and b/dev/_images/oceanCurrentProfiles.png differ diff --git a/dev/_images/option2Schematic.jpg b/dev/_images/option2Schematic.jpg new file mode 100644 index 000000000..6c503c518 Binary files /dev/null and b/dev/_images/option2Schematic.jpg differ diff --git a/dev/_images/oswec_iso_side.png b/dev/_images/oswec_iso_side.png new file mode 100644 index 000000000..5d89477a8 Binary files /dev/null and b/dev/_images/oswec_iso_side.png differ diff --git a/dev/_images/oswec_pto_sim.PNG b/dev/_images/oswec_pto_sim.PNG new file mode 100644 index 000000000..d11674c57 Binary files /dev/null and b/dev/_images/oswec_pto_sim.PNG differ diff --git a/dev/_images/pGainSweep.png b/dev/_images/pGainSweep.png new file mode 100644 index 000000000..9b4f7e138 Binary files /dev/null and b/dev/_images/pGainSweep.png differ diff --git a/dev/_images/passiveYaw_comparison.png b/dev/_images/passiveYaw_comparison.png new file mode 100644 index 000000000..313b6cb0d Binary files /dev/null and b/dev/_images/passiveYaw_comparison.png differ diff --git a/dev/_images/piGainSweep.png b/dev/_images/piGainSweep.png new file mode 100644 index 000000000..5a8799328 Binary files /dev/null and b/dev/_images/piGainSweep.png differ diff --git a/dev/_images/piPTOSimulink.png b/dev/_images/piPTOSimulink.png new file mode 100644 index 000000000..ebe0fe78a Binary files /dev/null and b/dev/_images/piPTOSimulink.png differ diff --git a/dev/_images/pto_diagram.PNG b/dev/_images/pto_diagram.PNG new file mode 100644 index 000000000..bc6cb89f2 Binary files /dev/null and b/dev/_images/pto_diagram.PNG differ diff --git a/dev/_images/pto_sim_lib.png b/dev/_images/pto_sim_lib.png new file mode 100644 index 000000000..356b915f5 Binary files /dev/null and b/dev/_images/pto_sim_lib.png differ diff --git a/dev/_images/reactiveWithPTOCC.png b/dev/_images/reactiveWithPTOCC.png new file mode 100644 index 000000000..05a4fb3c2 Binary files /dev/null and b/dev/_images/reactiveWithPTOCC.png differ diff --git a/dev/_images/reactiveWithPTOCCPower.png b/dev/_images/reactiveWithPTOCCPower.png new file mode 100644 index 000000000..7131b9681 Binary files /dev/null and b/dev/_images/reactiveWithPTOCCPower.png differ diff --git a/dev/_images/reactiveWithPTOOpt.png b/dev/_images/reactiveWithPTOOpt.png new file mode 100644 index 000000000..8d8e6c8c8 Binary files /dev/null and b/dev/_images/reactiveWithPTOOpt.png differ diff --git a/dev/_images/reactiveWithPTOOptPower.png b/dev/_images/reactiveWithPTOOptPower.png new file mode 100644 index 000000000..f07d4e2ff Binary files /dev/null and b/dev/_images/reactiveWithPTOOptPower.png differ diff --git a/dev/_images/reactiveWithPTOSweep.png b/dev/_images/reactiveWithPTOSweep.png new file mode 100644 index 000000000..c53c5a229 Binary files /dev/null and b/dev/_images/reactiveWithPTOSweep.png differ diff --git a/dev/_images/rectangles.png b/dev/_images/rectangles.png new file mode 100644 index 000000000..7607c0406 Binary files /dev/null and b/dev/_images/rectangles.png differ diff --git a/dev/_images/rm3_iso_side.png b/dev/_images/rm3_iso_side.png new file mode 100644 index 000000000..916827c65 Binary files /dev/null and b/dev/_images/rm3_iso_side.png differ diff --git a/dev/_images/rm3with_pto_sim.PNG b/dev/_images/rm3with_pto_sim.PNG new file mode 100644 index 000000000..155fa28ab Binary files /dev/null and b/dev/_images/rm3with_pto_sim.PNG differ diff --git a/dev/_images/rotational_pto.PNG b/dev/_images/rotational_pto.PNG new file mode 100644 index 000000000..c72e11cc9 Binary files /dev/null and b/dev/_images/rotational_pto.PNG differ diff --git a/dev/_images/simulation_diagram.png b/dev/_images/simulation_diagram.png new file mode 100644 index 000000000..f7e4faf2e Binary files /dev/null and b/dev/_images/simulation_diagram.png differ diff --git a/dev/_images/sphere_freedecay_iso_side.png b/dev/_images/sphere_freedecay_iso_side.png new file mode 100644 index 000000000..ae8cdad1e Binary files /dev/null and b/dev/_images/sphere_freedecay_iso_side.png differ diff --git a/dev/_images/translational_pto.PNG b/dev/_images/translational_pto.PNG new file mode 100644 index 000000000..8e1686a76 Binary files /dev/null and b/dev/_images/translational_pto.PNG differ diff --git a/dev/_images/wave_diagram.PNG b/dev/_images/wave_diagram.PNG new file mode 100644 index 000000000..1b202023b Binary files /dev/null and b/dev/_images/wave_diagram.PNG differ diff --git a/dev/_images/wec_sim_header.png b/dev/_images/wec_sim_header.png new file mode 100644 index 000000000..59911a3d5 Binary files /dev/null and b/dev/_images/wec_sim_header.png differ diff --git a/dev/_images/wecccomp_diagram.png b/dev/_images/wecccomp_diagram.png new file mode 100644 index 000000000..6cf6f989c Binary files /dev/null and b/dev/_images/wecccomp_diagram.png differ diff --git a/dev/_images/wecccomp_iso_side.png b/dev/_images/wecccomp_iso_side.png new file mode 100644 index 000000000..50d15a5db Binary files /dev/null and b/dev/_images/wecccomp_iso_side.png differ diff --git a/dev/_images/wigley_iso_side.png b/dev/_images/wigley_iso_side.png new file mode 100644 index 000000000..d78be89d0 Binary files /dev/null and b/dev/_images/wigley_iso_side.png differ diff --git a/dev/_sources/developer/advanced_features.rst.txt b/dev/_sources/developer/advanced_features.rst.txt new file mode 100644 index 000000000..9ffb9a000 --- /dev/null +++ b/dev/_sources/developer/advanced_features.rst.txt @@ -0,0 +1,43 @@ +.. _dev-advanced-features: + +Advanced Features +================= + + +Added Mass +----------- + +.. include:: /_include/added_mass.rst + + +Morison Element +--------------- + +.. include:: /_include/morison_element.rst + +.. TO DO: add passive yaw +.. TO DO: add morison element +.. TO DO: add passive yaw +.. TO DO: add PTO-Sim + +Extract Mask Variables +---------------------- +The Simulink variable workspace is inaccesible in the MATLAB workspace by default. +Simulink variables can be imported to the MATLAB workspace using the block handle +of the Simulink block being probed. The block parameters can be used by developers +to programmatically set block parameters by being able to access the unique tags +that Simulink uses for a particular block parameter. This is also useful for the code +initialization of Simulink mask blocks. +The function :code:`ExtractMaskVariables()` +located in :code:`source\functions\simulink\mask`, can be used to extract the block +parameters in following steps, + +* Open the pertinent Simulink model, +* Run the function with the address of the block being probed as the argument, +* Explore the :code:`mask` data structure in the MATLAB workspace. + + +.. figure:: /_static/images/extractMaskVariables.PNG + :width: 550pt + :figwidth: 550pt + :align: center \ No newline at end of file diff --git a/dev/_sources/developer/getting_started.rst.txt b/dev/_sources/developer/getting_started.rst.txt new file mode 100644 index 000000000..a2b02208b --- /dev/null +++ b/dev/_sources/developer/getting_started.rst.txt @@ -0,0 +1,32 @@ +.. _dev-getting-started: + +Getting Started +=============== + +The WEC-Sim source code is hosted on `WEC-Sim's GitHub repository `_. +Please fork the WEC-Sim repository if you plan to contribute to the WEC-Sim code. +Forking the repository allows developers to create a personal copy of the WEC-Sim repository that can be edited idependently. +For details on creating and using a fork, refer to `GitHub's forking documentation `_. + +Once you have forked the repository on GitHub, add the fork's remote, and pull the fork into your local directory:: + + >> git remote add https://github.com//WEC-Sim.git + >> git pull + + +Push local commits to fork on GitHub:: + + >> git push + +Pull updates from WEC-Sim origin:: + + >> git pull origin + + +.. Note:: + This example defines ``origin`` as `WEC-Sim's GitHub repository `_, and ```` as the developer's fork. Develoeprs may use whatever convention they prefer, refer to `GitHub documentation on configuring remotes `_ + + + + + diff --git a/dev/_sources/developer/index.rst.txt b/dev/_sources/developer/index.rst.txt new file mode 100644 index 000000000..0ada75360 --- /dev/null +++ b/dev/_sources/developer/index.rst.txt @@ -0,0 +1,15 @@ +.. _dev: + +################# +Developer Manual +################# + +.. toctree:: + :maxdepth: 2 + + overview.rst + getting_started.rst + pull_requests.rst + software_tests.rst + library.rst + advanced_features.rst diff --git a/dev/_sources/developer/library.rst.txt b/dev/_sources/developer/library.rst.txt new file mode 100644 index 000000000..d24dce54c --- /dev/null +++ b/dev/_sources/developer/library.rst.txt @@ -0,0 +1,435 @@ +.. _dev-library: + +WEC-Sim Library +=============== + +The WEC-Sim Library is in the ``$WECSIM/source/lib`` directory, and includes the following files: + +========================= ================================== +**Simulink Library** **File name** +WEC-Sim Library ``WECSim_Lib.slx`` +Frames Sublibrary ``WECSim_Lib_Frames.slx`` +Body Elements Sublibrary ``WECSim_Lib_Body_Elements.slx`` +Constraints Sublibrary ``WECSim_Lib_Constraints.slx`` +PTOs Sublibrary ``WECSim_Lib_PTOs.slx`` +Cables Sublibrary ``WECSim_Lib_Cables.slx`` +Moorings Sublibrary ``WECSim_Lib_Moorings.slx`` +========================= ================================== + +GitHub tracks when a change is made to a binary file (e.g. ``*.slx``), but not the specific revisions made. +This makes tracking revisions to the WEC-Sim Library more challenging than revisions to text files (e.g. ``*.m``). +The WEC-Sim Library is saved as a `Custom Simulink Library `_ with sublibaries. +To ensure backwards compatibility, a `Forwarding Table `_ is used. + + + +.. _dev-library-format: + +Formatting +----------- +Please format the color of library blocks according to their function: + +========================= ================================== +**Library Function** **Color** +Input Green +Output Red +From Workspace Yellow +Simulink Function Orange +Subsystem Gray +Linked Block Light Blue +========================= ================================== + +.. figure:: /_static/images/dev/library_format.png + :align: center + :width: 400pt + + WEC-Sim Library blocks with color formatting + + + +.. _dev-library-development: + +Library Development +---------------------- +When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes. + +In order to modify blocks masks the variable being modified must be accesible to Simulink's workspace. This can be acheived by running any ``wecSimInputFile.m`` script without executing WEC-Sim. Running the ``wecSimInputFile.m`` script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim's class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., ``bodyClass``, ``waveClass`` etc.). + +Simulink then executes each block mask's initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the ``wecSimInputFile.m`` script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library. + +.. Note:: + This is especially important for the Wave Markers and for B2B + +.. _dev-sim-funcs: + +Simulink Functions +------------------ +Whenever a Simulink Function is called from the WEC-Sim Library, save the function to the ``$WECSIM/source/simulink/functions`` directory. +This allows revisions to Simulink Functions to be more easily tracked by Git. +Simulink Model Functions should be saved to the ``$WECSIM/source/functions/simulink/model`` directory. +Simulink Mask Functions should be saved to the ``$WECSIM/source/functions/simulink/mask`` directory. +Refer to the :ref:`dev-library-format` section for details on block color formatting. + + +The ``$WECSIM/source/functions/simulink/model`` directory contains functions called by the Simulink model during runtime. +These functions implement physics equations such as calculation of the irregular excitation force or the radiation damping convolution integral. These functions greatly affect the accuracy of WEC-Sim. +Whereas the functions in the ``$WECSIM/source/functions/simulink/mask`` directory are only used in preprocessing when running WEC-Sim from Simulink, refer to Run from Simulink :ref:`dev-run-sim-lib`. + +.. _dev-run-sim: + +Run from Simulink +--------------------- +The :ref:`user-advanced-features-simulink` feature allows users to initialize WEC-Sim from the command window and then run the simulation directly from Simulink. +This feature allows greater compatibility with other models or hardware-in-the-loop simulations. + +Internally, the Run From Simulink functionality differs from executing the ``wecSim`` command by how the input file is run. +The ``wecSim`` command begins by running the ``wecSimInputFile`` in the current directory and continuing with the pre-processing steps. +Run From Simulink differs by either: + + * Running the input file selected in the Global Reference Frame (when the ``Input File`` option is selected) + * Writing and then running a new input file ``wecSimInputFile_customParameters.m`` (when the Global Reference when the ``Custom Parameters`` option is selected) + + +.. _dev-run-sim-custom: + +Custom Parameters +^^^^^^^^^^^^^^^^^^^ +WEC-Sim allows users to define input file parameters inside Simulink block masks. +When using the ``Custom Parameters`` setting, users can both load an input file into the block masks and write an block masks to an input file. +This feature was created so that users have a written record of case parameters utilized during a simulation run from Simulink. + +The mask of each library block allows users to define a subset of possible input parameters that would be defined in the ``wecSimInputFile``. +The values that a user inputs to a block are stored as mask parameters. +When a block mask is accessed, a prompt similar to the figure below appears: + +.. figure:: /_static/images/dev/mask_user_grf.png + :align: center + :width: 400pt + + Simulation class parameters defined in the Global Reference Frame. + +Turning on certain flags may change the visibility of other parameters. +For example, the wave type will affect which wave settings are visible to a user: + +.. figure:: /_static/images/dev/mask_user_grf_waveOptions.png + :align: center + :width: 400pt + + Wave class parameters defined in the Global Reference Frame. Visibility changes based on the selected wave type, + +The spectrum type, frequency discretization and phase seed are not used for regular waves, so they are no visible. +Similarly, a visibility-flag relation is present for each body's Morison element options, nonhydro body parameters, etc. +Having a flag change the visibility of options that cannot be used may help new users understand the interdependence of input parameters. + +.. Note:: + To decrease the burden of maintaining these masks, only the most common input file parameters can be defined in Simulink. + For example, the Global Reference Frame contains simulationClass parameters such as ``mode``, ``explorer``, ``solver``, time information, and state space flags. + However less common parameters such as ``mcrMatFile``, ``saveStructure``, ``b2b`` and others are not included. + + +.. _dev-run-sim-lib: + +Library Masks +^^^^^^^^^^^^^^^^^^^^ +In order to maintain the functionality of the :ref:`user-advanced-features-simulink` feature, the WEC-Sim Library must be updated when new features are added. +Developers may add additional options using the below instructions. + +WEC-Sim is developed as a class based software. +This results in a complex interplay between the class variables and those defined in the block masks. +The difficult and complex part of this feature comes from three aspects: + + * Changing parameter visibility based on a flags value (``callbacks``) + * Writing an input file from mask parameters (``writeInputFromBlocks``, ``writeLineFromVar``) + * Writing block parameters when loading an input file (``writeBlocksFromInput``) + +Each of these items will be addressed in this section, but first an overview of the mask set-up is given. +It is recommended that developers review Mathworks `Simulink.MaskParameter `_ documentation before preceding with edits to this advanced feature. + +When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes. +To modify blocks masks, + + * Before modifying a block mask, the variable being modified should be accesible to Simulink's workspace. This can be acheived by making sure that the ``source`` folder in the WEC-Sim directory is added to MATLAB path, and running any available ``wecSimInputFile.m`` script without running WEC-Sim. Running the ``wecSimInputFile.m`` script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim's class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., ``bodyClass``, ``waveClass`` etc.). + * Simulink executes each block mask's initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the ``wecSimInputFile.m`` script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library. + +.. Note:: + This is especially important for the Wave Markers and for B2B . + +Mask Structure +"""""""""""""" +Each block mask first contains the ``number`` as in historical WEC-Sim set-up; +``body(1)``, ``pto(2)``, ``constraint(1)``, etc. Next there is a string +that clarifying that no custom parameters on shown when the ``Global Reference +Frame`` is set to use an input file. A folder than contains all custom +parameters within tabs. + +.. figure:: /_static/images/dev/mask_dev_body.png + :align: center + :width: 400pt + +Within the custom parameters folder are various tabs. The first tab contains +parameters not within a class structure. Additional tabs are organized based +on what class structures are used. For example all parameters within the +``body(i).morisonElement`` structure are under the morisonElement tab, +``body(i).initial`` under the tab, etc. This method of placing class +structures into tabs helps organize the mask and write parameters to the input +file. + + +Parameter Specifics +""""""""""""""""""" + +Each mask parameter has certain properties (``name``, ``value``, ``prompt``, ``type``), +attributes, and dialog options (``visible``, ``callback``) that must be properly +defined: + +.. figure:: /_static/images/dev/mask_dev_grf.png + :align: center + :width: 400pt + + +**Properties** + +The properties of a mask parameter define the ``name``, ``value``, ``type`` and +user-facing ``prompt``. The mask name must be *identical* to the name of the +corresponding class property. This is essential to easily writing/reading an +input file to/from the mask. The defaults of each parameter should be the same +as the corresponding class property. + +Parameters with a distinct set of values (flags, wave types, etc) should be of +Type ``popup`` to limit users and more easily use callbacks dependent on their +values. Use ``checkbox`` not ``popup`` for flags that take values of ``on, off`` +(such as ``pto(i).lowerLimitSpecify``. Other parameters are typically of Type +``edit`` to allow flexible user input. + +**Attributes** + +In general, most parameters should not be read only or hidden, and should be +saved. One exception to this is the Global Reference Frame parameters ``waves`` +and ``simu`` which identify the block in the workspace when reading/writing +input files. + +**Dialog** + +The dialog options are primarily used to change a parameter's visibility, +tooltip and define a callback function. A tooltip defines a string that +appears when a user hovers on a parameter. This can be useful to provide +additional context that is too long for the prompt. +A parameter's callback functions run whenever the value is updated. In WEC-Sim, +mask callbacks are typically used to with flag parameters to update the +visibility of other parameters: + +====================== ====================================== ========== +Block / class Mask parameter Callback +====================== ====================================== ========== +PTO, constraint, cable upperLimitSpecify, lowerLimitSpecify ``hardStopCallback`` +Body STLButton ``stlButtonCallback`` +Body H5Button ``h5ButtonCallback`` +Body nonHydro, (morisonElement.) on ``bodyClassCallback`` +====================== ====================================== ========== + +A specific variable's callbacks are defined in: +``BLOCK/Mask Editor/Parameters & Dialog/PARAMETER/Property editor/Dialog/Callback/``. +For more information about the callback functions refer to :ref:`dev-sim-funcs` and :ref:`dev-run-sim-callback`. + + +.. _dev-run-sim-callback: + +Callback Functions +"""""""""""""""""" +All callbacks and other functions used in Simulink masks for the Run From +Simulink feature are stored as ``*.m`` files in the +``$WECSIM/source/functions/simulink/mask/`` directory, refer to :ref:`dev-sim-funcs`. + + +WEC-Sim callback functions can be split into several categories by their use: + +===================== ====================================== +Category Functions +===================== ====================================== +Button callbacks ``inFileButtonCallback.m``, ``etaButtonCallback.m``, ``spectrumButtonCallback.m``, ``h5ButtonCallback.m``, ``stlButtonCallback.m``, ``loadInputFileCallback.m``, etc +Visibility callbacks ``hardStopCallback.m``, ``waveClassCallback.m``, ``bodyClassCallback.m``, ``customVisibilityCallback.m``, ``inputOrCustomCallback.m``, etc +===================== ====================================== + +**Visibility callbacks** + +Visibility callbacks are used with flag parameters to update the visibility of +available options. For example, if ``body(i).morisonElement.on=0``, then a user +is not able to define ``body(i).morisonElement.cd, .ca,`` etc. +The visibility callbacks function by checking the value of a flag: + +.. code-block:: matlabsession + + >> mask = Simulink.Mask.get(bodyBlockHandle) + >> meParam = mask.getParameter('on') + >> nonHydroParam = mask.getParameter('nonHydro') + + +Depending on the value of a flag, the visibility of individual variables or an +entire tab can be changed: + +.. code-block:: matlabsession + + >> meTab = mask.getDialogControl('morisonElement'); + >> if nonHydroParam.value >= 1 + >> centerGravityParam.Visible = 'on'; + >> centerBuoyancyParam.Visible = 'on'; + >> else + >> centerGravityParam.Visible = 'off'; + >> centerBuoyancyParam.Visible = 'off'; + >> end + >> + >> if meParam.value >= 1 + >> meTab.Visible = 'on'; + >> else + >> meTab.Visible = 'off'; + >> end + + +This method is also how the Global Reference Frame turns off all custom +parameters when it is set to use an input file. In this case, +``inputOrCustomCallback`` is used. When a new class is created, developers must +add the class variable (``body, simu, etc``) into the list checked in +``inputOrCustomCallback``. This list is necessary to ensure that Simulink +models can contain non-WEC-Sim blocks without error. + +**Button callbacks** + +Button callback typically open a file explorer and allow users to select +a given file. These buttons allow wave spectrum, wave elevation, body h5 or +body STL files, etc to be defined in the mask. These callbacks use the MATLAB +command ``uigetfile()`` and then set the correct mask value based if a valid +file is selected. + +.. code-block:: matlabsession + + >> [filename,filepath] = uigetfile('.mat'); + >> + >> % Don't set value if no file is chosen, or prompt canceled. + >> if ~isequal(filename,0) && ~isequal(filepath,0) + >> mask = Simulink.Mask.get(bodyBlockHandle) + >> fileParam = mask.getParameter('spectrumFile ') + >> fileParam.value = [filepath,filename]; + >> end + + +.. _dev-run-sim-input-mask: + +Writing Input File from Mask +"""""""""""""""""""""""""""" + +WEC-Sim writes an input file from mask parameters using the functions ``writeInputFromBlocks`` and ``writeLineFromVar``. +WEC-Sim scans the open Simulink file for all blocks, and reorders them based on the typical input file +order: ``simu``, ``waves``, ``body``, ``constraint``, ``pto``, ``cable``, ``mooring``. +WEC-Sim also creates default copies of each class. +All mask variables are looped through and written to ``wecSimInputFile_simulinkCustomParameters`` using the function ``writeLineFromVar``. +This function takes in a default class, variable name, mask value, number and structure value. +For example, in the body class: + +.. code-block:: matlabsession + + >> writeLineFromVar(body, 'option', maskVars, maskViz, num, 'morisonElement'); + +This function allows WEC-Sim to easily compare the mask value with the default, +assign variables to a certain class number and structure. Checking a mask value +against the class default keeps the new input file clean and easy to read. It is +critical that any mask parameter written with this function is named +identically to its class counterpart. It returns a string to +``writeInputFromBlocks`` that is immediately written to the input file. As of +now, developers must manually add a line to print a new mask parameter to +the input file. + + +.. _dev-run-sim-mask-input: + +Writing Mask Parameters from Input File +""""""""""""""""""""""""""""""""""""""" + +WEC-Sim loads mask parameters from an input file using the function +``writeBlocksFromInput``. This function is called by ``loadInputFileCallback`` +in the ``Global Reference Frame``. This function loops through all blocks in +the Simulink model. Within each block, the chosen input file is run. Values of +each class variables are assigned directly to the mask value. The default is +not checked in this instance, as the mask cannot be cleaned up in the same +method as the input file. + +When creating a new class, developers must manually +add a value to the `'type'` flag in ``loadInputFileCallback``. This ensures that +the mask variables are set with the correct WEC-Sim class, i.e.: + +.. code-block:: matlabsession + + >> maskVar. ... = body(1). ...; + >> maskVar. ... = pto(2). ...; + >> maskVar. ... = cable(3). ...; + + +Developers must also edit each case of ``writeBlocksFromInput`` when creating +a new mask parameter or renaming a class property. + + +.. _dev-run-sim-summary: + +Summary +""""""" + +**To create or rename a mask parameter** + +1. Change the mask parameter name and default value in Simulink +2. If tied to a flag, update callbacks to hide/show the parameter +3. Update ``writeInputFromBlocks`` and ``writeBlocksFromInput`` with the new parameter + name + +**Creating a new class or block** + +1. Setup the mask parameter structure described above, or copy from another block + in that class: + + .. code-block:: matlabsession + + >> pSource = Simulink.Mask.get(srcBlockName) + >> pDest = Simulink.Mask.create(destBlockName) + >> pDest.copy(pSource) + +2. Ensure that ``inputOrCustomCallback`` functions correctly to hide/show all custom + parameters depending on the ``Global Reference Frame`` setting. + +3. If tied to a flag, update callbacks to hide/show parameters. + +4. Permanently hide any parameters not used in that class (e.g. + 6DOF Constraint does not have end stops, so that tab is not visible) + +5. Create new ``writeInputFromBlocks`` and ``writeBlocksFromInput`` sections + to tie the block mask to an input file. + +.. Note:: + * Mask parameters should always have the same name as the corresponding + class property + * All mask parameters should have the ability to write to an input file and + load from Simulink + + +.. _dev-merge-tool: + +MATLAB Merge Tool +------------------ +It is recommended that developers use the `MATLAB Merge Tool `_ to compare library versions when there are merge conflicts. +The MATLAB Merge Tool allows users to compare changes directly in Simulink. +The merge tool will open a special Simulink GUI that allows users to compare code versions both textually and within the block diagram. +To use the tool, merge both branches locally and resolve any conflicts using the merge tool. + +For example, take the branches ```` and ```` that each contain new WEC-Sim features. +In the Git for Windows command line, these changes can be merged using:: + + # Checkout the branch and pull the latest + git checkout + git pull / + + # Merge branch into branch + git merge + + # Resolve library conflicts using the MATLAB merge tool + git mergetool -t mlMerge source/lib/WEC-Sim/.slx + + # Save desired revisions, then add and commit changes + git add source/lib/WEC-Sim/.slx + git commit -m 'merge with ' diff --git a/dev/_sources/developer/overview.rst.txt b/dev/_sources/developer/overview.rst.txt new file mode 100644 index 000000000..bc1acf157 --- /dev/null +++ b/dev/_sources/developer/overview.rst.txt @@ -0,0 +1,11 @@ +.. _dev-overview: + +Overview +======== + +The :ref:`WEC-Sim development team ` is currently engaged in continuous code development and support. +Efforts are made by the development team to improve the code's flexibility, accuracy, and usability. +The :ref:`dev-getting-started` section describes the development team's workflow for anyone who wishes to submit new WEC-Sim features for inclusion in future WEC-Sim releases. +The developer manual also documents specific WEC-Sim features that are especially relevant to WEC-Sim development. +It is intended as a reference for members of the (internal and external) development team when adding new features. + diff --git a/dev/_sources/developer/pull_requests.rst.txt b/dev/_sources/developer/pull_requests.rst.txt new file mode 100644 index 000000000..4ccff722f --- /dev/null +++ b/dev/_sources/developer/pull_requests.rst.txt @@ -0,0 +1,27 @@ +.. _dev-pull-requests: + +Pull Requests +=============== + +A stable version of WEC-Sim is maintained on the `WEC-Sim main branch `_, and `WEC-Sim releases `_ are tagged on GitHub. +WEC-Sim development is performed on `WEC-Sim dev branch `_ using a `fork-based workflow `_. +New WEC-Sim features are developed on forks of the WEC-Sim repository, and `pull-requests `_ are submitted to merge new features from a development fork into the main WEC-Sim repository. +Pull-requests for new WEC-Sim features should be submitted to the WEC-Sim dev branch. +The only exception to this workflow is for bug fixes; pull-request for bug fixes should be should submitted to the WEC-Sim main branch. +When a new version of WEC-Sim is released, the dev branch is pulled into main where all changes are incorporated into the code. + + +A `pull request (PR) `_ should focus on one update at a time. +This ensures that PR revisions are easily tracked, and keeps the repository history remains clean. +If working on multiple updates, please use different branches, and submit separate pull requests. +Once a PR is merged please delete legacy branches to keep your fork clean. + +Prior to submitting a pull request, pull the latest commits from the WEC-Sim repository, resolve any merge conflicts, and commit revisions to your fork:: + + >> git pull origin + >> git commit -m 'commit message' + >> git push + +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +:ref:`dev-software-tests`. +To submit a pull request, navigate to the `WEC-Sim's pull requests `_ and submit a new pull request. \ No newline at end of file diff --git a/dev/_sources/developer/software_tests.rst.txt b/dev/_sources/developer/software_tests.rst.txt new file mode 100644 index 000000000..5b5601694 --- /dev/null +++ b/dev/_sources/developer/software_tests.rst.txt @@ -0,0 +1,56 @@ +.. _dev-software-tests: + +Software Tests +=============== + +WEC-Sim includes `MATLAB Continuous Integration `_ tests that check the source code's stability and generate a build report. +The continuous integration tests are run each time a commit is made to the WEC-Sim GitHub repository, and the stability of each commit is available via `WEC-Sim's GitHub Actions `_. +Tests are run on both the `WEC-Sim main `_ and `WEC-Sim dev `_ branches. +To ensure stability across MATLAB distributions, WEC-Sim tests are also run on current and prior MATLAB releases. +Refer to MATLAB's `unit test framework `_ and `continuous integration `_ documentation for more information. + +When new features are added, tests should developed to verify functionality. +All tests should be run locally to ensure stability prior to submitting a pull request. +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +:ref:`dev-pull-requests`. + +.. _dev-software-tests-ws: + +WEC-Sim Tests +-------------- +The WEC-Sim tests are located in the ``$WECSIM/tests`` directory. +To execute the WEC-Sim tests locally and generates a build report, navigate to the ``$WECSIM`` directory (e.g. ``C:/User/Documents/GitHub/WEC-Sim``), and type the following command in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> results = wecSimTest() + + + Totals: + 38 Passed, 0 Failed, 0 Incomplete. + + +.. _dev-software-tests-wsa: + +WEC-Sim Applications Tests +--------------------------- +The `WEC-Sim Applications repository `_ includes tests of each applications case. +To execute the WEC-Sim Applications tests locally and generates a build report, navigate to the ``$WECSIM_Applications`` directory (e.g. ``C:/User/Documents/GitHub/WEC-Sim``), and type the following command in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> results = wecSimAppTest() + + + Totals: + 43 Passed, 0 Failed, 0 Incomplete + + +.. TO DO: add section about regression and compilation tests + +.. Regression Tests +.. WEC-Sim regression tests are used to compare the latest version of WEC-Sim with a solution from a previous (stable) release. A maximum difference is asserted in each unit test to ensure that the latest version does not deviate from a previous release. + +.. Compilation Tests +.. WEC-Sim compilation tests are used to check that new features do not break existing functionality by verifying that WEC-Sim runs for a selection of existing application cases. However, for these cases no regression comparison is performed. + diff --git a/dev/_sources/index.rst.txt b/dev/_sources/index.rst.txt new file mode 100644 index 000000000..424545ae0 --- /dev/null +++ b/dev/_sources/index.rst.txt @@ -0,0 +1,76 @@ +.. _home: + +.. figure:: /_static/images/wec_sim_header.png + :target: https://github.com/WEC-Sim/WEC-Sim + + +.. toctree:: + :maxdepth: 5 + :hidden: + + Home + introduction/index.rst + theory/index.rst + user/index.rst + most/index.rst + developer/index.rst + + +######################################### +WEC-Sim (Wave Energy Converter SIMulator) +######################################### + +`WEC-Sim (Wave Energy Converter SIMulator) `_ +is an open-source software for simulating wave energy converters. The software is +developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape +Multibody. WEC-Sim has the ability to model devices that are comprised of +bodies, joints, power take-off systems, and mooring systems. WEC-Sim can model +both rigid bodies and flexible bodies with generalized body modes. Simulations +are performed in the time-domain by solving the governing wave energy converter +equations of motion in the 6 Cartesian degrees-of-freedom, plus any number of +user-defined modes. The `WEC-Sim Applications repository +`_ contains a wide variety of +scenarios that WEC-Sim can be used to model, including desalination, mooring +dynamics, nonlinear hydrodynamic bodies, passive yawing, batch simulations and +many others. The software is very flexible and can be adapted to many scenarios +within the wave energy industry. + +.. _developers: + +WEC-Sim Developers +===================== +WEC-Sim is a collaboration between the `National Renewable Energy Laboratory +(NREL) `_ and `Sandia National Laboratories +(Sandia) `_, +funded by the U.S. Department of Energy’s Water Power Technologies Office. +Due to the open source nature of the software, WEC-Sim has also had many external +contributions. +For more information refer to :ref:`intro-acknowledgements`. + +Current members of the development team include: + +* Dominic Forbush (Sandia) +* Jeff Grasberger (Sandia) +* Salman Husain (NREL - PI) +* Adam Keester (Sandia) +* Jorge Leon (Sandia) +* David Ogden (NREL) +* Kelley Ruehl (Sandia - PI) +* Mohamed Shabara (NREL) + +Former members of the development team include: + +* Michael Lawson (NREL) +* Carlos Michelen (Sandia) +* Nathan Tom (NREL) +* Jennifer Van Rij (NREL) +* Yi-Hsiang Yu (NREL) + + +.. Indices and tables +.. ================== + +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` + diff --git a/dev/_sources/introduction/acknowledgements.rst.txt b/dev/_sources/introduction/acknowledgements.rst.txt new file mode 100644 index 000000000..2a998dd4a --- /dev/null +++ b/dev/_sources/introduction/acknowledgements.rst.txt @@ -0,0 +1,27 @@ +.. _intro-acknowledgements: + +Acknowledgements +================ + +External Contributors +------------------------- +In addition to development by :ref:`developers`, WEC-Sim has had many contributors, including: + +* Ratanak So (Oregon State University) +* Matt Hall (University of Maine) +* Brad Ling (Azura Wave) +* Adam Nelessen (Georgia Institute of Technology) +* Sam Kanner (University of California at Berkeley) +* Chris McComb (Carnegie Mellon University) +* Sam Edwards (University of Michigan) + +The association with the listed organization is credited to when a contribution to WEC-Sim was made. The contributor may no longer be associated with the listed organization at this time. + +Funding +-------- +Development and maintenance of the WEC-Sim code is funded by the U.S. Department of Energy's Water Power Technologies Office. WEC-Sim code development is a collaboration between the National Renewable Energy Laboratory and Sandia National Laboratories. + +The National Renewable Energy Laboratory is a national laboratory of the U.S. Department of Energy, Office of Energy Efficiency and Renewable Energy, operated by the Alliance for Sustainable Energy, LLC. under contract No. DE-AC36-08GO28308. + +Sandia National Laboratories is a multi-mission laboratory managed and operated by National Technology and Engineering Solutions of Sandia, LLC., a wholly owned subsidiary of Honeywell International, Inc., for the U.S. Department of Energy's National Nuclear Security Administration under contract DE-NA0003525. + diff --git a/dev/_sources/introduction/index.rst.txt b/dev/_sources/introduction/index.rst.txt new file mode 100644 index 000000000..b5889d419 --- /dev/null +++ b/dev/_sources/introduction/index.rst.txt @@ -0,0 +1,14 @@ +.. _intro: + +############## +Introduction +############## + +.. toctree:: + :maxdepth: 2 + + overview.rst + acknowledgements.rst + release_notes.rst + publications.rst + license.rst diff --git a/dev/_sources/introduction/license.rst.txt b/dev/_sources/introduction/license.rst.txt new file mode 100644 index 000000000..ee43d28b2 --- /dev/null +++ b/dev/_sources/introduction/license.rst.txt @@ -0,0 +1,22 @@ +.. _intro-license: + +License +======= +WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS). +The software is distributed under the Apache License 2.0. + + +Copyright +------------ + +.. literalinclude:: ../../COPYRIGHT + :language: text + + + +Apache License 2.0 +------------------------- + +.. literalinclude:: ../../LICENSE + :language: text + diff --git a/dev/_sources/introduction/overview.rst.txt b/dev/_sources/introduction/overview.rst.txt new file mode 100644 index 000000000..dbca7c096 --- /dev/null +++ b/dev/_sources/introduction/overview.rst.txt @@ -0,0 +1,180 @@ +.. _intro-overview: + +Overview +======================= + +.. TODO + - compare to other codes? + table of advantages over similar codes + speed / accuracy comparison + Reference OC6P1 paper and how well WEC-Sim performs + + +WEC-Sim (Wave Energy Converter SIMulator) is an open-source software for simulating wave energy converters. +It is developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape Multibody. +WEC-Sim has the ability to model devices that are comprised of hydrodynamic bodies, joints and constraints, power take-of systems, and mooring systems. +Simulations are performed in the time-domain by solving the governing wave energy converter equations of motion in the 6 rigid Cartesian degrees-of-freedom. +A body may also contain any number of generalized body modes to represent hydrodynamic effects in shear, torsion, bending, and others. + +.. /_static/images/overview/overview_diagram.JPG +.. figure:: /_static/images/WEC-Sim_flowChart.png + :width: 750pt + +At a high level, the only external input WEC-Sim requires is hydrodynamic data from boundary element method (BEM) software such as WAMIT, NEMOH, Aqwa, and Capytaine. +The boundary element method data represents the hydrodynamic response of the device for a given wave frequency. +WEC-Sim uses this data to simulate devices in the time-domain where they can be coupled with controls, power take-off systems, and other external bodies and forces. +WEC-Sim outputs the motions, forces, and power for individual bodies, joints and PTOs in MATLAB for custom post-processing or coupling with external tools. + +Several interfaces with Simulink are included that allow users to couple WEC-Sim with a wide variety of other models and scripts relevant to their devices. +Complex power take-off systems and advanced control algorithms are just two examples of the advanced tools that can be coupled with WEC-Sim. + +.. figure:: /_static/images/overview/OSWEC_with_ptosim.png + :width: 750pt + + Block diagram of an OSWEC device with hydraulic PTO created with PTO-Sim. + +.. figure:: /_static/images/overview/wecccomp_diagram.png + :width: 400pt + + Block diagram of the WECCCOMP device with advanced controller. + +Together with PTO and control systems, WEC-Sim is able to model a wide variety of marine devices. +The WEC-Sim Applications repository contains a wide variety of scenarios that WEC-Sim can model. +This repository includes both demonstrations of WEC-Sim's advanced features and applications of WEC-Sim to unique devices. + +WEC-Sim's capabilities include the ability to model both nonlinear hydrodynamic effects (Froude-Krylov forces and hydrostatic stiffness) and nonhydrodynamic bodies, body-to-body interactions, mooring systems, passive yawing. +WEC-Sim contains numerous numerical options and ability to perform highly customizable batch simulations. WEC-Sim can take in data from a variety of boundary element method software using its BEMIO (BEM-in/out) functionality and can output paraview files for visualization. +Some of its advanced features are highlighted in the figures below. + + +.. |b2b| image:: /_static/images/overview/b2b_comparison2.png + :width: 400pt + :height: 175pt + :align: middle + +.. |nlh| image:: /_static/images/overview/nlhydro_comparison4.png + :width: 400pt + :height: 175pt + :align: middle + +.. |num| image:: /_static/images/overview/numOpt_comparison.png + :width: 400pt + :height: 175pt + :align: middle + +.. |yaw| image:: /_static/images/overview/passiveYaw_comparison.png + :width: 400pt + :height: 175pt + :align: middle + +.. |mcr1| image:: /_static/images/overview/mcr_waveElev-heaveResp.png + :width: 400pt + :height: 175pt + :align: middle + +.. |mcr2| image:: /_static/images/overview/mcr_powerMatrix.png + :width: 400pt + :height: 175pt + :align: middle + ++-------------------------------------------------------------------+ +| Advanced Features Demonstration | ++=================================+=================================+ +| |nlh| | |num| | +| Nonlinear hydrodynamics | Various numerical options | ++---------------------------------+---------------------------------+ +| |b2b| | |yaw| | +| Body-to-body interactions | Passive yaw | ++---------------------------------+---------------------------------+ +| |mcr1| | |mcr2| | +| Multiple case run: elevation | Multiple case run: power matrix | ++---------------------------------+---------------------------------+ + + +WEC-Sim can model a wide variety of marine renewable energy and offshore devices. +The figures below highlight a small sample of devices that WEC-Sim has successfully modeled in the past. + +.. TODO: + Paraview figures or Simscape diagrams: + RM5 + GBM -> use more flexible design where bending can be seen + COER COMP + OC6 Phase II (future) + FOSWEC + desal + ptosim + Industry/academic designs? + + +.. |rm3| image:: /_static/images/overview/rm3_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim/tree/main/examples/RM3 + + +.. |oswec| image:: /_static/images/overview/oswec_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim/tree/main/examples/OSWEC + + +.. |sphere| image:: /_static/images/overview/sphere_freedecay_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Free_Decay + + +.. |ellipsoid| image:: /_static/images/overview/ellipsoid_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Nonlinear_Hydro + + +.. |gbm| image:: /_static/images/overview/gbm_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Generalized_Body_Modes + + +.. |wigley| image:: /_static/images/overview/wigley_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/Wigley + + +.. |wec3| image:: /_static/images/overview/wecccomp_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WECCCOMP + + +.. |oc6p1| image:: /_static/images/overview/oc6_iso_side.png + :align: middle + :width: 400pt + + +.. rm3 Reference Model 3 + oswec Bottom-fixed Oscillating Surge WEC (OSWEC) + sphere + ellipsoid Ellipsoid + gbm Barge with Four Flexible Body Modes + wigley Wigley Ship Hull + wec3 Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device + oc6p1 OC6 Phase I DeepCwind Floating Semisubmersible + + ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| Sample of devices that have been with WEC-Sim | ++======================================================================+======================================================================+ +| |rm3| | |oswec| | +| Reference Model 3 | Bottom-fixed Oscillating Surge WEC (OSWEC) | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |sphere| | |ellipsoid| | +| Hemisphere in Free Decay | Ellipsoid | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |wigley| | |gbm| | +| Wigley Ship Hull | Barge with Four Flexible Body Modes | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |wec3| | |oc6p1| | +| Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device | OC6 Phase I DeepCwind Floating Semisubmersible | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ \ No newline at end of file diff --git a/dev/_sources/introduction/publications.rst.txt b/dev/_sources/introduction/publications.rst.txt new file mode 100644 index 000000000..a18ae1de7 --- /dev/null +++ b/dev/_sources/introduction/publications.rst.txt @@ -0,0 +1,122 @@ +.. _intro-publications: + +Publications +============ + +Refer to the `WEC-Sim Signature Project page `_ for a complete list of WEC-Sim publications, including publications written by users of the WEC-Sim code outside of the WEC-Sim development team. +Here is a list of publications written by the WEC-Sim multi-lab team about the development and application of WEC-Sim: + +[1] Y.-H. Yu, M. Lawson, K. Ruehl, and C. Michelen, “`Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool `_,” in Proceedings of the 2nd Marine Energy Technology Symposium, METS 2014, Seattle, WA, 2014. + +[2] Y.-H. Yu, Y. Li, K. Hallett, and C. Hotimsky, “`Design and Analysis for a Floating Oscillating Surge Wave Energy Converter `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[3] M. Lawson, Y.-H. Yu, A. Nelessen, K. Ruehl, and C. Michelen, “`Implementing Nonlinear Buoyancy and Excitation Forces in the WEC-Sim Wave Energy Converter Modeling Tool `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[4] K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y.-H. Yu, “`Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[5] M. Lawson, Y.-H. Yu, K. Ruehl, and C. Michelen, “`Improving and Validating the WEC-Sim Wave Energy Converter Code `_," in Proceedings of the 3rd Marine Energy Technology Symposium, METS 2015, DC, 2015. + +[6] N. Tom, M. Lawson, and Y. Yu, “`Demonstration of the Recent Additions in Modeling Capabilities for the WEC-Sim Wave Energy Converter Design Tool `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[7] R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen, “`Development of PTO-SIM: A Power Performance Module for the Open-Source Wave Energy Converter Code WEC-SIM `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[8] M. Lawson, B. Garzon, F. Wendt, Y.-H. Yu, and C. Michelen, “`COER Hydrodynamics Modeling Competition: Modeling the Dynamic Response of a Floating Body Using the WEC-SIM and FAST Simulation Tools `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[9] N. Tom, M. Lawson, and Y.-H. Yu, “`Recent Additions in the Modeling Capabilities for the WEC-Sim-v1.1 Wave Energy Converter Design Tool `_,” in Proceedings of the 25th International Offshore and Polar Engineering Conference, ISOPE 2015, Kona, HI, 2015. + +[10] R. So, S. Casey, S. Kanner, A. Simmons, and Brekken, T. K. A., “`PTO-Sim: Development of a Power Take Off Modeling Tool for Ocean Wave Energy Conversion `_,” in Proceedings of the IEEE Power and Energy Society General Meeting, PES 2015, Denver, CO, 2015. + +[11] A. Simmons, T. Brekken, P. Lomonaco, and C. Michelen, “`Creating a Dynamometer for Experimental Validation of Power Take-Off Forces on a Wave Energy Converter `_,” in Proceedings of the IEEE Sustainability Technology Conference, SusTech 2015, Ogden, UT, 2015. + +[12] A. Combourieu, M. Lawson, A. Babarit, K. Ruehl, A. Roy, R. Costello, P. L. Weywada, and H. Bailey, “`WEC3: Wave Energy Converters modeling Code Comparison project `_,” in Proceedings of the 11th European Wave and Tidal Conference, EWTEC 2015, Nantes, France, 2015. + +[13] K. Ruehl, C. Michelen, Y.-H. Yu, and M. Lawson, “`Update on WEC-Sim Validation Testing and Code Development `_,” in Proceedings of the 4th Marine Energy Technology Symposium, METS 2016, DC, 2016. + +[14] B. Bosma, K. Ruehl, A. Simmons, B. Gunawan, P. Lomonaco, and C. Kelley, “`WEC-Sim Phase 1 Validation Testing – Experimental Setup and Initial Results `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[15] K. Ruehl, C. Michelen, B. Bosma, and Y.-H. Yu, “`WEC-Sim Phase 1 Validation Testing – Numerical Modeling of Experiments `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[16] S. Sirnivas, Y.-H. Yu, M. Hall, and B. Bosma, 2016, “`Coupled Mooring Analyses for the WEC-Sim Wave Energy Converter Design Tool `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[17] E. Quon, A. Platt, Y.-H. Yu, and M. Lawson, 2016, “`Application of the Most Likely Extreme Response Method for Wave Energy Converters `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[18] R. So, C. Michelen, B. Bosma, P. Lenee-Bluhm, and T. K. A. Brekken, “`Statistical Analysis of a 1:7 Scale Field Test Wave Energy Converter Using WEC-Sim `_,” IEEE Transactions on Sustainable Energy, vol. 8, no. 3, pp. 1118–1126, Jul. 2017. + +[19] J. Van Rij, Y.-H. Yu, and Y. Guo, “`Structural loads analysis for wave energy converters `_,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017. + +[20] Y.-H. Yu and D. Jenne, “`Analysis of a wave-powered, reverse-osmosis system and its economic availability in the United States `_,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017. + +[21] J. Ringwood et al., “`A competition for WEC control systems `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[22] F. Wendt et al., “`International Energy Agency Ocean Energy Systems Task 10 Wave Energy Converter Modeling Verification and Validation `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[23] Y. Guo, Y.-H. Yu, and J. van Rij, “`Inclusion of structural flexibility in design load analysis for wave energy converters `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[24] N. Tom, K. Ruehl, and F. Ferri, “`Numerical model development and validation for the WECCCOMP control competition `_,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018. + +[25] Y.-H. Yu, N. Tom, and D. Jenne, “`Numerical analysis on hydraulic power take-off for wave energy converter and power smoothing methods `_,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018. + +.. TODO This list of publications only goes through 2018 + + +News Articles +^^^^^^^^^^^^^ + +* August 2013 – Sandia National Laboratories, `Sandia-NREL Wave Energy Converter (WEC)-Sim Development Meeting `_ + +* April 2014 – Sandia National Laboratories, `WEC-Sim Code Development Meeting at the National Renewable Energy Laboratory `_ + +* July 2014 – Sandia National Laboratories, `Sandia, NREL Release Wave Energy Converter Modeling and Simulation Code: WEC-Sim `_ + +* August 2014 – NASA’s Jet Propulsion Laboratory, `NASA helps harness an ocean of energy `_ + +* November 2014 – Renewable Energy World, `Marine Energy Making Waves on Both Sides of the Pond `_ + +* April 2015 – Tidal Energy Today, `NREL, SNL release update for WEC simulator `_ + +* May 2015 – US Department of Energy, `Revamped Simulation Tool to Power Up Wave Energy Development `_ + +* July 2015 - Tidal Energy Today, `US wave energy simulation team wins COER award `_ + +* September 2015 - Sandia Wind & Water Power Newsletter, `WEC-Sim Leveraged to Model Floating Offshore Wind Experiments, and PTO-Sim: A Power Performance Module for WEC-Sim `_ + +* October 2015 – Windpower Engineering, `WEC-Sim leveraged to model floating offshore wind experiments `_ + +* October 2015 – OpenORE, `WEC3: codes that work `_ + +* October 2015 – OpenORE, `WEC-Sim Version 1.2 `_ + +* December 2015 – Oregon State University, O.H. Hinsdale Wave Research Laboratory, `Wave Energy Converter Simulator: WEC-Sim `_ + +* February 2016 - Tidal Energy Today, `US National Labs organize WEC-Sim training course `_ + +* April 2016 - Tidal Energy Today, `Open-source WEC-Sim testing moves forward `_ + +* April 2016 - US Department of Energy, `EERE Success Story—Open-Source Testing Reaches New Milestone for Wave Energy `_ + +* November 2016 – Oregon State University, College of Engineering, `Ripples upon ripples `_ + +* April 2017 - Tidal Energy Today, `Sandia Labs sets up wave energy webinars `_ + +* May 2017 - Tidal Energy Today, `Video: US national labs share wave modeling know-how `_ + +* November 2017 - MATLAB Newsletter, `Modeling and Simulating Next-Generation Wave Farm Technology `_ + +* December 2017 - NUI Maynooth Centre for Ocean Energy Research, `WEC Control Competition (WECCCOMP) `_ + +.. TODO This list of publications only goes through 2017 + +* June 2020 - NREL, `Wave Energy Modeling Tool Helps Design Tomorrow's Tech `_ + +* May 2021 - Offshore Energy, `WEC-Sim to support NASA’s lunar test flight `_ + +* October 2021 - R&D World, `WEC-Sim wins 2021 R&D 100 Award for Software/Service `_ + +* November 2021 - Testing & Expertise for Marine Energy (TEAMER), `WEC-Sim established as TEAMER test facility for numerical modeling `_ + +* January 2022 - `Award-Winning Simulation Software Helps NASA and Close to 100 Wave Energy Developers Improve Sea-Faring Technology `_ + +* March 2022 - Department of Energy Water Power Technologies Office (DOE WPTO), `Open-Source Wave Energy WEC-Sim Software Receives R&D 100 Award and Contributes to Space Exploration `_ + +* July 2022 - R&D World, `R&D 100 winner of the day: WEC-Sim `_ + diff --git a/dev/_sources/introduction/release_notes.rst.txt b/dev/_sources/introduction/release_notes.rst.txt new file mode 100644 index 000000000..e80ddcac9 --- /dev/null +++ b/dev/_sources/introduction/release_notes.rst.txt @@ -0,0 +1,735 @@ +.. _intro-release-notes: + +Release Notes +============= + +.. _intro-citation: + +Citing WEC-Sim +------------------------ + +To cite WEC-Sim, please use the citation for WEC-Sim software release and/or cite the following WEC-Sim publication. + + +`WEC-Sim v6.1 `_ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. NOTE: citation needs to be revised for each release, author order should reflect the Zenodo DOI. + +[1] Kelley Ruehl, Adam Keester, Dominic Forbush, Jeff Grasberger, Salman Husain, Jorge Leon, David Ogden, and Mohamed Shabara, "WEC-Sim v6.1". Zenodo, September 16, 2024. https://doi.org/10.5281/zenodo.13770349. + +.. NOTE: citation needs to be revised for each release, author order should reflect the Zenodo DOI. + +.. code-block:: none + + @software{wecsim, + author = {Kelley Ruehl, + Adam Keester, + Dominic Forbush, + Jeff Grasberger, + Salman Husain, + Jorge Leon, + David Ogden, + Mohamed Shabara}, + title = {WEC-Sim v6.1}, + month = September, + year = 2024, + publisher = {Zenodo}, + version = {v6.1}, + doi = {10.5281/zenodo.10023797}, + url = {https://doi.org/10.5281/zenodo.13770349} + } + + +.. NOTE: badge does NOT need to be updated, doi badge is always for the lastest release + +.. image:: https://zenodo.org/badge/20451353.svg + :target: https://zenodo.org/badge/latestdoi/20451353 + + +Publication +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +[1] D. Ogden, K. Ruehl, Y.H. Yu, A. Keester, D. Forbush, J. Leon, N. Tom, "Review of WEC-Sim Development and Applications" in Proceedings of the 14th European Wave and Tidal Energy Conference, EWTEC 2021, Plymouth, UK, 2021. + + +`WEC-Sim v6.1 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* Update docs on main by @salhus in `#1031 `_ + +* Save mooring library to R2020b by @akeeste in `#1040 `_ + +* Update readAQWA.m by @salhus in `#1096 `_ + +* Update plotRadiationIRF.m by @AlufaSam in `#1102 `_ + +* Update readNEMOH.m for compatibility with NEMOH v3.0 by @nathanmtom in `#1105 `_ + +* Remove direct github installations from docs environment by @H0R5E in `#1149 `_ + +* Exclude R2020b and R2021a from Windows test runners by @H0R5E in `#1166 `_ + +* Add BEMIO cleanup function by @dforbush2 in `#1076 `_ + +* Remove dead code from wecSim.m by @akeeste in `#1170 `_ + +* Update wecSim.m to new MoorDyn dll by @jtgrasb in `#1177 `_ + +* Merge main commits to dev by @jtgrasb in `#1183 `_ + +* Port testing PR #1186 to main by @H0R5E in `#1187 `_ + +* Add R2023b to Windows tests by @H0R5E in `#1186 `_ + +* Nemoh v3.0.2 Examples by @MShabara in `#1204 `_ + +* Update paraview docs by @jtgrasb in `#1227 `_ + +* Update default branch to main by @akeeste in `#1235 `_ + +* Apply #1235 and #1241 to dev branch by @H0R5E in `#1240 `_ + +* PTO Extension Feature by @Allison-File in `#1198 `_ + +* Updating tests on main and dev by @kmruehl in `#1250 `_ + +* Updating WEC-Sim Issue Templates by @kmruehl in `#1247 `_ + +* Enable WEC-Sim to use MoorDyn v2 capabilities by @jtgrasb in `#1212 `_ + +* Add missing mask initialization line in spherical constraint by @akeeste in `#1264 `_ + +* Update readCAPYTAINE.m to read Khs from .nc by @salhus in `#1263 `_ + +* Update readCapytaine - fix reading multiple bodies with <6 dofs by @akeeste in `#1274 `_ + +* Reposition % for readability by @Gusmano-2-OSU in `#1272 `_ + +* Update waveSpread calculation in irregular waves by @dforbush2 in `#1290 `_ + +* Add new examples for updated version of NEMOH (NEMOHv3.0.2) by @ashleynchong in `#1226 `_ + +* Pull main into dev by @kmruehl in `#1297 `_ + +* Expand regression tests by @akeeste in `#1273 `_ + +* BEMIO Unit Updates by @jniffene in `#1296 `_ + +* Speed up writeBEMIOH5 by @akeeste in `#1301 `_ + +* Update readAQWA.m by @jtgrasb in `#1253 `_ + +* Variable hydrodynamics by @akeeste in `#1248 `_ + +* Update readCapytaine - get Khs from .nc files when bodies have less than 6 DOFs by @akeeste in `#1275 `_ + +* Adds the QTFs to WEC-Sim by @MShabara in `#1242 `_ + +* QTF - Variable Hydro compatibility by @akeeste in `#1312 `_ + +* Resolve conflicts between variable hydro and GBM by @akeeste in `_ + +**Bug Fixes** + +* Update to MoorDyn to fix MoorDyn crashing MATLAB session. by @AlixHaider in `#1012 `_ + +* Fix Direct Drive PTO Output order by @jtgrasb in `#1095 `_ + +* Fix accelerator modes issue by @jtgrasb in `#1100 `_ + +* Bugfix for plotBEMIO bodies by @akeeste in `#1207 `_ + +* Fix to #1217, nonlinFK and body block changed by @dforbush2 in `#1220 `_ + +* Fix on pDis function call by @dforbush2 in `#1229 `_ + +* Bug fixes for WEC-Sim GUI and Run From Simulink features by @akeeste in `#1195 `_ + +* Fix sign bug in the Generator Equivalent Circuit Block in PTO-Sim - Rebase PR to main by @jleonqu in `#1236 `_ + +* Fix direct drive bugs by @jtgrasb in `#1256 `_ + +* Minor fix for formatting in Developer manual by @akeeste in `#1280 `_ + +* Bad BEMIO fcn fix by @dforbush2 in `#1289 `_ + +**New Contributors** + +* @AlixHaider made their first contribution in `#1012 `_ + +* @AlufaSam made their first contribution in `#1102 `_ + +* @Allison-File made their first contribution in `#1198 `_ + +* @Gusmano-2-OSU made their first contribution in `#1272 `_ + +* @ashleynchong made their first contribution in `#1226 `_ + +**Issues and Pull Requests** + +* `v6.1 Changelog `_ + +* \> 104 issues closed since v6.0 + +* \> 48 PRs merged since v6.0 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.13770349.svg + :target: https://doi.org/10.5281/zenodo.13770349 + + + +`WEC-Sim v6.0 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* initial commit largeXYDispOption by @dforbush2 in `#877 `_ + +* Update coordinate system figure by @JiaMiGit in `#931 `_ + +* Property validation for WEC-Sim objects by @jtgrasb in `#904 `_ + +* Dev: adding ampSpectraForWS function by @dforbush2 in `#907 `_ + +* Customizable DOFs for plotBEMIO by @akeeste in `#944 `_ + +* Calculation_of_Ainf_using_radiationIRF.m by @salhus in `#946 `_ + +* Update citation names by @akeeste in `#954 `_ + +* Update getDofNames() by @akeeste in `#957 `_ + +* included readCAPYTAINE() argument to explicitly define KH.dat & Hydro by @dav-og in `#962 `_ + +* Extract mask variable by @salhus in `#958 `_ + +* Add tests to check that SLX file versions do not exceed R2020b by @H0R5E in `#919 `_ + +* Products of Inertia in WEC-Sim by @akeeste in `#981 `_ + +* Pull bug fixes #954, #999, #1002 from master into dev by @akeeste in `#1011 `_ + +* updating readNEMOH based on #983 by @kmruehl in `#990 `_ + +* Remove 'fixed' mass option from OSWEC input file by @jtgrasb in `#1024 `_ + +* Save the applied added mass time series by @akeeste in `#1023 `_ + +* Update tutorials by @kmruehl in `#1030 `_ + +* Control applications docs by @jtgrasb in `#1018 `_ + +* Update read- and writeBEMIOH5 to allow for pressure integration for mean drift by @nathanmtom in `#1046 `_ + +* Add function to read h5 file to hydro data structure by @jtgrasb in `#1048 `_ + +* Update radiationIRF.m by @nathanmtom in `#1045 `_ + +* Normalize quaternion to increase simulation robustness by @akeeste in `#1049 `_ + +* Plot bemio features by @jtgrasb in `#1034 `_ + +* Updates to Morison Element Implementation by @nathanmtom in `#1052 `_ + +* Moving PTO-Sim to main WEC-Sim library by @jleonqu in `#1057 `_ + +* Add windows runner to dev branch unit test workflow by @H0R5E in `#1061 `_ + +* Update docs dependencies by @H0R5E in `#1080 `_ + +* Type property pto sim by @jleonqu in `#1064 `_ + +* Added mass updates by @akeeste in `#1058 `_ + +* Feature paraview by @agmoore4 in `#1081 `_ + +* Paraview documentation hyperlink fix by @agmoore4 in `#1093 `_ + +* use capytaine v2 to compute hydrostatics by @dav-og in `#1092 `_ + +* Update paraview doc images by @jtgrasb in `#1098 `_ + +* readNEMOH update to be compatible with v3.0.0 release (but not QTF) by @nathanmtom in `#1087 `_ + +* Add simple direct drive PTO model by @jtgrasb in `#1106 `_ + +* Control+pto docs by @jtgrasb in `#1108 `_ + +* MOST Capabilities - Continuation by @jtgrasb in `#1127 `_ + +* Implement an FIR filter to calculate radiation forces by @salhus in `#1071 `_ + +* Updating documentation to include links for the Advanced Features Web by @jleonqu in `#1126 `_ + +* Multiple Wave Spectra by @salhus in `#1130 `_ + +* Update WECSim_Lib_Body_Elements.slx for N Waves Applications by @salhus in `#1133 `_ + +* Update to MoorDyn v2 by @RyanDavies19 in `#1134 `_ + +* Updating WEC-Sim tests for dev branch by @kmruehl in `#1142 `_ + +**Bug Fixes** + +* Remove fixed mass option by @akeeste in `#856 `_ + +* Move run('stopWecSim') to wecSim.m by @jtgrasb in `#885 `_ + +* Pull bug fixes into dev by @akeeste in `#900 `_ + +* Save slx files in 2020b fixes #920 by @jtgrasb in `#923 `_ + +* Fix readCAPYTAINE by @jtgrasb in `#884 `_ + +* Fixes saveViz feature for elevation import by @jtgrasb in `#929 `_ + +* Fix wave elevation import with rampTime = 0 by @jtgrasb in `#917 `_ + +* readCapytaine_fixes_for_reading_dataformats_correctly by @salhus in `#947 `_ + +* Pull #954 into dev by @akeeste in `#955 `_ + +* Bug fix for direction in readCapytaine by @akeeste in `#999 `_ + +* Fix sign bug reported on issue #993 by @jleonqu in `#102 `_ + +* Dev: reverts PR 910, fixing error in nonLinearBuoyancy by @dforbush2 in `#1017 `_ + +* Fix the transpose of linear restoring matrix to make roll mode rows to be 0 by @salhus in `#1032 `_ + +* Bugfix resolving documentation build error by @kmruehl in `#1059 `_ + +* fix_readWAMIT_and_writeBEMIOh5 by @salhus in `#1065 `_ + +* Pulling master bugfixes into dev by @kmruehl in `#1101 `_ + +* Bug fixes for v6.0 by @akeeste in `#1136 `_ + +* Path fix for BEMIO example by @akeeste in `#1144 `_ + +**New Contributors** + +* @JiaMiGit made their first contribution in `#931 `_ + +* @agmoore4 made their first contribution in `#1081 `_ + +* @RyanDavies19 made their first contribution in `#1134 `_ + + +**Issues and Pull Requests** + +* \>130 issues closed since v5.0.1 + +* \>74 PRs merged since v5.0.1 + +* `v6.0 Changelog `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.10023797.svg + :target: https://doi.org/10.5281/zenodo.10023797 + + +`WEC-Sim v5.0.1 `_ +-------------------------------------------------------------------------------- + +**New Features** + +This is a bug fix release. New features since the previous release are not included. + +**Bug Fixes** + +* Fix saveViz by @jtgrasb in `#866 `_ + +* Fix typo in docs. by @mancellin in `#898 `_ + +* Update documentation tutorials to fix OSWEC inertia by @jtgrasb in `#894 `_ + +* CI: Split docs jobs | Add color to docs logs | Cancel runs on new push | Add 2021b to MATLAB versions by @H0R5E in `#862 `_ + +* Mac path fixes and make outputDir public by @ahmedmetin in `#874 `_ + +* wecSimPCT Fix (Master) by @yuyihsiang in `#870 `_ + +* Fix image bug in PTO-Sim in Library Browser by @jleonqu in `#896 `_ + +* update to v5.0 citation by @akeeste in `#911 `_ + +* fix non-linear hydro by @dforbush2 in `#910 `_ + +* Pull dev bugfixes into master by @akeeste @jtgrasb in `#950 `_ (includes `#929 `_ `#917 `_ `#884 `_ by @jtgrasb) + +**New Contributors** + +* @mancellin made their first contribution in `#898 `_ + +* @ahmedmetin made their first contribution in `#874 `_ + +**Issues and Pull Requests** + +* \>52 issues closed since v5.0 + +* \>23 PRs merged since v5.0 + +* `v5.0.1 Changelog `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7121186.svg + :target: https://doi.org/10.5281/zenodo.7121186 + + +`WEC-Sim v5.0 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* Refactoring classes and properties @kmruehl in `#803 `_, `#822 `_, `#828 `_, `#832 `_, @akeeste in `#838 `_ + +* Refactoring docs by @kmruehl in `#840 `_ + +* Refactor BEMIO functions, tests, and documentation @akeeste in `#790 `_, `#812 `_, @H0R5E in `#839 `_, @dav-og in `#806 `_ + +* Run from sim updates by @akeeste in `#737 `_ + +* Allow binary STL files by @akeeste in `#760 `_ + +* Update Read_AQWA and AQWA examples by @jtgrasb in `#761 `_, `#779 `_, `#797 `_, `#831 `_ + +* Rename plotWaves by @jtgrasb in `#765 `_ + +* Update to normalize to handle sorting mean drift forces by @nathanmtom in #808 #809 + +* Remove passiveYawTest.m by @jtgrasb in `#807 `_ + +* Wave class wave gauge update by @nathanmtom in `#801 `_ + +* New pto sim lib by @jleonqu in `#821 `_ + +* Warning/Error flags by @jtgrasb in `#826 `_ + +* Add Google Analytics 4 by @akeeste in `#864 `_ + +**Documentation** + +* Update WEC-Sim's Developer Documentation for the Morison Element Implementation by @nathanmtom in `#796 `_ + +* Update response class API by @akeeste in `#802 `_ + +* Doc_auto_gen_masks by @salhus in `#842 `_ + +* Move documentation compilation to GitHub Actions by @H0R5E in `#817 `_ + +* Add branch build in docs workflow for testing PRs by @H0R5E in `#834 `_ + +* Update the WEC-Sim Theory Documentation to Clarify Wave Power Calculation by @nathanmtom in `#847 `_ + +* Update documentation on mean drift and current by @akeeste in `#800 `_ + +**Bug Fixes** + +* Fix cable library links. Resolves #770 by @akeeste in #774 #775 + +* Fix rate transition error by @akeeste in `#799 `_ + +* Fix cable implementation by @dforbush2 in `#827 `_ + +* PTO-Sim bug fix by @jleonqu in `#833 `_ + +* Bug fix for the regular wave power full expression by @nathanmtom in `#841 `_ + +* Fix documentation on dev branch by @H0R5E in `#816 `_ + +* Bug fix: responseClass reading the MoorDyn Lines.out file too early, resolves `#811 `_ by @akeeste in `#814 `_ + +**Issues and Pull Requests** + + * \>52 issues closed since v4.4 + + * \>44 PRs merged since v4.4 + + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.6555137.svg + :target: https://doi.org/10.5281/zenodo.6555137 + + + +`WEC-Sim v4.4 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added WEC-Sim Library blocks for cable, spherical constraint, and spherical pto `#712 `_ `#675 `_ + + * Added feature to add/remove WEC-Sim path and create temp directory for each run `#685 `_ `#686 `_ + + * Updated WEC-Sim Library to 2020b and saved Simulink Library Functions to (`*.m`) files `#686 `_ `#654 `_ + + * Split WEC-Sim Library into sublibraries for each class `#720 `_ + + * Restructured WEC-Sim Continuous Integration tests into class-based tests `#620 `_ + + * Added wave visualization with wave markers and post-processing `#736 `_ `#678 `_ + + * Moved nonlinear hydrodynamics and morison elements to properties of the Body Class `#692 `_ + +**Documentation** + + * Added developer manual content for WEC-Sim Library, Run from Simulink, Simulink Functions, Added Mass, Software Tests `#728 `_ + + * Added user manual content for troubleshooting WEC-Sim `#641 `_ + + * Updated content for PTO-Sim, ParaView, WEC-Sim Applications and Tutorials `#668 `_ `#642 `_ `#649 `_ `#643 `_ + + * Added multi-version documentation for ``master`` and ``dev`` branches `#630 `_ + + +**Bug Fixes** + + * Resolved bug with macro for ParaView 5.9 `#459 `_ + + * Resolved bugs in BEMIO with Read_Capytaine, READ_AQWA, and Write_H5 functions `#727 `_ `#694 `_ `#636 `_ + + * Resolved bug with variable time-step solver `#656 `_ + +Issues and Pull Requests** + + * \> 57 issues closed since v4.3 + + * \> 54 PRs merged since v4.3 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.5608563.svg + :target: https://doi.org/10.5281/zenodo.5608563 + + + +`WEC-Sim v4.3 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added the ability for WEC-Sim to be run directly from Simulink `#503 `_ `#512 `_ `#548 `_ + + * Added capability to read Capytaine (.nc) output. Includes examples of running Capytaine with hydrostatics `#464 `_ + + * Created a more accurate infinite frequency added mass calculation `#517 `_ + + * Added ability for setInitDisp to intake multiple initial rotations `#516 `_ `#586 `_ + +**Documentation** + + * Restructured into four manuals: introduction, theory, user and development `#455 `_ `#557 `_ + + * Update of code structure section `#455 `_, links `#649 `_ , diagrams `#643 `_, paraview `#642 `_, + + * Added section on suggested troubleshooting `#641 `_ + +**Continuous integration tests** + + * Overhaul and speed up of tests `#508 `_ `#620 `_ + + * Extension of tests to the applications cases `#7 `_ + +**Clean up** + + * Created issue templates on GitHub `#575 `_ `#634 `_ + + * Updated Morison Element warning flags `#408 `_ + + * Clean up response class methods `#491 `_ `#514 `_ + + * Clean up paraview output functions `#490 `_ + +**Bug Fixes** + + * Paraview macros and .pvsm files `#459 `_ + + * BEMIO read mean drift force in R2021a `#636 `_ + + * PTO-Sim calling workspace `#632 `_ + + * Combine_BEM Ainf initialization `#611 `_ + +**Issues and Pull Requests** + + * \> 100 issues closed since v4.2 + + * \> 45 PRs merged since v4.2 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.5122959.svg + :target: https://doi.org/10.5281/zenodo.5122959 + + + +`WEC-Sim v4.2 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added normal/tangential option for Morison Force (``simu.morisonElement = 2``) `#408 `_ + + * Added Drag Body (``body(i).nhBody=2``) `#423 `_ `#384 `_ + + * WEC-Sim output saved to structure `#426 `_ + + * Added WEC-Sim parallel execution for batch runs (``wecSimPCT``) using MATLAB parallel computing toolbox `#438 `_ + + * Added end stops to PTOs `#445 `_ + +**Documentation** + + * Automatically compile docs with TravisCI `#439 `_ + + * Generate docs for master and dev branches of WEC-Sim + +**Bug Fixes** + + * Resolved convolution integral bug for body-to-body interactions `#444 `_ + + * Resolved PTO-Sim bug for linear to rotary conversion blocks `#247 `_ `#485 `_ + + * Resolved variant subsystem labeling bug `#486 `_ `#479 `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.4391330.svg + :target: https://doi.org/10.5281/zenodo.4391330 + + + +`WEC-Sim v4.1 `_ +-------------------------------------------------------------------------------- + +* Added passive yaw +* Revised spectral formulations per IEC TC114 TS 62600-2 Annex C +* Updated examples on the `WEC-Sim_Applications `_ repository +* Added unit tests with Jenkins +* Added API documentation for WEC-Sim classes + +* Merged Pull Requests + + * Updated BEMIO for AQWA version comparability `#373 `_ + + * Extended capabilities for ParaView visualization `#355 `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3924765.svg + :target: https://doi.org/10.5281/zenodo.3924765 + + +`WEC-Sim v4.0 `_ +-------------------------------------------------------------------------------- + +* Added mean drift force calculation +* Added generalized body modes for simulating flexible WEC devices and for structure loading analysis +* Updated BEMIO for mean drift force and generalized body modes + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3827897.svg + :target: https://doi.org/10.5281/zenodo.3827897 + + + +`WEC-Sim v3.1 `_ +-------------------------------------------------------------------------------- + +* Added wave gauges for three locations +* Added command line documentation for objects +* Added error and warning flags +* Converted Morison Elements to script instead of block +* Converted WEC-Sim and PTO-Sim library files back to slx format +* Fixed plot error in MATLAB 2018b + + +`WEC-Sim v3.0 `_ +-------------------------------------------------------------------------------- + +* Added option of :ref:`equal energy spacing ` for irregular waves (default) +* Added option to calculate the wave elevation at a location different from the origin +* Added option to define :ref:`gamma for JONSWAP spectrum ` +* Improved the WEC-Sim simulation speed when using rapid-acceleration mode +* Fixed path bug in BEMIO for LINUX/OSX users + +* Changed/Added following WEC-Sim parameters + + * waves.randPreDefined -> :ref:`waves.phaseSeed ` + + * waves.phaseRand -> waves.phase + + * simu.dtFeNonlin -> :ref:`simu.dtNL ` + + * simu.rampT -> :ref:`simu.rampTime ` + + * Added simu.dtME to allow specification of :ref:`Morison force time-step ` + + +`WEC-Sim v2.2 `_ +-------------------------------------------------------------------------------- + +* Added option to save pressure data for nonlinear hydro (`simu.pressureDis`) +* Update to moorDyn parser (doesn't require line#.out) + +* Repository cleanup + + * Implemented `Git LFS `_ for tracking ``*.h5`` files + + * Added `WEC-Sim Application repository `_ as a `submodule `_ + + * Moved `moorDyn `_ to its own repository + + * Removed publications from repository, :ref:`available on website ` + + + +`WEC-Sim v2.1 `_ +-------------------------------------------------------------------------------- + +* Added MATLAB version of BEMIO (to replace python version) +* Added variable time-step option with 'ode45' by @ratanakso +* Update to MCR, option to not re-load ``*.h5`` file by @bradling +* Update to waveClass to allow for definition of min/max wave frequency by @bradling + + +`WEC-Sim v2.0 `_ +-------------------------------------------------------------------------------- + +* Updated WEC-Sim Library (generalized joints/constraints/PTOs) +* Body-to-body interactions for radiation forces +* Morison forces +* Batch run mode (MCR) +* Mooring sub-library implemented in mooringClass (no longer in body or joint) +* More realistic PTO and mooring modeling through PTO-Sim and integration with MoorDyn +* Non-hydrodynamic body option +* Visualization using ParaView + + +`WEC-Sim v1.3 `_ +-------------------------------------------------------------------------------- +* Added Morison Elements +* Body2Body Interactions +* Multiple Case Runs (wecSimMCR) +* Moordyn +* Added Non-hydro Bodies +* Morison Forces +* Joint Updates +* Visualization with Paraview + +`WEC-Sim v1.2 `_ +-------------------------------------------------------------------------------- +* Nonlinear Froude-Krylov hydrodynamics and hydrostatics +* State space radiation +* Wave directionality +* User-defined wave elevation time-series +* Imports nondimensionalized BEMIO hydrodynamic data (instead of fully dimensional coefficients) +* Variant Subsystems implemented to improve code stability (instead of if statements) +* Bug fixes + + +`WEC-Sim v1.1 `_ +-------------------------------------------------------------------------------- +* WEC-Sim v1.1, `available on GitHub `_ +* Improvements in code stability through modifications to the added mass, radiation damping calculations, and impulse response function calculations +* Implementation of state space representation of radiation damping convolution integral calculation +* New hydrodynamic data format based on :ref:`BEMIO ` output, a python code that reads data from WAMIT, NEMOH, and AQWA and writes to the `Hierarchical Data Format 5 `_ (HDF5) format used by WEC-Sim. +* Documentation available on WEC-Sim Website + +`WEC-Sim v1.0 `_ +-------------------------------------------------------------------------------- +* Initial release of WEC-Sim (originally on OpenEI, now on GitHub) +* Available as a static download +* Documentation available in PDF + + diff --git a/dev/_sources/most/acknowledgements.rst.txt b/dev/_sources/most/acknowledgements.rst.txt new file mode 100644 index 000000000..364043d5a --- /dev/null +++ b/dev/_sources/most/acknowledgements.rst.txt @@ -0,0 +1,14 @@ +.. _most-acknowledgements: + +Acknowledgements +================ + +MOST software has been developed by the `MOREnergy Lab `_ of Politecnico di Torino, Italy. + +.. figure:: IMAGE_LogoPolitecnicodiTorino.jpg + :width: 40% + +.. figure:: IMAGE_LogoMOREnergyLab.png + :width: 40% + +| \ No newline at end of file diff --git a/dev/_sources/most/advanced_features.rst.txt b/dev/_sources/most/advanced_features.rst.txt new file mode 100644 index 000000000..026b720dd --- /dev/null +++ b/dev/_sources/most/advanced_features.rst.txt @@ -0,0 +1,328 @@ +.. _most-advanced_features: + +***************** +Advanced Features +***************** + +In this section, a more detailed look will be taken at some of the operational aspects of the new features introduced with MOST. Specifically, we will +focus on the pre-processing part in which all the data necessary for simulating Floating Offshore Wind Turbines (FOWT) and hybrid platforms are obtained. +For the simulation and post-processing part, please refer to the theory section of MOST (:ref:`most-theory`) and the advanced features of WEC-Sim (:ref:`user-advanced-features`). + + + +MOST-IO +======= +The pre-processing phase of MOST takes place through the use of the ``mostIO.m`` script in the ''mostData'' subfolder, through which the following scripts +are launched (in this order): + +* ``run_turbsim.m`` : creation of the data structure describing the input wind speeds; +* ``Create_Mooring_Matrix.m`` : creation of the look-up table describing the mooring forces; +* ``BladeData.m`` : creation of the data structure concerning the characteristics of the airfoils constituting the turbine blades; +* ``WTproperties.m`` : creation of the data structure concerningo the geometric and inertial characteristics of the wind turbine; +* ``Steady_States.m`` : computation of the steady-state values of certain quantities of interest when the average wind speed varies and used for the calculation of some quantities concerning the control logic; +* ``Controller.m`` : creation of the data used to simulate the control logics (Baseline :cite:`Hansen2005` or ROSCO :cite:`abbas2022reference`) +* ``AeroLoads.m`` : creation of the aerodynamic loads look-up table (acting on the blades root). + +In the next subsections, MOST features will be discussed in detail, in particular, the settings to be provided to obtain the required data and the +operations performed in the various codes will be explained. + + +Wind Features +------------- +Wind speed can be defined by choosing between the two options of the wind class: + +* **Constant** wind conditions +* **Turbulent** wind conditions + +The constant wind speed is constant in time and space while the second option includes the temporal and spatial turbulence of the wind. Below is an +image of the Variant Subsystem through which one of the two wind options can be enabled. + +.. figure:: IMAGE_wind_Choice.png + :width: 60% + :align: center + +| + +The simulation of the wind turbine for turbulent wind conditions requires the generation of a look-up table which relates the temporal and spatial +variation of wind speed on the wind turbine rotor plane (yz plane). Therefore the wind speed is discretized for 3 variables (2 spatial parameters, +y and z, and the time). The look-up table is generated using ``run_turbsim.m`` which computes turbulent wind field based on `Turbsim `_ +executable. Mean wind speed can be defined in ``run_turbsim.m`` script, while other parameters can be set-up in the ``Turbsim_inputfile.txt`` file, +the main ones are: + + +========================================= ========================================================================== +**Name** **Description** +``NumGrid_Z`` Vertical grid-point matrix dimension +``NumGrid_Y`` Horizontal grid-point matrix dimension +``TimeStep`` Time step [s] +``AnalysisTime`` Length of analysis time series [s] +``UsableTime`` Usable length of output time series [s] +``HubHt`` Hub height [m] +``GridHeight`` Grid height [m] +``GridWidth`` Grid width [m] +``VFlowAng`` Vertical mean flow (uptilt) angle [deg] +``HFlowAng`` Horizontal mean flow (skew) angle [deg] +``TurbModel`` Turbulence model ("IECKAI"=Kaimal, "IECVKM"=von Karman, "GP_LLJ", "NWTCUP", "SMOOTH", "WF_UPW", "WF_07D", "WF_14D", "TIDAL") +``IECstandard`` Number of IEC 61400-x standard (x=1,2, or 3 with optional 61400-1 edition number) +``IECturbc`` IEC turbulence characteristic ("A", "B", "C" or the turbulence intensity in percent) +``IEC_WindType`` IEC turbulence type ("NTM"=normal, "xETM"=extreme turbulence, "xEWM1"=extreme 1-year wind, "xEWM50"=extreme 50-year wind, where x=wind turbine class 1, 2, or 3) +``ETMc`` IEC Extreme Turbulence Model "c" parameter [m/s] +``WindProfileType`` Wind profile type ("JET";"LOG"=logarithmic;"PL"=power law;"H2L"=Log law for TIDAL spectral model;"IEC"=PL on rotor disk, LOG elsewhere) +``RefHt`` Height of the reference wind speed [m] +``PLExp`` Power law exponent [-] +``Z0`` Surface roughness length [m] +``PC_UW`` Hub mean u'w' Reynolds stress +``PC_UV`` Hub mean u'v' Reynolds stress +``PC_VW`` Hub mean v'w' Reynolds stress +========================================= ========================================================================== + +A detailed description of using Turbsim is given here :cite:`kelley2005overview`. + + +Aerodynamic wind loads calculation in the Simulink model requires the average wind speed for each blade. This is found by computing the average wind +speed for four discretized points along the blade length during the simulation. Relative wind speed for each blade is computed including the influence +of the horizontal hub speed and the pitch and yaw rotation of the hub. + + + +Mooring Features +---------------- + +MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. Specifically, the mooring look-up table +simulates a mooring system consisting of a certain number of lines suspended between two points (anchor and fairlead) and angularly equispaced. +This option is based on the catenary equations similarly to the open-source code MAP++ :cite:`MAP`. + + +In the simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outpus (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called "moor_matrix" and created through the ``Create_Mooring_Matrix.m`` script, in which the following +variables are specified: + +* Water density (kg/m^3): :code:`rho_water` +* Gravity acceleration (m/s^2): :code:`gravity` +* Water depth (m): :code:`depth` +* Mooring line diameter (m): :code:`d` +* Linear mass (kg/m): :code:`linear_mass` +* Number of lines: :code:`number_lines` +* Fairlead and anchor positions of the first line (m): :code:`nodes` +* Mooring lines unstretched length (m): :code:`L` +* Sectional stiffness (N): :code:`EA` +* Seabed friction coefficient: :code:`CB` + +In addition, the user can specify the domain of the look-up tables, specifically: + +* Amplitude and discretisation along surge direction (m): :code:`X` +* Amplitude and discretisation along sway direction (m): :code:`Y` +* Amplitude and discretisation along heave direction (m): :code:`Z` +* Amplitude and discretisation around roll axis (rad): :code:`RX` +* Amplitude and discretisation around pitch axis (rad): :code:`RY` +* Amplitude and discretisation around yaw axis (rad): :code:`RZ` + + +The code for generating the "moor_matrix" structure at first calculates the positions of the fairleads and anchors of the other lines, +in accordance with the specified number and in an angularly equispaced manner, after which, for each combination of the inputs (surge, +sway, heave, roll, pitch, and yaw) it calculates the new positions of the fairleads. Given these positions, for each line it performs a +numerical optimization by which the vertical force and the horizontal force (along the projection of the line in the xy plane) are +calculated. Specifically, by means of the typical catenary equations, it is possible to calculate (knowing the characteristics of a line) +the above-mentioned vertical and horizontal forces having as input the vertical and horizontal distances between the two ends of the +line, so, in this case the optimization procedure searches for forces such that the distances are as close as possible to those +specified. Once the vertical and horizontal forces are calculated for each line, the resulting force and torque in the global reference +frame are applied to the origin of the reference frame attached to the structure. + + + +Wind Turbine Features +--------------------- + +The wind turbine is modelled as a multi-body system including the tower, the nacelle, the hub, and the blades. The properties of each wind turbine component +are defined in two structures that can be generated using the provided ``BladeData.m`` and ``WTproperties.m`` MATLAB codes. In the first, the +variables concerning the blades are defined, specifically (see figure below for a better comprehension): + +* Blade radius values for which other properties are defined: ``radius`` +* Value, for each specified radius, of the pre-bending distance out of the rotor plane: ``BlCrvAC`` +* Value, for each specified radius, of the pre-bending angle out of the rotor plane: ``BlCrvAng`` +* Value, for each specified radius, of the pre-bending distance in the rotor plane: ``BlSwpAC`` +* Value, for each specified radius, of the twist angle: ``twist`` +* Value, for each specified radius, of the chord: ``chord`` +* Index of the airfoil type corresponding to each specified radius: ``airfoil_index`` +* Matrix containing, for each type of airfoil existing, the values of lift, drag and torque coefficients as a function of angle of attack: ``airfoil`` + +The following figure :cite:`BladeGeometry` shows some of the values mentioned above. + +.. figure:: IMAGE_blade_geom.png + :width: 80% + :align: center + + +| + +In the second script, the geometric and inertial properties of the turbine components are defined. For each of them the mass and inertia are defined, +in addition, the following other variables must be entered (see figure below for a better comprehension): + + +* Tower offset position relative to sea water level (m): :code:`tower.offset` +* Tower height (m): :code:`tower.height` +* Tower relative center of mass (relative to tower offset) (m): :code:`tower.cog_rel` +* Nacelle relative center of mass (relative to tower top) (m): :code:`nacelle.cog_rel` +* Twr2Shft (deg): :code:`nacelle.Twr2Shft` +* Tilt angle (deg): :code:`nacelle.tiltangle` +* Overhang (m): :code:`hub.overhang` +* Hub height (m): :code:`hub.height` +* Hub radius (m): :code:`hub.Rhub` +* Precone angle (deg): :code:`hub.precone` +* Blades relative center of mass (relative to hub center) (m): :code:`blade.cog_rel` +* Blade discretization nodes to average the wind speed: :code:`blade.bladeDiscr` +* Generator efficiency: :code:`gen_eff` +* CAD file path + + +.. figure:: IMAGE_geometry.png + :width: 80% + :align: center + +| + +Once these dimensions are known, the positions of the centre of mass of each component in the inertial reference frame are calculated (origin at sea +level and at the centre of the tower, as far as the horizontal plane is concerned), as well as the total mass and inertia. + + + +Control Features +^^^^^^^^^^^^^^^^ + +In MOST there is the possibility of using two different wind turbine control logics (Baseline :cite:`Hansen2005` and ROSCO :cite:`abbas2022reference`) +and as explained in the :ref:`theory` the steps to be taken in order to obtain the data needed for their simulation are the calculation +of the stationary values and the calculation of the controller gains. The first task is performed by the script ``Steady_States.m`` in the subfolder +"Control". Specifically, through this, the stationary values of power, rotor speed, thrust force, generator torque and collective blade pitch angle are computed +for both of the aforementioned control logics. The following variables must be specified in the script: + +* Value of power produced under nominal conditions and under conditions where the wind speed is greater than the nominal one: :code:`Prated` + +* Wind speed at which power begins to be produced (and therefore at which the generator torque becomes non-zero): :code:`v_cutin` + +* Wind speed above which no power is produced, and the blades rotate to a safe position (feather condition): :code:`v_cutout` + +* Rated first try wind speed, meaning that the actual wind speed (probably close to this) will be calculated later: :code:`v_rated_try` + +* Rated first try rotor speed, meaning that the actual one (probably close to this) will be calculated later: :code:`omega_rated_try` + +* Wind speed discretization, which indicates how many stationary values will be calculate: :code:`v_discr` + +* Minimum allowed value of the rotor speed (setting used only for the calculation of stationary values related to the ROSCO controller): :code:`omega_min` + +* Boundary wind speed value between zone 1.5 (zone with constant and equal to minimum rotor speed) and zone 2 (zone with optimal tip speed ratio), this value is used only for the ROSCO controller: :code:`vw_R2in_try` + +* Ratio of the maximum allowed thrust to what there would be if no limits were imposed: :code:`max_Thrust_factor` + + +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal one (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is also the case of some turbine types for what concerns the ROSCO controller. +The first step performed in the code is the calculation of the actual nominal conditions (rated wind speed, rotor speed and blade pitch angle): by +means of a constrained optimisation, the values of wind speed, rotor speed and blade pitch angle are sought such that the first two are as close as +possible to those set for the first attempt, with the constraint of having a thrust not exceeding the maximum and a power output equal to the rated +one. In the case of the Baseline controller, the first constraint does not apply, in the case of the ROSCO controller, on the other hand, we first +calculate the nominal conditions without the thrust constraint, then calculate the maximum thrust by multiplying the nominal one by the thrust factor +defined in the settings and then repeat the calculation to find the correct nominal values. The optimisation relies on a function that calculates the +aerodynamic forces at the hub by solving the BEM (Blade Element Momentum) theory, for more information on how this function works see (:cite:`ning2014simple` , :cite:`Ning2015`). + +The second step, performed only in the case of ROSCO, involves finding the wind speed for which transition from zone 1.5 to zone 2 (see :cite:`abbas2022reference`) occurs. +In both zones it is desired to maximize power, but in zone 1.5 is where there is the additional constraint of minimum rotor speed. Here, to maximize +power, the rotor speed would need to be less than the minimum rotor speed, and to partially compensate for the resulting power deficit, a blade pitch +angle greater than zero is used. The search for the frontier wind speed is done by an optimization that looks for the wind speed for which the +difference between the rotor speed that maximizes power without imposing constraints equals the minimum wind speed. To find the rotor speed that +maximizes power for a given wind speed, a second nested optimization is used. + +Finally, the last step involves calculating the stationary values as the wind speed changes. It is performed by a constrained optimization through which +the rotor speed and blade pitch values are sought such that the power produced is maximized while maintaining it at or below the rated power and +respecting the maximum thrust limit. Once the rotor speed and blade pitch values have been found for each wind speed analysed, the steady-state +values of the other quantities of interest (power, thrust, and generator torque) are evaluated. + + +Once the steady-state values for the two control logics have been calculated, it is possible to build the data structures needed for controller +simulation by running the ``Controller.m`` script in the "Control" subfolder. In this script a few settings have to be defined, which can refer to +both logics or just the Baseline or ROSCO controller. + + +The common settings are as follows: + +* Maximum allowable torque rate: :code:`torqueMaxRate` + +* Maximum allowable blade pitch rate: :code:`thetaMaxRate` + +* Values needed to define the state space used to filter the rotor speed before providing this as input to the controllers: :code:`omegaFilter` + + +The settings only valid for ROSCO are: + +* Natural frequency of the electric generator torque control loop: :code:`wn_C` + +* Damping ratio of the electric generator torque control loop: :code:`csi_C` + +* Natural frequency of the blade pitch control loop: :code:`wn_theta_ROSCO` + +* Damping ratio of the blade pitch control loop: :code:`csi_theta_ROSCO` + +* Constants used in the "Set Point Smoothing" module: :code:`kb` and :code:`kt` + +* Gain related to the velocity (along the surge) of the nacelle, used to control floating wind turbines: :code:`KV` + +* Values needed to define the state space used to filter the wind speed before providing this as input to the controller: :code:`windFilter` + +* Values needed to define the transfer function used to filter the nacelle speed before providing this as input to the controller: :code:`pitchFilter` + +* Values needed to define the transfer function used as a filter in the "Set Point Smoothing" module: :code:`SPSFilter` + + +The settings only valid for Baseline are: + +* Natural frequency of the blade pitch control loop: :code:`wn_theta_BL` + +* Damping ratio of the blade pitch control loop: :code:`csi_theta_BL` + + + +Regarding the Baseline controller, at the operational level, the torque law is simply computed by creating a biunivocal relationship between the +steady-state (as wind speed changes) values of rotor speed and generator torque. As for the blade pitch loop, at first the value of +:math:`K_P^\prime` and :math:`K_I^\prime` are calculated (see :ref:`Baseline`), after which the power to pitch sensitivity, as a function of blade pitch angle, +is computed for each stationary point. To do this centered finite differences are used by calculating power via a function that solves the +aerodynamics via BEM theory. Finally, we perform quadratic regression of :math:`\frac{dP}{d\theta_{bl}}` so that we have, in simulation, a simple +relationship between blade pitch and power-to-pitch sensitivity. + + + +As for the ROSCO controller, however, at the operational level, in the script the :math:`A` and :math:`B_{\theta_{bl}}` matrices are calculated for +each wind speed for which stationary values were computed through centered finite differences; regarding the :math:`B_{T_{gen}}` matrix, it is +calculated only once since it is constant (see :ref:`ROSCO`). Once the matrices are known, the values of :math:`K_P` and :math:`K_I` for the two controls (generator +torque and blade pitch) are calculated. Finally, the minimum allowable blade pitch value is calculated using an optimization procedure; specifically, +for each wind speed in region 3 (a rotor speed equal to the nominal one is assumed in this region), the blade pitch angle such that the maximum thrust +occurs is found. It represents the minimum angle value that can be imposed, below which there will be a thrust greater than the maximum allowed. + + + +Aerodynamic Loads Features +^^^^^^^^^^^^^^^^^^^^^^^^^^ +The look-up tables of aerodynamic loads are generated using the ``AeroLoads.m`` script; the aerodynamic forces and torques are calculated as a function +of three input parameters: the wind speed, the difference between the rotor speed and the stationary rotor speed for that wind speed, and the difference +between the blade pitch angle and the steady-state angle for that wind speed. In order to calculate the required look-up tables, the user will need to +define the following variables: + +* Rotor speed discretization values: :code:`o_discr` +* Blade pitch discretization values: :code:`theta_discr` +* Discretization range of rotor speed values around steady-state one (rad/s): :code:`o_A` +* Discretization range of blade pitch values around steady-state one (rad): :code:`theta_A` + +The discretisation range is used to determine the aerodynamic loads near the steady states, which include all cases that are likely to be reached during +operating conditions. + + + + + +References +---------- + +.. bibliography:: ../most/MOST.bib + :style: unsrt + :labelprefix: D \ No newline at end of file diff --git a/dev/_sources/most/index.rst.txt b/dev/_sources/most/index.rst.txt new file mode 100644 index 000000000..3ecc83769 --- /dev/null +++ b/dev/_sources/most/index.rst.txt @@ -0,0 +1,17 @@ +.. _most: + +########### +MOST Manual +########### + +.. toctree:: + :maxdepth: 2 + + overview.rst + acknowledgements.rst + release_notes.rst + publications.rst + license.rst + introduction.rst + theory.rst + advanced_features.rst diff --git a/dev/_sources/most/introduction.rst.txt b/dev/_sources/most/introduction.rst.txt new file mode 100644 index 000000000..ae2946b42 --- /dev/null +++ b/dev/_sources/most/introduction.rst.txt @@ -0,0 +1,41 @@ +.. _most-introduction: + +Introduction +============ + +With MOST, it is possible to simulate Floating Offshore Wind Turbines (FOWTs) and hybrid platforms thanks to the development of a wind turbine model which can be coupled with the WEC-Sim library. MOST requires several user inputs similar to WEC-Sim including hydrodynamic bodies requiring hydrodynamic coefficients from Boundary Element Method (BEM) software (e.g. Nemoh, Wamit or Ansys Aqwa), mooring, constraints, and simulation input details. Differently to WEC-Sim, MOST also includes user inputs relative to the wind turbine and wind, which will be explained in the next sections. + + +Numerical codes added to WEC-Sim are the following: + +========================== ============================================================================================================================================================ +**File Type** **File name** +Pre-processing Executables ``mostIO.m``, ``run_turbsim.m``, ``Create_Mooring_Matrix.m``, ``BladeData.m``, ``WTproperties.m``, ``Steady_States.m``, ``Controller.m`` and ``AeroLoads.m`` +Post-Processing Functions ``userDefinedFunction.m`` +New MATLAB Classes ``windClass.m`` and ``windTurbineClass.m`` +MOST Simulink Library ``MOST_Lib.slx`` +========================== ============================================================================================================================================================ + +The pre-processing executables and post-processing function can be found in the WEC-Sim Applications MOST example while the new classes and Simulink library have been added to the WEC-Sim source directly. + +Existing WEC-Sim source code has also been modified to include further option features relative to the new capabilities. The following codes have been modified: + + +========================================= ====================================================================================================================================================================================================================================================================================================================================================== +**File name** **Description** +``initializeWecSim`` Modified to add functions relative to the wind, wind turbine, and new mooring blocks. New functions are created in each relative class to read data prepared during the pre-processing by the user. Control parameters are also added to give user choice of which control logic to be used. +``mooringClass`` It is now also possible to calculate mooring loads (static loads) using non-linear look-up tables computed during pre-processing and with system displacements as input. Compared to previous versions, the mooringClass now also has a function by means of which look-up tables are loaded from a file whose name is the new property called "lookupTableFile". +``postProcessWecSim`` + ``responseClass`` Modified to add wind turbine results in the WEC-Sim output structure. Examples of new outputs are the timeseries of wind turbine power, rotor speed, blade pitch, and nacelle acceleration. +========================================= ====================================================================================================================================================================================================================================================================================================================================================== + + + +The following diagram summarizes the workflow for the simulation of wave energy converters, which has now been updated to include the simulation of floating offshore wind turbines or hybrid devices. The portions of the code introduced with MOST are highlighted in grey, the portions executed by WEC-Sim codes in green, and what is carried out by external software in yellow. + + + +.. figure:: IMAGE_workflow.png + :align: center + :width: 80% + +| \ No newline at end of file diff --git a/dev/_sources/most/license.rst.txt b/dev/_sources/most/license.rst.txt new file mode 100644 index 000000000..1f9edc7c8 --- /dev/null +++ b/dev/_sources/most/license.rst.txt @@ -0,0 +1,23 @@ +.. _most-license: + +License +======= + +.. equivalent of this statement? "WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS)" + +The software is distributed under the Apache License 2.0. + + +Copyright +------------ + +.. literalinclude:: NOTICE_MOST + :language: text + + +Apache License 2.0 +------------------------- + +.. literalinclude:: ../../LICENSE + :language: text + diff --git a/dev/_sources/most/overview.rst.txt b/dev/_sources/most/overview.rst.txt new file mode 100644 index 000000000..427f3390b --- /dev/null +++ b/dev/_sources/most/overview.rst.txt @@ -0,0 +1,30 @@ +.. _most-overview: + +Overview +======== + +MOST (Matlab for Offshore Simulation Tool), is a simulation tool operating in the WEC-Sim environment for simulating floating offshore wind turbines, hybrid wind-wave energy converters, platforms with multiple turbines, etc. +MOST builds on WEC-Sim in MATLAB/Simulink to add ``windClass`` and ``windTurbineClass`` objects that can define a given turbine and weather conditions. +Currently, MOST supports single-tower, three-bladed, horizontal-axis wind turbines controlled by Baseline or ROSCO controllers and providing geometric and inertial data as input. + + +.. _most-developers: + +MOST Developers +--------------- +MOST is developed and maintained by the MORE Energy Lab, Politecnico di Torino, Italy. +The WEC-Sim+MOST coupling is a collaboration between the MORE Energy Lab and the WEC-Sim developers at Sandia National Laboratories and the National Renewable Energy Lab. + +Current members of the MOST development team include: + +* Giovanni Bracco (PI) +* Emilio Faraggiana +* Alberto Ghigo +* Davide Issoglio +* Ermando Petracca +* Massimo Sirigu + +.. TODO - list former MOST developers as appropriate + + + diff --git a/dev/_sources/most/publications.rst.txt b/dev/_sources/most/publications.rst.txt new file mode 100644 index 000000000..346af99c1 --- /dev/null +++ b/dev/_sources/most/publications.rst.txt @@ -0,0 +1,15 @@ +.. _most-publications: + +Publications +============ +.. TODO - enter any MOST theses, publications here. This is a historical list, whereas the release_notes only contains the most recent citation + +[1] M. Sirigu, E. Faraggiana, A. Ghigo, G. Bracco, “`Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody `_” Journal of Physics: Conference Series. Vol. 2257. No. 1. IOP Publishing, 2022. + +[2] E. Faraggiana, M. Sirigu, A. Ghigo, G. Bracco, G. Mattiazzo, “`An efficient optimisation tool for floating offshore wind support structures. `_” Energy Reports 8 (2022): 9104-9118.. + +[3] M. Sirigu, E. Faraggiana, A. Ghigo, E. Petracca, G. Bracco, G. Mattiazzo. “`Development of a simplified blade root fatigue analysis for floating offshore wind turbines. `_” Trends in Renewable Energies Offshore (2022): 935-941.. + +[4] Faraggiana, E., et al. “`An optimal design of the Hexafloat floating platform for offshore wind turbines. `_” Trends in Renewable Energies Offshore: Proceedings of the 5th International Conference on Renewable Energies Offshore (RENEW 2022, Lisbon, Portugal, 8–10 November 2022). CRC Press, 2022. + +[5] Petracca, Ermando, et al. “`Design and techno-economic analysis of a novel hybrid offshore wind and wave energy system. `_” Energies 15.8 (2022): 2739. diff --git a/dev/_sources/most/release_notes.rst.txt b/dev/_sources/most/release_notes.rst.txt new file mode 100644 index 000000000..e6d1b7eb2 --- /dev/null +++ b/dev/_sources/most/release_notes.rst.txt @@ -0,0 +1,42 @@ +.. _most-release-notes: + +Release Notes +============= + +.. _most-citation: + + +`MOST v1.0.0 (within WEC-Sim v6.0) `_ +--------------------------------------------------------------------------------------------- + +**New Features** + +* Addition of the windClass object + +* Addition of the windTurbineClass object + +* Addition of the MOST library + +* Release of a WEC-Sim+MOST Application + + +Citing MOST +----------- + +When using MOST with WEC-Sim, please cite the following MOST publication in addition to the WEC-Sim software release and publication: + +.. TODO - add publication that users should cite when using MOST + +.. TODO - add latex format for easy reference +.. code-block:: none + + @inproceedings{sirigu2022development, + title={Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody}, + author={Sirigu, M and Faraggiana, E and Ghigo, A and Bracco, G}, + booktitle={Journal of Physics: Conference Series}, + volume={2257}, + number={1}, + pages={012003}, + year={2022}, + organization={IOP Publishing} + } diff --git a/dev/_sources/most/theory.rst.txt b/dev/_sources/most/theory.rst.txt new file mode 100644 index 000000000..02351656a --- /dev/null +++ b/dev/_sources/most/theory.rst.txt @@ -0,0 +1,511 @@ +.. _most-theory: + +****** +Theory +****** + +In this section, the features introduced with MOST will be explored, offering some theoretical background to understand their use. +To do this, the workflow shown in the :ref:`most-introduction` will be followed: Pre-processing, User Inputs, Simulation, +and Post-processing. + + +Pre-processing +============== +In the pre-processing phase, it is possible to create all the data required for the simulation (except the hydrodynamic coefficients) by +launching the ``mostIO.m`` script, which will call up other codes, each dedicated to specific data (e.g. wind turbine, control, or mooring) +and described in this section. As with other WEC-Sim examples, the ``bemio.m`` script should still be used to load the hydrodynamic coefficient data. + + +Mooring look-up table +--------------------- +MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. +Specifically, the mooring look-up table simulates a mooring system consisting of a certain number of lines suspended between two points +(anchor and fairlead) and angularly equally spaced. This option is based on the catenary equations similarly to the open-source code MAP++ :cite:`MAP`. +In the Simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outputs (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called "moor_matrix" and created through the ``Create_Mooring_Matrix.m`` script. + + +Wind input +---------- +This section describes how the input wind field is generated; there are two possible methods: to have constant wind speed (in time and space) or to +have a wind speed field in which turbulence and non-uniform spatial distribution are taken into account. It is possible to specify wind method in ``wecSimInputFile.m`` by initializing the windClass with "constant" or "turbulent". +In the first case there will be a constant wind speed at all times and at every point on the rotor area, while the second case considers the spatial +and temporal turbulence of the wind. Regarding the second case, the scatter of the wind speed is obtained using an external code, `Turbsim `_, developed +by NREL, and integrated within the MOST code. The user can launch the ``run_turbsim.m`` script (in "turbsim" subfolder) to create the wind input data +structure, specifying some properties such as mean velocity and turbulence intensity. For more information, it is recommended to read the :ref:`most-advanced_features` or the +documentation of TurbSim :cite:`kelley2005overview`. The resulting data structure consists of the wind speed +(in the surge direction) at each instant and for each node of a spatial grid covering the rotor area. During the simulation, the wind speed +corresponding to the blade nodes will be obtained by interpolating between the grid points via look-up tables. + + +Wind turbine properties +----------------------- +All wind turbine components are modelled as rigid bodies; this includes the tower, the nacelle, the hub, and the blades. The inertial and geometrical +properties of the components must be defined in a MATLAB structure, the user can use the script ``WTproperties.m`` ("turbine_properties" subfolder) to write the parameters of the +desired wind turbine. In particular, mass, moment of inertia, centre of mass relative to the reference, and centre of mass in the global reference +frame (whose origin is at the sea water level) are defined for each body. In addition, other parameters such as tilt and precone angles, tower +height, electrical generator efficiency, and CAD file names are set. The CAD files to define the geometry can be imported from external software. +They must be saved in the folder "geometry". The user must set the name of the CAD files in "WTcomponents" struct to allow MOST to upload the files. + +.. image:: IMAGE_geometry.png + :width: 80% + :align: center + +| + +In addition to the general characteristics of the wind turbine, the user must set the specific properties for the blades by launching the ``BladeData.m`` +script, which defines the needed data structure by taking the information from some text files in the "BladeData" subfolder. In these, lift, drag, and +torque coefficients are specified for each type of airfoil used, as well as certain geometric characteristics of the blades such as twist angle and +chord length as a function of radius and geometric characteristics related to pre-bending. + + +Control properties +------------------ + +This section explains how the MOST controller characteristics to be used in simulations are calculated. As mentioned earlier, it is possible to choose +between two control logics (Baseline :cite:`Hansen2005` and ROSCO :cite:`abbas2022reference`), and, for the creation of the data required for the +simulation, it is necessary to know the steady-states values, i.e. the stationary values of certain quantities of interest when varying, in this case, +the wind speed, which is considered constant for this purpose. The first step in obtaining the data required for the simulation is therefore to run +the script called ``Steady_States.m`` in the subfolder "control" to perform this calculation. Specifically, through this, the stationary values +of power, rotor speed, thrust force, generator torque, and blade pitch angle are computed for both of the aforementioned control logics. +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal wind speed (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is the case for some turbine types in the ROSCO case. + +Below is a figure representing an example of steady-state values for Baseline and ROSCO controllers for the IEA 15 MW reference wind turbine :cite:`Gaertner2020`. + + +.. image:: IMAGE_Steady_States.png + :width: 80% + :align: center + +| + +In the following, the Baseline and ROSCO control logics will be briefly explained; for more information refer to :cite:`Hansen2005` (Baseline) +and :cite:`abbas2022reference` (ROSCO). + +.. _Baseline: + +Baseline +^^^^^^^^ + +Baseline is a conventional, variable-speed, variable collective pitch controller, which is made up of two independent systems: + +* A generator torque controller (consisting of a generator speed-torque law) designed to maximize power extraction below nominal wind speed +* A blades collective pitch controller designed to regulate rotor and generator speed above nominal wind speed + +Generator torque controller +""""""""""""""""""""""""""" + +The generator-torque control law is designed to have three main regions and two transition ones between them. Aerodynamic torque acts as an +accelerating load, the generator torque, converting mechanical energy to electrical energy, acts as a braking load. The generator torque is computed +as a tabulated function of the filtered generator speed, incorporating 4 operational control regions: 1, 1.5, 2, and 3. + +* **Region 1**: control region before cut-in wind speed, where the generator is detached from the rotor to allow the wind to accelerate the rotor for start-up. In this region, the generator torque is zero and no power is extracted from the wind. + + +* **Region 1.5**: transition region called start-up region and permits a smooth transition between null and optimal torque. + + +* **Region 2**: control region where extracted power is maximized. Here, to maintain the tip speed ratio constant at its optimal value, the generator torque is proportional to the square of the filtered generator speed. Aerodynamic torque can be expressed as: + + .. math:: + T_{\text {aero }}=\frac{1}{2} \rho \pi \frac{R^5}{\lambda^3} C_P\left(\lambda, \theta_{\text {bl }}\right) \cdot \Omega^2=k_{\text {opt }} \cdot \Omega^2\ \ \ \ \ \ (1) + + Where :math:`k_{opt}` is obtained with TSR (Tip Speed Ratio, :math:`λ`) and blade pitch values that lead to maximum power coefficient: :math:`λ = λ_{opt}`, :math:`\theta_{bl} = 0^{\circ}`; + +* **Region 3**: above rated condition region, where the generator torque is kept constant at its rated value. In this region pitch control is active to maintain rotor speed at its rated value. + +The figure below shows an example of control law of the Baseline generator torque controller for the IEA 15 MW reference wind turbine :cite:`Gaertner2020`. + +.. image:: IMAGE_Baseline_Torque_Law.png + :width: 60% + :align: center + +| + +Blade pitch controller +"""""""""""""""""""""" + +Regarding the blade pitch controller, it regulates the generator speed in region 3 (where wind speed exceeds its rated value) to maintain it at its nominal +value through a scheduled proportional-integral control (PI). In this region the torque is kept constant at its rated value (:math:`T_{gen} = T_{gen,r} = P_{r} / \Omega_{r}`). +Aerodynamic torque :math:`T_{\mathrm{aero\ }}` depends on wind speed, rotor speed and blade pitch, but assuming in this region rotor speed maintains +its rated value :math:`\Omega_r` (this assumption can be made since the control objective is to track that value) and neglecting power to +wind speed sensitivity, linearization around rated condition is: + +.. math:: + + T_{\text {aero }} \approx T_{\text {aero }}\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)+\left.\frac{d T_{\text {aero }}\left(U_{\text {wind }}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\substack{U_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r}}\left(\theta_{b l}-\theta_{b l, r}\right)= + + =\frac{P\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)}{\Omega_r}+\left.\frac{1}{\Omega_r} \frac{d P\left(U_{\text {wind}}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\begin{array}{c} \theta_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r \end{array}}\left(\theta_{b l}-\theta_{b l, r}\right)\ \ \ \ \ \ (2) + + +where :math:`U_{wind,r}` and :math:`\theta_{bl,r}` are rated wind speed and blade pitch. Once first is chosen, :math:`\theta_{bl,r}` is which one leads to a steady state +condition with extracted power equal to the rated one. So, aerodynamic torque expression becomes: + +.. math:: + + T_{\mathrm{aero\ }}\approx\ \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r}\frac{dP}{d\theta_{bl}}\Delta\theta_{bl}\ \ \ \ \ \ (3) + + +Where :math:`\Delta \theta _{bl}` represents a small perturbation of the blade pitch angle about its linearization point :math:`\theta_{bl,r}`. By +expressing the blade-pitch regulation starting from the speed perturbation with a proportional-integrative control law (PI), it is possible to write: + +.. math:: + + \Delta \theta_{b l}=K_P \Delta \Omega+K_I \int_0^t \Delta \Omega d t\ \ \ (4) + +Where :math:`K_P` is the proportional gain and :math:`K_I` the integrative gain; :math:`\Delta\Omega` represents a small perturbation of rotor speed about its rated value: +:math:`\Delta\Omega=\ (\Omega-\Omega_r)`. Combining last equations found with the equilibrium equation of the rotor around its rotation axis +:math:`(T_{\mathrm{aero\ }}-\ T_{\mathrm{gen\ }}= I_{\mathrm{eq\ }}\dot{\Omega})`, it is possible to obtain, once defined :math:`\Delta\Omega=\ \dot{\delta}`, +the following relation: + +.. math:: + \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r} \frac{d P}{d \theta_{b l}}\left(K_P \dot{\delta}+K_I \delta\right)-\frac{P_r}{\Omega_r}=I_{e q} \ddot{\delta}\ \ \ (5) + + +Which can be rearranged as: + +.. math:: + I_{e q} \ddot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_P}{\Omega_r}\right] \dot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_I}{\Omega_r}\right] \delta=0\ \ \ (6) + +That in the canonical form becomes: + +.. math:: + M \ddot{\delta}+C \dot{\delta}+K \delta=0 \ \ \ \ (7) + +With: :math:`\ M= I_{eq}`, :math:`\\C= \left[-\frac{dP}{d\theta_{bl}}\frac{K_P}{\Omega_r}\right]`, :math:`\\K=\left[-\frac{dP}{d\theta_{bl}}\frac{K_I}{\Omega_r}\right]` + + + +Now it is possible to choose proportional and integral gains in order to obtain desired characteristics of the blade pitch control. Its characteristics +directly depend on natural frequency and damping ratio: + +.. math:: + \omega_n=\sqrt{\frac{M}{K}}\ \ ,\ \ \ \ \ \ \zeta=\frac{C}{2M\omega_{n\ }}\ \ \ \ \ \ (8) + +Once defined :math:`\omega_{n}` and :math:`\zeta`, expressions of proportional and integral gains become: + +.. math:: + K_P=\frac{2\ I_{eq}{\ \omega}_n\ \zeta{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_P^\prime}{\frac{dP}{d\theta_{bl}}}\ ,\ \ \ \ \ \ \ K_I=\frac{I_{eq\ }\omega_n^2{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_I^\prime}{\frac{dP}{d\theta_{bl}}}\ \ \ \ \ \ \ \ \ \ (9) + +The term :math:`\frac{dP}{d\theta_{bl}}` is the power to pitch sensitivity, which depends on wind speed and blade pitch (related each other as previously +mentioned) adopted during linearization. So, to always have the same system characteristic (:math:`\omega_n` and :math:`\zeta`), proportional and integral +gains must vary with a variation of blade pitch and so of wind speed. Figure below shows power to pitch sensitivity with respect to blade pitch; as can be +seen there, it can be well approximated with a quadratic regression, through which quadratic form that minimize sum of square error is computed. Thanks to +this regression, power to pitch sensitivity expression becomes of the form: + +.. math:: + \frac{dP}{d\theta_{bl}}\ \approx\ c_1{\theta_{bl}}^2+c_2\theta_{bl}+c_3\ \ \ \ \ \ (10) + +:math:`\frac{dP}{d\theta_{bl}}` is the power to pitch sensitivity and :math:`c_1 (W/{deg}^3)`, :math:`c_2 (W/{deg}^2)` and :math:`c_3 (W/deg)` are the +coefficients of its quadratic regression. + +.. image:: IMAGE_Baseline_PowerToPitch_Sensitivity.png + :width: 60% + :align: center + +| + +This approximation will make the calculation of controller gains computationally less demanding during simulation. + + +.. _ROSCO: + +ROSCO +^^^^^ +ROSCO controller (Reference Open-Source COntroller for fixed and floating offshore wind turbines) was developed by researchers at the Delft University +of Technology :cite:`abbas2022reference` to provide a modular reference wind turbines controller that represent industry standards and performs comparably +or better than existing reference controllers, such as baseline, discussed in previous section. The primary functions of the controller are still to +maximize power in below-rated operations and to regulate rotor speed in above-rated ones, moreover, it also provides additional modules which can improve +control performances. ROSCO controller, as well as Baseline and most of other conventional ones, consists of two methods of actuation: generator torque +and collective blade pitch. Strategies of actuation are commonly separated into four main regions, with transition logic between them. Regions 1 and 4 +correspond to below cut-in and above cut-out wind speed conditions, these regions are generally out of interest for standard control purposes (performances +optimization) and so they will not be further discussed below. In region 1 generator torque is set to zero to allow the wind to accelerate the rotor for +start-up. In this region, no power is extracted. In region 4 blades are pitched to reduce thrust force to zero (feathering position). + +.. image:: IMAGE_ROSCO_Power_Curve.png + :width: 60% + :align: center + +| + +Control strategies for regions 1.5, 2 and 3 are highly like those ones adopted in Baseline control. Region 2 is when wind speed is below rated condition, +here main goal is power extraction maximization. To do so, two methods can be used, a quadratic law (as in Baseline controller) of generator torque with +respect to rotor angular speed or a tip speed ratio (TSR) tracking to maintain the latter at its optimal value (in this case a wind speed estimation is needed). +Region 3 is when wind speed is above rated condition, here blade pitch is regulated to maintain rotor speed at its rated value and to stabilize platform (for +offshore floating wind turbines, through floating feedback module), while generator torque is kept constant at its rated value. Region 1.5 is a transition +region from cut-in wind speed and region 2. Here generator torque is regulated to maintain a defined minimum rotor speed and blades are pitched to compensate +resulting high values of TSR to improve power extraction. + +ROSCO Implementation +"""""""""""""""""""" +Controller implementation starts from aerodynamic torque (:math:`T_{aero}`) expression and rotor equilibrium equation: + +.. math:: + T_{aero}=\frac{1}{2}\ \rho\ A_D\ C_P\ (\lambda,\theta_{bl})\ \frac{{U_\infty}^3\ }{\Omega}\ \ \ \ \ \ (11) + +.. math:: + \dot{\Omega}=\frac{T_{\mathrm{aero\ }}-\ T_{gen}\ }{I_{\mathrm{eq\ }}}\ \ \ \ \ \ (12) + +:math:`I_{\mathrm{eq\ }}` is the rotor inertia, :math:`\rho` is the air density, :math:`A_D` is the rotor area, :math:`C_P` is the power coefficient +and :math:`U_\infty` is the undisturbed wind speed. The first-order linearization of eq 11 at some nominal steady-state operational point is: + +.. math:: + \Delta T_{aero}=\Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.\ \Delta\Omega+\Gamma_{\theta_{bl}}\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta\theta_{bl}+\Gamma_U\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta U\ \ \ \ \ \ (13) + +With: :math:`\ \ \ \Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\Omega\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.,{\ \ \ \ \ \Gamma}_{\theta_{bl}}\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\theta_{bl}\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\mathrm{,\ \ \ \ \ \ \ }\Gamma_U\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial U\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.` + +“op” denotes the steady-state operational point at which linearization is made. Equation 12 can then be rewritten as (Δ denotes the perturbation from +steady state value “op” and :math:`\left \{ X_{op}=\lambda_{op},\\\ \theta_{bl, op} \right \}`): + +.. math:: + \Delta \dot{\Omega}=A\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \Omega+B_{T_{g e n}} \Delta T_{g e n}+B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \theta_{b l}+B_U\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta U\ \ \ \ \ \ (14) + +With: + +.. math:: + + A\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{I_{\mathrm{eq}}} \frac{\partial T_{\text {aero }}}{\partial \lambda} \frac{\partial \lambda}{\partial \Omega} \\ + +.. math:: + \frac{\partial T_{\text {aero }}}{\partial \lambda}=\frac{1}{2} \rho A_{\mathrm{D}} R U_{\mathrm{op}}^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \lambda} \lambda_{\mathrm{op}}-C_{\mathrm{p}, \mathrm{op}}\right) \\ + +.. math:: + \frac{\partial \lambda}{\partial \Omega}=\frac{R}{U_{\mathrm{op}}}, \quad\left(\lambda=\frac{\Omega R}{U}\right) \\ + +.. math:: + B_{T_{g e n}}=-\frac{1}{I_{\mathrm{eq}}} \\ + +.. math:: + B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{2 I_{\mathrm{eq}}} \rho A_{\mathrm{D}} R U_{\mathrm{op}}{ }^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \theta_{b l}} \lambda_{\mathrm{op}}\right) + + + +All derivatives are calculated at “op” conditions; :math:`\Delta U`, difference between actual wind speed and wind speed at linearization point, is considered +equal to zero during control tuning, that is computation of control gains. Both generator torque and blade pitch controllers are PI controllers, generically +defined as: + +.. math:: + y = K_P \ u + K_I \int_{0}^{T} u\ dt\ \ \ \ \ \ (15) + +Where :math:`u` represents the input and :math:`y` the output, while :math:`K_P` and :math:`K_I` are respectively the proportional and integral gains. Generator torque +controller has as input and output: + +.. math:: + u=-\delta\Omega\ ,\ \ \ y=\Delta C_{gen}\ \ \ \ \ \ (16) + +Blade pitch controller has as input and output: + +.. math:: + u=-\delta\Omega,\ \ \ y=\Delta\theta_{bl}\ \ \ \ \ \ (17) + +:math:`\delta\Omega` is defined as a perturbation from the reference speed: + +.. math:: + \Omega(t)=\Omega_{\mathrm{ref\ }}+\delta\Omega\longrightarrow-\delta\Omega=\Omega_{ref}-\Omega(t)\ \ \ \ \ \ (18) + +While :math:`\Delta C_{gen}` and :math:`\Delta\theta_{bl}` are perturbations from steady state values: + +.. math:: + \theta_{bl}(t)={\theta_{bl}}_{\mathrm{op\ }}+\Delta\theta_{bl},{\ \ \ \ C}_{gen}(t)={C_{gen}}_{op}+\Delta C_{gen}\ \ \ \ \ \ (19) + + +Now, defining :math:`\Delta \Omega_{ref} =\Omega_{ref}-\Omega_{op}` (assumed =0, since “op” point is chosen at a steady state condition with +:math:`\Omega_{op}=\Omega_{ref}`), we can combine equation 14 with above definitions to obtain a differential equation that relates +:math:`\Delta \Omega =\Omega-\Omega_{op}` and :math:`\Delta \Omega_{ref}`. Then, if the Laplace transform of this equation is considered, we arrive +to two closed-loop transfer functions (one for the generator torque module and the other for the blade pitch one) in the form: + +.. math:: + H(s)=\frac{\Delta \Omega(s)}{\Delta \Omega_{\mathrm{ref}}(s)}=\frac{B\left(K_P\left(x_{\mathrm{op}}\right) s+K_I\left(x_{\mathrm{op}}\right)\right)}{s^2+\left(B K_P\left(x_{\mathrm{op}}\right)-A\left(x_{\mathrm{op}}\right)\right) s+B K_I\left(x_{\mathrm{op}}\right)}\ \ \ \ \ \ (20) + + +Where :math:`B` is :math:`B_{T_{gen}}` or :math:`B_{\theta_{bl}}`, depending on which module is considered, since when generator torque loop is +considered, :math:`\Delta\theta_{bl}` is set to zero and, when blade pitch loop is considered, :math:`\Delta T_{gen}` can be equal to zero or +:math:`B_{T_{gen}}` can be englobed in :math:`A`. Moreover, in both cases we consider :math:`\Delta U=0`. :math:`H(s)` is a simple second order +system whose characteristics are strictly related to natural frequency and damping ratio of its canonical form. They can be defined, in order to +reach desired performance, choosing values of proportional and integral gains. If we call :math:`\omega_n` the natural frequency and :math:`\zeta` +the damping ratio, :math:`K_P` and :math:`K_I` expressions (varying with operational steady state point) are: + +.. math:: + + K_P=\frac{1}{B\left(\boldsymbol{x}_{\mathrm{op}}\right)}\left(2 \zeta \omega_n+A\left(\boldsymbol{X}_{\mathrm{op}}\right)\right)\ \ \ \ \ \ (21) + +.. math:: + + K_I=\frac{\omega_{\mathrm{n}}^2}{B\left(\boldsymbol{X}_{\mathrm{op}}\right)}\ \ \ \ \ \ (22) + + +Once transfer function of generator torque and blade pitch closed loop has been defined, and once way through which PI controllers’ gains are computed +has been explored, we can focus, specifically, on the two different modules to investigate the reference speed signals adopted and how the scheduling +of gains is performed, varying according to the conditions in which the system is. + + +Generator Torque Controller +""""""""""""""""""""""""""" +Four different generator torque controllers are available in ROSCO, they are the possible combination between two methods for below wind speed operations +and two methods for above wind speed conditions. Regarding below rated operations, to maximize extracted power at each wind condition, a quadratic low +of generator torque with respect to rotor angular speed can be adopted. In this section we omit exploitation of this method since is the same adopted +in Baseline controller. Alternatively, a tip speed ratio tracking to maintain it at its optimal value can be adopted. If the wind speed can be measured +or estimated accurately, a generator torque controller can be designed to maintain the :math:`\lambda_{opt}` and maximize power capture, so reference +rotor angular speed becomes: + +.. math:: + {\Omega_{ref}}_\tau=\frac{\lambda_{opt}\ \hat{U}}{R}\ \ \ \ \ \ (23) + +Where subscript :math:`\tau` indicates the reference speed of torque controller and :math:`\hat{U}` is the estimated wind speed. From equations 14, 21 +and 22, it can be seen that integral gain :math:`K_I` of generator torque controller is constant, whereas :math:`A`, so proportional gain :math:`K_P`, +are both dependent on :math:`U` (wind speed). However, it was found that fixing :math:`K_P = K_P (U = Urated)` does not negatively affect power production. +Regarding the two existing methods for above rated conditions, first of them considers a constant generator torque, defined as: + +.. math:: + T_{gen,ar}(t)=\ T_{rated}=\frac{P_{\mathrm{rated\ }}}{\Omega_{rated}}\ \ \ \ \ \ (24) + +Where subscript “ar” means “above rated”. On the other hand, the second strategy considers a constant extracted power equal to its rated value, so +generator torque is defined as: + +.. math:: + T_{gen,ar}(t)=\frac{P_{\mathrm{rated\ }}}{\Omega}\ \ \ \ \ \ (25) + + +Blade Pitch Controller +"""""""""""""""""""""" +Main goal of blade pitch controller is keeping rotor angular speed at its rated value, so reference speed is (both in below rated and above rated +conditions): + +.. math:: + \Omega_{\mathrm{ref\ },\theta_{bl}}=\Omega_{\mathrm{rated}}\ \ \ \ \ \ (26) + +Where subscript :math:`\theta_{bl}` means we refer to blade pitch controller. In below rated conditions, generator speed is lower than rated value, +so :math:`-\delta\Omega=\Omega_{ref}-\Omega\ >\ 0` and, since gains are normally negative, :math:`\theta_{bl}` is saturated at its minimum value, +defined by an additional module of ROSCO controller which will be discussed later. According to equations 21 and 22, to find controllers gain values, +:math:`B_{\theta_{bl}}\left({X}_{op}\right)` and :math:`A\left({X}_{op}\right)` should be computed. They change for any operation point at which +system is linearized, so they are function of :math:`{X}_{op}=\ \left\{\lambda_{op},{\theta_{bl}}_{op}\right\}`. Linearization point can be the +optimal steady state values chosen during strategy definition, for which there is a unique relationship between :math:`\lambda_{op}` and +:math:`{\theta_{bl}}_{op}`. For this reason, :math:`B_{\theta_{bl}}` and :math:`A` can be expressed with respect to :math:`{\theta_{bl}}_{op}`, +so gains’ values can be scheduled with :math:`\theta_{bl}` as parameter. + +Additional Control Modules +"""""""""""""""""""""""""" +In this section principal additional modules are briefly discussed to understand their functions and how they modify control output; for more information +it is possible to consult :cite:`abbas2022reference`. They are: + +* **Wind speed estimator** : This module estimates wind sped used for TSR tracking in the generator torque controller. Employed algorithm is based on a continuous-discrete Kalman filter, which exploits system model, a wind auto regressive model and other information, like covariance matrices based on the expected wind field and measure’s confidence of rotor speed to estimate a mean wind speed across rotor area at each time. + +* **Set Point Smoothing** : Generator torque and blade pitch controllers will normally conflict with each other in near-rated operation due to incompatible reference rotor speed. To avoid this, a set point smoother can be employed; it shifts the speed reference signal of the inactive controller while the active one works. As an example, at above rated condition torque controller is the inactive one and vice versa. If TSR tracking were to be adopted for the torque generator, then the reference speed at high wind speeds would be higher than the one actually wanted (rated one), so the smoother brings the reference towards the rated speed and the resulting torque approaches the rated one, the one actually intended by adopting a constant torque strategy under above conditions. + +* **Minimum pitch Saturation** : This module defines a minimum value of blade pitch angle which will be used as a saturation limit during control operations. It mainly modifies expected blade pitch values in region 1.5 and near rated conditions and leads to two effects: + + * **Peak shaving** : Near rated condition thrust value reaches the highest values, since below rated wind speed is lower and above rated condition blade pitching reduces that force. So, to limit loads, minimum pitch module imposes not null pitch angles also below rated wind speed, near that value. + + + * **Power maximization in low wind** : In region 1.5, as mentioned in control region section, a minimum value of rotor speed is imposed, so at low wind speeds TSR deviates far from its optimal value. To compensate this fact and to increase power coefficient value in this condition, blade pitch is led to be greater. + + +* **Floating offshore wind turbine feedback** : this module is though for FOWTs (Floating Offshore Wind Turbines) and introduces a new term in the PI blade pitch controller, which becomes: + + .. math:: + \Delta \theta_{b l}=-k_{\mathrm{P}} \delta \Omega-k_{\mathrm{I}} \int_0^T \delta \Omega \mathrm{d} t+k_{\theta_{\text {bl,float }}} \dot{x}_t\ \ \ \ \ \ (27) + + Additional term is tower-top velocity :math:`{\dot{x}}_t` multiplied by :math:`k_{{\theta_{bl,float}}_\mathrm{\ }}` gain. The latter is chosen from a + manipulation of rotor equilibrium equation and structure pitch equation, in which expression of thrust and power coefficients compare. The aim is to + find gains’ value that reduces rotor angular acceleration to tower speed sensitivity to mitigate structure pitch effect on rotor aerodynamic torque. + This expedient increases the average extracted power and stabilizes the structure. + +| + +In this case, TSR tracking was chosen for torque control at wind speeds lower than nominal one and a constant torque equal to nominal in above rated +conditions. Furthermore, the wind speed is assumed to be a priori known, so the Kalmann filter constituting the estimation module will not be +exploited. + + +Aerodynamic Loads +----------------- + +The aerodynamic loads due to the interaction between wind and blades are determined during the simulation using look-up tables previously obtained +during pre-processing. Specifically, the "AeroLoads" script in the "aeroloads" subfolder handles this by using a function, based on BEM (Blade Element +Momentum Theory), which receives as input the wind speed, rotor speed, and blade pitch angle and outputs the aerodynamic forces and torques acting on +the blade root. For more information on the resolution of BEMT see :cite:`ning2014simple` and :cite:`Ning2015`. The aerodynamic forces do not take into +account the flexibility of the blade (rigid body assumption), the deflection of the wake due to the rotor misalignment with respect to the wind and +the wake dynamics. The domain of the tables will consist of the wind speeds for which the stationary values were previously calculated and a number +of values of rotor speed and blade pitch angle evenly spaced around the stationary value corresponding to the wind speed. The look-up table of +the aerodynamic loads has only one input for the wind speed, so the average wind speed is determined by interpolating four points for each blade in +the wind grid along the blade length. The discretization points are defined by “blade.bladeDiscr” in ``WTproperties.m`` script. It is preferable to define +those points starting from the middle of the blade and not from the root because the wind speed has more influence at the final section of the blade. The horizontal hub speed, due to surge and pitch oscillation, is added to the wind speed. +Furthermore, the pitch motion and yaw motion of the hub multiplied by the distance from the hub of discretization points (blade.bladeDiscr) are also +added to wind speed. + + +User inputs +=========== + +In addition to the settings defined in pre-processing, to use MOST it is necessary to define simulation settings and decide which input files (created +in the pre-processing) to use, this is done via the WEC-Sim library script ``wecSimInputFile.m``. + + +Simulation +========== + +The simulation of floating wind turbines or hybrid systems is carried out in the Simulink environment using the WEC-Sim libraries and the MOST library +("MOST_lib.slx"), for the wind turbine part and its control. In order to launch the simulation, it is necessary to use the ``wecSim.m`` executable, +which calls up ``wecSimInputFile.m`` for defining the input data and the ``initializeWecSim.m`` function for setting up the classes and defining the active +variant subsystems according to the settings made. Below is an example of a Simulink model for the simulation of a floating wind turbine. + +.. image:: IMAGE_Volturn15MW_Simulink_example.png + :width: 60% + :align: center + +| + +The platform and mooring subsystems are libraries of WEC-Sim that solve the hydrodynamic and hydrostatic loads acting on the platform and the forces +due to moorings according to the settings and file names provided. The turbine subsystem is the MOST library, visible in the figure below. + +.. image:: IMAGE_MOST_Library.png + :width: 100% + :align: center + +| + +The MOST model is mainly composed of rigid bodies (representing the various components of the turbine) connected via fixed joints or, in the case of +the link between the hub and nacelle, with a revolute joint. An example of a component (hub) can be seen in the figure below and includes the calculation of +inertial forces (in the "Body Properties" block) and weight force (in the "External Force and Torque" block). In the case of blades, aerodynamic forces +are also applied via a similar block. + +.. image:: IMAGE_Body_Block_example.png + :width: 60% + :align: center + +| + +In the 'Aerodynamics + Control' subsystem, the aerodynamic forces and torque values of the generator and collective blade pitch are derived. In the +"Control" and "Blade wind speed" subsystems, variant subsystems are contained in which it is decided whether to use the Baseline or ROSCO controller +and whether to have constant or turbulent wind. With regard to wind block, here the relative speed with respect to the interested blade nodes is +calculated, receiving the movements of the structure and the wind field as inputs. Finally, the "AeroLoads" subsystem contains the look-up tables of +the aerodynamic loads obtained in pre-processing. + +.. image:: IMAGE_Aeroload_Control_Submodel.png + :width: 100% + :align: center + +| + + +Post-processing +=============== + +Post-processing consists of processing the simulation output data and saving it, as well as of the possible creation of an (ASCII) text file containing +the simulation report. For this we rely on the WEC-Sim executables ``stopWecSim.m`` and ``postProcessWecSim.m``, which use the ``rensponseClass`` for processing +the results, and on the ``userDefinedFunction.m`` script to plot time-domain simulation input and output by also exploiting some functions of the ``rensponseClass``. +The ``responseClass`` contains all the output time-series and methods to plot and interact with the results. It is not initialized by the user; instead, it +is created automatically at the end of a WEC-Sim simulation. The ``responseClass`` does not input any parameter back to WEC-Sim, only taking output data from +the various objects and blocks. After WEC-Sim is done running, there will be a new variable called ``output`` saved to the MATLAB workspace. +The output object is an instance of the ``responseClass``; it contains all the relevant time-series results of the simulation. +The figure below shows an example of some input-output plots from a simulation of the IEA 15 MW reference wind turbine mounted on the VolturnUS semi-submersible +platform (:cite:`Gaertner2020` and :cite:`Allen2020`). + +.. image:: IMAGE_Results_Plots_example.png + :width: 100% + :align: center + diff --git a/dev/_sources/theory/index.rst.txt b/dev/_sources/theory/index.rst.txt new file mode 100644 index 000000000..e13dd3166 --- /dev/null +++ b/dev/_sources/theory/index.rst.txt @@ -0,0 +1,10 @@ +.. _theory: + +############# +Theory Manual +############# + +.. toctree:: + :maxdepth: 2 + + theory.rst diff --git a/dev/_sources/theory/theory.rst.txt b/dev/_sources/theory/theory.rst.txt new file mode 100644 index 000000000..3e5d8f4e5 --- /dev/null +++ b/dev/_sources/theory/theory.rst.txt @@ -0,0 +1,928 @@ +.. _theory-theory: + +Overview +-------- + +Modeling wave energy converters (WECs) involves the interaction between the +incident waves, device motion, power-take-off (PTO mechanism), and mooring. +WEC-Sim uses a radiation and diffraction method :cite:`Li2012,Babarit2012` to +predict power performance and design optimization. The radiation and +diffraction method generally obtains the hydrodynamic forces from a +frequency-domain boundary element method (BEM) solver using linear coefficients +to solve the system dynamics in the time domain. + +.. _wec_sim_methodology: + +.. figure:: /_static/images/Physics.png + :align: center + + .. + + +Coordinate System +----------------- + +The :ref:`WEC-Sim Coordinate System ` figure illustrates a +3-D floating point absorber subject to incoming waves in water. The figure also +defines the coordinates and the 6 degree of freedom (DOF) in WEC-Sim. The +WEC-Sim coordinate system assumes that the positive X-axis defines a wave angle +heading of zero (e.g., a wave propagating with along a zero-degree direction is +moving in the +X direction). The positive Z-axis is in the vertical upwards +direction, and the positive Y-axis direction is defined by the right-hand rule. +In the vectors and matrices used in the code, Surge (x), Sway (y), and Heave +(z) correspond to the first, second and third position respectively. Roll (Rx), +Pitch (Ry), and Yaw (Rz) correspond to the fourth, fifth, and sixth position +respectively. + +.. _coordinate_system: + +.. figure:: /_static/images/coordinateSystem.png + :align: center + :width: 200pt + + .. + + *WEC-Sim Coordinate System* + + +Units +----- + +All units within WEC-Sim are in the MKS (meters-kilograms-seconds system) and +angular measurements are specified in radians (except for wave directionality +which is defined in degrees). + +Boundary Element Method (BEM) +----------------------------- + +In WEC-Sim, wave forcing components are modeled using linear coefficients +obtained from a frequency-domain potential flow Boundary Element Method (BEM) +solver (e.g., WAMIT :cite:`Lee2006`, Aqwa :cite:`AQWA`, NEMOH :cite:`NEMOH`, and Capytaine :cite:`ancellin2019,babarit2015`). +The BEM solutions are obtained by solving the Laplace equation +for the velocity potential, which assumes the flow is inviscid, incompressible, +and irrotational. More details on the theory for the frequency-domain BEM can +be found in :cite:`Lee2006`. + +WEC-Sim imports nondimensionalized hydrodynamic coefficients from an ``*.h5`` +data structure generated by :ref:`user-advanced-features-bemio` for the BEM solvers: WAMIT, +Aqwa, NEMOH or Capytaine. Alternatively, the ``*.h5`` data structure can be +manually defined by the user. The WEC-Sim code scales the hydrodynamic +coefficients according to the equations below, where :math:`\rho` is the water +density, :math:`\omega` is the wave frequency in rad/s, and :math:`g` is +gravity: + +.. math:: + :nowrap: + + \begin{gather*} + |\overline{F_{exc}(\omega)}| = \frac{|F_{exc}(\omega)|}{\rho g} \\ + \overline{A(\omega)} = \frac{A(\omega)}{\rho} \\ + \overline{B(\omega)} = \frac{B(\omega)}{\rho \omega} \\ + \overline{K_{hs}} = \frac{K_{hs}}{\rho g} + \end{gather*} + +where :math:`F_{exc}` is the wave-excitation force and torque vector, :math:`A` +is the radiation added mass coefficient, :math:`B` is the radiation wave +damping coefficient, and :math:`K_{hs}` is the linear hydrostatic restoring +coefficient. + + +.. _theory-time-domain: + +Time-Domain Formulation +----------------------- + +A common approach to determining the hydrodynamic forces is to use linear wave +theory which assumes the waves are the sum of incident, radiated, and +diffracted wave components. The dynamic response of the system is calculated by +solving WEC system equations of motion :cite:`Babarit2012,Nolte2014`. The +equation of motion for a floating body about its center of gravity can be given +as: + +.. math:: + + m\ddot{X}=F_{exc}(t)+F_{md}(t)+F_{rad}(t)+F_{pto}(t)+F_{v}(t)+F_{me}(t)+F_{B}(t)+F_{m}(t) + + +where :math:`\ddot{X}` is the (translational and rotational) acceleration +vector of the device, :math:`m` is the mass matrix, :math:`F_{exc}(t)` is the +wave excitation force and torque (6-element) vector, :math:`F_{md}(t)` is the +mean drift force and torque vector, :math:`F_{rad}(t)` is the +force and torque vector resulting from wave radiation, :math:`F_{pto}(t)` is +the PTO force and torque vector, :math:`F_{v}(t)` is the damping force and +torque vector, :math:`F_{me}(t)` is the Morison Element force and torque +vector, :math:`F_{B}(t)` is the net buoyancy restoring force and torque vector, +and :math:`F_{m}(t)` is the force and torque vector resulting from the mooring +connection. + +.. ACTION: Add QTF documentation here + +:math:`F_{exc}(t)` , :math:`F_{rad}(t)` , and :math:`F_{B}(t)` are calculated +using hydrodynamic coefficients provided by the frequency-domain BEM solver. +The radiation term includes an added-mass term, matrix :math:`A(\omega)`, and +wave damping term, matrix :math:`B(\omega)`, associated with the acceleration +and velocity of the floating body, respectively, and given as functions of +radian frequency (:math:`\omega`) by the BEM solver. The wave excitation term +:math:`F_{exc}(\omega)` includes a Froude-Krylov force component generated by +the undisturbed incident waves and a diffraction component that results from +the presence of the floating body. The buoyancy term :math:`F_{B}(t)` depends +on the hydrostatic stiffness :math:`K_{hs}` coefficient, displacement of the +body, and its mass. + +Numerical Methods +------------------ + +WEC-Sim can be used for regular and irregular wave simulations, but note that +:math:`F_{rad}(t)` is calculated differently for +sinusoidal steady-state response scenarios and random sea simulations. The +sinusoidal steady-state response is often used for simple WEC designs with +regular incoming waves. However, for random sea simulations or any simulations +where fluid memory effects of the system are essential, the convolution +integral method is recommended to represent the fluid memory retardation force +on the floating body. To speed computation of the convolution integral, the +state space representation method can be specified to approximate this +calculation as a system of linear ordinary differential equations. + +Ramp Function +^^^^^^^^^^^^^ + +A ramp function (:math:`R_{f}`), necessary to avoid strong transient flows at +the earlier time steps of the simulation, is used to calculate the wave +excitation force. The ramp function is given by + +.. math:: + + R_{f}(t)=\begin{cases} + \frac{1}{2}(1+\cos(\pi+\frac{\pi t}{t_{r}})) & \frac{t}{t_{r}}<1\\ + 1 & \frac{t}{t_{r}}\geq1 + \end{cases} + +where :math:`t` is the simulation time and :math:`t_{r}` is the ramp time. + +Sinusoidal Steady-State Response +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This approach assumes that the system response is in sinusoidal steady-state +form; therefore, it is only valid for regular wave simulations. The radiation +term can be calculated using the added mass and the wave radiation damping term +for a given wave frequency, which is obtained from + + +.. math:: + + F_{rad}(t)=-A(\omega)\ddot{X}-B(\omega)\dot{X} + +where :math:`\dot{X}` is the velocity vector of the floating body, +:math:`A(\omega)` is the added mass matrix, and :math:`B(\omega)` is the +radiation damping matrix. + +The free surface profile is based on linear wave theory for a given wave +height, wave frequency, and water depth. The regular wave excitation force is +obtained from + +.. math:: + + F_{exc}(t)=\Re\left[ R_{f}(t)\frac{H}{2}F_{exc}(\omega, \theta)e^{i\omega t} \right] + +where :math:`\Re` denotes the real part of the formula, :math:`R_{f}` is the +ramp function, :math:`H` is the wave height, :math:`F_{exc}` is the frequency +dependent complex wave-excitation amplitude vector, and :math:`\theta` is the +wave direction. + +The mean drift force has two contributions: + + * 2nd-order hydrodynamic pressure due to the first-order wave + * Interaction between the first-order motion and the first-order wave + +Currently, WEC-Sim only reads mean drift coefficients representing the first contribution. +The mean drift force can optionally be included if these coefficients are defined in the BEM data. +The mean drift force is obtained from: + +.. math:: + F_{md}(t)=\left(\frac{H}{2}\right)^2F_{md}(\omega,\theta) + +The mean drift force is combined with the excitation force in the response class output. + +.. ACTION: Add QTF documentation here + +.. Note:: + Currently, WEC-Sim only supports mean drift coefficients and QTF from WAMIT. + +Convolution Integral Formulation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case of an irregular wave spectrum, the fluid memory has an important +impact on the WEC dynamics. This fluid memory effect is captured by the +convolution integral formulation based upon the Cummins equation +:cite:`Cummins1962` is used. The radiation term can be calculated by + +.. math:: + + F_{rad}(t)=-A_{\infty}\ddot{X}-\intop_{0}^{t}K_{r}(t-\tau)\dot{X}(\tau)d\tau + +where :math:`A_{\infty}` is the added mass matrix at infinite frequency and +:math:`K_{r}` is the radiation impulse response function. This representation +also assumes that there is no motion for :math:`t<0`. The radiation impulse +response function is defined as + +.. math:: + K_{r}(t) = \frac{2}{\pi} \intop_{0}^{\infty} B(\omega) cos(\omega t) d\omega + +For regular waves, the equation described in the last subsection is used to +calculate the wave excitation vector. For irregular waves, the free surface +elevation is constructed from a linear superposition of a number of regular +wave components. Each regular wave component is extracted from a wave spectrum, +:math:`S(\omega)`, describing the wave energy distribution over a range of wave +frequencies, generally characterized by a significant wave height and peak wave +period. The irregular excitation force can be calculated as the real part of an +integral term across all wave frequencies as follows + +.. math:: + + F_{exc}(t)=\Re\left[ R_{f}(t) \sum_{j=1}^{N} + F_{exc}(\omega_{j}, \theta) + e^{i(\omega_{j}t+\phi_{j})} + \sqrt{2S(\omega_{j})d\omega_{j}} \right] + +where :math:`\phi` is the randomized phase angle and :math:`N` is the number of +frequency bands selected to discretize the wave spectrum. For repeatable +simulation of an irregular wave field :math:`S(\omega)`, WEC-Sim allows +specification of :math:`\phi`, refer to the :ref:`user-advanced-features-seeded-phase` +section. + +Additionally, an excitation force impulse response function is defined +as + +.. math:: + + K_{e}(t) = \frac{1}{2\pi} \intop_{-\infty}^{\infty} + F_{exc}(\omega,\theta)e^{i\omega t} d\omega + +The excitation impulse response function is only used for the userDefinedElevation wave case. + +State Space +^^^^^^^^^^^ + +It is highly desirable to represent the radiation convolution integral +described in the last subsection in state space (SS) form :cite:`Yu1996`. This +has been shown to dramatically increase computational speeds +:cite:`Taghipour2008` and allow utilization of conventional control methods +that rely on linear state space models. An approximation will need to be made +as :math:`K_{r}` is solved from a set of partial differential equations where +as a `linear state space` is constructed from a set of ordinary differential +equations. In general, a linear system is desired such that: + +.. math:: + + \dot{X}_{r} \left( t \right) = + \mathbf{A_{r}} X_{r} \left( t \right) + + \mathbf{B_{r}} \mathbf{u} (t);~~X_{r}\left( 0 \right) = 0~~ \nonumber \\ + \int_{0}^{t} \mathbf{K_{r}} \left( t- \tau \right) d\tau \approx + \mathbf{C_{r}} X_{r} \left( t \right) + + \mathbf{D_{r}} \mathbf{u} \left( t \right)~~ + +with :math:`\mathbf{A_{r}},~\mathbf{B_{r}},~\mathbf{C_{r}},~\mathbf{D_{r}}` +being the time-invariant state, input, output, and feed through matrices, while +:math:`u` is the input to the system and :math:`X_{r}` is the state vector +describing the convolution kernel as time progresses. + +Calculation of :math:`K_{r}` from State Space Matrices +"""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The impulse response of a single-input zero-state state-space model is +represented by + +.. math:: + + \dot{x} &= \mathbf{A_{r}} x + \mathbf{B_{r}} u \\ + y &= \mathbf{C_{r}} x + +where :math:`u` is an impulse. If the initial state is set to :math:`x(0)= +\mathbf{B_{r}} u` the response of the unforced (:math:`u=0`) system + + +.. math:: + + \dot{x} &= \mathbf{A_{r}} x \\ + y &= \mathbf{C_{r}} x + +is clearly equivalent to the zero-state impulse response. The impulse response +of a continuous system with a nonzero :math:`\mathbf{D_r}` matrix is infinite +at :math:`t=0`; therefore, the lower continuity value +:math:`\mathbf{C_{r}}\mathbf{B_{r}}` is reported at :math:`t=0`. The general +solution to a linear time invariant (LTI) system is given by: + +.. math:: + + x(t) = e^{\mathbf{A_{r}}t} x(0) + + \int_{0}^{t} e^{\mathbf{A_{r}}(t-\tau)} \mathbf{B_{r}} u (\tau) d\tau~~ + +where :math:`e^{\mathbf{A_{r}}}` is the matrix exponential and the calculation +of :math:`K_{r}` follows: + +.. math:: + + K_{r}(t) = \mathbf{C_{r}}e^{\mathbf{A_{r}}t}\mathbf{B_{r}}~~ + +Realization Theory +"""""""""""""""""" + +The state space realization of the hydrodynamic radiation coefficients can be +pursued in the time domain (TD). This consists of finding the minimal order of +the system and the discrete time state matrices +(:math:`\mathbf{A_{d}},~\mathbf{B_{d}},~\mathbf{C_{d}},~\mathbf{D_{d}}`) from +samples of the impulse response function. This problem is easier to handle for +a discrete-time system than for continuous-time. The reason being is that the +impulse response function of a discrete-time system is given by the Markov +parameters of the system: + +.. math:: + + \mathbf{\tilde{K}_{r}} \left( t_{k} \right) = + \mathbf{C_{d}}\mathbf{A_{d}}^{k}\mathbf{B_{d}}~~ + +where :math:`t_{k}=k\Delta t` for :math:`k=0,~1,~2,~\ldots` with :math:`\Delta +t` being the sampling period. The feedthrough matrix :math:`\mathbf{D_d}` is +assumed to be zero in order to maintain causality of the system, as a non-zero +:math:`\mathbf{D_d}` results in an infinite value at :math:`t=0`. + +The most common algorithm to obtain the realization is to perform a Singular +Value Decomposition (SVD) on the Hankel matrix of the impulse response +function, as proposed by Kung :cite:`Kung1978`. The order of the system and +state-space parameters are determined from the number of significant singular +values and the factors of the SVD. The Hankel matrix (:math:`H`) of the impulse +response function + +.. math:: + + H = \begin{bmatrix} + \mathbf{K_{r}}(2) & \mathbf{K_{r}}(3) & \ldots & \mathbf{K_{r}}(n) \\ + \mathbf{K_{r}}(3) & \mathbf{K_{r}}(4) & \ldots & 0 \\ + \vdots & \vdots & \ddots & \vdots \\ + \mathbf{K_{r}}(n) & 0 & \cdots & 0 + \end{bmatrix} &\\ + +can be reproduced exactly by the SVD as + +.. math:: + + H = \mathbf{U} \Sigma \mathbf{V^{*}} + +where :math:`\Sigma` is a diagonal matrix containing the Hankel singular values +in descending order. Examination of the Hankel singular values reveals there +are only a small number of significant states and that the rank of :math:`H` +can be greatly reduced without a significant loss in accuracy +:cite:`Taghipour2008,Kristiansen2005`. Further detail into the SVD method and +calculation of the state space parameters will not be discussed here and the +reader is referred to :cite:`Taghipour2008,Kristiansen2005`. + +Regular Waves +------------- + +Regular waves are defined as planar sinusoidal waves, where the incident wave is defined as :math:`\eta(x,y,t)` : + +.. math:: + + \eta(x,y,t)= \frac{H}{2} \cos( \omega t - k (x\cos \theta + y\sin \theta) + \phi) + +where :math:`H` is the wave height, :math:`\omega` is the wave frequency +(:math:`\omega = \frac{2\pi}{T}`), :math:`k` is the wave number (:math:`k = +\frac{2\pi}{\lambda}`), :math:`\theta` is the wave direction, and :math:`\phi` +is the wave phase. + +Dispersion Relation +^^^^^^^^^^^^^^^^^^^ +For ocean waves, the dispersion relation is a relation between the wave angular frequency and the wave number (i.e. wavelength). +The dispersion relation is derived using separation of variables to satisfy the free surface kinematic and dynamic boundary conditions. +For a more detailed derivation please the reader is referred `here `__ The dispersion relation that WEC-sim uses is defined as: + +.. math:: + + \omega^{2} = gk\tanh\left(kh\right) \approx \begin{cases} + gk & \text{as } kh \rightarrow \infty \\ + gk^{2}h & \text{as } kh \rightarrow 0 + \end{cases} + +where :math:`\omega` is the wave angular frequency (:math:`\omega = \frac{2\pi}{T}`), :math:`g` is gravitational acceleration, +:math:`k` is the wave number (:math:`k=\frac{2\pi}{\lambda}`), and :math:`h` is the water depth. The dispersion relation can be +simplified if the floating body is located in deep water, :math:`h \rightarrow \infty` . The simplification comes from the hyperbolic +tangent function having an asympote of 1 as its argument tends to infinity (:math:`\tanh \left( \infty \right) \rightarrow 1`). +The deep water condition can still be met if the water depth is not infinite while the following expression holds :math:`kh \geq \pi` . +The dispersion relation can then be used to derive the phase velocity which refers to the speed that an observer would need to travel for +the wave to appear stationary (unchanging). The phase velocity of a two-dimensional progressive wave is given by the following expression: + +.. math:: + + c_{p} = \frac{\omega}{k} = \sqrt{\frac{g}{k}\tanh\left(kh\right)} \approx \begin{cases} + \sqrt{\frac{g}{k}}=\frac{g}{\omega} & \text{as } kh \rightarrow \infty \\ + \sqrt{gh} & \text{as } kh \rightarrow 0 + \end{cases} + +Regular Wave Power +^^^^^^^^^^^^^^^^^^^ + +The time-averaged power, per unit wave crest with, for a propagating water wave + +.. math:: + + P_{w} = \frac{1}{2}\rho g A^{2} c_{g} + +where :math:`\rho` is the fluid density, :math:`g` is gravitational acceleration, :math:`A` is the wave amplitude, and :math:`c_{g}` is wave group velocity. +The group velocity is the speed of propagation of a packet of waves which is always slower than the wave phase velocity. For a more detailed derivation on the +group velocity the reader is referred `here `__. The group velocity of a two-dimensional progressive wave +is given by the following expression: + +.. math:: + + c_{g} = \frac{\delta \omega}{\delta k} = \frac{1}{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) + +where :math:`\sinh` is the hyperbolic sine function. The square root term is the phase velocity which can be used to simplify the group velocity expression as follows: + +.. math:: + + c_{g} = \frac{1}{2} c_{p} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) \approx \begin{cases} + \frac{1}{2} c_{p} & \text{as } kh \rightarrow \infty \\ + 1 & \text{as } kh \rightarrow 0 + \end{cases} + +Inserting the full expression for the group velocity into the wave power equation provides the following: + +.. math:: + + P_{w} = \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left[ 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right] + +Similar to the other wave property expressions, the wave power expression can be simplified for both deep and shallow water conditions as follows: + +.. math:: + + P_{w} \approx + \begin{cases} + \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}} = \frac{1}{8\pi}\rho g^{2} A^{2} T & \text{as } kh \rightarrow \infty \\ + \frac{1}{4}\rho g A^{2} \sqrt{gh} & \text{as } kh \rightarrow 0 + \end{cases} + +.. Note:: + The deep water condition is often used without proper validation of the wave environment which can have a significant effect on wave power. + WEC-Sim by default will calculate the wave power using the full expression, no simplification, unless the hydrodynamic data is imported with + the assumption of infinite water depth. + +Irregular Waves +---------------- + +Irregular waves are modeled as the linear superposition of a large number of +harmonic waves at different frequencies and angles of incidence, where the +incident wave is defined as :math:`\eta(x,y,t)` : + +.. math:: + + \eta(x,y,t) = \sum_{i} \frac{H_{i}}{2} \cos( \omega_{i} t - + k_{i} (x\cos \theta_{i} + y \sin \theta_{i}) + \phi_{i}) + +where :math:`H` is the wave height, :math:`\omega` is the wave frequency +(:math:`\omega = \frac{2\pi}{T}`), :math:`k` is the wave number (:math:`k = +\frac{2\pi}{\lambda}`), :math:`\theta` is the wave direction, and :math:`\phi` +is the wave phase (randomized for irregular waves). + +.. _theory-wave-spectra: + +Wave Spectra +^^^^^^^^^^^^ + +The linear superposition of regular waves of distinct amplitudes and periods is +characterized in the frequency domain by a wave spectrum. Through statistical +analysis, spectra are characterized by specific parameters such as significant +wave height, peak period, wind speed, fetch length, and others. Common types of +wave spectra that are used by the offshore industry are discussed in the +following sections. The general form of the wave spectra available in WEC-Sim +is given by: + +.. math:: + + S\left( f , \theta \right)= S\left( f \right)D\left( \theta \right)~~ + +where :math:`S\left( f\right)` is the wave power spectrum, :math:`f` is the +wave frequency (in Hertz), :math:`D\left( \theta \right)` is the directional +distribution, and :math:`\theta` is the wave direction (in Degrees). The +formulation of :math:`D\left( \theta \right)` requires that + +.. math:: + + \int_{0}^{\infty} \int_{-\pi}^{\pi} + S \left( f \right) D \left( \theta \right) d\theta df = + \int_{0}^{\infty} S\left( f \right) df + +so that the total energy in the directional spectrum must be the same as the +total energy in the one-dimensional spectrum. + +.. math:: + + S\left( f \right) = A_{ws} f^{-5}\exp\left[-B_{ws} f^{-4} \right]~~ + +where :math:`A_{ws}` and :math:`B_{ws}` are coefficients that vary depending on +the wave spectrum and :math:`\exp` stands for the exponential function. +Spectral moments of the wave spectrum, denoted :math:`m_{k}~,~k=0, 1, 2,...`, +are defined as + +.. math:: + m_{k} = \int_{0}^{\infty} f^{k} S \left( f \right) df ~~ + +The spectral moment, :math:`m_{0}` is the variance of the free surface which +allows one to define the mean wave height of the tallest third of waves, +significant wave height :math:`H_{m0}` (in m), as: + +.. math:: + H_{m0} = 4 \sqrt{m_{0}}~~ + +Irregular Wave Power +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The time-averaged wave power available for a given irregular sea state can be calcuated from: + +.. math:: + P_{w} = \rho g \int_{0}^{\infty} S \left( f \right) c_{g} \left( f \right) df + +where the expression for group velocity for regular waves can be inserted for each frequency used +to describe the sea spectrum. + + + +Pierson--Moskowitz (PM) Spectrum +"""""""""""""""""""""""""""""""""""""""""""""" + +The PM spectrum is applicable to a fully developed sea, when the growth of the +waves is not limited by the fetch :cite:`PM`. The two-parameter PM spectrum is +based on a significant wave height and peak wave frequency. For a given +significant wave height, the peak frequency can be varied to cover a range of +conditions including developing and decaying seas. In general, the parameters +depend strongly on wind speed, and also wind direction, fetch, and locations of +storm fronts. The spectral density of the surface elevation defined by the PM +spectrum :cite:`IEC-2` is defined by: + +.. math:: + + S_{PM}\left( f \right) = \frac{{H_{m0}}^2}{4} + \left( 1.057f_{p} \right)^{4} f^{-5} \exp + \left[-\frac{5}{4} \left( \frac{f_{p}}{f}\right)^{4} \right] + +This implies coefficients of the general form: + +.. math:: + + A_{ws} &= \frac{{H_{m0}}^2}{4}\left(1.057f_{p}\right)^{4} \approx + \frac{5}{16} {H_{m0}}^2 {f_{p}}^{4} \approx \frac{B_{ws}}{4}{H_{m0}}^2 \\ + B_{ws} &= \left(1.057f_{p}\right)^{4} \approx \frac{5}{4}{f_{p}}^{4} + +where :math:`H_{m0}` is the significant wave height, :math:`f_{p}` is the peak +wave frequency :math:`\left(=1/T_{p}\right)`, and :math:`f` is the wave +frequency. + +JONSWAP (JS) Spectrum +""""""""""""""""""""""""""""""""""" + +The JONSWAP (Joint North Sea Wave Project) spectrum is formulated as a +modification of the PM spectrum for developing sea sate in a fetch-limited +situation :cite:`HK`. The spectrum accounts for a higher peak and a narrower +spectrum in a storm situation for the same total energy as compared to the PM +spectrum. The spectral density of the surface elevation defined by the JS +spectrum :cite:`IEC-2` is defined by: + +.. math:: + + S_{JS}\left( f \right) = C_{ws} \left(\gamma\right) S_{PM} \gamma^{\alpha} + +where :math:`\gamma` is the nondimensional peak-shape parameter. + +The normalizing factor, :math:`C_{ws}\left(\gamma\right)`, is defined as: + +.. math:: + + C_{ws}\left(\gamma\right) = \frac{\int_{0}^{\infty} S_{PM}\left( f \right)df} + {\int_{0}^{\infty}S_{PM}\left(f\right)\gamma^{\alpha}df} = + 1 -0.287\ln\left(\gamma\right) + +The peak-shape parameter exponent :math:`\alpha` is defined as: + +.. math:: + + \alpha = \exp \left[ -\left( \frac{\frac{f}{f_{p}}-1}{\sqrt{2} \sigma}\right)^{2} \right],~~ + \sigma = \begin{cases} 0.07 & f \leq f_{p} \\0.09 & f > f_{p} \end{cases} ~~ + +The peak-shape parameter is defined based on the following relationship between +the significant wave height, :math:`H_{m0}`, and peak period, :math:`T_{p}`: + +.. math:: + + \gamma = \begin{cases} + 5 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} \leq 3.6 \\ + \exp\left(5.75 - 1.15\frac{T_{p}}{\sqrt{H_{m0}}} \right) & \text{for } 3.6 \leq \frac{T_{p}}{\sqrt{H_{m0}}} \leq 5 \\ + 1 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} > 5 + \end{cases} + +with general form coefficients thus defined: + +.. math:: + A_{ws} &= \frac{B_{ws}}{4}{H_{m0}}^2 C_{ws}\left(\gamma \right) \gamma^{\alpha} \\ + B_{ws} &= \frac{5}{4}{f_{p}}^{4} + + +.. _theory-current: + +Ocean Current +------------- + +An ocean current is a continuous, directed movement of sea water generated by a number of forces acting upon the water, including wind, +the Coriolis effect, breaking waves, cabbeling, temperature and salinity differences, and other ocean phenomena. Depth contours, shoreline configurations, and +interactions with other currents influence a current's direction and strength. Ocean current can vary in space and time, but are generally modeled assuming a +horizontally uniform flow field of constant velocity and direction, varying only as a function of depth. + +.. figure:: /_static/images/oceanCurrentProfiles.png + :align: center + :width: 400pt + + .. + + *Ocean Current Profiles Within WEC-Sim* + +Within WEC-Sim there are three options to model ocean currents: + +Option 1 +^^^^^^^^ + +In Option 1, the sub-surface current is depth independent and is equal to the current at the water surface: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +where :math:`\theta_{c}` is the current direction. + +Option 2 +^^^^^^^^ + +In Option 2, the sub-surface current profile varies with depth following a 1/7th power law: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right]^{1/7} \left[ \cos \left(\theta_{c}\right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +where :math:`d_{current}` is the water depth where the sub-surface current is 0. + +Option 3 +^^^^^^^^ + +In Option 3, the sub-surface current profile varies linearly with depth: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right] \left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +.. Note:: + WEC-Sim does not adjust the linear wave hydrodynamics based on the presence + of ocean currents and assumes a linear superposition between current and + wave forces. The ocean current option is used only in the Morison Element + force calculation. + +Power Take-Off (PTO) +-------------------- + +Throughout the following sections, unless specification is made between linear +and rotary PTOs, units are not explicitly stated. + +Linear PTO +^^^^^^^^^^ + +The PTO mechanism is represented as a linear spring-damper system where the +reaction force is given by: + +.. math:: + + F_{pto}=-K{}_{pto}X_{rel}-C_{pto}\dot{X}_{rel} + +where :math:`K_{pto}` is the stiffness of the PTO, :math:`C_{pto}` is the +damping of the PTO, and :math:`X_{rel}` and :math:`\dot{X}_{rel}` are the +relative motion and velocity between two bodies. The instantaneous power +absorbed by the PTO is given by: + +.. math:: + + P_{pto} = -F_{pto}\dot{X}_{rel} = \left(K_{pto}X_{rel} \dot{X}_{rel} + + C_{pto} \dot{X}^{2}_{rel} \right) + +Hydraulic PTO +^^^^^^^^^^^^^ + +The PTO mechanism is modeled as a hydraulic system :cite:`So`, where the +reaction force is given by: + +.. math:: + + F_{pto}=\Delta{} p_{piston}A_{piston} + +where :math:`\Delta{} p_{piston}` is the differential pressure of the hydraulic +piston and :math:`A_{piston}` is the piston area. The instantaneous hydraulic +power absorbed by the PTO is given by: + +.. math:: + + P_{pto}=-F_{pto}\dot{X}_{rel} + + +Mechanical PTO +^^^^^^^^^^^^^^ + +The PTO mechanism is modeled as a direct-drive linear generator system +:cite:`So`, where the reaction force is given by: + +.. math:: + + F_{pto}=(\frac{\pi}{\tau_{pm}})\lambda_{fd}i_{sq} + +where :math:`\tau_{pm}` is the magnet pole pitch (the center-to-center distance +of adjacent magnetic poles), :math:`\lambda_{fd}` is the flux linkage of the +stator :math:`d`-axis winding due to flux produced by the rotor magnets, and +:math:`i_{sq}` is the stator :math:`q`-axis current. The instantaneous +mechanical power absorbed by the PTO is given by: + +.. math:: + + P_{pto}=-F_{pto}\dot{X}_{rel} + +For more information about application of pto systems in WEC-Sim, refer to +:ref:`user-advanced-features-pto` section. + +Mooring +------- + +The mooring load is represented using a linear quasi-static mooring stiffness +or by using the mooring forces calculated from `MoorDyn +`_, which is an +open-source lumped-mass mooring dynamics model. + +Mooring Matrix +^^^^^^^^^^^^^^ + +When linear quasi-static mooring stiffness is used, the mooring load can be +calculated by + +.. math:: + F_{m}=-K_{m}X-C_{m}\dot{X} + +where :math:`K_{m}` and :math:`C_{m}` are the stiffness and damping matrices +for the mooring system, and :math:`X` and :math:`\dot{X}` are the displacement +and velocity of the body, respectively. + +Mooring Lookup Table +^^^^^^^^^^^^^^^^^^^^ + +The Mooring Lookup Table searches a user-supplied 6DOF force lookup table. +The lookup table must contain six parameters: the resultant mooring force in each degree of freedom. +Each force must be indexed by position in all six degrees of freedom, as shown below. +The mooringClass does not assume a value for empty indices or forces. +All degrees of freemdom must be initialized and supplied by the user. +The mooring force is linearly interpolated between indexed positions based on the instantaneous position of the mooring system using a Simulink N-D Lookup Table for each force component. +The fidelity of the mooring lookup table is entirely dependent on the user-defined input. + +MoorDyn +^^^^^^^ + +MoorDyn discretizes each mooring line in a mooring system into evenly-sized +line segments connected by node points (see :ref:`MoorDyn figure +`). The line mass is lumped at these node points along with +gravitational and buoyancy forces, hydrodynamic loads, and reactions from +contact with the seabed. Hydrodynamic drag and added mass +are calculated based on Morison's equation. A mooring line's axial stiffness +is modeled by applying a linear stiffness to each line segment in tension only. +A damping term is also applied in each segment to dampen non-physical resonance +caused by the lumped-mass discretization. Bending and torsional stiffnesses are +neglected. Bottom contact is represented by vertical stiffness and damping +forces applied at the nodes when a node is located below the seabed. +:cite:`Hall2015ValidationData,hall2020moordyn`. + +.. _MoorDynFig: + +.. figure:: /_static/images/MoorDyn_Graphic.png + :scale: 70 % + :align: center + + .. + + *MoorDyn mooring model elements* + +For more information about application of mooring systems in WEC-Sim, refer to +:ref:`user-advanced-features-mooring` section. + + +Nonlinear Buoyancy and Froude-Krylov Wave Excitation +----------------------------------------------------- + +The linear model assumes that the body motion and the waves consist of small +amplitudes in comparison to the wavelengths. A weakly nonlinear approach is +applied to account for the nonlinear hydrodynamic forces induced by the +instantaneous water surface elevation and body position. Rather than using the +BEM calculated linear wave-excitation and hydrostatic coefficients, the +nonlinear buoyancy and the Froude-Krylov force components can be obtained by +integrating the static and dynamic pressures over each panel along the wetted +body surface at each time step. Linear wave theory is used to determine the +flow velocity and pressure field, so the values become unrealistically large +for wetted panels that are above the mean water level. To correct this, the +Wheeler stretching method is applied :cite:`wheeler1969methods`, which applies +a correction to the instantaneous wave elevation that forces its height to be +equal to the water depth when calculating the flow velocity and pressure, + + .. math:: + z^* = \frac{D(D+z)}{(D+\eta)} - D + +where :math:`D` is the mean water depth, and :math:`\eta` is the z-value on the +instantaneous water surface. + +.. Note:: + The nonlinear WEC-Sim method is not intended to model highly nonlinear hydrodynamic events, such as wave slamming and wave breaking. + +For more information about application of nonlinear hydrodynamics in WEC-Sim, +refer to :ref:`user-advanced-features-nonlinear` section. + +.. _theory-viscous-damping-morison: + +Viscous Damping and Morison Elements +------------------------------------ + +Additional damping and added-mass can be added to the WEC system. This +facilitates experimental validation of the WEC-Sim code, particularly in the +event that the BEM hydrodynamic outputs are not sufficiently representative of +the physical system. + +Viscous Damping +^^^^^^^^^^^^^^^ + +Linear damping and quadratic drag forces add flexibility to the definition of viscous forcing + + .. math:: + F_{v} &= -C_{v}\dot{X}-\frac{C_{d} \rho A_{d}}{2}\dot{X}|\dot{X}| \\ + &= -C_{v}\dot{X}-C_{D}\dot{X}|\dot{X}| + +where :math:`C_{v}` is the linear (viscous) damping coefficient, :math:`C_{d}` +is the quadratic drag coefficient, :math:`\rho` is the fluid density, and +:math:`A_{d}` is the characteristic area for drag calculation. Alternatively, +one can define :math:`C_{D}` directly. + +Because BEM codes are potential flow solvers and neglect the effects of +viscosity, :math:`F_{v}` generally must be included to accurately model device +performance. However, it can be difficult to select representative drag +coefficients, as they depend on device geometry, scale, and relative velocity +between the body and the flow around it. Empirical data on the drag coefficient +can be found in various literature and standards, but is generally limited to +simple geometries evaluated at a limited number of scales and flow conditions. +For realistic device geometries, the use of computational fluid dynamic +simulations or experimental data is encouraged. + +Morison Elements +^^^^^^^^^^^^^^^^ + +The Morison Equation assumes that the fluid forces in an oscillating flow on a +structure of slender cylinders or other similar geometries arise partly from +pressure effects from potential flow and partly from viscous effects. A slender +cylinder implies that the diameter, D, is small relative to the wave length, +:math:`\lambda`, which is generally met when :math:`D/\lambda < 0.1 - 0.2`. If +this condition is not met, wave diffraction effects must be taken into account. +Assuming that the geometries are slender, the resulting force can be +approximated by a modified Morison formulation :cite:`Morison1950`. The +formulation for each element on the body can be given as + + .. math:: + F_{me}=\rho\forall\dot{v} + \rho\forall C_{a}(\dot{v}-\ddot{X}) + + \frac{C_{d}\rho A_{d}}{2}(v-\dot{X})|v-\dot{X}| + +where :math:`v` is the fluid particle velocity due to the wave and current speed, +:math:`C_{a}` is the coefficient of added mass, and :math:`\forall` is the +displaced volume. + +.. Note:: + WEC-Sim does not consider buoyancy effects when calculating the forces + from Morison elements. + +For more information about application of Morison Elements in WEC-Sim, refer to +:ref:`user-advanced-features-morison` section. + + +Generalized Body Modes +---------------------- + +Additional generalized body modes (GBM) are included to account for solving a +multibody system with relative body motions, dynamics, or structural +deformation. This implementation assumes the modal properties are given, +obtainable in closed-form expressions or with finite element analysis. Once the +hydrodynamic coefficients that include these additional flexible DOF are +obtained from the BEM solver, the 6DOF rigid body motion for each body and the +additional GBM DOFs are solved together in one system of equations. See this +example and :ref:`user-advanced-features` for more details on implementing GBM. + + +Terminology +----------- + +.. include:: /_include/terminology.rst + + +References +---------- + +.. bibliography:: ../refs/WEC-Sim_Theory.bib + :style: unsrt + :labelprefix: B diff --git a/dev/_sources/user/advanced_features.rst.txt b/dev/_sources/user/advanced_features.rst.txt new file mode 100644 index 000000000..03ed27ab3 --- /dev/null +++ b/dev/_sources/user/advanced_features.rst.txt @@ -0,0 +1,1663 @@ +.. _user-advanced-features: + +Advanced Features +================= + +The advanced features documentation provides an overview of WEC-Sim features +and applications that were not covered in the WEC-Sim :ref:`user-tutorials`. +The diagram below highlights some of WEC-Sim's advanced features, details of +which will be described in the following sections. Most advanced features have +a corresponding example case within the `WEC-Sim_Applications repository +`_ or the ``WEC-Sim/Examples`` +directory in the WEC-Sim source code. For those topics of interest, it is +recommended that users run and understand the output of an application while +reading the documentation on the feature. + +.. codeFeatures: + +.. figure:: /_static/images/codeFeatures.png + :width: 400pt + :align: center + + .. + +.. _user-advanced-features-bemio: + +BEMIO +----- + +.. include:: /_include/bemio.rst + +.. _user-advanced-features-simulation: + +Simulation Features +------------------- + +This section provides an overview of WEC-Sim's simulation class features; for +more information about the simulation class code structure, refer to +:ref:`user-code-structure-simulation-class`. + +Running WEC-Sim +^^^^^^^^^^^^^^^ + +The subsection describes the various ways to run WEC-Sim. The standard method is +to type the command ``wecSim`` in the MATLAB command window when in a ``$CASE`` +directory. This is the same method described in the :ref:`user-workflow` and +:ref:`user-tutorials` sections. + + +.. _user-advanced-features-fcn: + +Running as Function +""""""""""""""""""" + +WEC-Sim allows users to execute WEC-Sim as a function by using ``wecSimFcn``. +This option may be useful for users who wish to devise their own batch runs, +isolate the WEC-Sim workspace, create a special set-up before running WEC-Sim, +or link to another software. + + +.. _user-advanced-features-simulink: + +Running from Simulink +""""""""""""""""""""" + +WEC-Sim can also be run directly from Simulink. +The Run From Simulink advanced feature allows users to initialize WEC-Sim from the command window and then begin the simulation from Simulink. +This allows greater compatibility with other models or hardware-in-the-loop simulations that must start in Simulink. +The WEC-Sim library contains mask options that allow users to either: + + 1. Define an standard input file to use in WEC-Sim or + 2. Define custom parameters inside the block masks. + +The Global Reference Frame mask controls whether an input file or custom +parameters are used for WEC-Sim. Note that when the Custom Parameters options is +selected, WEC-Sim will only use those variable in the block masks. Certain options +become visible when the correct flag is set. For example, ``body.morisonElement.cd`` +will not be visible unless ``body.morisonElement.on > 0``. This method of running +WEC-Sim may help some users visualize the interplay between the blocks and classes. +For more information on how the blocks and classes are related, see the +:ref:`user-code-structure` section. + +To run WEC-Sim from Simulink, open the Simulink ``.slx`` file and choose whether to +use an input file or custom parameters in the Global Reference Frame. Next type +``initializeWecSim`` in the MATLAB Command Window. Then, run the model from the +Simulink interface. Lastly, after the simulation has completed, type ``stopWecSim`` +in the MATLAB Command Window to run post-processing. + +* Run from Simulink with a wecSimInputFile.m + * Open the WEC-Sim Simulink file (``.slx``). + * Set the Global Reference Frame to use an input file + * Type ``initializeWecSim`` in the Command Window + * Run the model from Simulink + * Wait for the simulation to complete, then type ``stopWecSim`` in the Command Window +* Run from Simulink with custom parameters + * Open the Simulink file (``.slx``). + * Set the Global Reference Frame to use custom parameters + * (Optional) prefill parameters by loading an input file. + * Edit custom parameters as desired + * Type ``initializeWecSim`` in the Command Window + * Run the model from Simulink + * Wait for the simulation to complete, then type ``stopWecSim`` in the Command Window + +After running WEC-Sim from Simulink with custom parameters, a +``wecSimInputFile_simulinkCustomParameters.m`` file is written to the ``$CASE`` +directory. This file specifies all non-default WEC-Sim parameters used for the +WEC-Sim simulation. This file serves as a record of how the case was run for +future reference. It may be used in the same manner as other input files when +renamed to ``wecSimInputFile.m`` + + +.. _user-advanced-features-mcr: + +Multiple Condition Runs (MCR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows users to easily perform batch runs by typing ``wecSimMCR`` into +the MATLAB Command Window. This command executes the Multiple Condition Run +(MCR) option, which can be initiated three different ways: + + + **Option 1.** Specify a range of sea states and PTO damping coefficients in + the WEC-Sim input file, example: + ``waves.height = 1:0.5:5; waves.period = 5:1:15;`` + ``pto(1).stiffness=1000:1000:10000; pto(1).damping=1200000:1200000:3600000;`` + + **Option 2.** Specify the excel filename that contains a set of wave + statistic data in the WEC-Sim input file. This option is generally useful + for power matrix generation, example: + ``simu.mcrExcelFile = ".xls"`` + + **Option 3.** Provide a MCR case *.mat* file, and specify the filename in + the WEC-Sim input file, example: + ``simu.mcrMatFile = ".mat"`` + +For Multiple Condition Runs, the ``*.h5`` hydrodynamic data is only loaded +once. To reload the ``*.h5`` data between runs, set ``simu.reloadH5Data =1`` in +the WEC-Sim input file. + +If the Simulink model relies upon ``From Workspace`` input blocks other than those utilized by the WEC-Sim library blocks (e.g. ``waves.elevationFile``), these can be iterated through using Option 3. The MCR file header MUST be a cell containing the exact string ``'LoadFile'``. The pathways of the files to be loaded to the workspace must be given in the ``cases`` field of the MCR *.mat* file. WEC-Sim MCR will then run WEC-Sim in sequence, once for each file to be loaded. The variable name of each loaded file should be consistent, and specified by the ``From Workspace`` block. + +For more information, refer to :ref:`webinar1`, and the **RM3_MCR** example on the `WEC-Sim Applications `_ repository. + +The **RM3_MCR** examples on the `WEC-Sim Applications +`_ repository demonstrate the +use of WEC-Sim MCR for each option above (arrays, .xls, .mat). The fourth case +demonstrates how to vary the wave spectrum input file in each case run by +WEC-Sim MCR. + +The directory of an MCR case can contain a :code:`userDefinedFunctionsMCR.m` +file that will function as the standard :code:`userDefinedFunctions.m` file. +Within the MCR application, the :code:`userDefinedFunctionsMCR.m` script +creates a power matrix from the PTO damping coefficient after all cases have +been run. + +For more information, refer to :ref:`webinar1`. + +.. _user-advanced-features-pct: + +Parallel Computing Toolbox (PCT) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows users to execute batch runs by typing ``wecSimPCT`` into the +MATLAB Command Window. This command executes the MATLAB `Parallel Computing +Toolbox `_ (PCT), +which allows parallel capability for :ref:`user-advanced-features-mcr` but adds +an additional MATLAB dependency to use this feature. Similar to MCR, this +feature can be executed in three ways (Options 1~3). + +For PCT runs, the ``*.h5`` hydrodynamic data must be reload, regardless the +setting for ``simu.reloadH5Data`` in the WEC-Sim input file. + + +.. Note:: + The ``userDefinedFunctionsMCR.m`` is not compatible with ``wecSimPCT``. + Please use ``userDefinedFunctions.m`` instead. + + +Radiation Force calculation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The radiation forces are calculated at each time-step by the convolution of the body velocity and the +radiation Impulse Response Function -- which is calculated using the cosine transform of the radiation-damping. +Speed-gains to the simulation can be made by using alternatives to the convolution operation, namely, + +1. The State-Space Representation, +2. The Finite Impulse Response (FIR) Filters. + +Simulation run-times were benchmarked using the RM3 example simulated for 1000 s. Here is a summary of normalized +run-times when the radiation forces are calculated using different routes. The run-times are normalized by the +run-time for a simulation where the radiation forces are calculated using "Constant Coefficients" ( :math:`T_0` ): + + +------------------------------------------------+-------------------------------------------+ + | *Radiation Force Calculation Approach* | *Normalized Run Time* | + +------------------------------------------------+-------------------------------------------+ + | Constant Coefficients | :math:`T_0` | + +------------------------------------------------+-------------------------------------------+ + | Convolution | :math:`1.57 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + | State-Space | :math:`1.14 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + | FIR Filter | :math:`1.35 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + +State-Space Representation +"""""""""""""""""""""""""" + +The convolution integral term in the equation of motion can be linearized using +the state-space representation as described in the :ref:`theory` section. To +use a state-space representation, the ``simu.stateSpace`` simulationClass variable +must be defined in the WEC-Sim input file, for example: + + :code:`simu.stateSpace = 1` + +.. _user-advanced-features-time-step: + + +Finite Impulse Response (FIR) Filters +""""""""""""""""""""""""""""""""""""" +By default, WEC-Sim uses numerical integration to calculate the convolution integral, while +FIR filters implement the same using a `discretized convolution`, by using FIR filters -- digital filters +that are inherently stable. Convolution of Impulse Response Functions of `Finite` length, i.e., those +that dissipate and converge to `zero` can be accomplished using FIR filters. +The convolution integral can also be calculated using FIR filters by setting: + + :code:`simu.FIR=1`. + +.. Note:: + By default :code:`simu.FIR=0`, unless specified otherwise. + +Time-Step Features +^^^^^^^^^^^^^^^^^^ + +The default WEC-Sim solver is 'ode4'. Refer to the **NonlinearHydro** example +on the `WEC-Sim Applications `_ +repository for a comparisons between 'ode4' to +`'ode45' `_. The following +variables may be changed in the simulationClass (where N is number of increment +steps, default: N=1): + +* Fixed time-step: :code:`simu.dt` +* Output time-step: :code:`simu.dtOut=N*simu.dt` +* Nonlinear Buoyancy and Froude-Krylov Excitation time-step: :code:`simu.nonlinearDt=N*simu.dt` +* Convolution integral time-step: :code:`simu.cicDt=N*simu.dt` +* Morison force time-step: :code:`simu.morisonDt = N*simu.dt` + +Fixed Time-Step (ode4) +"""""""""""""""""""""" + +When running WEC-Sim with a fixed time-step, 100-200 time-steps per wave period +is recommended to provide accurate hydrodynamic force calculations (ex: simu.dt += T/100, where T is wave period). However, a smaller time-step may be required +(such as when coupling WEC-Sim with MoorDyn or PTO-Sim). To reduce the required +WEC-Sim simulation time, a different time-step may be specified for nonlinear +buoyancy and Froude-Krylov excitation and for convolution integral +calculations. For all simulations, the time-step should be chosen based on +numerical stability and a convergence study should be performed. + +Variable Time-Step (ode45) +"""""""""""""""""""""""""" + +To run WEC-Sim with a variable time-step, the following variables must be +defined in the simulationClass: + +* Numerical solver: :code:`simu.solver='ode45'` +* Max time-step: :code:`simu.dt` + +This option sets the maximum time step of the simulation (:code:`simu.dt`) and +automatically adjusts the instantaneous time step to that required by MATLAB's +differential equation solver. + +.. _user-advanced-features-wave: + +Wave Features +-------------- + +This section provides an overview of WEC-Sim's wave class features. For more +information about the wave class code structure, refer to +:ref:`user-code-structure-wave-class`. The various wave features can be +compared by running the cases within ``the WEC-Sim/Examples/RM3`` and ``the +WEC-Sim/Examples/OSWEC`` directories. + +.. _user-advanced-features-irregular-wave-binning: + +Irregular Wave Binning +^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim's default spectral binning method divides the wave spectrum into 499 +bins with equal energy content, defined by 500 wave frequencies. As a result, +the wave forces on the WEC using the equal energy method are only computed at +each of the 500 wave frequencies. The equal energy formulation speeds up the +irregular wave simulation time by reducing the number of frequencies the wave +train is defined by, and thus the number of frequencies for which the wave +forces are calculated. It prevents bins with very little energy from being +created and unnecessarily adding to the computational cost. The equal energy +method is specified by defining the following wave class variable in the +WEC-Sim input file: + + :code:`waves.bem.option = 'EqualEnergy';` + +By comparison, the traditional method divides the wave spectrum into a +sufficiently large number of equally spaced bins to define the wave spectrum. +WEC-Sim's traditional formulation uses 999 bins, defined by 1000 wave +frequencies of equal frequency distribution. To override WEC-Sim's default +equal energy method, and instead use the traditional binning method, the +following wave class variable must be defined in the WEC-Sim input file: + + :code:`waves.bem.option = 'Traditional';` + +Users may override the default number of wave frequencies by defining +``waves.bem.count``. However, it is on the user to ensure that the wave spectrum +is adequately defined by the number of wave frequencies, and that the wave +forces are not impacted by this change. + +Wave Directionality +^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the ability to model waves with various angles of incidence, +:math:`\theta`. To define wave directionality in WEC-Sim, the following wave +class variable must be defined in the WEC-Sim input file: + + :code:`waves.direction = ; %[deg]` + +The incident wave direction has a default heading of 0 Degrees (Default = 0), +and should be defined as a column vector for more than one wave direction. For +more information about the wave formulation, refer to +:ref:`theory-wave-spectra`. + +Wave Directional Spreading +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the ability to model waves with directional spreading, +:math:`D\left( \theta \right)`. To define wave directional spreading in +WEC-Sim, the following wave class variable must be defined in the WEC-Sim input +file: + + :code:`waves.spread = ;` + +The wave directional spreading has a default value of 1 (Default = 1), and +should be defined as a column vector of directional spreading for each one wave +direction. For more information about the spectral formulation, refer to +:ref:`theory-wave-spectra`. + +.. Note:: + + Users must define appropriate spreading parameters to ensure energy is + conserved. Recommended directional spreading functions include + Cosine-Squared and Cosine-2s. + +.. _user-advanced-features-seeded-phase: + +Multiple Wave-Spectra +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Wave Directional Spreading feature only allows splitting the same wave-front. +However, quite often mixed-seas are composed of disparate Wave-Spectra with unique +periods, heights, and directions. An example would be a sea-state composed of +swell-waves and chop-waves. + +Assuming that the linear potential flow theory holds, the wave inputs to the system can be +super-imposed. This implies, the effects of multiple Wave-Spectra can be simulated, if the +excitation-forces for each Wave-Spectra is calculated, and added to the pertinent +Degree-of-Freedom. + +WEC-Sim can simulate the dynamics of a body experiencing multiple Wave-Spectra each with +their unique directions, periods, and heights. In order to calculate the excitation-forces +for multiple Wave-Spectra, WEC-Sim automatically generates multiple instances of +excitation-force sub-systems. The user only needs to create multiple instances of +the ``waves`` class. + + +Here is an example for setting up multiple Wave-Spectra in the WEC-Sim input file:: + + waves(1) = waveClass('regularCIC'); % Initialize Wave Class and Specify Type + waves(1).height = 2.5; % Wave Height [m] + waves(1).period = 8; % Wave Period [s] + waves(1).direction = 0; % Wave Direction (deg.) + waves(2) = waveClass('regularCIC'); % Initialize Wave Class and Specify Type + waves(2).height = 2.5; % Wave Height [m] + waves(2).period = 8; % Wave Period [s] + waves(2).direction = 90; % Wave Direction (deg.) + + + +.. Note:: + + 1. If using a wave-spectra with different wave-heading directions, ensure that the BEM data has + the hydrodynamic coefficients corresponding to the desired wave-heading direction, + + 2. All wave-spectra should be of the same type, i.e., if :code:`waves(1)` is initialized + as :code:`waves(1) = waveClass('regularCIC')`, the following :code:`waves(#)` object should + initialized the same way. + +Addtionally, the multiple Wave-Spectra can be visualized as elaborated in :ref:`user-advanced-features-wave-markers`. +The user needs to define the marker parameters for each Wave-Spectra, as one would for a single Wave-Spectra. + +Here is an example of 2 Wave-Spectra being visualized using the wave wave-markers feature: + +.. figure:: /_static/images/Nwave.png + :width: 600pt + :align: center + +Here is a visualization of two Wave-Spectra, represented by red markers and blue markers respectively. + +Irregular Waves with Seeded Phase +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the phase for all irregular wave cases are generated randomly. In +order to reproduce the same time-series every time an irregular wave simulation +is run, the following wave class variable may be defined in the WEC-Sim input +file: + + :code:`waves.phaseSeed = ;` + +By setting ``waves.phaseSeed`` equal to 1,2,3,...,etc, the random wave phase +generated by WEC-Sim is seeded, thus producing the same random phase for each +simulation. + +Wave Gauge Placement +^^^^^^^^^^^^^^^^^^^^ +Wave gauges can be included through the wave class parameters:: + + waves.marker.location + waves.marker.size + waves.marker.style + +By default, the wave surface elevation at the origin is calculated by WEC-Sim. +In past releases, there was the option to define up to three numerical wave gauge +locations where WEC-Sim would also calculate the undisturbed linear incident wave +elevation. WEC-Sim now has the feature to define wave markers that oscillate +vertically with the undistrubed linear wave elevation (see :ref:`user-advanced-features-wave-markers`). +This feature does not limit the number of point measurements of the undisturbed +free surface elevation and the time history calculation at the marker location +is identical to the previous wave gauge implementation. Users who desire to +continuing using the previous wave gauge feature will only need to update the +variable called within WEC-Sim and an example can be found in the +`WECCCOMP Repository `_. + +.. Note:: + The numerical wave markers (wave gauges) do not handle the incident wave interaction with the radiated or diffracted + waves that are generated because of the presence and motion of any hydrodynamic bodies. + + +.. _user-advanced-features-current: + +Ocean Current +^^^^^^^^^^^^^ +The speed of an ocean current can be included through the wave class parameters:: + + waves.current.option + waves.current.speed + waves.current.direction + waves.current.depth + +The current option determines the method used to propagate the surface current across the +specified depth. Option 0 is depth independent, option 1 uses a 1/7 power law, option 2 +uses linear variation with depth and option 3 specifies no ocean current. +The ``current.speed`` parameter represents the surface current speed, and ``current.depth`` +the depth at which the current speed decays to zero (given as a positive number). +See :ref:`theory-current` for more details on each method. +These parameters are used to calculate the fluid velocity in the Morison Element calculation. + +.. _user-advanced-features-body: + +Body Features +------------- + +This section provides an overview of WEC-Sim's body class features; for more +information about the body class code structure, refer to +:ref:`user-code-structure-body-class`. + +Body Mass and Geometry Features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The mass of each body must be specified in the WEC-Sim input file. The +following features are available: + +* **Floating Body** - the user may set :code:`body(i).mass = 'equilibrium'` + which will calculate the body mass based on displaced volume and water + density. If :code:`simu.nonlinearHydro = 0`, then the mass is calculated using the + displaced volume contained in the ``*.h5`` file. If :code:`simu.nonlinearHydro = 1` + or :code:`simu.nonlinearHydro = 2`, then the mass is calculated using the displaced + volume of the provided STL geometry file. + +* **Fixed Body** - if a body is fixed to the seabed using a fixed constraint, the mass + and moment of inertia may be set to arbitrary values such as 999 kg and [999 999 999] + kg-m^2. If the constraint forces on the fixed body are important, the mass and inertia + should be set to their real values. + +* **Import STL** - to read in the geometry (``*.stl``) into Matlab use the + :code:`body(i).importBodyGeometry()` method in the bodyClass. This method will import the + mesh details (vertices, faces, normals, areas, centroids) into the + :code:`body(i).geometry` property. This method is also used for nonlinear + buoyancy and Froude-Krylov excitation and ParaView visualization files. Users + can then visualize the geometry using the :code:`body(i).plotStl` method. + +.. _user-advanced-features-nonlinear: + +Nonlinear Buoyancy and Froude-Krylov Excitation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the option to include the nonlinear hydrostatic restoring and +Froude-Krylov forces when solving the system dynamics of WECs, accounting for +the weakly nonlinear effect on the body hydrodynamics. To use nonlinear +buoyancy and Froude-Krylov excitation, the **body(ii).nonlinearHydro** bodyClass +variable must be defined in the WEC-Sim input file, for example: + + :code:`body(ii).nonlinearHydro = 2` + +For more information, refer to the :ref:`webinar2`, and the **NonlinearHydro** +example on the `WEC-Sim Applications `_ +repository. + +Nonlinear Settings +"""""""""""""""""" + +**body(ii).nonlinearHydro** - +The nonlinear hydrodynamics option can be used with the parameter: +:code:`body(ii).nonlinearHydro` in your WEC-Sim input file. When any of the three +nonlinear options (below) are used, WEC-Sim integrates the wave pressure over +the surface of the body, resulting in more accurate buoyancy and Froude-Krylov +force calculations. + + **Option 1.** :code:`body(ii).nonlinearHydro = 1` This option integrates the pressure + due to the mean wave elevation and the instantaneous body position. + + **Option 2.** :code:`body(ii).nonlinearHydro = 2` This option integrates the pressure + due to the instantaneous wave elevation and the instantaneous body position. + This option is recommended if nonlinear effects need to be considered. + +**simu.nonlinearDt** - +An option available to reduce the nonlinear simulation time is to specify a +nonlinear time step, :code:`simu.nonlinearDt=N*simu.dt`, where N is number of +increment steps. The nonlinear time step specifies the interval at which the +nonlinear hydrodynamic forces are calculated. As the ratio of the nonlinear to +system time step increases, the computation time is reduced, again, at the +expense of the simulation accuracy. + +.. Note:: + WEC-Sim's nonlinear buoyancy and Froude-Krylov wave excitation option may + be used for regular or irregular waves but not with user-defined irregular + waves. + +STL File Generation +""""""""""""""""""" + +When the nonlinear option is turned on, the geometry file (``*.stl``) +(previously only used for visualization purposes in linear simulations) is used +as the discretized body surface on which the nonlinear pressure forces are +integrated. As in the linear case, the STL mesh origin must be at a body's center of gravity. + +A good STL mesh resolution is required when using the nonlinear buoyancy and Froude-Krylov wave excitation in +WEC-Sim. The simulation accuracy will increase with increased surface +resolution (i.e. the number of discretized surface panels specified in the +``*.stl`` file), but the computation time will also increase. +There are many ways to generate an STL file; however, it is important to verify +the quality of the mesh before running WEC-Sim simulations with the nonlinear +hydro flag turned on. An STL file can be exported from most CAD programs, but +few allow adequate mesh refinement. By default, most CAD programs write an STL +file similar to the left figure, with the minimum panels possible. +To accurately model nonlinear hydrodynamics in WEC-Sim, STL files should be refined to +have an aspect ratio close to one, and contain a high resolution in the vertical direction +so that an accurate instantaneous displaced volume can be calculated. + +.. figure:: /_static/images/rectangles.png + :width: 300pt + :align: center + +Many commercial and free software exist to convert between mesh formats and +refine STL files, including: + +* `Free CAD `_ +* `BEM Rosetta `_ +* `Meshmagick `_ +* `Coreform CUBIT `_ (commercial) +* `Rhino `_ (commercial) + + +.. _user-advanced-features-nonlinear-tutorial-heaving-ellipsoid: + +Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The body tested in the study is an ellipsoid with a cross- section +characterized by semi-major and -minor axes of 5.0 m and 2.5 m in the wave +propagation and normal directions, respectively . The ellipsoid is at its +equilibrium position with its origin located at the mean water surface. The +mass of the body is then set to 1.342×105 kg, and the center of gravity is +located 2 m below the origin. + +.. _user-advanced-features-nonlinearEllipsoid: + +.. figure:: /_static/images/nonlinearEllipsoid.png + :width: 350pt + :align: center + +STL file with the discretized body surface is shown below (``ellipsoid.stl``) + +.. _user-advanced-features-nonlinearMesh: + +.. figure:: /_static/images/nonlinearMesh.png + :width: 250pt + :align: center + +The single-body heave only WEC model is shown below (``nonLinearHydro.slx``) + +.. _user-advanced-features-nonlinearWEC: + +.. figure:: /_static/images/nonlinearWEC.png + :width: 450pt + :align: center + +The WEC-Sim input file used to run the nonlinear hydro WEC-Sim simulation: + +.. _user-advanced-features-nonLinearwecSimInputFile: + +.. rli:: https://raw.githubusercontent.com/WEC-Sim/WEC-Sim_Applications/main/Nonlinear_Hydro/ode4/Regular/wecSimInputFile.m + :language: matlab + +Simulation and post-processing is the same process as described in the +:ref:`user-tutorials` section. + +Viscous Damping and Morison Elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows for the definition of additional damping and added-mass terms +to allow users to tune their models precisely. Viscous damping and Morison Element +may be defined for hydrodynamic, drag, or flexible bodies. It is highly recommended +that users add viscous or Morison drag to create a realistic model. + +When the Morison Element +option is used in combination with a hydrodynamic or flexible body, it serves as a +tuning method. The equation of motion for hydrodynamic and flexible bodies with a +Morison Element is more complex than the traditional Morison Element formulation. +A traditional Morison Element may be created by using a drag body +(``body(#).nonHydro=2``) with ``body(#).morisonElement.option = 1 or 2``. +For more information about the numerical formulation of viscous damping and +Morison Elements, refer to the theory section :ref:`theory-viscous-damping-morison`. + +Viscous Damping +""""""""""""""" + +A viscous damping force in the form of a linear damping coefficient +:math:`C_{v}` can be applied to each body by defining the following body class +parameter in the WEC-Sim input file (which has a default value of zero):: + + body(i).linearDamping + +A quadratic drag force, proportional to the square of the body's velocity, can +be applied to each body by defining the quadratic drag coefficient +:math:`C_{d}`, and the characteristic area :math:`A_{d}` for drag calculation. +This is achieved by defining the following body class parameters in the WEC-Sim +input file (each of which have a default value of zero):: + + body(i).quadDrag.cd + body(i).quadDrag.area + +Alternatively, one can define :math:`C_{D}` directly:: + + body(i).quadDrag.drag + +.. _user-advanced-features-morison: + +Morison Elements +"""""""""""""""" + +To use Morison Elements, the following body class variable must be +defined in the WEC-Sim input file with :code:`body(ii).morisonElement.option`. + +Implementation Option 0 Morison Elements are not included in the body force and moment calculations. + +Implementation Option 1 allows for the Morison Element properties to be defined +independently for the x-, y-, and z-axis while Implementation Option 2 uses a +normal and tangential representation of the Morison Element properties. Note +that the two options allow the user flexibility to implement hydrodynamic +forcing that best suits their modeling needs; however, the two options have +slightly different calculation methods and therefore the outputs will not +necessarily provide the same forcing values. The user is directed to look at +the Simulink Morison Element block within the WEC-Sim library to better +determine which approach better suits their modeling requirements. + +Morison Elements must be defined for each body using the +:code:`body(i).morisonElement` property of the body class. This property +requires definition of the following body class parameters in the WEC-Sim input +file (each of which have a default value of zero(s)). + +For :code:`body(ii).morisonElement.option = 1` :: + + body(i).morisonElement.cd = [c_{dx} c_{dy} c_{dz}] + body(i).morisonElement.ca = [c_{ax} c_{ay} c_{az}] + body(i).morisonElement.area = [A_{x} A_{y} A_{z}] + body(i).morisonElement.VME = [V_{me}] + body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}] + body(i).morisonElement.z = [0 0 0] + +.. Note:: + + For Option 1, the unit normal :code:`body(#).morisonElement.z` must be + initialized as a [:code:`n` x3] vector, where :code:`n` is the number of Morison Elements, although it will not be used in the + hydrodynamic calculation. + +For :code:`body(ii).morisonElement.option = 2` :: + + body(i).morisonElement.cd = [c_{dn} c_{dt} 0] + body(i).morisonElement.ca = [c_{an} c_{at} 0] + body(i).morisonElement.area = [A_{n} A_{t} 0] + body(i).morisonElement.VME = [V_{me}] + body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}] + body(i).morisonElement.z = [z_{x} z_{y} z_{z}] + +.. Note:: + + For Option 2, the :code:`body(i).morisonElement.cd`, + :code:`body(i).morisonElement.ca`, and + :code:`body(i).morisonElement.area` variables need to be + initialized as [:code:`n` x3] vector, where :code:`n` is the number of Morison Elements, with the third column index set to zero. While + :code:`body(i).morisonElement.z` is a unit normal vector that defines the + orientation of the Morison Element. + +To better represent certain scenarios, an ocean current speed can be defined to +calculate a more accurate fluid velocity and acceleration on the Morison +Element. These can be defined through the wave class parameters +``waves.current.option``, ``waves.current.speed``, ``waves.current.direction``, +and ``waves.current.depth``. See :ref:`user-advanced-features-current` for more +detail on using these options. + +The Morison Element time-step may also be defined as +:code:`simu.morisonDt = N*simu.dt`, where N is number of increment steps. For an +example application of using Morison Elements in WEC-Sim, refer to the `WEC-Sim +Applications `_ repository +**Free_Decay/1m-ME** example. + +.. Note:: + + Morison Elements cannot be used with :code:`elevationImport`. + +.. _user-advanced-features-non-hydro-body: + +Non-Hydrodynamic Bodies +^^^^^^^^^^^^^^^^^^^^^^^ + +For some simulations, it might be important to model bodies that do not have +hydrodynamic forces acting on them. This could be bodies that are completely +outside of the water but are still connected through a joint to the WEC bodies, +or it could be bodies deeply submerged to the point where the hydrodynamics may +be neglected. WEC-Sim allows for bodies which have no hydrodynamic forces +acting on them and for which no BEM data is provided. + +To do this, use a Body Block from the WEC-Sim Library and initialize it in the +WEC-Sim input file as any other body but leave the name of the ``h5`` file as +an empty string. Specify :code:`body(i).nonHydro = 1;` and specify body name, +mass, moments of inertia, center of gravity, center of buoyancy, geometry file, +location, and displaced volume. You can also specify visualization options and +initial displacement. + +To use non-hydrodynamic bodies, the following body class variable must be +defined in the WEC-Sim input file, for example:: + + body(i).nonHydro = 1 + +Non-hydrodynamic bodies require the following properties to be defined:: + + body(i).mass + body(i).inertia + body(i).centerGravity + body(i).volume + +In the case where only non-hydrodynamic and drag bodies are used, WEC-Sim does +not read an ``*.h5`` file. Users must define these additional parameters to +account for certain wave settings as there is no hydrodynamic body present in +the simulation to define them:: + + waves.bem.range + waves.waterDepth + + +For more information, refer to :ref:`webinar2`, and the **Nonhydro_Body** +example on the `WEC-Sim Applications +`_ repository. + +Drag Bodies +^^^^^^^^^^^ + +A body may be subjected to viscous drag or Morison forces, but does not +experience significant wave excitation or radiation. And example may be a +deeply-submerged heave plate of large surface area tethered to a float. In +these instances, the drag body implementation can be utilized by defining the +following body class variable:: + + body(i).nonHydro = 2 + + +Drag bodies have zero wave excitation or radiation forces, but viscous forces +can be applied in the same manner as a hydrodynamic body via the parameters:: + + body(i).quadDrag.drag + body(i).quadDrag.cd + body(i).quadDrag.area + body(i).linearDamping + +or if using Morison Elements:: + + body(i).morisonElement.cd + body(i).morisonElement.ca + body(i).morisonElement.area + body(i).morisonElement.VME + body(i).morisonElement.rgME + +which are described in more detail in the forthcoming section. At a minimum, it +is necessary to define:: + + body(i).mass + body(i).inertia + body(i).centerGravity + body(i).volume + +to resolve drag body dynamics. One can additionally describe initial body +displacement in the manner of a hydrodynamic body. + +.. _user-advanced-features-b2b: + +Body-To-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows for body-to-body interactions in the radiation force +calculation, thus allowing the motion of one body to impart a force on all +other bodies. The radiation matrices for each body (radiation wave damping and +added mass) required by WEC-Sim and contained in the ``*.h5`` file. **For +body-to-body interactions with N total hydrodynamic bodies, the** ``*h5`` +**data structure is [(6\*N), 6]**. + +When body-to-body interactions are used, the augmented [(6\*N), 6] matrices are +multiplied by concatenated velocity and acceleration vectors of all +hydrodynamic bodies. For example, the radiation damping force for body(2) in a +3-body system with body-to-body interactions would be calculated as the product +of a [1,18] velocity vector and a [18,6] radiation damping coefficients matrix. + +To use body-to-body interactions, the following simulation class variable must +be defined in the WEC-Sim input file:: + + simu.b2b = 1 + +For more information, refer to :ref:`webinar2`, and the **RM3_B2B** example in +the `WEC-Sim Applications `_ +repository. + +.. Note:: + + By default, body-to-body interactions are off (:code:`simu.b2b = 0`), and + only the :math:`[1+6(i-1):6i, 1+6(i-1):6i]` sub-matrices are used for each + body (where :math:`i` is the body number). + +.. _user-advanced-features-generalized-body-modes: + +Generalized Body Modes +^^^^^^^^^^^^^^^^^^^^^^ + +To use this, select a Flex Body Block from the WEC-Sim Library (under Body +Elements) and initialize it in the WEC-Sim input file as any other body. +Calculating dynamic response of WECs considering structural flexibility using +WEC-Sim should consist of multiple steps, including: + +* Modal analysis of the studied WEC to identify a set of system natural + frequencies and corresponding mode shapes +* Construct discretized mass and impedance matrices using these structural + modes +* Include these additional flexible degrees of freedom in the BEM code to + calculate hydrodynamic coefficients for the WEC device +* Import the hydrodynamic coefficients to WEC-Sim and conduct dynamic analysis + of the hybrid rigid and flexible body system + +The `WEC-Sim Applications repository `_ +contains a working sample of a barge with four additional degrees of freedom to +account for bending and shearing of the body. See this example for details on +how to implement and use generalized body modes in WEC-Sim. + +.. Note:: + + Generalized body modes module has only been tested with WAMIT, where BEMIO + may need to be modified for NEMOH, Aqwa and Capytaine. + +.. _user-advanced-features-passive-yaw: + +Passive Yaw Implementation +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For non-axisymmetric bodies with yaw orientation that changes substantially +with time, WEC-Sim allows a correction to excitation forces for large yaw +displacements. To enable this correction, add the following to your +``wecSimInputFile``:: + + body(ii).yaw.option = 1 + +Under the default implementation (:code:`body(ii).yaw.option = 0`), WEC-Sim uses the +initial yaw orientation of the device relative to the incident waves to +calculate the wave excitation coefficients that will be used for the duration +of the simulation. When the correction is enabled, excitation coefficients are +interpolated from BEM data based upon the instantaneous relative yaw position. +For this to enhance simulation accuracy, BEM data must be available over the +range of observed yaw positions at a sufficiently dense discretization to +capture the significant variations of excitation coefficients with yaw +position. For robust simulation, BEM data should be available from -180 to 170 +degrees of yaw (or equivalent). + +This can increase simulation time, especially for irregular waves, due to the +large number of interpolations that must occur. To prevent interpolation at +every time-step, ``body(ii).yaw.threshold`` (default 1 degree) can be specified in the +``wecSimInputFile`` to specify the minimum yaw displacement (in degrees) that +must occur before another interpolation of excitation coefficients will be +calculated. The minimum threshold for good simulation accuracy will be device +specific: if it is too large, no interpolation will occur and the simulation +will behave as :code:`body(ii).yaw.option = 0`, but overly small values may not +significantly enhance simulation accuracy while increasing simulation time. + +When :code:`body(ii).yaw.option = 1`, hydrostatic and radiation forces are +determined from the local body-fixed coordinate system based upon the +instantaneous relative yaw position of the body, as this may differ +substantially from the global coordinate system for large relative yaw values. + +A demonstration case of this feature is included in the **PassiveYaw** example +on the `WEC-Sim Applications `_ +repository. + +.. Note:: + + Caution must be exercised when simultaneously using passive yaw and + body-to-body interactions. Passive yaw relies on interpolated BEM solutions + to determine the cross-coupling coefficients used in body-to-body + calculations. Because these BEM solutions are based upon the assumption of + small displacements, they are unlikely to be accurate if a large relative + yaw displacement occurs between the bodies. + +.. _user-advanced-features-large-XY-disp: + +Large X-Y Displacements +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the excitation force applied to the modeled body is calculated at the body's CG position as defined in BEM. +If large lateral displacements (i.e., in the x or y direction by the default WEC-Sim coordinate system) are expected for the modeled device, it may be desirable to adjust the excitation force to account for this displacment. + +When :code:`body(i).largeXYDisplacement.option = 1`, the phase of the excitation force exerted on the body is adjusted based upon its displacement as + +:math:`\phi_{displacement} = k \omega x(1)*cos(\frac{\theta \pi}{180}) + x(2).*sin(\frac{\theta \pi}{180})` + +where k is waves.wavenumber, x(1,2) is displacement in the (x,y) direction, :math:`\omega` is waves.omega, and :math:`\theta` is waves.direction (in degrees). +This phase is thus the same size as waves.phase, and is then summed with waves.phase to determine excitation force. + +Note that this adjustment only affects the incident exciting waves, not the total wave field that is the superposition of exciting and radiating waves. +This implies that this adjustment is only valid for cases where the lateral velocity of the body is significantly less than the celerity of its radiated waves, and is thus not appropriate for sudden, rapid displacements. + +.. Note:: + + This feature has not been implemented for a user-defined wave elevation. + + +.. _user-advanced-features-pto: + +Constraint and PTO Features +---------------------------- + +.. include:: /_include/pto.rst + + + +.. _user-advanced-features-control: + +Controller Features +------------------- + +The power generation performance of a WEC is highly dependent on the control +algorithm used in the system. There are different control strategies that +have been studied for marine energy applications. These control algorithms +can be applied directly to the PTO components to achieve a desired output, or +they can be high-level controllers which are focused on the total PTO force +applied to the WEC. The examples presented in this section are based on high- +level controller applications. WEC-Sim’s controller features support the modeling +of both simple passive and reactive controllers as well as more complex methods +such as model predictive control. + +The files for the controller tutorials described in this section can be found in +the **Controls** examples on the `WEC-Sim Applications repository +`_ . The controller examples +are not comprehensive, but provide a reference for user to implement their +own controls. + + +--------------------------------+-------------------------------------------+ + | **Controller Application** | **Description** | + +--------------------------------+-------------------------------------------+ + | Passive (P) | Sphere with proportional control | + +--------------------------------+-------------------------------------------+ + | Reactive (PI) | Sphere with proportional-integral control | + +--------------------------------+-------------------------------------------+ + | Latching | Sphere with latching control | + +--------------------------------+-------------------------------------------+ + | Declutching | Sphere with declutching control | + +--------------------------------+-------------------------------------------+ + | Model Predictive Control | Sphere with model predictive control | + +--------------------------------+-------------------------------------------+ + | Reactive with PTO | Sphere with reactive control and DD PTO | + +--------------------------------+-------------------------------------------+ + + +Examples: Sphere Float with Various Controllers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +First, it is important to understand the concept of complex conjugate control. +Complex conjugate control, as applied to wave energy conversion, +can be used to understand optimal control. For a complex conjugate controller, +the impedance of the controller is designed to match the admittance of the +device (equal to the complex conjugate of device impedance). Hence, it is +also known as impedance matching and is a common practice within electrical +engineering. Complex conjugate control is not a completely realizable control +method due to its acausality, which means it requires exact knowledge of +future wave conditions. Still, a causal transfer function can be used to approximate +complex conjugate control across a limited frequency range :cite:`bacelli2020comments`. +Thus, complex conjugate control presents a reference for the implementation of +optimal causal controls. The WEC impedance can be modeled by the following equation +:cite:`bacelli2019feedback` and can be used to formulate the optimal control implementation: + +.. math:: + + Z_i(\omega) = j\omega (m + A(\omega)) + B(\omega) + \frac{K_{hs}}{j\omega} + +By characterizing the impedance of the WEC, a greater understanding of the +dynamics can be reached. The figure below is a bode plot of the impedance of +the RM3 float body. The natural frequency is defined by the point at which the +phase of impedance is zero. By also plotting the frequency of the incoming +wave, it is simple to see the difference between the natural frequency of +the device and the wave frequency. Complex conjugate control (and some other +control methods) seeks to adjust the natural frequency of the device to match +the wave frequency. Matching the natural frequency to the wave frequency leads +to resonance, which allows for theoretically optimal mechanical power. + +.. figure:: /_static/images/impedance.png + :width: 300pt + :align: center + +It is important to note here that although impedance matching can lead to maximum mechanical +power, it does not always lead to maximum electrical power. Resonance due to +impedance matching often creates high peaks of torque and power, which are usually +far from the most efficient operating points of PTO systems used to extract power +and require those systems to be more robust and expensive. +Thus, the added factor of PTO dynamics and efficiency may lead to +complex conjugate control being suboptimal. Furthermore, any constraints or other +nonlinear dynamics may make complex conjugate control unachievable or suboptimal. +Theoretical optimal control using complex conjugates presented here should be +taken as a way to understand WEC controls rather than a method to achieve +optimal electrical power for a realistic system. + +.. _control-passive: + +Passive Control (Proportional) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Passive control is the simplest of WEC controllers and acts as a damping force. +Hence, the damping value (also referred to as a proportional gain) is +multiplied by the WEC velocity to determine the power take-off force: + +.. math:: + + F_{PTO} = K_p \dot{X} + +Although unable to reach optimal power for a regular wave due to its passive +nature, a passive controller can still be tuned to reach its maximum power. +According to complex conjugate control, a passive controller can be +optimized for regular wave conditions using the following formula :cite:`gomes2015dynamics`: + +.. math:: + + K_{p,opt} = \sqrt{B(\omega)^2 + (\frac{K_{hs}}{\omega} - \omega (m + A(\omega)))^2} + +The optimal proportional gain has been calculated for the float using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file sets +up a sweep of the proportional gains which can be used to show that the results +confirm the theoretical optimal gain in the figure below (negative power corresponding to +power extracted from the system). This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window. + +.. figure:: /_static/images/pGainSweep.png + :width: 300pt + :align: center + +This example only shows the optimal proportional gain in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains. + +.. _control-reactive: + +Reactive Control (Proportional-Integral) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Reactive control is also a very simple form of WEC control and combines the +damping force of a passive controller with a spring stiffness force. The standard PTO +block can also be used to implement PI control using the damping and stiffness +values but doesn't allow for negative inputs which is often necessary for +optimal stiffness. This controller is also known as a proportional integral +controller with the proportional gain corresponding to the damping value and +the integral gain corresponding to a spring stiffness value: + +.. math:: + + F_{PTO} = K_p \dot{X} + K_i X + +The addition of the reactive component means the controller can achieve optimal +complex conjugate control by cancelling out the imaginary portion of the device +impedance. Thus, the proportional and integral control gains can be defined by the +following formulas :cite:`coe2021practical`: + +.. math:: + + K_{p,opt} = B(\omega) + +.. math:: + + K_{i,opt} = (m + A(\omega)) \omega^2 - K_hs + +The optimal proportional and integral gains have been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file again sets +up a sweep of the gains which can be used to show that the results +confirm the theoretical optimal gains in the figure below. This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window. + +.. figure:: /_static/images/piGainSweep.png + :width: 300pt + :align: center + +This example only shows the optimal gains in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains. + +.. _control-latching: + +Latching Control +^^^^^^^^^^^^^^^^ + +Latching control combines a traditional passive controller with a latching mechanism which applies +a large braking force during a portion of the oscillation. By locking the device for +part of the oscillation, latching control attempts to adjust the phase of the motion to +match the phase of incoming waves. Latching control can slow the device motion to match +wave motion and is therefore most often used when the wave period is longer than the natural +period. Latching control is still considered passive as no energy input is required (assuming velocity +is zero while latched). + +The braking/latching force is implemented as a very large damping force (:math:`G`), which can be +adjusted based on the device's properties :cite:`babarit2006optimal`: + +.. math:: + + G = 80 (m + A(\omega)) + +Because latching achieves phase matching between the waves and device, the optimal +damping can be assumed the same as for reactive control. Lastly, the main control +variable, latching time, needs to be determined. For regular waves, it is +desired for the device to move for a time equal to its natural frequency, meaning +the optimal latching time is likely close to half the difference between the wave +period and the natural period :cite:`babarit2006optimal` (accounting for 2 latching periods per wave period). + +.. math:: + + t_{latch} = \frac{1}{2} (T_{wave} - T_{nat}) + +The optimal latching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. The mcrBuildTimes.m file sets +up a sweep of the latching times, the results for which are shown in the figure below. +This MCR run can be recreated by running the mcrBuildGains.m file then typing wecSimMCR +in the command window. Based on the results, the optimal latching time is slightly +lower than expected which may be due to imperfect latching or complex dynamics which +aren't taken into account in the theoretical optimal calculation. Regardless, latching results in +much larger power when compared to traditional passive control. + +.. figure:: /_static/images/latchTimeSweep.png + :width: 300pt + :align: center + +Further, the figure below shows the excitation force and velocity, which are close to +in phase when a latching time of 2.4 seconds is implemented. + +.. figure:: /_static/images/latching.png + :width: 300pt + :align: center + +Although not shown with this example, latching can also be implemented in irregular waves +but often requires different methods including excitation prediction. + +.. _control-declutching: + +Declutching Control +^^^^^^^^^^^^^^^^^^^ + +Declutching control is essentially the opposite of latching. Instead of locking the device, +it is allowed to move freely (no PTO force) for a portion of the oscillation. Often, +declutching is used when the wave period is smaller than the natural period, allowing the +device motion to "catch up" to the wave motion. Declutching is also considered +a passive control method. + +The optimal declutching time and damping values are slightly harder to estimate than for +latching. The device's motion still depends on its impedance during the declutching period, +meaning the device does not really move "freely" during this time. Hence, in opposition to +optimal latching the declutching time was assumed to be near half the difference between +the natural period and the wave period, but is further examined through tests. + +.. math:: + + t_{declutch} = \frac{1}{2} (T_{wave} - T_{nat}) + +This optimal declutching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. Because energy is not harvested during the declutching +period, it is likely that a larger damping is required. Thus, the optimal passive +damping value was used for the following simulations, although a more +optimal damping value likely exists for delclutching. + +Since declutching is most desired when the wave period is smaller than the natural period, +a wave period of 3.5 seconds was tested with a height of 1 m. For comparison to traditional +passive control, the optimal passive damping value was tested for these conditions, leading +to a power of 5.75 kW. The mcrBuildTimes.m file sets up a sweep of the declutching times, +the results for which are shown in the figure below. It is clear that delcuthing control +can offer an improvement over traditional passive control. + +.. figure:: /_static/images/declutchTimeSweep.png + :width: 300pt + :align: center + +Further, the figure below shows the excitation force and velocity with a declutch time +of 0.8 seconds. The excitation and response are not quite in phase, but the device +can be seen "catching up" to the wave motion during the declutching time. + +.. figure:: /_static/images/declutching.png + :width: 300pt + :align: center + +Although not shown with this example, declutching can also be implemented in irregular waves +but often requires different methods including excitation prediction. + +.. _control-MPC: + +Model Predictive Control (MPC) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Model predictive control is a WEC control method which uses a plant model to predict and +optimize the dynamics. MPC is a complex controller that can be applied in both regular +and irregular waves while also taking into account time-domain constraints such as position, +velocity, and PTO force. For the model predictive controller implemented here, +the plant model is a frequency dependent state-space model :cite:`so2017development`. +The state space model is then converted to a quadratic programming problem to be +solved by quadprog(), MATLAB's quadratic programming function. Solving this system +leads to a set of PTO forces to optimize the future dynamics for maximum harvested +power, the first of which is applied at the current timestep. The relevant files for +the MPC example in the Controls folder of WEC-Sim Applications are detailed in the +table below (excluding wecSimInputFile.m and userDefinedFunctions.m which are not +unique to MPC). Note: This controller is similar to the NMPC example within the +WECCCOMP Application, but this example includes a method for calculating frequency +dependence and setting up the state space matrices based on boundary element method +data, allows for position, velocity, and force constraints, and is applied to a +single body heaving system. + + +--------------------------------+------------------------------------------------------+ + | *File* | *Description* | + +--------------------------------+------------------------------------------------------+ + | coeff.mat | Coefficients for frequency dependence | + +--------------------------------+------------------------------------------------------+ + | fexcPrediction.m | Predicts future excitation forces | + +--------------------------------+------------------------------------------------------+ + | sphereMPC.slx | Simulink model including model predictive controller | + +--------------------------------+------------------------------------------------------+ + | mpcFcn.m | Creates and solves quadratic programming problem | + +--------------------------------+------------------------------------------------------+ + | plotFreqDep.m | Solves for and plots frequency dependence coeffs | + +--------------------------------+------------------------------------------------------+ + +The Simulink diagram is shown in the figure below. The figure shows an overview of +the controller, which primarily consists of the plant model and the optimizer. The plant +model uses the excitation force, applied PTO force, and current states to calculate the +states at the next timestep. Then, the optimizer predicts the future excitation, which +is input into the mpcFcn.m file along with the states to solve for the optimal change in +PTO force (integrated to solve for instantaneous PTO force). + +.. figure:: /_static/images/mpcSimulink.png + :width: 500pt + :align: center + +The results of the model predictive controller simulation in irregular waves are shown +below with the dashed lines indicating the applied +constraints. MPC successfully restricts the system to within the constraints (except for +a few, isolated timesteps where the solver couldn't converge) while also optimizing for maximum +average mechanical power (300 kW). The constraints can be changed to account for +specific WEC and PTO physical limitations, but will limit the average power. +There are also other parameters which can be defined or changed by the user in the +wecSimInputFile.m such as the MPC timestep, prediction horizon, r-scale, etc. to +customize and tune the controller as desired. + +.. figure:: /_static/images/mpcPos.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcVel.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcForce.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcForceChange.png + :width: 300pt + :align: center + +The model predictive controller is particularly beneficial because of its ability to +predict future waves and maximize power accordingly as well as the ability to handle constraints. A +comparison to a reactive controller is shown in the table below. The reactive controller +can be tuned to stay within constraint bounds only when future wave conditions are known +and, in doing so, would sacrifice significant power. On the other hand, without knowledge +of future wave, the results from the untuned reactive controller are shown below using +optimal theoretical gains from the complex conjugate method at the peak wave period. +With no ability to recognize constraints, the reactive controller leads to much larger +amplitude and velocity and exhibits large peaks in PTO force and power, both of which +would likely lead to very expensive components and inefficient operation. +It is clear that the model predictive controller significantly outperforms the reactive +controller in terms of mechanical power harvested, constraint inclusions, and peak conditions. +Because of the increased complexity of model predictive control, limitations include longer +computation time and complex setup. + + +----------------------------+--------------+-------------+------------+ + | *Parameter* | *Constraint* | *MPC* | *Reactive* | + +----------------------------+--------------+-------------+------------+ + | Max Heave Position (m) | 4 | 4.02 | 8.06 | + +----------------------------+--------------+-------------+------------+ + | Max Heave Velocity (m/s) | 3 | 2.95 | 5.63 | + +----------------------------+--------------+-------------+------------+ + | Max PTO Force (kN) | 2,000 | 2,180 | 4,630 | + +----------------------------+--------------+-------------+------------+ + | Max PTO Force Change (kN/s)| 1,500 | 1,500 | 3,230 | + +----------------------------+--------------+-------------+------------+ + | Peak Mechanical Power (kW) | N/A | 4,870 | 13,700 | + +----------------------------+--------------+-------------+------------+ + | Avg Mechanical Power (kW) | N/A | 300 | 241 | + +----------------------------+--------------+-------------+------------+ + +.. _control-reactive-with-PTO: + +Reactive Control with Direct Drive Power Take-Off +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The previous controllers only considered the mechanical power output. Although maximization +of mechanical power allows for the maximum energy transfer from waves to body, it often does +not lead to maximum electrical power. The previous controller examples demonstrate the +controller types and energy transfer from waves to body, but the important consideration of +electrical power requires a PTO model. This example applies a reactive controller to the +sphere body with a simplified direct drive PTO model to maximize electrical power. Within +the Simulink subsystem for determining the PTO force, the controller prescribes the ideal or +desired force which is fed into the direct drive PTO. The current in the generator is then +used to control the applied force. + +.. figure:: /_static/images/piPTOSimulink.png + :width: 500pt + :align: center + +The PTO parameters used for this example are defined in the ``wecSimInputFile.m`` and correspond to +the Allied Motion Megaflux Frameless Brushless Torque Motors–MF0310 :cite:`allied`. The +results in terms of capture width (ratio of absorbed power (W) to wave power (W/m)) and resultant power for the +applied gains from Section :ref:`control-reactive` are shown in the figures +below for a regular wave with a period of 9.6664 s and a height of 2.5 m. The "Controller (Ideal)" +power is the ideal power absorbed according to the applied controller gains. +The "Mechanical (Drivetrain)" power is the actual mechanical power absorbed by +the PTO system including the inertial, damping, and shaft torque power. Lastly, the +"Electrical (Generator)" power is the electrical power absorbed by the +generator including the product of induced current and voltage (based on shaft torque and velocity, +respectively) and the resultant generator losses (product of current squared and winding resistance). +Mechanical power maximization requires significant net input electrical power +(signified by red bar) which leads to an extremely negative capture width. Thus, +instead of harvesting electrical power, power would need to be taken from the grid or energy +storage component to achieve mechanical power maximization. + +.. figure:: /_static/images/reactiveWithPTOCCPower.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOCC.png + :width: 300pt + :align: center + +On the other hand, by testing different controller gains in the same wave conditions +(regular wave: period = 9.6664 s, height = 2.5 m), the gains which optimize for +maximum electrical power can be found as shown below. Increasing the proportional gain +and decreasing the integral gain magnitude leads to a maximum power of about 84 kW and capture width of about +1.5 m. The resultant motion is almost ten times smaller than for the mechanical power +maximization which leads to a lower current and much lower generator power losses +(product of current squared and winding resistance). + +.. figure:: /_static/images/reactiveWithPTOSweep.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOOptPower.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOOpt.png + :width: 300pt + :align: center + + +.. _user-advanced-features-cable: + +Cable Features +---------------------------- + +Cables or tethers between two bodies apply a force only in tension (when taut or stretched), but not in compression, +can be modeled using the :code:`cableClass` implementation. A cable block must be added to the +model between the two PTOs or constraints that are to be connected by a cable. Users must initialize the cable +class in the ``wecSimInputFile.m`` along with the base and follower connections in that order, by including the following lines:: + + cable(i) = cableClass('cableName','baseConnection','followerConnection'); + +where ``baseConnection`` is a PTO or constraint block that defines the cable connection on the base side, and ``followerConnection`` +is a PTO or constraint block that defineds the connection on the follower side. + + +It is necessary to define, at a minimum: :: + + cable(i).stiffness = ; + cable(i).damping = ; + +where :code:`cable(i).stiffness` is the cable stiffness (N/m), and :code:`cable(i).damping` is the cable damping (N/(m*s)). Force from the cable stiffness or +damping is applied between the connection points if the current length of the cable exceeds the equilibrium length of the cable. +By default, the cable equilibrium length is defined to be the distance between the locations of the ``baseConnection`` and ``followerConnection``, so that initially there is no tension on the cable. + +If a distinct initial condition is desired, one can define either ``cable(i).length`` or ``cable(i).preTension``, where :code:`cable(i).length` is the equilibrium (i.e., unstretched) length of the cable (m), and :code:`cable(i).preTension` is the pre-tension applied to the cable at simulation start (N). The unspecified parameter is then calculated from the location of the ``baseConnection`` and +``followerConnection``. + +To include dynamics applied at the cable-to-body coupling (e.g., a stiffness and damping), a PTO block +can be used instead, and the parameters :code:`pto(i).damping` and :code:`pto(i).stiffness` can be used to describe these dynamics. + +By default, the cable is presumed neutrally buoyant and it is not subjected to fluid drag. To include fluid drag, the user can additionally define these parameters in a style similar to the :code:`bodyClass` :: + + cable(i).quadDrag.cd + cable(i).quadDrag.area + cable(i).quadDrag.drag + cable(i).linearDamping + +The cable mass and fluid drag is modeled with a low-order lumped-capacitance method with 2 nodes. +The mass and fluid drag forces are exerted at nodes defined by the 2 drag bodies. +By default, one is co-located with the ``baseConnection`` and the other with the ``followerConnection``. +The position of these bodies can be manipulated by changing the locations of the base or follower connections points. + +.. Note:: + + This is not appropriate to resolve the actual kinematics of cable motions, but it is sufficient to model the aggregate forces among the connected bodies. + +.. _user-advanced-features-mooring: + +Mooring Features +---------------- + +.. include:: /_include/mooring.rst + + +WEC-Sim Post-Processing +------------------------ + +WEC-Sim contains several built in methods inside the response class and wave +class to assist users in processing WEC-Sim output: ``output.plotForces``, +``output.plotResponse``, ``output.saveViz``, ``waves.plotElevation``, and +``waves.plotSpectrum``. This section will demonstrate the use of these methods. +They are fully documented in the WEC-Sim :ref:`user-api`. + +Plot Forces +^^^^^^^^^^^ + +The ``responseClass.plotForces()`` method can be used to plot the time series of +each force component for a body. The first argument takes in a body number, the +second a degree of freedom of the force. For example, ``output.plotForces(2,3)`` +will plot the vertical forces that act on the 2nd body. The total force is split +into its :ref:`components `: + +- total force +- excitation force +- radiation damping force +- added mass force +- restoring force (combination of buoyancy, gravity and hydrostatic stiffness), +- Morison element and viscous drag force +- linear damping force + +.. figure:: /_static/images/OSWEC_heaveForces.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.plotForces() method for the OSWEC example. + + +Plot Response +^^^^^^^^^^^^^ + +The ``responseClass.plotResponse()`` method is very similar to ``plotForces`` +except that it will plot the time series of a body's motion in a given degree +of freedom. For example, ``output.plotResponse(1,5)`` will plot the pitch motion +of the 1st body. The position, velocity and acceleration of that body is shown. + +.. figure:: /_static/images/OSWEC_pitchResponse.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.plotResponse() method for the OSWEC example. + + + +Plot Elevation +^^^^^^^^^^^^^^^ + +The ``waveClass.plotElevation()`` method can be used to plot the wave elevation time +series at the domain origin. The ramp time is also marked. The only required input +is ``simu.rampTime``. Users must manually plot or overlay the wave elevation at a +wave gauge location. + +.. figure:: /_static/images/OSWEC_plotEta.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of waves.plotElevation() method for the OSWEC example. + + +Plot Spectrum +^^^^^^^^^^^^^ + +The ``waveClass.plotSpectrum()`` method can be used to plot the frequency spectrum +of an irregular or spectrum import wave. No input parameters are required. + +.. figure:: /_static/images/OSWEC_plotSpectrum.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of waves.plotSpectrum() method for the OSWEC example. + + +WEC-Sim Visualization +--------------------- +WEC-Sim provides visualization in SimScape Mechanics Explorer by default. This section describes some additional options for WEC-Sim visualization + + +.. _user-advanced-features-wave-markers: + +Wave Markers +^^^^^^^^^^^^^^^^^^^ + +This section describes how to visualize the wave elevations at various locations using +markers in SimScape Mechanics Explorer. +Users must define an array of [X,Y] coordinates, the marker style (sphere, cube, frames), the marker size in pixels, marker color in RGB format. +The ``Global Reference Frame`` block programmatically initiates and adds/deletes the visualization blocks based on the number of markers *(0 to N)* defined by the user. +Here are the steps to define wave markers representing a wave-spectra, ``waves(1)``. Similar steps can be followed for subsequent ``waves(#)`` objects. + + +* Define an array of marker locations: ``waves(1).marker.location = [X,Y]``, where the first column defines the X coordinates, and the second column defines the corresponding Y coordinates, Default = ``[]`` +* Define marker style : ``waves(1).marker.style = 1``, where 1: Sphere, 2: Cube, 3: Frame, Default = ``1``: Sphere +* Define marker size : ``waves(1).marker.size = 10``, to specify marker size in Pixels, Default = ``10`` +* Define marker color: ``waves(1).marker.graphicColor = [1,0,0]``, to specifie marker color in RBG format. + +.. Here is an example. In this example a mesh of points is described using the meshgrid command and then making it an array of X and Y coordinates using reshape(). + +For more information about using ParaView for visualization, refer to the **Wave_Markers** examples on the `WEC-Sim Applications `_ repository. + + +.. Note:: + + This feature is not compatible with user-defined waves ``waves = waveClass('elevationImport')`` + +.. figure:: /_static/images/RM3_vizMarker.jpg + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of visualization markers in SimScape Mechanics Explorer. + + +Save Visualization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``responseClass.saveViz()`` method can be used to create a complete +animation of the simulation. The animation shows the 3D response of all bodies +over time on top of a surface plot of the entire directional wave field. The +default wave domain is defined by ``simu.domainSize``, ``waves.waterDepth``, and +the maximum height that the STL mesh of any body reaches. Users may optionally +input the axis limits to restrict or widen the field of view, the time steps per +animation frame, and the output file format. Users can choose to save the animation +as either a ``.gif`` or ``.avi`` file. This function can take significant time to +run depending on simulation time and time step, however it may be faster and easier +than Paraview. Users are still recommended to use the provided Paraview macros for +more complex animations and analysis. + +For example, in the OSWEC case the command +``output.saveViz(simu,body,waves,'timesPerFrame',5,'axisLimits',[-50 50 -50 50 -12 20])`` +results in the following figure: + +.. figure:: /_static/images/OSWEC_plotWaves.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.saveViz() method for the OSWEC example. + + +.. _user-advanced-features-paraview: + +Paraview Visualization +---------------------- + +.. include:: /_include/viz.rst + + +.. _user-advanced-features-WSviz: + + + +.. _user-advanced-features-decay: + +Decay Tests +----------- + +When performing simulations of decay tests, you must use one of the no-wave +cases and setup the initial (time = 0) location of each body, constraint, PTO, +and mooring block. The initial location of a body or mooring block is set by +specifying the centerGravity or location at the stability position (as with any WEC-Sim +simulation) and then specifying an initial displacement. To specify an initial +displacement, the body and mooring blocks have a :code:`.initial` property +with which you can specify a translation and angular rotation about an +arbitrary axis. For the constraint and PTO blocks, the :code:`.location` property +must be set to the location at time = 0. + +There are methods available to help setup this initial displacement for all +bodies, constraints, PTOs, and moorings. To do this, you would use the: + +* :code:`body(i).setInitDisp()` +* :code:`constraint(i).setInitDisp()` +* :code:`pto(i).setInitDisp()` +* :code:`mooring(i).setInitDisp()` + +methods in the WEC-Sim input file. A description of the required input can be +found in the method's header comments. The following properties must be +defined prior to using the object's :code:`setInitDisp()` method: + +* :code:`body(i).centerGravity` +* :code:`constraint(i).location` +* :code:`pto(i).location` +* :code:`mooring.location` + +For more information, refer to the **Free Decay** example on the `WEC-Sim +Applications `_ repository. + +Other Features +------------------ + +The WEC-Sim Applications repository also includes examples of using WEC-Sim to +model a Desalination plant and a numerical model of the WaveStar device for +control implementation. The WaveStar device was used in the WECCCOMP wave +energy control competition. + +References +------------------------ +.. bibliography:: ../refs/WEC-Sim_Adv_Features.bib + :style: unsrt + :labelprefix: C diff --git a/dev/_sources/user/api.rst.txt b/dev/_sources/user/api.rst.txt new file mode 100644 index 000000000..afd37704d --- /dev/null +++ b/dev/_sources/user/api.rst.txt @@ -0,0 +1,86 @@ +.. _user-api: + +API +=== + +.. _simulation: + +Simulation Class +------------------ + +.. autoclass:: objects.simulationClass + :members: + :exclude-members: simulationClass, caseDir, numCables, numConstraints, numDragBodies, numHydroBodies, numMoorings, numPtos, numPtoSim, time, caseFile, cicLength, cicTime, date, gitCommit, maxIt, outputDir, wsVersion, checkInputs, setup, listInfo, loadSimMechModel, rhoDensitySetup, getGitCommit + :no-undoc-members: + + +.. _wave: + +Wave Class +------------------ + +.. autoclass:: objects.waveClass + :members: + :exclude-members: waveClass, amplitude, deepWater, dOmega, omega, phase, power, spectrum, type, typeNum, waveAmpTime, waveAmpTimeViz, wavenumber, checkInputs, setup, listInfo, calculateElevation, waveElevationGrid + :no-undoc-members: + + +.. _body: + +Body Class +------------------ + +.. autoclass:: objects.bodyClass + :members: + :exclude-members: bodyClass, dofEnd, dofStart, hydroData, b2bDOF, hydroForce, massCalcMethod, number, total, geometry, checkInputs, listInfo, loadHydroData, nonHydroForcePre, dragForcePre, hydroForcePre, adjustMassMatrix, restoreMassMatrix, storeForceAddedMass, forceAddedMass, importBodyGeometry, triArea, checkStl, triCenter, setNumber, setDOF + :no-undoc-members: + +.. _constraint: + +Constraint Class +------------------ + +.. autoclass:: objects.constraintClass + :members: + :exclude-members: constraintClass,number, checkLoc, setOrientation, listInfo, setNumber + :no-undoc-members: + +.. _ptoAPI: + +PTO Class +------------------ + +.. autoclass:: objects.ptoClass + :members: + :exclude-members: ptoClass, number, checkLoc, setOrientation, listInfo, setPretension, setNumber + :no-undoc-members: + +.. _mooringAPI: + +Mooring Class +------------- + +.. autoclass:: objects.mooringClass + :members: + :exclude-members: mooringClass, orientation, number, listInfo, setLoc, setNumber + :no-undoc-members: + +.. _cableAPI: + +Cable Class +------------- + +.. autoclass:: objects.cableClass + :members: + :exclude-members: cableClass, number, location, volume, setTransPTOLoc, checkLoc, setOrientation, setVolume, dragForcePre, linearDampingMatrix, setCb, setLength, listInfo, setNumber + +.. _response: + +Response Class +------------------ + +.. autoclass:: objects.responseClass + :members: + :exclude-members: responseClass, bodies, cables, constraints, moorDyn, mooring, ptos, ptosim, wave, loadMoorDyn, saveText + :no-undoc-members: + diff --git a/dev/_sources/user/applications.rst.txt b/dev/_sources/user/applications.rst.txt new file mode 100644 index 000000000..e35fb8504 --- /dev/null +++ b/dev/_sources/user/applications.rst.txt @@ -0,0 +1,159 @@ +.. _user-applications: + +WEC-Sim Applications +======================== + +The `WEC-Sim Applications `_ +repository contains many more applications of the WEC-Sim code that demonstrate +WEC-Sim :ref:`Advanced Features `. This includes +tutorials by the WEC-Sim team as well as user-shared examples and covers topics +such as body interactions, numerical set-up, batch runs, visualization, control +examples, mooring and more. These applications highlight the +versatility of WEC-Sim and can be used as a starting point for users interested +in a given application. +It is highly recommended that users go through an application case along with the +relevant advanced feature section when learning to implement a new WEC-Sim feature. +The WEC-Sim Applications repository is included as a +`submodule `_ of the +WEC-Sim repository. The applications are summarized below. + +.. TODO currently these descriptions are copy/pasted from the application READMEs. + Expand on descriptions and link directly to the READMEs later on. + + +Body-to-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Body-to-Body (B2B) ` to run WEC-Sim for the :ref:`RM3 ` +geometry. The scripts run and plot the RM3 model with B2B on/off and with +Regular/RegularCIC. Execute the `runB2B.m` script to run this case. + +Controls +^^^^^^^^ + +Examples using :ref:`Controllers `. +Examples of WEC-Sim models using various control methods are included for the :ref:`RM3 ` +float geometry. These examples include passive, reactive, latching, declutching, and model predictive control methods. + +Desalination +^^^^^^^^^^^^ + +Example using WEC-Sim for desalination based on the :ref:`OSWEC ` +geometry. Note the dependency on SimScape Fluids to run this desalination case. + +Free Decay +^^^^^^^^^^ + +Example using WEC-Sim to simulate :ref:`free decay ` +of a sphere in heave, using :ref:`Multiple Condition Runs `. +Execute the `runFreeDecay.m` script to run this case. + +Generalized Body Modes +^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Generalized Body Modes ` +in WEC-Sim. In this application a barge is allowed four additional flexible +degrees of freedom. Note that this requires the BEM solver also account for +these general degrees of freedom and output the appropriate quantities required +by BEMIO. + +Mooring +^^^^^^^ + +One example using the :ref:`RM3 ` +geometry coupled with :ref:`MoorDyn ` +to simulate a more realistic mooring system. And another example modeling the +RM3 with a Mooring Matrix. The MoorDyn application consists of 3 catenary +mooring lines attached to floating buoys and then to different points on the +spar and anchored at the sea floor. + +Multiple Condition Run +^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Multiple Condition Runs ` +to run the :ref:`RM3 `. +These examples demonstrate each of the 3 different ways to run WEC-Sim with MCR +and generates a power matrix for each PTO damping value. The last example +demonstrates how to use MCR to vary the imported sea state test file and +specify corresponding phase. Execute `wecSimMCR.m` from the case directory to +run an example. + +* MCROPT1: Cases defined using arrays of values for period and height. +* MCROPT2: Cases defined with wave statistics in an Excel spreadsheet +* MCROPT3: Cases defined in a MATLAB data file (``.mat``) +* MCROPT4: Cases defined using several MATLAB data files (``*.mat``) of the + wave spectrum + +Nonhydrodynamic Body +^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Non-Hydro Body ` +to run WEC-Sim for the :ref:`OSWEC `. +This example models the base as a nonhydro body, and the flap as a hydrodynamic +body. + +Nonlinear Hydrodynamic Body +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Nonlinear Hydro ` +to run WEC-Sim for a :ref:`heaving ellipsoid `. +Includes examples of running nonlinear hydrodynamics with different :ref:`fixed and +variable time-step solvers ` +(ode4/ode45), and different regular wave formulations (with/without CIC). +Execute the `runNL.m` script to run this case. + +Paraview Visualization +^^^^^^^^^^^^^^^^^^^^^^ + +Example using ParaView data visualization for WEC-Sim coupled with :ref:`MoorDyn ` +to simulate a more realistic mooring system for the :ref:`RM3 ` +geometry. Example consists of 3 catenary mooring lines attached to different +points on the spar and anchored at the sea floor. + +Example using ParaView data visualization for WEC-Sim with :ref:`Nonlinear Hydro ` +for the Flap and a :ref:`Non-Hydro Body ` +for the Base to run WEC-Sim for the :ref:`OSWEC ` +geometry. + +Passive Yaw +^^^^^^^^^^^ + +Example on using :ref:`Passive Yaw ` +to run WEC-Sim for the :ref:`OSWEC ` geometry. +Execute the `runYawCases.m` script to run this case. + +PTO-Sim +^^^^^^^ + +Examples using :ref:`PTO-Sim `. +Examples of WEC-Sim models using PTO-Sim are included for the :ref:`RM3 ` +geometry and :ref:`OSWEC ` +geometry. + +RM3 PTO Extension +^^^^^^^^^^^^^^^^^ + +Examples on using the :ref:`PTO Extension ` advanced feature to set-up an initial displacement of the :ref:`RM3 ` easily. +This geometry is a special case with a large DOF in which different WEC bodies can be identified as the PTO mechanism with a cooresponding position change when setting the PTO Initial Displacement. + +Visualization Markers +^^^^^^^^^^^^^^^^^^^^^^ + +Examples of WEC-Sim with Wave Elevation visualization at User-Defined Locations. +The setup for the visualization can be found at `Advanced Features ` + +WECCCOMP +^^^^^^^^ + +Numerical model for the WEC Control Competition (WECCCOMP) using WEC-Sim to +model the WaveStar with various fault implementations can be found in the `WECCCOMP `_ repository. +See the project report written by Erica Lindbeck in the "report" folder. + +Write HDF5 +^^^^^^^^^^ + +This is an example of how to write your own h5 file using MATLAB. Can be useful +if you want to modify your coefficients, use experimental coefficients, or +coefficients from another BEM code other than WAMIT, NEMOH, AQWA, or CAPYTAINE. For more +details see :ref:`BEMIO ` +documentation. \ No newline at end of file diff --git a/dev/_sources/user/code_structure.rst.txt b/dev/_sources/user/code_structure.rst.txt new file mode 100644 index 000000000..4649fb49e --- /dev/null +++ b/dev/_sources/user/code_structure.rst.txt @@ -0,0 +1,904 @@ +.. TODO: + tie to theory section and add basic equations in the wave and body sections + + +.. _user-code-structure: + +Code Structure +============== + +This section provides a description of the WEC-Sim source code and its +structure. For more information about WEC-Sim's code structure, refer to the +:ref:`user-webinars-code-structure` webinar. + +.. _user-code-structure-src: + +WEC-Sim Source Code +------------------- + +The directory where the WEC-Sim code is contained is referred to as ``$WECSIM`` +(e.g. ``C:/User/Documents/GitHub/WEC-Sim``). The WEC-Sim source code files are +contained within a source directory referred to as ``$WECSIM/source``. The +WEC-Sim source code consists primarily of three components as described in the table: + +========================= ==================== ============================ +**File Type** **File name** **Directory** +WEC-Sim Executable ``wecSim.m`` ``$WECSIM/source`` +WEC-Sim MATLAB Functions ``.m`` ``$WECSIM/source/functions`` +WEC-Sim MATLAB Classes ``.m`` ``$WECSIM/source/objects`` +WEC-Sim Simulink Library ``WECSim_Lib.slx`` ``$WECSIM/source/lib`` +========================= ==================== ============================ + +The WEC-Sim executable is the ``wecSim.m`` file. +Executing ``wecSim`` from a case directory parses the user input data, +performs pre-processing calculations in each of the classes, selects and +initializes variant subsystems in the Simulink model, runs the time-domain +simulations in WEC-Sim, and calls post-processing scripts. +When a WEC-Sim case is properly set-up, the user only needs to use the single command ``wecSim`` +in the command line to run the simulation. + +Users can run WEC-Sim from the command line with the command ``wecSim`` or from directly from Simulink, +refer to :ref:`user-advanced-features-simulink`. + + +.. _user-code-structure-classes: + +WEC-Sim Classes +--------------- + +All information required to run WEC-Sim simulations is contained within the +``simu``, ``waves``, ``body(i)``, ``constraint(i)``, ``pto(i)``, ``cable(i)``, and +``mooring(i)`` objects (instances of the simulationClass, waveClass, bodyClass, +constraintClass, ptoClass, cableClass, and mooringClass). +Users can instantiate and interact with these classes within the WEC-Sim input +file (``wecSimInputFile.m``). The following :ref:`user-code-structure-source-details` +section describes the role of the WEC-Sim objects, and how to and interact with the +WEC-Sim objects to define input properties. + +There are two ways to look at the available properties and methods within a +class. The first is to type ``doc `` in Matlab Command Window, and +the second is to open the class definitions located in the +``$WECSIM/source/objects`` directory by typing ``open `` in MATLAB +Command Window. The latter provides more information since it also defines the +different fields in a structure. + + +.. _user-code-structure-library: + +WEC-Sim Library +--------------- + +In addition to the ``wecSimInputFile.m`` that instantiates classes, a WEC-Sim +simulation requires a simulink model (``*.slx``) that represents the WEC +system components and their connectivity. Similar to how the input file uses the +WEC-Sim classes, the Simulink model uses WEC-Sim library blocks. There should +be a one-to-one relationship between the objects defined in the input file and +the blocks used in the Simulink model. + +The WEC-Sim library is divided different types of library blocks. +Users should be able to model their WEC device using the available WEC-Sim +blocks (and possibly other Simulink/Simscape blocks). The image below shows the +WEC-Sim block grouping by type. + +.. figure:: /_static/images/WEC-Sim_Lib.PNG + :width: 400pt + :align: center + +The following sections describe the different library types, the related class, and their general +purpose. + +.. _user-code-structure-source-details: + +Source Details +-------------- +The WEC-Sim Classes and Library Blocks interact with one another during a simulation. +The classes contain functions for initialization, reading input data, pre-processing and post-processing. +The library blocks use these pre-processed parameters during the time-domain simulation in Simulink. +The relationship between WEC-Sim Classes and their corresponding Library Blocks are described in the following sections, and summarized in the table below. + +======================================= ===================================== +**WEC-Sim Classes** **Corresponding Library Blocks** +Simulation Class and Wave Class Frames +Body Class Body Elements +Constraint Class Constraints +PTO Class PTOs +Cable Class Cables +Mooring Class Moorings +======================================= ===================================== + +.. _user-code-structure-simulation-class: + +Simulation Class +^^^^^^^^^^^^^^^^ + +The simulation class contains the simulation parameters, flags and solver +settings necessary to execute the WEC-Sim code. These simulation parameters +include numerical settings such as the time step, start time, differential +equation solver method, and flags for various output options and nonlinear +hydrodynamics options. At a high level, the simulation class interacts with the +rest of WEC-Sim as shown in the diagram below. The most common flags and +attributes that are passed to other objects are the start, end, and ramp times, +time steps, global variables (gravity, density, etc). + +.. figure:: /_static/images/code_structure/simulation_diagram.png + :width: 100% + +Simulation Class Initialization +"""""""""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, users +must initialize the simulation class (``simulationClass``) and specify the name +of the WEC-Sim (``*.slx``) model file by including the following lines:: + + simu=simulationClass(); + simu.simMechanicsFile='.slx' + +All simulation class properties are specified as variables within the ``simu`` +object as members of the ``simulationClass``. +The WEC-Sim code has default values defined for the simulation class +properties. These default values can be overwritten by the user in the input file, +for example, the end time of a simulation can be set by entering the following command: +``simu.endTime = ``. + +Users may specify other simulation class properties using the ``simu`` object +in the ``wecSimInputFile.m``, such as: + +===================== ================== +Simulation start time ``simu.startTime`` +End time ``simu.endTime`` +Ramp time ``simu.rampTime`` +Time step ``simu.dt`` +===================== ================== + +Available simulation properties, default values, and functions can be found by +typing ``doc simulationClass`` in the MATLAB command window, or by opening the +``simulationClass.m`` file in ``$WECSIM/source/objects`` directory by typing ``open +simulationClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's simulation class, refer to +:ref:`user-advanced-features-simulation`. + +Frame Block +"""""""""""""" + +The simulation class is tied to the Frames library. +The Frames library contains one block that is necessary in every model. The +``Global Reference Frame`` block defines the global coordinates, solver +configuration, seabed and free surface description, simulation time, and other +global settings. It can be useful to think of the Global Reference Frame as +being the seabed when creating a model. Every model requires one instance of +the Global Reference Frame block. The ``Global Reference Frame`` block uses the +simulation class variable `simu` and the wave class variable `waves`, which +must be defined in the input file. + +.. figure:: /_static/images/WEC-Sim_Lib_frames.PNG + :width: 400pt + :align: center + + +.. _user-code-structure-wave-class: + +Wave Class +^^^^^^^^^^ + +The wave class contains all wave information necessary to define the incident +wave condition for the WEC-Sim time-domain simulation. The wave class contains +the incoming wave information that determines the excitation +force, added mass, radiation damping and other frequency based parameters that +influence a body's motion. + +At a high level, the wave class interacts with the rest of WEC-Sim as shown in +the diagram below. The wave primarily interacts with the body class +through the pre-processing of wave forces and in Simulink. + +.. figure:: /_static/images/code_structure/wave_diagram.PNG + :width: 100% + +Wave Class Initialization +"""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, users +must initialize the wave class (``waveClass``) and specify the ``waveType`` by +including the following line:: + + waves = waveClass(''); + +Users must specify additional wave class properties using the ``waves`` object +depending on which wave type is selected, as shown in the table below. A more +detailed description of the available wave types is given in the following +sections. + +=================== ================================================================== +**Wave Type** **Required Properties** +``noWave`` ``waves.period`` +``noWaveCIC`` +``regular`` ``waves.height``, ``waves.period`` +``regularCIC`` ``waves.height``, ``waves.period`` +``irregular`` ``waves.height``, ``waves.period``, ``waves.spectrumType`` +``spectrumImport`` ``waves.spectrumFile`` +``elevationImport`` ``waves.elevationFile`` +=================== ================================================================== + +Available wave class properties, default values, and functions can be found by +typing ``doc waveClass`` in the MATLAB command window, or by opening the +``waveClass.m`` file in ``$WECSIM/source/objects`` directory by typing ``open +waveClass`` in the Matlab Command Window. +For more information about application of WEC-Sim's wave class, refer to +:ref:`user-advanced-features-wave`. + + +noWave +"""""" + +The ``noWave`` case is for running WEC-Sim simulations with no waves and +constant radiation added mass and wave damping coefficients. The ``noWave`` +case is typically used to run decay tests. Users must still provide hydro +coefficients from a BEM solver before executing WEC-Sim and specify the period +(``wave.T``) from which the hydrodynamic coefficients are selected. + +The ``noWave`` case is defined by including the following in the input file:: + + waves = waveClass('noWave'); + waves.period = ; %[s] + +noWaveCIC +""""""""" + +The ``noWaveCIC`` case is the same as the noWave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. + +The ``noWaveCIC`` case is defined by including the following in the input file:: + + waves = waveClass('noWaveCIC'); + +regular +""""""" + +The ``regular`` wave case is used for running simulations in regular waves with +constant radiation added mass and wave damping coefficients. Using this option, +WEC-Sim assumes that the system dynamic response is in sinusoidal steady-state +form, where constant added mass and damping coefficients are used (instead of +the convolution integral) to calculate wave radiation forces. Wave period +(``wave.T``) and wave height (``wave.H``) must be specified in the input file. + +The ``regular`` case is defined by including the following in the input file:: + + waves = waveClass('regular'); + waves.period = ; %[s] + waves.height = ; %[m] + +regularCIC +"""""""""" + +The ``regularCIC`` is the same as regular wave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. Wave period (``wave.T``) and wave height +(``wave.H``) must be specified in the input file. + +The ``regularCIC`` case is defined by including the following in the input file:: + + waves = waveClass('regularCIC'); + waves.period = ; %[s] + waves.height = ; %[m] + +.. _user-code-structure-irregular: + +irregular +""""""""" + +The ``irregular`` wave case is the wave type for irregular wave simulations +using a Pierson Moskowitz (PM) or JONSWAP (JS) wave spectrum as defined by the +IEC TS 62600-2:2019 standards. Significant wave height (``wave.H``), peak +period (``wave.T``), and wave spectrum type (``waves.spectrumtype``) must be +specified in the input file. The available wave spectra and their corresponding +``waves.spectrumType`` are listed below: + +====================== ================== +**Wave Spectrum** **spectrumType** +Pierson Moskowitz ``PM`` +JONSWAP ``JS`` +====================== ================== + +The ``irregular`` case is defined by including the following in the input file:: + + waves = waveClass('irregular'); + waves.period = ; %[s] + waves.height = ; %[m] + waves.spectrumType = ''; + +When using the JONSWAP spectrum, users have the option of defining gamma by +specifying ``waves.gamma = ;``. If gamma is not defined, +then gamma is calculated based on a relationship between significant wave +height and peak period defined by IEC TS 62600-2:2019. + +spectrumImport +"""""""""""""" + +The ``spectrumImport`` case is the wave type for irregular wave simulations +using an imported wave spectrum (ex: from buoy data). The user-defined spectrum +must be defined with the wave frequency (Hz) in the first column, and the +spectral energy density (m^2/Hz) in the second column. Users have the option to +specify a third column with phase (rad); if phase is not specified by the user +it will be randomly defined. An example file is provided in the +``$WECSIM/examples/*/spectrumData.mat`` directory. The ``spectrumImport`` case is defined by including the following +in the input file:: + + waves = waveClass('spectrumImport'); + waves.spectrumFile ='.mat'; + +.. Note:: + When using the ``spectrumImport`` option, users must specify a sufficient + number of wave frequencies (typically ~1000) to adequately describe the + wave spectra. These wave frequencies are the same that will be used to + define the wave forces on the WEC, for more information refer to the + :ref:`user-advanced-features-irregular-wave-binning` section. + +elevationImport +""""""""""""""" + +The ``elevationImport`` case is the wave type for wave simulations using user-defined +time-series (ex: from experiments). The user-defined wave surface elevation +must be defined with the time (s) in the first column, and the wave surface +elevation (m) in the second column. An example of this is given in the +``elevationData.mat`` file in the tutorials directory folder of the WEC-Sim source +code. The ``elevationImport`` case is defined by including the following in the input +file:: + + waves = waveClass('elevationImport'); + waves.elevationFile ='.mat'; + +When using the ``elevationImport`` option, excitation forces are calculated via +convolution with the excitation impulse response function. This solution method +is not particularly robust and the quality of the results can depend heavily on +the discretization and range of the BEM data. This is especially true for elevation +data that contains a small number of frequencies (e.g., an approximation of regular +wave). Further, a number of advanced features are not available for this solution +method. Direct multiplication of the frequency components, as performed in the +``spectrumImport`` and ``irregular`` methods is a more robust and capable approach, +but requires developing a '.mat' that is time-domain equivalent to '.mat'. +For this workflow, the ``elevationToSpectrum`` function has been provided in +``$WEC-Sim/source/functions/BEMIO``. + +.. _user-code-structure-body-class: + +Body Class +^^^^^^^^^^ + +The body class represents each rigid or flexible body that comprises the WEC +being simulated. It contains the mass and hydrodynamic properties of each body, +defined by hydrodynamic data from the ``*.h5`` file. The corresponding body block +uses the hydrodynamic data and wave class to calculate all relevant forces on +the body and solve for its resultant motion. At a high level, the body class +interacts with the rest of WEC-Sim as shown in the diagram below. +Bodies hold hydrodynamic BEM input data, calculate body forces and pass forces +and motions to other Simulink blocks. + +.. figure:: /_static/images/code_structure/body_diagram.PNG + :width: 750pt + +Body Class Initialization +"""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, +users must initialize each iteration of the body class (``bodyClass``), and +specify the location of the hydrodynamic data file (``.h5``) and geometry +file (``.stl``) for each body. The body class is defined by including the +following lines in the WEC-Sim input file, where ``i`` is the body number and +'.h5' is the name of the h5 file containing the BEM results:: + + body(i)=bodyClass('.h5') + body(i).geometryFile = '.stl'; + +WEC-Sim bodies may be one of four types\: hydrodynamic, flexible, +drag, or nonhydrodynamic. These types represent varying degrees of complexity +and require various input parameters and BEM data, detailed in the table below. +The :ref:`user-advanced-features-body` section contains more details on these +important distinctions. + +.. TO DO: This table is not rendering properly + ++-------------------------+---------------------------------------------+ +|**Body Type** |**Description** | ++=========================+=============================================+ +|Hydrodynamic Body |``body(i)=bodyClass('.h5')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | ++-------------------------+---------------------------------------------+ +|Drag Body |``body(i)=bodyClass('')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | +| |``body(i).centerGravity`` | +| |``body(i).centerBuoyancy`` | +| |``body(i).volume`` | +| |``body(i).nonHydro=1`` | ++-------------------------+---------------------------------------------+ +|Nonhydrodynamic Body |``body(i)=bodyClass('')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | +| |``body(i).centerGravity`` | +| |``body(i).centerBuoyancy`` | +| |``body(i).volume`` | +| |``body(i).nonHydro=2`` | ++-------------------------+---------------------------------------------+ +|Flexible Body |``body(i)=bodyClass('.h5')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | ++-------------------------+---------------------------------------------+ + +Users may specify other body class properties using the ``body`` object for +each body in the ``wecSimInputFile.m``. +Important body class properties include quantities such as +the mass, moment of inertia, center of gravity and center of buoyancy. +Other parameters are specified as needed. +For example, viscous drag can be specified by entering the viscous drag +coefficient and the characteristic area in vector format the WEC-Sim +input file as follows:: + + body(i).quadDrag.cd = [0 0 1.3 0 0 0] + body(i).quadDrag.area = [0 0 100 0 0 0] + +Available body properties, default values, and functions can be found by typing +``doc bodyClass`` in the MATLAB command window, or opening the ``bodyClass.m`` +file in ``$WECSIM/source/objects`` directory by typing ``open bodyClass`` in +Matlab Command Window. +For more information about application of WEC-Sim's body class, refer to +:ref:`user-advanced-features-body`. + +.. Note:: + The ``*.h5`` file defines the hydrodynamic data for all relevant bodies. It is + required that any drag body or nonhydrodyamic body be numbered after all + hydrodynamic bodies The body index must correspond with the index in the + ``*.h5`` file and the number in the Simulink diagram. + +Body Blocks +"""""""""""""" + +The Body Class is most closely associated with the Body Elements library. +The Body Elements library shown below contains four body types in two blocks: +the ``Rigid Body`` block and the ``Flex Body`` block. The rigid body block is +used to represent hydrodynamic, nonhydrodynamic, and drag bodies. Each type of +rigid body is a `Variant Sub-system `_. +Before simulation, one variant is activated by a flag in the body object +(body.nonHydro=0,1,2). The flex body block is used to represent hydrodynamic +bodies that contain additional flexible degrees of freedom ('generalized body +modes'). The flex body is determined automatically by the degrees of freedom +contained in the BEM input data. At least one instance of a body +block (rigid or flex) is required in each model. The +:ref:`user-advanced-features-body` section describes the various types of +WEC-Sim bodies in detail. + +Both in Simulink and the input file, the user has to name the blocks +``body(i)`` (where i=1,2,...). The mass properties, hydrodynamic data, geometry +file, mooring, and other properties are then specified in the input file. +Within the body block, the wave radiation, wave excitation, hydrostatic +restoring, viscous damping, and mooring forces are calculated. + +.. figure:: /_static/images/WEC-Sim_Lib_bodies.PNG + :width: 400pt + :align: center + + +.. _user-code-structure-constraint-class: + +Constraint Class +^^^^^^^^^^^^^^^^ + +The WEC-Sim constraint class and blocks connect WEC bodies to one another (and +possibly to the seabed) by constraining DOFs. Constraint objects do not apply +any force or resistance to body motion outside of the reactive force required +to prevent motion in a given DOF. At a high level, the constraint class +interacts with the rest of WEC-Sim as shown in the diagram below. Constraint +objects largely interact with other blocks through Simscape connections that +pass resistive forces to other bodies, constraints, ptos, etc. + +.. figure:: /_static/images/code_structure/constraint_diagram.PNG + :width: 750pt + +Constraint Class Initialization +"""""""""""""""""""""""""""""""" + +The properties of the constraint class (``constraintClass``) are defined in the +``constraint`` object. Within the ``wecSimInputFile.m``, users must initialize +each iteration the constraint class (``constraintClass``) and specify the +``constraintName``, by including the following lines:: + + constraint(i)=constraintClass(''); + +For rotational constraint (ex: pitch), users may also specify the +location and orientation of the rotational joint with respect to the global +reference frame:: + + constraint(i).location = [ ]; + constraint(i).orientation.z = [ ]; + constraint(i).orientation.y = [ ]; + +Available constraint properties, default values, and functions can be found by +typing ``doc constraintClass`` in the MATLAB command window, or opening the +`constraintClass.m` file in ``$WECSIM/source/objects`` directory by typing +``open constraintClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's constraint class, refer to +:ref:`user-advanced-features-pto`. + +Constraint Blocks +"""""""""""""""""""" + +The Constraint Class is tied to the blocks within the Constraints library. +These are used to define the DOF of a +specific body. Constraint blocks define only the DOF, but do not otherwise +apply any forcing or resistance to the body motion. Each Constraint block has +two connections: a base (B) and a follower (F). The Constraints block restricts +the motion of the block that is connected to the follower relative to the block +that is connected to the base. For a single body system, the base would be the +``Global Reference Frame`` and the follower is a ``Rigid Body``. + +.. figure:: /_static/images/WEC-Sim_Lib_constraints.PNG + :width: 400pt + :align: center + +A brief description of each constraint block is given below. More information +can also be found by double clicking on the library block and viewing the Block +Parameters box. + ++--------------------+-----+-----------------------------------------+ +| Constraint Library | ++====================+=====+=========================================+ +|Block |DOFs |Description | ++--------------------+-----+-----------------------------------------+ +|``Fixed`` |0 |Rigid connection. Constrains all motion | +| | |between the base and follower | ++--------------------+-----+-----------------------------------------+ +|``Translational`` |1 |Constrains the motion of the follower | +| | |relative to the base to be translation | +| | |along the constraint's Z-axis | ++--------------------+-----+-----------------------------------------+ +|``Rotational`` |1 |Constrains the motion of the follower | +| | |relative to the base to be rotation | +| | |about the constraint's Y-axis | ++--------------------+-----+-----------------------------------------+ +|``Spherical`` |3 |Contrains the motion of the follower | +| | |relative to the base to be rotation about| +| | |the X-, Y-, and Z- axis. | ++--------------------+-----+-----------------------------------------+ +|``Floating (3DOF)`` |3 |Constrains the motion of the follower | +| | |relative to the base to planar motion | +| | |with translation along the constraint's | +| | |X- and Z- and rotation about the Y- axis | ++--------------------+-----+-----------------------------------------+ +|``Floating (6DOF)`` |6 |Allows for unconstrained motion of the | +| | |follower relative to the base | ++--------------------+-----+-----------------------------------------+ + + +.. _user-code-structure-pto-class: + +PTO Class +^^^^^^^^^ + +WEC-Sim Power Take-Off (PTO) blocks connect WEC bodies to one other (and +possibly to the seabed) by constraining DOFs and applying linear damping and +stiffness. The ability to apply damping, stiffness, or other external forcing +differentiates a 'PTO' from a 'Constraint'. The damping and stiffness allow a +pto to extract power from relative body motion with respect to a fixed reference +frame or another body. + +At a high level, the PTO class interacts with the rest of WEC-Sim as shown in +the diagram below. PTO objects largely interact with other blocks through +Simscape connections that pass resistive forces to other bodies, constraints, +ptos, etc. + +.. figure:: /_static/images/code_structure/pto_diagram.PNG + :width: 750pt + +PTO Class Initialization +"""""""""""""""""""""""""" + +The properties of the PTO class (``ptoClass``) are +defined in the ``pto`` object. Within the ``wecSimInputFile.m``, users must +initialize each iteration the pto class (``ptoClass``) and specify the +``ptoName``, by including the following lines:: + + pto(i) = ptoClass(''); + +For rotational ptos, the user also needs to specify the location of the +rotational joint with respect to the global reference frame in the +``pto(i).location`` variable. In the PTO class, users can also specify +linear damping (``pto(i).damping``) and stiffness (``pto(i).stiffness``) values to +represent the PTO system (both have a default value of 0). Users can overwrite +the default values in the input file. For example, users can specify a damping +value by entering the following in the WEC-Sim input file:: + + pto(i).damping = ; + pto(i).stiffness = ; + +Available pto properties, default values, and functions can be found by typing +``doc ptoClass`` in the MATLAB command window, or opening the `ptoClass.m` file +in ``$WECSIM/source/objects`` directory by typing ``open ptoClass`` in MATLAB +Command Window. +For more information about application of WEC-Sim's pto class, refer to +:ref:`user-advanced-features-pto`. + +PTO Blocks +"""""""""""""" + +The PTO Class is tied to the PTOs library. +Similar to the Constraint blocks, the PTO blocks have a base (B) and +a follower (F). Users must name each PTO block ``pto(i)`` +(where i=1,2,...) and then define their properties in the input file. + +The ``Translational PTO``, ``Spherical PTO``, and ``Rotational PTO`` are identical to the +``Translational``, ``Spherical``, and ``Rotational`` constraints, but they allow for the +application of linear damping and stiffness forces. Additionally, there are two +other variations of the Translational and Rotational PTOs. The Actuation +Force/Torque PTOs allow the user to define the PTO force/torque at each +time-step and provide the position, velocity and acceleration of the PTO at +each time-step. The user can use the response information to calculate the PTO +force/torque. The Actuation Motion PTOs allow the user to define the motion of +the PTO. These can be useful to simulate forced-oscillation tests. + +.. figure:: /_static/images/WEC-Sim_Lib_pto.PNG + :width: 400 pt + :align: center + +.. Note:: + When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, + the loads and displacements are specified in the local (not global) + coordinate system. This is true for both the sensed (measured) and actuated + (commanded) loads and displacements. + + +.. _user-code-structure-cable-class: + +Cable Class +^^^^^^^^^^^^^^^^ + +WEC-Sim Cable blocks connect WEC bodies to one other by a cable. +They allows users to apply damping and/or stiffness when the cable is in tension, +but allow no forcing in compression. +At a high level, the cable class interacts with the rest of WEC-Sim as shown in the diagram below. + +.. figure:: /_static/images/code_structure/cable_diagram.PNG + :width: 750pt + +Cable Class Initialization +"""""""""""""""""""""""""""""""" +The properties of the cable class (``cableClass``) are defined in the ``cable`` object. +Within the ``wecSimInputFile.m``, users must initialize the cable class and specify the +``cableName``, in addition to the ``baseConnection`` and ``followerConnection`` (in that order), by including the following lines:: + + cable(i) = cableClass('cableName','baseConnection','followerConnection'); + cable(i).damping = ; + cable(i).stiffness = ; + +Available cable properties, default values, and functions +can be found by typing ``doc cableClass`` in the MATLAB command window, or +opening the `cableClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open cableClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-cable`. + +Cable Block +"""""""""""""""""""" + +The Cable Class is tied to the Cables library. +The ``Cable`` block applies linear damping and stiffness based on +the motion between the base and follower. +Cables can be used between two bodies to apply a coupling force only when taut or stretched. +A cable block must be added to the model between two PTOs or constraints that are to be connected by the cable. + +.. figure:: /_static/images/WEC-Sim_Lib_cable.PNG + :width: 400pt + :align: center + + + +.. _user-code-structure-mooring-class: + +Mooring Class +^^^^^^^^^^^^^ + +The mooring class (``mooringClass``) allows for different fidelity simulations +of mooring systems. Three possibilities are available, a lumped mooring matrix, +a mooring lookup table, or MoorDyn. These differences are determined by the Simulink block(s) chosen, and are +described below. At a high level, the Mooring class interacts with the rest of +WEC-Sim as shown in the diagram below. The interaction is similar to a +constraint or PTO, where some resistive forcing is calculated and passed to a +body block through a Simscape connection. + +.. figure:: /_static/images/code_structure/mooring_diagram.PNG + :width: 750pt + +Mooring Class Initialization +"""""""""""""""""""""""""""""""" + +The properties of the mooring class (``mooringClass``) are defined in the +``mooring`` object. Within the ``wecSimInputFile.m``, users must initialize +the mooring class and specify the ``mooringName``, by including the following lines:: + + mooring(i)= mooringClass(''); + +Available mooring properties, default values, and functions +can be found by typing ``doc mooringClass`` in the MATLAB command window, or +opening the `mooringClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open mooringClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-mooring`. + +Mooring Blocks +"""""""""""""""""""" + +The Mooring Class is tied to the Moorings library. +Four types of blocks may be used\: a 'Mooring Matrix', a 'Mooring Lookup Table', +a 'MoorDyn Connection' block, or a 'MoorDyn Caller' block. +The ``MooringMatrix`` block applies linear damping and stiffness based on +the motion of the follower relative to the base. +Damping and stiffness can be specified between all DOFs in a 6x6 matrix. +The ``MooringLookupTable`` block searches a user-supplied 6DOF force lookup table. +The lookup table should contain six parameters: the resultant mooring force in each degree of freedom. +Each force is indexed by position in all six degrees of freedom. +The mooring force is interpolated between indexed positions based on the instantaneous position of the mooring system. +There are no restrictions on the number of MooringMatrix or MooringLookupTable blocks. + +The ``MoorDynConnection`` block is used to detect the relative motion between +two connection points (i.e., a body and the global reference frame or between +two bodies). The block uses Simulink's 'Goto' and 'From' blocks to feed the +relative response to the ``MoorDynCaller`` block, which then calls MoorDyn to +calculate the 6 degree of freedom mooring forces based on the instantaneous displacement, +velocity, a MoorDyn input file, and the compiled MoorDyn libraries to simulate a realistic +mooring system. The mooring forces are then sent back to the MoorDyn Connection +block to be applied at the body's center of gravity. Multiple MoorDyn Connection +blocks can be used to specify mooring lines between different bodies/frames, +but there can only be one MoorDyn Caller block per Simulink model. Each +MoorDyn Connection block should be initialized as a ``mooring`` object in +the ``wecSimInputFile.m`` with ``mooring(i).moorDyn`` set equal to 1. The +``MoorDynCaller`` block should not have an accompanying ``mooring`` object. +If set up correctly in the ``wecSimInputFile.m``, the signals will be +automatically sent between the MoorDyn Connection and MoorDyn Caller blocks. + +.. figure:: /_static/images/WEC-Sim_Lib_mooring.PNG + :width: 400 pt + :align: center + +.. _user-code-structure-ptosim-class: + +PTO-Sim Class +^^^^^^^^^^^^^^^^ + +The PTO-Sim class contains all the information for the PTO-Sim blocks, which can be used to simulate PTO systems. +The difference beetween the PTO-Sim class and the PTO class is that the PTO-Sim class have detailed models of different components +that are used in PTO systems such as hydraulic cylinders, hydraulic accumulators, hydraulic motors, electric generators, etc., +while the PTO class have a linear parametric model that summarizes the PTO dynamics with a stiffness and a damping term. +At a high level, the PTO-Sim class interacts with the rest of +WEC-Sim as shown in the diagram below: + +.. figure:: /_static/images/code_structure/PTOSimClass_diagram.png + :width: 750pt + +The PTO-Sim blocks receive the linear or angular response from the PTO blocks and give either the torque or the force depending on the PTO dynamics. + +PTO-Sim Class Initialization +"""""""""""""""""""""""""""""""" +The properties of the PTO-Sim class (``ptoSimClass``) are defined in the ``ptoSim`` object. The PTO-Sim class must be +initialized in the ``wecSimInputFile.m`` script. There are three properties that must be initialized for all the PTO-Sim blocks, +those are the name, the block number, and the type:: + + ptoSim(i) = ptoSimClass('ptoSimName'); + ptoSim(i).ptoSimNum = i; + ptoSim(i).ptoSimType = ; + +The type value must be defined depending on the type of block used in the simulation as follows: + ++---------------------+-----+ +| PTO-Sim Library | ++=====================+=====+ +|Block |Type | ++---------------------+-----+ +|Electric Generator |1 | ++---------------------+-----+ +|Hydraulic cylinder |2 | ++---------------------+-----+ +|Hydraulic accumulator|3 | ++---------------------+-----+ +|Rectifying check |4 | +|valve | | ++---------------------+-----+ +|Hydraulic motor |5 | ++---------------------+-----+ +|Linear crank |6 | ++---------------------+-----+ +|Adjustable rod |7 | ++---------------------+-----+ +|Check valve |8 | ++---------------------+-----+ +|Direct drive |9 | +|linear generator | | ++---------------------+-----+ +|Direct drive |10 | +|rotary generator | | ++---------------------+-----+ + + +Available PTO-Sim blocks properties, default values, and functions +can be found by typing ``doc ptoSimClass`` in the MATLAB command window, or +opening the `ptoSimClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open ptoSimClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-pto`. + +PTO-Sim Blocks +"""""""""""""""""""" + +There are eight different types of blocks in the PTO-Sim class divided +in three sub-categories: Hydraulic, Electric, and Motion Conversion. In the hydraulic sub-category +there are five blocks: Check Valve, Compressible Fluid Piston, +Gas-Charged Hydraulic Accumulator, Hydraulic Motor, and Rectifying Check Valve. +In the Electric sub-category there is a block call Electric Generator Equivalent Circuit which models an electric generator +with an equivalent circuit. The motion conversion blocks (Rotary to Linear Adjustable Rod, and +Rotary to Linear Crank) can be used to to convert rotational motion into linear motion to add a hydraulic cylinder +to the PTO model. There are no restrictions on the number of PTO-Sim blocks. + + +.. figure:: /_static/images/WEC-Sim_Lib_PTOSim.png + :width: 400 pt + :align: center + + +.. _user-code-structure-response-class: + +Response Class +^^^^^^^^^^^^^^ +The response class contains all the output time-series and methods to plot and +interact with the results. It is not initialized by the user, and there is no +related Simulink block. Instead, it is +created automatically at the end of a WEC-Sim simulation. The response class +does not input any parameter back to WEC-Sim, only taking output data from the +various objects and blocks. + +After WEC-Sim is done running, there will be a new variable called ``output`` +saved to the MATLAB workspace. The ``output`` object is an instance of the +``responseClass``. It contains all the relevant time-series results of the +simulation. Time-series are given as [# of time-steps x 6] arrays, where 6 is the degrees of freedom. +Refer to the WEC-Sim API documentation for the :ref:`response` for +information about the structure of the ``output`` object, . + + +.. _user-code-structure-functions: + +Functions & External Codes +-------------------------- + +While the bulk of the WEC-Sim code consists of the WEC-Sim classes and the +WEC-Sim library, the source code also includes supporting functions and +external codes. These include third party Matlab functions to read ``*.h5`` and +``*.stl`` files, WEC-Sim Matlab functions to write ``*.h5`` files and run +WEC-Sim in batch mode, MoorDyn compiled libraries, python macros for ParaView +visualization, and the PTO-Sim class and library. Additionally, BEMIO can be +used to create the hydrodynamic ``*.h5`` file required by WEC-Sim. MoorDyn is +an open source code that must be downloaded separately. Users may also obtain, +modify, and recompile the code as desired. + + +.. _user-code-structure-external-blocks: + +External Simulink/Simscape Blocks +--------------------------------- + +In some situations, users may want to use Simulink/Simscape blocks that are not +included in the WEC-Sim Library to build their WEC model. +External blocks may be linked to the standard WEC-Sim library to implement +controllers, additional bodies, complex power take-offs and other custom designs. + +.. Note:: + The Simulink Mechanism Configuration for automatic gravity calculations is + not used in WEC-Sim. Gravity is instead defined as a force that is + combined with the buoyancy force. + Users who wish to add external bodies should account for gravity by: + + 1. Create nonhydrodynamic bodies with zero displaced volume, or + 2. Manually add the gravity force into their external functionality + diff --git a/dev/_sources/user/getting_started.rst.txt b/dev/_sources/user/getting_started.rst.txt new file mode 100644 index 000000000..69f9d3189 --- /dev/null +++ b/dev/_sources/user/getting_started.rst.txt @@ -0,0 +1,157 @@ +.. _user-getting-started: + +Getting Started +=============== + +This section provides instructions on how to download and install WEC-Sim. + +MATLAB Requirements +------------------- + +WEC-Sim is developed in MATLAB/Simulink, and requires the following toolboxes: + +========================== ============================= +**Required Toolbox** **Oldest Compatible Version** +MATLAB Version 9.9 (R2020b) +Simulink Version 10.2 (R2020b) +Simscape Version 5.0 (R2020b) +Simscape Multibody Version 7.2 (R2020b) +========================== ============================= + +WEC-Sim's Simulink Library is saved in MATLAB R2020b, and WEC-Sim tests are run on the last four releases of MATLAB. +Any version of MATLAB newer than R2020b should be compatible with WEC-Sim, however we do not test all MATLAB releases. +The stability of each MATLAB release is available via `WEC-Sim's GitHub Actions `_. +Certain advanced features rely on external functions (such as :ref:`mooring-moordyn`), and additional MATLAB Toolboxes (such as :ref:`user-advanced-features-pct`). + +Verify that the MATLAB required toolboxes are installed by typing ``ver`` in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> ver + ----------------------------------------------------------------------------------------------------- + MATLAB Version: 9.9.0.1592791 (R2020b) + ----------------------------------------------------------------------------------------------------- + MATLAB Version 9.9 (R2020b) + Simulink Version 10.2 (R2020b) + Simscape Version 5.0 (R2020b) + Simscape Multibody Version 7.2 (R2020b) + + +Download WEC-Sim +---------------- + +The WEC-Sim source code is hosted on `WEC-Sim's GitHub repository `_. +WEC-Sim users should clone WEC-Sim's Github repository. +Cloning the repository allows users to easily pull the latest updates to the WEC-Sim source code. +The WEC-Sim source code can be cloned by installing `Git Large File Storage `_ (git lfs) to access large files (e.g. ``*.h5`` files), and `cloning `_ the WEC-Sim GitHub repository. + +To install WEC-Sim using `git `_:: + + >> git lfs install + >> git clone https://github.com/WEC-Sim/WEC-Sim + +The local copy of WEC-Sim can easily be updated to include updates from the main version of the WEC-Sim source code hosted on the GitHub by using the git pull command:: + + >> git pull origin main + +For users who are new to git, it is recommended to go through examples on `GitHub `_ or other sources while getting started. +If you have problems downloading or installing please see the :ref:`user-troubleshooting` page. + +For developers who wish to contribute to WEC-Sim, refer to the Developer :ref:`dev-getting-started` section. + + +.. Note:: + Users may also download a static version of WEC-Sim from the latest tagged + `WEC-Sim Release `_. This is + the easiest way to obtain the WEC-Sim code, however users must manually + download new releases for updates. + + +.. _user-install: + +Install WEC-Sim +--------------- + +Once you have downloaded the WEC-Sim source code, take the following steps to install WEC-Sim. +The directory where the WEC-Sim source code is saved is referred to as ``$WECSIM`` (e.g. ``C:/User/Documents/GitHub/WEC-Sim``). + + +Step 1. Add WEC-Sim to the MATLAB Path +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To run WEC-Sim, the source directory must be on the MATLAB path. +Users have two options to do this: + +**Option 1. Automatically add the WEC-Sim source on MATLAB startup.** + +Open ``$WECSIM/source/addWecSimSource.m`` and copy contents to a new file called ``startup.m``. +Set the WEC-Sim path to the local ``$WECSIM/source`` directory, e.g. ``wecSimSource = 'C:/User/Documents/GitHub/WEC-Sim/source``. +Save ``startup.m`` to the `MATLAB Startup Folder `_. +Restart MATLAB, and the ``$WECSIM/source`` directory will automatically be added to the MATLAB path. + + +.. literalinclude:: ../../addWecSimSource.m + :language: matlab + + +**Option 2. Manually add and remove the WEC-Sim source from the MATLAB path.** + +This option requires users to run a script each time MATLAB is opened to add the WEC-Sim source directory to the path. +Navigate to the ``$WECSIM`` directory and run ``addWecSimSource``. +The ``$WECSIM/source`` directory will then be added to the MATLAB path for this instance of MATLAB. +To remove WEC-Sim from the path, run ``removeWecSimSource``. + + +Step 2. Verify the Path +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Verify the path was set up correctly by checking that the WEC-Sim source directory is listed in the MATLAB search path. +The WEC-Sim source directory, ``$WECSIM/source``, and its subfolders should be listed. +To view the MATLAB path, type ``path`` in the MATLAB Command Window:: + + >> path + + MATLABPATH + + C:/User/Documents/GitHub/WEC-Sim/source + + + +Step 3. Add WEC-Sim Library to Simulink +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Open the Simulink Library Browser by typing ``slLibraryBrowser`` in the MATLAB +Command Window:: + + >> slLibraryBrowser + +Once the Simulink Library Browser opens, `refresh the Simulink Library `_. +The WEC-Sim Library should now be visible, as shown in the figure below. +The WEC-Sim Library will now be accessible every time Simulink is opened. +For more information on using and modifying library blocks refer to the `Simulink Documentation `_. + +.. figure:: /_static/images/WEC-Sim_Lib.PNG + :align: center + + .. + +Step 4. Test the Installation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Both users and contributors can test the installation using the following steps. +In the MATLAB Command Window type:: + + >> cd $WECSIM/examples/RM3 + >> wecSim + +This should run an example case using the Reference Model 3 (RM3) point absorber. +A Mechanics Explorer window will open within the MATLAB window, and figures will be generated displaying simulation outputs. +Both the RM3 and the OSWEC examples (``$WECSIM/examples/OSWEC``) come ready-to-run and can be used once WEC-Sim is installed. + +.. Note:: + + If a git lfs error is produced, there was a problem with git-lfs + installation. You may need to manually install `Git Large File + Storage `_ , or run + ``$WECSIM/examples/RM3/hydroData/bemio.m`` to generate the correct + ``rm3.h5`` file. + diff --git a/dev/_sources/user/index.rst.txt b/dev/_sources/user/index.rst.txt new file mode 100644 index 000000000..32d230c7a --- /dev/null +++ b/dev/_sources/user/index.rst.txt @@ -0,0 +1,18 @@ +.. _user: + +########### +User Manual +########### + +.. toctree:: + :maxdepth: 2 + + getting_started.rst + workflow.rst + tutorials.rst + code_structure.rst + advanced_features.rst + applications.rst + webinars.rst + troubleshooting.rst + api.rst diff --git a/dev/_sources/user/troubleshooting.rst.txt b/dev/_sources/user/troubleshooting.rst.txt new file mode 100644 index 000000000..9fd95b6e7 --- /dev/null +++ b/dev/_sources/user/troubleshooting.rst.txt @@ -0,0 +1,239 @@ +.. _user-troubleshooting: + +Troubleshooting +=============== + +WEC-Sim Issues +--------------- +The WEC-Sim development team actively maintains the `WEC-Sim Issues page `_ on GitHub. +This issue page is maintained to assist users and past issues. +In this way, it serves as a significant resource for users in solving WEC-Sim problems or clarifying its implementation. + +If you have problems downloading, installing, or using WEC-Sim please follow the debugging steps on this page. +Completing these steps will help users address their own questions and aid the development team in maintaining the issue board effectively. +Please take the time to follow these steps before opening an issue on GitHub. + + +Note on the Issue Board +^^^^^^^^^^^^^^^^^^^^^^^^ + +Unfortunately, the WEC-Sim development team does not have the time and funding to address issues outside of WEC-Sim. +The following topics cannot be addressed when there is not a direct relation to WEC-Sim code, theory, or implementation: + +- MATLAB/Simulink/Simscape-based issues +- general hydrodynamics questions +- performing tasks for a user's case, i.e. supplying nonlinear meshes, \*.h5 files, BEM results +- running BEM software +- use or development of BEM software + +The issue board is provided as a convenience to users and the development team makes every effort to respond to issues in a timely manner. +However, users should not expect nor request an immediate response from the developers. + + + +Debugging +--------------------- + +Before opening an issue on GitHub, it is expected that users do a fair share of debugging. +WEC-Sim is intentionally easy to use and utilizes convenient MATLAB/Simulink interfaces. +However, this ease of use does not detract from the difficulty and time required to create an accurate and robust simulation. +Users should spend time carefully setting up and debugging their WEC-Sim cases. For example: + +- Follow all error codes to the root cause of the error +- Confirm that all user-defined inputs are set correctly +- Confirm that WEC-Sim is called in the intended way (wecSim, wecSimMCR, wecSimPCT, from Simulink, etc) +- When running a WEC-Sim example (e.g. OSWEC, RM3) carefully compare to the working examples before opening an issue +- Check BEM input data for expected results, referring to the notes in the BEMIO figures +- If creating your own WEC-Sim case, go through the wave test cases below. Check the common issues and solutions for each test. + + +Identify Root Cause +^^^^^^^^^^^^^^^^^^^^^ +Identify if MATLAB and Simulink, or WEC-Sim is the root cause of the problem. +Does the problem occur in a WEC-Sim class, function, or Simulink model? If so, it may be a WEC-Sim error. +Carefully check input file paths, especially when copying previously working WEC-Sim examples. +Please do not submit issues for errors related to using MATLAB. +The development team cannot provide support for MATLAB errors outside of WEC-Sim. + + +Review Relevant Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Read the appropriate documentation section for solutions or clarification on use of a particular feature. +The documentation is thorough but requires careful reading of relevant sections. +If documentation in an area is lacking, please identify this in a GitHub issue so that we may improve WEC-Sim. + + +Search WEC-Sim Issues +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In many cases, another user has had a similar issue before. +Search the issues page (both open and closed) and the below FAQ for topics that relate to your current problem. +If these are related but insufficient, tag them in your GitHub issue for as references for the development team and future users. + + +Open an Issue +^^^^^^^^^^^^^^^^^^^^^ + +If the above steps do not solve your problem, please open an issue using one of the provided templates: bug report, feature request, theory or implementation, or WEC-Sim application. +Issue templates serve to layout the information required to solve an issue in a consistent, up front manner. +Templates are new to the WEC-Sim workflow, and input on their use is welcome. +The development team hopes this will help address questions as quickly and thoroughly as possible for users. + +Users may remove all italic descriptive text in a template, but must keep the bold headers that organize the issue. +Users who do not use a template will be asked to reopen their issue with the appropriate layout. +If the provided templates do not fit an issue, users may open a blank issue with an initial statement explaining why there is no template and providing sufficient information. + +When opening an issue, please provide all relevant information. +Link to the relevant documentation section and past issues, and upload a case file whenever possible. + + + +Numerical Test Cases +-------------------- +This section describe a series of numerical test cases that should be performed when creating a novel WEC-Sim case. +These various wave cases are necessary to ensure a robust, accurate solution and speed the debugging process for users. +When opening a support question for case development, users will be asked to supply information on which test cases are functioning or not. +Note that this workflow is not foolproof, but can be used as a guide to create a more robust WEC-Sim case. + +====== ================================= ========================= +Number Purpose Input parameters utilized +====== ================================= ========================= +1A Hydrostatic stability noWave +1B Hydrostatic stability noWaveCIC +2A Free Decay, hydrostatic stiffness noWave, initial +2B Free Decay, hydrostatic stiffness noWaveCIC, initial +3A Viscous drag regular +3B Viscous drag regularCIC +4A Full functionality irregular, initial +====== ================================= ========================= + +Various problems may occur while progressing through these test cases. +Users should not advance to the next test unless the previous tests run without error and result in a physical response. + +Hydrostatic Stability +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Issues with Test 1A-B indicate there is an imbalance between the gravity and buoyant forces. +This may cause the "solution singularity" as described in the FAQ, or result in a body rising or falling indefinitely. +To solve this problem, recalculate the mass that will balance the displaced volume from the BEM data. +Alternatively utilize the ``body(#).mass = equilibrium`` option. + +Free Decay +^^^^^^^^^^^^^^ + +Failure in Test 2 but not Test 1 indicates an inaccurate hydrostatic stiffness. +The hydrostatic stiffness returns a device to equilibrium after some displacement. +If the stiffness is too large, the simulation may require a very small time step. +If too small, an initial displacement may cause infinite motion. +Reevaluate the BEM input or tune the stiffness with ``body(#).hydroStiffness`` in the input file. + +Viscous Drag +^^^^^^^^^^^^^^ + +A hydrostatically stable device that has an unphysical response to a regular wave requires improved drag and damping. +BEM codes inherently assume inviscid flow. Recreating the effects of viscous drag in WEC-Sim is essential to obtaining a physical response. +Tune the parameters ``body(#).quadDrag`` or ``body(#).linearDamping`` to create a realistic response to a regular wave. + +Irregular Waves +^^^^^^^^^^^^^^^^^^^^^ + +If Test 4 fails, users should check that the IRF decays to zero in BEMIO as done for the other CIC waves. Users may also investigate +different body drag, or change the mooring and PTO stiffness or damping. The state space or other numerical options may be helpful to stabilize the irregular wave case. +Once a simulation is stable and realistic in Test 4 and all previous test cases, it can likely be used in additional cases as desired. +Passing these test cases does not necessarily indicate accuracy, but it should result in a simulation without numerical errors. +It is up to each user to tune body, PTO and mooring parameters appropriately to model a device accurately. + +Other Tests +^^^^^^^^^^^ + +**Tests A vs B:** +CIC waves are one way to evaluate if "good" BEM data is being used. +If a non-CIC wave has unphysical behavior at a specific frequency but not others, there are likely irregular frequency (IRR) spikes in the BEM data. +The CIC wave decreases the impact of these spikes in radiation damping. + +If a CIC wave continues to oscillate without decaying to a steady state, the convolution integral time is not long enough. +Increase ``simu.cicEndTime`` to a greater value or use the state space option (``simu.stateSpace=1``). +In BEMIO, check that the convolution integral time is long enough for all oscillations to decay. + +**Nonlinear Hydrodynamics:** +If a user wishes to use the nonlinear hydro options, they should first follow this same workflow with ``simu.nonlinearHydro=0`` and again with ``simu.nonlinearHydro=1,2`` +The nonlinear hydro options are difficult to set-up and must be used with care. +A highly refined mesh is required to get an accurate displaced volume and wetted surface area at each time step. + + +FAQs +-------------------------- +This section highlights some of the Frequently Asked Questions from WEC-Sim issues. +All FAQ information is available in closed GitHub issues, but is repeated here for convenience. + +Solution Singularity +^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +The simulation is numerically unstable. Bodies may rise or fall indefinitely and have unphysical responses. +This occurs because there is an imbalance between the gravity and hydrostatic forces. +If the gravity force is much larger than the hydrostatic force, bodies may fall indefinitely. +The opposite may occur when gravity is small compared to the hydrostatic force. +An extremely large or small stiffness can also cause this problem. +A small stiffness may not restore a body to an equilibrium position. +A large stiffness may require a very small time step to be effective. + +**Possible error messages:** + +.. code-block:: none + + Derivative of state ... in block ... at time ... is not finite. + The simulation will be stopped. There may be a singularity in the solution + +**Solution:** +Re-evaluate the hydrostatic stability of the device. +Compare the mass and displaced volume of the device to evaluate if it will float properly. +Calculate an approximate stiffness that will restore the body to equilibrium in still water. +Compare the mass, volume, and stiffness to those results in the BEM data. + + +Degenerate Mass Distribution +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +When two PTOs or Constraints are connected in series with no mass between them, Simulink attempts to connect two joint blocks directly together. +Simulink cannot reconcile the forcing and motion between these series joints without a mass between them. + +**Possible error messages:** + +.. code-block:: none + + ... Joint has a degenerate mass distribution on its base/follower side. + +**Solution:** +Add an insignificantly small mass between the two joints (e.g. ``Simulink Library/Simscape/Multibody/Body Elements/Inertia``) . +Alternatively, create a new PTO or constraint with one of the many joints available in the +Simscape Multibody Joints library if special degrees of freedom are required. + + +Hydrodynamic Data File +^^^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +The path to the ``*.h5`` file does not exist or it is incomplete (size < 1kB). + +**Possible error messages:** + + +.. code-block:: none + + The hdf5 file hydroData/*.h5 does not exist + +.. code-block:: none + + This is not the correct *.h5 file. Please install git-lfs to access the correct *.h5 file, + or run \hydroData\bemio.m to generate a new *.h5 file + +**Solution:** +Check the path to the ``*.h5`` file in the ``wecSimInputFile.m`` or run BEMIO to generate a new ``*.h5`` file. + + + + + diff --git a/dev/_sources/user/tutorials.rst.txt b/dev/_sources/user/tutorials.rst.txt new file mode 100644 index 000000000..4f6a430ec --- /dev/null +++ b/dev/_sources/user/tutorials.rst.txt @@ -0,0 +1,413 @@ +.. _user-tutorials: + +Tutorials +========= + +This section provides step-by-step instructions on how to set-up and run the WEC-Sim code +using the provided Tutorials (located in the WEC-Sim ``$WECSIM/tutorials`` +directory). Two WEC-Sim tutorials are provided: the Two-Body Point Absorber +(RM3), and the Oscillating Surge WEC (OSWEC). +For cases that are already set-up and ready to run, see Step 3 of :ref:`user-install`. + +For information about the implementation of the WEC-Sim code refer to the +:ref:`user-code-structure` section. +For information about additional WEC-Sim +features, refer to :ref:`user-advanced-features`. + +.. _user-tutorials-rm3: + +Two-Body Point Absorber (RM3) +----------------------------- + +This section describes the application of the WEC-Sim code to model the +Reference Model 3 (RM3) two-body point absorber WEC. This tutorial is provided +in the WEC-Sim code release in the ``$WECSIM/tutorials`` directory. + +.. _user-tutorials-rm3-device-geometry: + +Device Geometry +^^^^^^^^^^^^^^^ + +The RM3 two-body point absorber WEC has been characterized both numerically and +experimentally as a result of the DOE-funded `Reference Model Project +`_. The RM3 is a two-body point absorber +consisting of a float and a reaction plate. Full-scale dimensions and mass +properties of the RM3 are shown below. + +.. figure:: /_static/images/RM3_Geom.png + :width: 300pt + :align: center + ++-------+---------------+ +| Body | Mass (tonne) | ++=======+===============+ +| Float | 727.01 | ++-------+---------------+ +| Plate | 878.30 | ++-------+---------------+ + ++-------+-----------+------------------------+--------------------------------------+ +| Body | Direction | Center of Gravity* (m) | Inertia Tensor (kg m^2) | ++=======+===========+========================+============+============+============+ +| | x | 0 | 20,907,301 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Float | y | 0 | 0 | 21,306,091 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -0.72 | 0 | 0 | 37,085,481 | ++-------+-----------+------------------------+------------+------------+------------+ +| | x | 0 | 94,419,615 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Plate | y | 0 | 0 | 94,407,091 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -21.29 | 0 | 0 | 28,542,225 | ++-------+-----------+------------------------+------------+------------+------------+ + +**\* The origin lies at the undisturbed free surface (SWL)** + +.. _user-tutorials-rm3-model-files: + +Model Files +^^^^^^^^^^^ + +Below is an overview of the files required to run the RM3 simulation in +WEC-Sim. For the RM3 WEC, there are two corresponding geometry files: +``float.stl`` and ``plate.stl``. In addition to the required files listed +below, users may supply a ``userDefinedFunctions.m`` file for post-processing +results once the WEC-Sim run is complete. + +================== ============================= ==================================== +**File Type** **File Name** **Directory** +Input File ``wecSimInputFile.m`` ``$WECSIM/tutorials/rm3/`` +Simulink Model ``rm3.slx`` ``$WECSIM/tutorials/rm3/`` +Hydrodynamic Data ``rm3.h5`` ``$WECSIM/tutorials/rm3/hydroData/`` +Geometry Files ``float.stl`` & ``plate.stl`` ``$WECSIM/tutorials/rm3/geometry/`` +================== ============================= ==================================== + +RM3 Tutorial +^^^^^^^^^^^^ + +.. _user-tutorials-rm3-step-one: + +Step 1: Run BEMIO +""""""""""""""""" + +Hydrodynamic data for each RM3 body must be parsed into a HDF5 file using +:ref:`user-advanced-features-bemio`. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, ``*.h5`` that is then read by WEC-Sim. +The RM3 tutorial includes data from a WAMIT run, ``rm3.out``, of the RM3 +geometry in the ``$WECSIM/tutorials/rm3/hydroData/`` directory. The RM3 WAMIT +``rm3.out`` file and the BEMIO ``bemio.m`` script are then used to generate the +``rm3.h5`` file. + +This is done by navigating to the ``$WECSIM/tutorials/rm3/hydroData/`` +directory, and typing``bemio`` in the MATLAB Command Window:: + + >> bemio + + +.. _user-tutorials-rm3-step-two: + +Step 2: Build Simulink Model +"""""""""""""""""""""""""""" + +The WEC-Sim Simulink model is created by dragging and dropping blocks from the +*WEC-Sim Library* into the ``rm3.slx`` file. When setting up a WEC-Sim model, +it is very important to note the base and follower frames. The base port should +always connect 'towards' the Global Reference Frame, while the follower port +connects 'away' from the reference frame. Also, a base port should always +connect to a follower port. The same port type should not be connected (i.e. no +base-base or follower-follower connections). + +* Place two **Rigid Body** blocks from *Body Elements* in *WEC-Sim Library* in + the Simulink model file, one for each RM3 rigid body. + +* Double click on the **Rigid Body** block, and rename each instance of the + body. The first body must be called ``body(1)``, and the second body should be + called ``body(2)``. + +.. figure:: /_static/images/RM3_WECSim_Body.jpg + :width: 400pt + :align: center + +* Place the **Global Reference Frame** from *Frames* in the *WEC-Sim Library* + in the Simulink model file. The global reference frame acts as the seabed. + + +.. figure:: /_static/images/RM3_WECSim_GlobalRef.jpg + :width: 400pt + :align: center + +* Place the **Floating (3DOF)** block from *Constrains* to connect the plate to + the seabed. This constrains the plate to move in 3DOF relative to the **Global + Reference Frame**. + +* Place the **Translational PTO** block from *PTOs* to connect the float to the + spar. This constrains the float to move in heave relative to the spar, and + allows definition of PTO damping. + +.. figure:: /_static/images/RM3_WECSim.JPG + :width: 400pt + :align: center + +.. _user-tutorials-rm3-step-three: + +Step 3: Write wecSimInputFile.m +""""""""""""""""""""""""""""""" + +The WEC-Sim input file defines simulation parameters, body properties, joints, +and mooring for the RM3 model. The ``wecSimInputFile.m`` for the RM3 is +provided in the RM3 case directory, and shown below. + +New users should manually write the wecSimInputFile.m to become familiar with +the set-up parameters and the files being called in a basic WEC-Sim run. First, +define the simulation parameters. Initialize an instance of the +simulationClass. Define the simulink file to use, the start, ramp and end +times, and the time step required. The simulation class also controls all +relevant numerical options and simulation-wide parameters in a single +convenient class. + +Next set-up the type of incoming wave by instantiating the waveClass. 'Regular' +is a sinusoidal wave and the easiest to start with. Define an appropriate wave +height and period. Waves can also be an irregular spectrum, imported by +elevation or spectrum, or multidirectional. + +Third, define all bodies, PTOs and constraints present in the simulink file. +There are distinct classes for bodies, PTOs and constraints that contain +different properties and function differently. Bodies are hydrodynamic and +contain mass and geometry properties. Initialize bodies by calling the +bodyClass and the path to the relevant h5 file. Set the path to the geometry +file, and define the body's mass properties. PTOs and constraints are more +simple and contain forces and power dissipation (in the constraint) that limit +the WEC's motion. PTOs and constraints can be set by calling the appropriate +class with the Simulink block name. Set the location and any PTO damping or +stiffness desired. + +.. literalinclude:: ../../tutorials/RM3/RM3_wecSimInputFile.m + :language: matlab + +.. _user-tutorials-rm3-step-four: + +Step 4: Run WEC-Sim +""""""""""""""""""" + +To execute the WEC-Sim code for the RM3 tutorial, type ``wecSim`` into the +MATLAB Command Window. Below is a figure showing the final RM3 Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the RM3 device, refer to :cite:`ruehl_preliminary_2014`. + +.. figure:: /_static/images/RM3_WECSim_GUI.JPG + :width: 400pt + :align: center + +.. _user-tutorials-rm3-step-five: + +Step 5: Post-processing +""""""""""""""""""""""" + +The RM3 tutorial includes a ``userDefinedFunctions.m`` which plots RM3 +forces and responses. This file can be modified by users for +post-processing. Additionally, once the WEC-Sim run is complete, the +WEC-Sim results are saved to the ``output`` variable in the MATLAB +workspace. + +.. _user-tutorials-oswec: + +Oscillating Surge WEC (OSWEC) +----------------------------- + +This section describes the application of the WEC-Sim code to model the +Oscillating Surge WEC (OSWEC). This tutorial is provided in the WEC-Sim +code release in the ``$WECSIM/tutorials`` directory. + +.. _user-tutorials-oswec-device-geometry: + +Device Geometry +^^^^^^^^^^^^^^^ + +The OSWEC was selected because its design is fundamentally different from the +RM3. This is critical because WECs span an extensive design space, and it is +important to model devices in WEC-Sim that operate under different principles. +The OSWEC is fixed to the ground and has a flap that is connected through a +hinge to the base that restricts the flap in order to pitch about the hinge. +The full-scale dimensions and mass properties of the OSWEC are shown below. + +.. figure:: /_static/images/OSWEC_Geom.png + :width: 600pt + :align: center + ++-------+---------------+ +| Body | Mass (tonne) | ++=======+===============+ +| Flap | 127 | ++-------+---------------+ + ++-------+-----------+------------------------+--------------------------------------+ +| Body | Direction | Center of Gravity* (m) | Moment of Inertia Tensor (kg m^2) | ++=======+===========+========================+============+============+============+ +| | x | 0 | 0 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Flap | y | 0 | 0 | 1,850,000 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -3.9 | 0 | 0 | 0 | ++-------+-----------+------------------------+------------+------------+------------+ + +.. Note:: + The global frame lies at the undisturbed free surface. The body-fixed frame is at the center of gravity. Since the OSWEC is modeled as a pitch device, only the Iyy Moment of Inertia has been defined. + +.. _user-tutorials-oswec-model-files: + +Model Files +^^^^^^^^^^^ + +Below is an overview of the files required to run the OSWEC simulation in +WEC-Sim. For the OSWEC, there are two corresponding geometry files: +``flap.stl`` and ``base.stl``. In addition to the required files listed below, +users may supply a ``userDefinedFunctions.m`` file for post-processing results +once the WEC-Sim run is complete. + +================== ============================ =============================== +**File Type** **File Name** **Directory** +Input File ``wecSimInputFile.m`` ``$WECSIM/tutorials/oswec/`` +Simulink Model ``oswec.slx`` ``$WECSIM/tutorials/oswec/`` +Hydrodynamic Data ``oswec.h5`` ``$WECSIM/tutorials/oswec/hydroData/`` +Geometry Files ``flap.stl`` & ``base.stl`` ``$WECSIM/tutorials/oswec/geometry/`` +================== ============================ =============================== + +OSWEC Tutorial +^^^^^^^^^^^^^^ + +.. _user-tutorials-oswec-step-one: + +Step 1: Run BEMIO +""""""""""""""""" + +Hydrodynamic data for each OSWEC body must be parsed into a HDF5 file using +:ref:`user-advanced-features-bemio`. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, ``*.h5`` that is then read by WEC-Sim. +The OSWEC tutorial includes data from a WAMIT run, ``oswec.out``, of the OSWEC +geometry in the ``$WECSIM/tutorials/rm3/hydroData/`` directory. The OSWEC WAMIT +``oswec.out`` file and the BEMIO ``bemio.m`` script are then used to generate +the ``oswec.h5`` file. + +This is done by navigating to the ``$WECSIM/tutorials/oswec/hydroData/`` +directory, and typing``bemio`` in the MATLAB Command Window:: + + >> bemio + +.. _user-tutorials-oswec-step-two: + +Step 2: Build Simulink Model +"""""""""""""""""""""""""""" + +The WEC-Sim Simulink model is created by dragging and dropping blocks from the +*WEC-Sim Library* into the ``oswec.slx`` file. + + +* Place two **Rigid Body** blocks from the *WEC-Sim Library* in the Simulink + model file, one for each OSWEC rigid body. + +* Double click on the **Rigid Body** block, and rename each instance of the + body. The first body must be called ``body(1)``, and the second body should be + called ``body(2)``. + +.. figure:: /_static/images/OSWEC_WECSim_Body.jpg + :width: 400pt + :align: center + +* Place the **Global Reference Frame** from *Frames* in the *WEC-Sim Library* + in the Simulink model file. The global reference frame acts as the seabed. + +.. figure:: /_static/images/OSWEC_WECSim_GlobalRef.jpg + :width: 400pt + :align: center + +* Place the **Fixed** block from *Constraints* to connect the base to the + seabed. This constrains the base to be fixed relative to the **Global Reference + Frame**. + +* Place a **Rotational PTO** block to connect the base to the flap. This + constrains the flap to move in pitch relative to the base, and allows for the + definition of PTO damping. + +.. figure:: /_static/images/OSWEC_WECSim.JPG + :width: 400pt + :align: center + +.. Note:: + + When setting up a WEC-Sim model, it is very important to note the base and + follower frames. + +.. _user-tutorials-oswec-step-three: + +Step 3: Write wecSimInputFile.m +""""""""""""""""""""""""""""""" + +The WEC-Sim input file defines simulation parameters, body properties, and +joints for the OSWEC model. Writing the OSWEC input file is similar to writing +the RM3 input. Try writing it on your own. Define the simulation class, wave +class, bodies, constraints and PTOs. The ``wecSimInputFile.m`` for the OSWEC is +provided in the OSWEC case directory, and shown below. + +.. literalinclude:: ../../tutorials/OSWEC/OSWEC_wecSimInputFile.m + :language: matlab + +.. _user-tutorials-oswec-step-four: + +Step 4: Run WEC-Sim +""""""""""""""""""" + +To execute the WEC-Sim code for the OSWEC tutorial, type ``wecSim`` into the +MATLAB Command Window. Below is a figure showing the final OSWEC Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the OSWEC device, refer to :cite:`y._yu_development_2014,y._yu_design_2014`. + +.. figure:: /_static/images/OSWEC_WECSim_GUI.jpg + :width: 400pt + :align: center + +.. _user-tutorials-oswec-step-five: + +Step 5: Post-processing +""""""""""""""""""""""" + +The OSWEC tutorial includes a ``userDefinedFunctions.m`` which plots OSWEC +forces and responses. This file can be modified by users for post-processing. +Additionally, once the WEC-Sim run is complete, the WEC-Sim results are saved +to the **output** variable in the MATLAB workspace. + + +.. _user-tutorials-examples: + +WEC-Sim Examples +---------------- + +Working examples of using WEC-Sim to model the RM3, OSWEC, and RM3FromSimulink are provided in +the ``$WECSIM/examples/`` directory. For each example the ``wecSimInputFile.m`` +provided includes examples of how to run different wave cases: + +* ``noWaveCIC`` - no wave with convolution integral calculation +* ``regularCIC`` - regular waves with convolution integral calculation +* ``irregular`` - irregular waves using a Pierson-Moskowitz spectrum with convolution integral calculation +* ``irregular`` - irregular waves using a Bretschneider Spectrum with state space calculation +* ``spectrumImport`` - irregular waves using a user-defined spectrum +* ``elevationImport`` - user-defined time-series + + +* Run from MATLAB Command Window (for RM3 and OSWEC examples) + * Type ``wecSim`` in the Command Window +* Run from Simulink (for RM3FromSimulink example) + * Open the relevant WEC-Sim Simulink file + * Type ``initializeWecSim`` in the Command Window + * Hit Play in Simulink model to run + +To customize or develop a new WEC-Sim model that runs from Simulink (e.g. for Hardware-in-the-Loop, HIL, applications) refer to :ref:`user-advanced-features-simulink` for more information. +Users may also use ``wecSimMCR``, ``wecSimPCT``, ``wecSimFcn`` and as described in the advanced features +sections :ref:`user-advanced-features-mcr` and :ref:`user-advanced-features-pct`. +These options are only available through the MATLAB Command Window. + +References +------------------------ +.. bibliography:: ../refs/WEC-Sim_Tutorials.bib + :style: unsrt + :labelprefix: A diff --git a/dev/_sources/user/webinars.rst.txt b/dev/_sources/user/webinars.rst.txt new file mode 100644 index 000000000..81d6f062b --- /dev/null +++ b/dev/_sources/user/webinars.rst.txt @@ -0,0 +1,327 @@ +.. _intro-webinars: + +Training Materials +================== + +The WEC-Sim team developed an online training course, and hosted advanced features webinars. +Recordings of each course are available below, along with the presentations. + + +Online Training Course +---------------------- +The WEC-Sim team developed an online training course. +This course provides an overview of what that WEC-Sim software does, and how to use it. +Recordings of each course are available below, along with the presentations. + +Overview +^^^^^^^^ +The section provides a big-picture overview of the WEC-Sim software. +The WEC-Sim Overview presentation is available for download here (`WEC-Sim +Overview Slides <../_static/downloads/1_WEC-Sim_Overview.pdf>`__), and the +recording is available below. + + .. raw:: html + + + + +Theory & Workflow +^^^^^^^^^^^^^^^^^ +This section discusses the WEC-Sim theory and workflow. +The WEC-Sim Theory & Workflow presentation is available +for download here (`Theory & Workflow Slides <../_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf>`__), and the recording is available below. + + .. raw:: html + + + + +Installation +^^^^^^^^^^^^ +This section described how to install WEC-Sim. +The WEC-Sim Installation presentation is available to download here (`Theory & Workflow Slides <../_static/downloads/3_WEC-Sim_Installation.pdf>`__), and the recording is available below. + + .. raw:: html + + + + +.. _user-webinars-code-structure: + +Code Structure +^^^^^^^^^^^^^^ +This section provides an overview of how the WEC-Sim code is +structured by describing the :ref:`user-code-structure-src` (e.g. +:ref:`user-code-structure-classes` and :ref:`user-code-structure-library`, and +how they are defined in the :ref:`user-workflow-input-files` (i.e. +``wecSimInputFile.m`` and ``.slx``). +The Code Structure Overview presentation is available to download here (`WEC-Sim Code +Structure Slides <../_static/downloads/4_WEC-Sim_CodeStructure.pdf>`__), and the +recording is available below. + + .. raw:: html + + + + +BEMIO +^^^^^ +This section of the course discusses how BEMIO is used to extract the hydrodynamic coefficients generated by a BEM software, +and post-process themfor use by WEC-Sim. +The BEMIO routines also help calculate impulse response functions, and plot data. +The BEMIO presentation can be donloaded here (`BEMIO Slides +<../_static/downloads/5_WEC-Sim_BEMIO.pdf>`__), and the +recording is available below. + + .. raw:: html + + + +Wave Class +^^^^^^^^^^ +This section of the course provides an overview of how waves are implemented in +the WEC-Sim code, both in the :ref:`user-code-structure-wave-class`, and in the +:ref:`user-code-structure-library`. +The Wave Class presentation is +available for download here (`Wave Implementation Slides +<../_static/downloads/6_WEC-Sim_WaveClass.pdf>`__), and the recording +is available below. + + .. raw:: html + + + +Body Class +^^^^^^^^^^ +This section of the course provides an overview of how bodies are implemented +in the WEC-Sim code, both in the :ref:`user-code-structure-body-class`, and in +the :ref:`user-code-structure-library`. The Body Class presentation is +available for download here (`Body Implementation Slides +<../_static/downloads/7_WEC-Sim_BodyClass.pdf>`__), and the recording +is available below. + + .. raw:: html + + + +Tutorial +^^^^^^^^ +This section shows users how to set up an run a the WEC-Sim tutorial. +The Tutorial presentation is available to download here (`WEC-Sim Tutorial +<../_static/downloads/8_WEC-Sim_Tutorial.pdf>`__), and the recording +is available below. + + .. raw:: html + + + + + +Advanced Features Series +-------------------------- + +The WEC-Sim team hosted a series of Advanced Features Series. The +topics are listed below. Recordings of each are available below, along with the +presentations. + + =========== ==================================== + **Series** **Topic** + 1 Multiple Condition Runs (MCR) + 2 Nonlinear Hydrodynamics + 3 Non-hydrodynamic Bodies + 4 Body-to-Body Interactions + 5 PTO-Sim + 6 WEC-Sim Controls + 7 Modeling Cables + 8 Using Moordyn with WEC-Sim + 9 Modeling OWC Devices + 10 Desalination + 11 WEC-Sim Visualization + =========== ==================================== + +.. _webinar1: + +Series 1 - Multiple Condition Runs (MCR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The series presents an overview of how to run multiple cases in WEC-Sim. The +presentation is available for download here ( `Series 1 Slides +<../_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf>`__ ), and the recording is +available below. + +**Series 1 - Multiple Condition Runs (MCR)** + + .. raw:: html + + + +.. _webinar2: + + +Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section is focused on how to implement Nonlinear Buoyancy and Froude-Krylov Wave Excitation forces in WEC-Sim. +The presentation is available +for download here ( `Series 2 Slides <../_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf>`__ ), +and the recordings are available below. + +**Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation** + + .. raw:: html + + + + +.. _webinar3: + +Series 3 - Non-hydrodynamic Bodies +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This webinar presents an overview of the non-hydrodynamic body implementation in WEC-Sim. The +presentation is available for download here ( `Series 3 Slides +<../_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf>`__ ), and the recordings are +available below. + +**Series 3 - Non-hydrodynamic Bodies** + + .. raw:: html + + + +.. _webinar4: + +Series 4 - Body-to-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is section of the Advanced Features Series presents some examples of how body-to-body interactions are modeled in WEC-Sim. +The presentation is available for download here ( `Series 4 Slides +<../_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf>`__ ), and the recordings are +available below. + +**Series 4 - Body-to-Body Interactions** + + .. raw:: html + + + +.. _webinar5: + +Series 5 - PTO-Sim +^^^^^^^^^^^^^^^^^^^ + +This section is focused on PTO-Sim. +The presentation is available for download here ( `Series 5 Slides +<../_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf>`__ ), and the recordings are +available below. + +**Series 5 - PTO-Sim** + + .. raw:: html + + + +.. _webinar6: + +Series 6 - WEC-Sim Controls +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents some examples of how to implement control algorithms for WECs using WEC-Sim. +The presentation is available for download here ( `Series 6 Slides +<../_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf>`__ ), and the recordings are +available below. + +**Series 6 - WEC-Sim Controls** + + .. raw:: html + + + +.. _webinar7: + +Series 7 - Modeling Cables +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section is focused on the Cable Block from WEC-Sim. +The presentation is available for download here ( `Series 7 Slides +<../_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf>`__ ), and the recordings are +available below. + +**Series 7 - Modeling Cables** + + .. raw:: html + + + + +.. _webinar8: + +Series 8 - Using MoorDyn with WEC-Sim +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use MoorDyn with WEC-Sim. +The presentation is available for download here ( `Series 8 Slides +<../_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf>`__ ), and the recordings are +available below. + +**Series 8 - Using MoorDyn with WEC-Sim** + + .. raw:: html + + + +.. Note:: + The above MoorDyn webinar is based on MoorDyn v1 and is in the process of being updated + for MoorDyn v2. Please refer to :ref:`user-advanced-features-mooring` for instruction on + using WEC-Sim with MoorDyn v2. + + +.. _webinar9: + +Series 9 - Modeling OWC Devices +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use model OWC devices using WEC-Sim. +The presentation is available for download here ( `Series 9 Slides +<../_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf>`__ ), and the recordings are +available below. + +**Series 9 - Modeling OWC Devices** + + .. raw:: html + + + + +.. _webinar10: + +Series 10 - Desalination +^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use WEC-Sim to model a desalination application. +The presentation is available for download here ( `Series 10 Slides +<../_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf>`__ ), and the recordings are +available below. + +**Series 10 - Desalination** + + .. raw:: html + + + + +.. _webinar11: + +Series 11 - WEC-Sim Visualization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to post-process results in WEC-Sim. +The presentation is available for download here ( `Series 11 Slides +<../_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf>`__ ), and the recordings are +available below. + +**Series 11 - WEC-Sim Visualization** + + .. raw:: html + + \ No newline at end of file diff --git a/dev/_sources/user/workflow.rst.txt b/dev/_sources/user/workflow.rst.txt new file mode 100644 index 000000000..7dc248f1a --- /dev/null +++ b/dev/_sources/user/workflow.rst.txt @@ -0,0 +1,248 @@ +.. _user-workflow: + +Workflow +======== + +The WEC-Sim workflow diagram below shows a high level view of WEC-Sim's functionality. +As a precursor, a WEC design must be defined in an input file and the Simulink model file. +This input file is read by WEC-Sim which instantiates objects based on parameters defined in the input file. +The objects are used in conjunction with WEC-Sim's Simulink library during the time-domain simulation. +User defined functions serve for easy post-processing and visualization of WEC-Sim's output. +A detailed description of this workflow is provided in the following sections. +For information about the implementation and structure of the WEC-Sim source code, refer to the :ref:`user-code-structure` section. + +.. _user-workflow-chart: + +.. figure:: /_static/images/WEC-Sim_flowChart.png + :width: 500pt + :align: center + + .. + + *WEC-Sim Workflow Diagram* + +.. _user-workflow-input-files: + +WEC-Sim Case Files +------------------- + +All files required for a WEC-Sim simulation must be contained within a case directory referred to as ``$CASE``. +The case directory can be located anywhere on your computer. +It must include: geometry file(s), hydrodynamic data saved to a ``*.h5`` data structure, a WEC-Sim input file, and a Simulink model of the device. +The table below lists the WEC-Sim case directory structure and required files. + +==================== ====================== ==================== +**File Type** **File Name** **Directory** +Geometry File(s) ``*.stl`` ``$CASE/geometry`` +Hydrodynamic Data ``*.h5`` ``$CASE/hydroData`` +Input File ``wecSimInputFile.m`` ``$CASE`` +Simulink Model ``*.slx`` ``$CASE`` +==================== ====================== ==================== + +.. Note:: + Where ``*`` denotes a user-specified file name. + +Geometry File +^^^^^^^^^^^^^ + +WEC-Sim requires geometry file(s) (``*.stl``) that define each body. +The origin of the geometry file(s) must be at the body's center of gravity. +When running WEC-Sim with linear hydrodynamics, the ``*.stl`` is only used for the Simscape Mechanics Explorer visualization. +However, when running WEC-Sim with nonlinear buoyancy and Froude-Krylov forces the STL mesh determines the instantaneous wetted surface at each time step. +In this nonlinear case, the quality of the STL mesh is critical, refer to the :ref:`user-advanced-features-nonlinear` section for more information. + +Hydrodynamic Data +^^^^^^^^^^^^^^^^^ + +Hydrodynamic data for each body may be generated using a boundary element method (BEM) software. +WEC-Sim requires hydrodynamic data from a BEM solution in the form of a HDF5 file (``*.h5``). +This ``*.h5`` hydrodynamic data file can be generated using the BEMIO pre-processor. +BEMIO (Boundary Element Method Input/Output) is a pre-processing software developed by the WEC-Sim team to parse BEM output files from WAMIT, NEMOH, Aqwa, and Capytaine into a data structure, saved as a ``*.h5`` file, that can be read by WEC-Sim. +For more information about the BEMIO pre-processor, refer to the :ref:`user-advanced-features-bemio` section. + +Input File +^^^^^^^^^^ + +A WEC-Sim input file (``wecSimInputFile.m``) is required. +The input file **MUST** be named ``wecSimInputFile.m`` and placed within the case directory. +WEC-Sim uses `object orientated programming `__ to describe components of the WEC model; +the main structure of the input file consists of initializing the WEC-Sim objects and defining properties for each object. +The input file requires initialization and definition of the simulation and wave classes, at least one instance of the body class, and at least one instance of the constraint or PTO classes. +For details about WEC-Sim's classes and available properties for each, refer to the :ref:`user-code-structure-classes` section. + +The WEC-Sim input file (``wecSimInputFile.m``) for the OSWEC example (``WEC-Sim/examples/OSWEC/``) is shown below. +WEC-Sim is an object oriented code and the input file reflects this by instantiating the WEC-Sim classes to create objects that are tied to the Simulink library. +The OSWEC input file initializes and defines properties for the simulation, body, constraint and pto classes. + + +.. literalinclude:: ../../tutorials/OSWEC/OSWEC_wecSimInputFile.m + :language: matlab + +Additional examples are provided in the :ref:`user-tutorials` section. + +Simulink Model +^^^^^^^^^^^^^^ + +In addition to an input file, WEC-Sim requires a Simulink model file (``*.slx``). +This Simulink model is defined using the WEC-Sim library blocks. +WEC-Sim's library blocks are based on Simscape Multibody, refer to `Simscape Multibody documentation `_ for more information. + +WEC-Sim library blocks contain masks that activate relevant parameters, based on the conditions specified in the ``wecSimInputFile.m``. +The top level of the Simulink model contains Simscape physical signals that pass information between blocks in order to solve the relevant equations of motion. + +An example Simulink model file for the OSWEC is shown below. +For more information about the OSWEC, and how to build WEC-Sim Simulink models, refer to the :ref:`user-tutorials` section. + +.. figure:: /_static/images/OSWEC_Model.png + :width: 200pt + :align: center + +.. _user-workflow-running-wec-sim: + +Running WEC-Sim +--------------- + +This section provides a description of the steps to run the WEC-Sim code. Refer +to the :ref:`WEC-Sim Workflow Diagram ` while following +the steps to run WEC-Sim. + +Step 1: Pre-Processing +^^^^^^^^^^^^^^^^^^^^^^ + +In the pre-processing step, users need to create the WEC geometry, and run a +BEM code to calculate the hydrodynamic coefficients. + +* **Create WEC Geometry**: + + * Create CAD models of the WEC geometry and export it to a ``*.stl`` format. + * The ``*.stl`` files are used to visualize the WEC response in Simscape + Explorer + * They are also used for :ref:`user-advanced-features-nonlinear` forces if + the option is enabled. + +* **Compute Hydrodynamic Coefficients**: WEC-Sim requires frequency-domain + hydrodynamic coefficients (e.g. added mass, radiation damping, and wave + excitation). + + * The coefficients for each body may be generated using a boundary element + method (BEM) code (e.g., **WAMIT**, **NEMOH**, **Aqwa**, or **Capytaine**). + * WEC-Sim requires that all hydrodynamic coefficients must be specified at + **the center of gravity** for each body. + +Step 2: Generate Hydrodata File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this step, users run :ref:`BEMIO` to convert +the hydrodynamic coefficients from their BEM solution into the ``*.h5`` format +for WEC-Sim to read: + +* **Run BEMIO**: to generate ``*.h5`` Hydrodynamic Coefficients for WEC-Sim + + * The hydrodynamic coefficients for each body generated from the BEM code + can be parsed into a ``*.h5`` data structure using + :ref:`BEMIO`, which was developed by the + WEC-Sim team. + * BEMIO currently supports WAMIT, NEMOH, Aqwa, and Capytaine. + +.. Note:: + * **If WAMIT is used:** + + * The origin of the body coordinate system (XBODY, defined in ``*.pot``) + as well as the mesh for each body must be at the center of gravity. + * The WAMIT mesh (``*.gdf``) can be generated using + `Rhino `_ or + `MultiSurf `_. + * More details on WAMIT setup are given in the + `WAMIT User Manual `_. + + * **If NEMOH is used:** + + * The origin of the mesh for each body (``*.dat``) is located at the mean + water surface. + * The location to output the hydrodynamic coefficients for each degree of + freedom is defined in the ``Nemoh.cal`` file. + * Please refer to `NEMOH-Mesh `_ + webpage for more mesh generation details. + * The NEMOH Mesh.exe code creates the ``Hydrostatics.dat`` and ``KH.dat`` + files (among other files) for one input body at a time. For the + readNEMOH function to work correctly in the case of a multiple body + system, the user must manually rename ``Hydrostatics.dat`` and + ``KH.dat`` files to ``Hydrostatics_0.dat``, ``Hydrostatics_1.dat``, …, + and ``KH_0.dat``, ``KH_1.dat``,…, corresponding to the body order + specified in the ``Nemoh.cal`` file. + * More details on NEMOH setup are given in the + `Nemoh Homepage `_. + + * **If Aqwa is used:** + + * The origin of the global coordinate system is at the mean water + surface, and the origin of the body coordinate system for each body + must be at the center of gravity (defined using the Aqwa GUI or in + the ``*.dat`` input file). + * In order to run BEMIO, Aqwa users must output both the default + ``*.LIS`` file and output the ``*.AH1`` hydrodynamic database file. + Both of these files are reacquired to run BEMIO. + * More details on Aqwa setup are given in the Aqwa Reference Manual. + + * **If Capytaine is used:** + + * The origin of the mesh for each body (``*.dat``) is located at the mean + water surface. + * More details on Capytaine setup are given in the `Capytaine webpage `_. + +.. Note:: + + Users are also able to specify their own hydrodynamic coefficients by + creating their own ``*.h5`` file with customized hydrodynamic coefficients + following the ``*.h5`` format created by BEMIO. + +.. Note:: + + We recommend installing HDFview https://www.hdfgroup.org/downloads/hdfview/ + to view the ``*.h5`` files generated by BEMIO. + +Step 3: Build Simulink Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this step, users build their WEC-Sim Simulink model (``*.slx``) using the +:ref:`user-code-structure-library` developed in Simulink/Simscape. The +``*.slx`` Simulink model file must be located in the ``$CASE`` directory. The +figure below shows an example WEC-Sim Simulink model for the OSWEC tutorial. + +.. figure:: /_static/images/OSWEC_Model.png + :width: 200pt + :align: center + +Step 4: Write wecSimInputFile.m +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The WEC-Sim input file must be located in the ``$CASE`` directory, and named +``wecSimInputFile.m``. The figure below shows an example of a WEC-Sim input +file. The input file specifies the simulation settings, body mass properties, +wave conditions, joints, and mooring. Additionally, the WEC-Sim input file must +specify the location of the WEC-Sim Simulink model (``*.slx``) file, the +geometry file(s) ``*.stl``, and the hydrodynamic data file (``*.h5``) . + + +Step 5: Run WEC-Sim +^^^^^^^^^^^^^^^^^^^ + +Lastly, WEC-Sim can be executed from the ``$CASE`` directory by typing ``wecSim`` from the Command Window: + +.. code-block:: matlabsession + + >> wecSim + +Refer to :ref:`user-tutorials-examples` for more details on how to run the examples. +Users may also run WEC-Sim from Simulink, or use the commands ``wecSimMCR``, +``wecSimPCT``, and ``wecSimFcn`` as described in the advanced features +sections :ref:`user-advanced-features-simulink`, +:ref:`user-advanced-features-mcr`, :ref:`user-advanced-features-pct`, +and :ref:`user-advanced-features-fcn`. + +.. Note:: The WEC-Sim source code is located in the ``$WECSIM`` directory, but + WEC-Sim must be executed from the ``$CASE`` directory. + The MATLAB path must include the WEC-Sim source directory. + + + diff --git a/dev/_static/_sphinx_javascript_frameworks_compat.js b/dev/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/dev/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/dev/_static/basic.css b/dev/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/dev/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/dev/_static/css/badge_only.css b/dev/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/dev/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/dev/_static/css/custom.css b/dev/_static/css/custom.css new file mode 100644 index 000000000..c981e54cd --- /dev/null +++ b/dev/_static/css/custom.css @@ -0,0 +1,17 @@ + +.math { + text-align: center; +} +.eqno { + float: right; +} + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; +} + +.wy-table-responsive { + margin-bottom: 24px; + max-width: 100%; + overflow: visible; +} diff --git a/dev/_static/css/fonts/Roboto-Slab-Bold.woff b/dev/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/dev/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/dev/_static/css/fonts/Roboto-Slab-Bold.woff2 b/dev/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/dev/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/dev/_static/css/fonts/Roboto-Slab-Regular.woff b/dev/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/dev/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/dev/_static/css/fonts/Roboto-Slab-Regular.woff2 b/dev/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/dev/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/dev/_static/css/fonts/fontawesome-webfont.eot b/dev/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/dev/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/dev/_static/css/fonts/fontawesome-webfont.svg b/dev/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/dev/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/_static/css/fonts/fontawesome-webfont.ttf b/dev/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/dev/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/dev/_static/css/fonts/fontawesome-webfont.woff b/dev/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/dev/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/dev/_static/css/fonts/fontawesome-webfont.woff2 b/dev/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/dev/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/dev/_static/css/fonts/lato-bold-italic.woff b/dev/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/dev/_static/css/fonts/lato-bold-italic.woff differ diff --git a/dev/_static/css/fonts/lato-bold-italic.woff2 b/dev/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/dev/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/dev/_static/css/fonts/lato-bold.woff b/dev/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/dev/_static/css/fonts/lato-bold.woff differ diff --git a/dev/_static/css/fonts/lato-bold.woff2 b/dev/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/dev/_static/css/fonts/lato-bold.woff2 differ diff --git a/dev/_static/css/fonts/lato-normal-italic.woff b/dev/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/dev/_static/css/fonts/lato-normal-italic.woff differ diff --git a/dev/_static/css/fonts/lato-normal-italic.woff2 b/dev/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/dev/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/dev/_static/css/fonts/lato-normal.woff b/dev/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/dev/_static/css/fonts/lato-normal.woff differ diff --git a/dev/_static/css/fonts/lato-normal.woff2 b/dev/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/dev/_static/css/fonts/lato-normal.woff2 differ diff --git a/dev/_static/css/theme.css b/dev/_static/css/theme.css new file mode 100644 index 000000000..6843d97b7 --- /dev/null +++ b/dev/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/dev/_static/doctools.js b/dev/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/dev/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/dev/_static/documentation_options.js b/dev/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/dev/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/dev/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf b/dev/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf new file mode 100644 index 000000000..8f361c776 Binary files /dev/null and b/dev/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf differ diff --git a/dev/_static/downloads/1_WEC-Sim_Overview.pdf b/dev/_static/downloads/1_WEC-Sim_Overview.pdf new file mode 100644 index 000000000..b38869564 Binary files /dev/null and b/dev/_static/downloads/1_WEC-Sim_Overview.pdf differ diff --git a/dev/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf b/dev/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf new file mode 100644 index 000000000..d73ec4b70 Binary files /dev/null and b/dev/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf differ diff --git a/dev/_static/downloads/3_WEC-Sim_Installation.pdf b/dev/_static/downloads/3_WEC-Sim_Installation.pdf new file mode 100644 index 000000000..e27d7c7c2 Binary files /dev/null and b/dev/_static/downloads/3_WEC-Sim_Installation.pdf differ diff --git a/dev/_static/downloads/4_WEC-Sim_CodeStructure.pdf b/dev/_static/downloads/4_WEC-Sim_CodeStructure.pdf new file mode 100644 index 000000000..fa8abcf20 Binary files /dev/null and b/dev/_static/downloads/4_WEC-Sim_CodeStructure.pdf differ diff --git a/dev/_static/downloads/5_WEC-Sim_BEMIO.pdf b/dev/_static/downloads/5_WEC-Sim_BEMIO.pdf new file mode 100644 index 000000000..9f40bfe62 Binary files /dev/null and b/dev/_static/downloads/5_WEC-Sim_BEMIO.pdf differ diff --git a/dev/_static/downloads/6_WEC-Sim_WaveClass.pdf b/dev/_static/downloads/6_WEC-Sim_WaveClass.pdf new file mode 100644 index 000000000..fff55d9e0 Binary files /dev/null and b/dev/_static/downloads/6_WEC-Sim_WaveClass.pdf differ diff --git a/dev/_static/downloads/7 WEC-Sim_BodyClass.pdf b/dev/_static/downloads/7 WEC-Sim_BodyClass.pdf new file mode 100644 index 000000000..506a55fc7 Binary files /dev/null and b/dev/_static/downloads/7 WEC-Sim_BodyClass.pdf differ diff --git a/dev/_static/downloads/8_WEC-Sim_Tutorial.pdf b/dev/_static/downloads/8_WEC-Sim_Tutorial.pdf new file mode 100644 index 000000000..25a33e14e Binary files /dev/null and b/dev/_static/downloads/8_WEC-Sim_Tutorial.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_BodyImplementation.pdf b/dev/_static/downloads/WEC-Sim_BodyImplementation.pdf new file mode 100644 index 000000000..8eb08a4e5 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_BodyImplementation.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_CodeStructure.pdf b/dev/_static/downloads/WEC-Sim_CodeStructure.pdf new file mode 100644 index 000000000..f329301a8 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_CodeStructure.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Overview.pdf b/dev/_static/downloads/WEC-Sim_Overview.pdf new file mode 100644 index 000000000..e35fac69d Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Overview.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Theory&Workflow.pdf b/dev/_static/downloads/WEC-Sim_Theory&Workflow.pdf new file mode 100644 index 000000000..1c3bb1982 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Theory&Workflow.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_WaveImplementation.pdf b/dev/_static/downloads/WEC-Sim_WaveImplementation.pdf new file mode 100644 index 000000000..a92fc1eba Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_WaveImplementation.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Webinar1.pdf b/dev/_static/downloads/WEC-Sim_Webinar1.pdf new file mode 100644 index 000000000..ca3679010 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Webinar1.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Webinar2.pdf b/dev/_static/downloads/WEC-Sim_Webinar2.pdf new file mode 100644 index 000000000..9989bc58f Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Webinar2.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Webinar3.pdf b/dev/_static/downloads/WEC-Sim_Webinar3.pdf new file mode 100644 index 000000000..a9d325db0 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Webinar3.pdf differ diff --git a/dev/_static/downloads/WEC-Sim_Webinar4.pdf b/dev/_static/downloads/WEC-Sim_Webinar4.pdf new file mode 100644 index 000000000..ff69c70a7 Binary files /dev/null and b/dev/_static/downloads/WEC-Sim_Webinar4.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf b/dev/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf new file mode 100644 index 000000000..51d541891 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf b/dev/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf new file mode 100644 index 000000000..e626fd079 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf b/dev/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf new file mode 100644 index 000000000..aedd873f6 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf b/dev/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf new file mode 100644 index 000000000..ac700af9e Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf b/dev/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf new file mode 100644 index 000000000..257050de6 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf b/dev/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf new file mode 100644 index 000000000..777401ac7 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf b/dev/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf new file mode 100644 index 000000000..d4f516fcd Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf b/dev/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf new file mode 100644 index 000000000..810892e31 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf b/dev/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf new file mode 100644 index 000000000..6a7bb4579 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf b/dev/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf new file mode 100644 index 000000000..b9acfded3 Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf differ diff --git a/dev/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf b/dev/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf new file mode 100644 index 000000000..fde22c86b Binary files /dev/null and b/dev/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf differ diff --git a/dev/_static/file.png b/dev/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/dev/_static/file.png differ diff --git a/dev/_static/fonts/Lato/lato-bold.eot b/dev/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bold.eot differ diff --git a/dev/_static/fonts/Lato/lato-bold.ttf b/dev/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bold.ttf differ diff --git a/dev/_static/fonts/Lato/lato-bold.woff b/dev/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bold.woff differ diff --git a/dev/_static/fonts/Lato/lato-bold.woff2 b/dev/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/dev/_static/fonts/Lato/lato-bolditalic.eot b/dev/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/dev/_static/fonts/Lato/lato-bolditalic.ttf b/dev/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/dev/_static/fonts/Lato/lato-bolditalic.woff b/dev/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/dev/_static/fonts/Lato/lato-bolditalic.woff2 b/dev/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/dev/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/dev/_static/fonts/Lato/lato-italic.eot b/dev/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/dev/_static/fonts/Lato/lato-italic.eot differ diff --git a/dev/_static/fonts/Lato/lato-italic.ttf b/dev/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-italic.ttf differ diff --git a/dev/_static/fonts/Lato/lato-italic.woff b/dev/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-italic.woff differ diff --git a/dev/_static/fonts/Lato/lato-italic.woff2 b/dev/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/dev/_static/fonts/Lato/lato-regular.eot b/dev/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/dev/_static/fonts/Lato/lato-regular.eot differ diff --git a/dev/_static/fonts/Lato/lato-regular.ttf b/dev/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/dev/_static/fonts/Lato/lato-regular.ttf differ diff --git a/dev/_static/fonts/Lato/lato-regular.woff b/dev/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-regular.woff differ diff --git a/dev/_static/fonts/Lato/lato-regular.woff2 b/dev/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/dev/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/dev/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/dev/_static/images/AdjustableRodHPTO.png b/dev/_static/images/AdjustableRodHPTO.png new file mode 100644 index 000000000..0eb091104 Binary files /dev/null and b/dev/_static/images/AdjustableRodHPTO.png differ diff --git a/dev/_static/images/DirectDrivePorts.png b/dev/_static/images/DirectDrivePorts.png new file mode 100644 index 000000000..6f71673be Binary files /dev/null and b/dev/_static/images/DirectDrivePorts.png differ diff --git a/dev/_static/images/GeneratorSpeedControl.png b/dev/_static/images/GeneratorSpeedControl.png new file mode 100644 index 000000000..82047be13 Binary files /dev/null and b/dev/_static/images/GeneratorSpeedControl.png differ diff --git a/dev/_static/images/HYDPHYMODEL.PNG b/dev/_static/images/HYDPHYMODEL.PNG new file mode 100644 index 000000000..4517f4bea Binary files /dev/null and b/dev/_static/images/HYDPHYMODEL.PNG differ diff --git a/dev/_static/images/HorizontalVerticalOrbitalVelocity.jpg b/dev/_static/images/HorizontalVerticalOrbitalVelocity.jpg new file mode 100644 index 000000000..a2ffc5652 Binary files /dev/null and b/dev/_static/images/HorizontalVerticalOrbitalVelocity.jpg differ diff --git a/dev/_static/images/MECHANICALPTO.PNG b/dev/_static/images/MECHANICALPTO.PNG new file mode 100644 index 000000000..7a14f728f Binary files /dev/null and b/dev/_static/images/MECHANICALPTO.PNG differ diff --git a/dev/_static/images/MagAngleOrbitalVelocity.jpg b/dev/_static/images/MagAngleOrbitalVelocity.jpg new file mode 100644 index 000000000..8e7814ef1 Binary files /dev/null and b/dev/_static/images/MagAngleOrbitalVelocity.jpg differ diff --git a/dev/_static/images/MoorDyn_Graphic.png b/dev/_static/images/MoorDyn_Graphic.png new file mode 100644 index 000000000..7db247629 Binary files /dev/null and b/dev/_static/images/MoorDyn_Graphic.png differ diff --git a/dev/_static/images/MotionConversionLib.png b/dev/_static/images/MotionConversionLib.png new file mode 100644 index 000000000..75ca70259 Binary files /dev/null and b/dev/_static/images/MotionConversionLib.png differ diff --git a/dev/_static/images/Nwave.png b/dev/_static/images/Nwave.png new file mode 100644 index 000000000..52ef4f2b4 Binary files /dev/null and b/dev/_static/images/Nwave.png differ diff --git a/dev/_static/images/OSWECPHYMODEL.PNG b/dev/_static/images/OSWECPHYMODEL.PNG new file mode 100644 index 000000000..101bff6bf Binary files /dev/null and b/dev/_static/images/OSWECPHYMODEL.PNG differ diff --git a/dev/_static/images/OSWECPTOSimExample.png b/dev/_static/images/OSWECPTOSimExample.png new file mode 100644 index 000000000..300361cf0 Binary files /dev/null and b/dev/_static/images/OSWECPTOSimExample.png differ diff --git a/dev/_static/images/OSWEC_Geom.png b/dev/_static/images/OSWEC_Geom.png new file mode 100644 index 000000000..15a94455e Binary files /dev/null and b/dev/_static/images/OSWEC_Geom.png differ diff --git a/dev/_static/images/OSWEC_Model.png b/dev/_static/images/OSWEC_Model.png new file mode 100644 index 000000000..ed4b95a85 Binary files /dev/null and b/dev/_static/images/OSWEC_Model.png differ diff --git a/dev/_static/images/OSWEC_WECSim.JPG b/dev/_static/images/OSWEC_WECSim.JPG new file mode 100644 index 000000000..2a8ba5797 Binary files /dev/null and b/dev/_static/images/OSWEC_WECSim.JPG differ diff --git a/dev/_static/images/OSWEC_WECSim_Body.jpg b/dev/_static/images/OSWEC_WECSim_Body.jpg new file mode 100644 index 000000000..97165ee5e Binary files /dev/null and b/dev/_static/images/OSWEC_WECSim_Body.jpg differ diff --git a/dev/_static/images/OSWEC_WECSim_GUI.jpg b/dev/_static/images/OSWEC_WECSim_GUI.jpg new file mode 100644 index 000000000..084edab6c Binary files /dev/null and b/dev/_static/images/OSWEC_WECSim_GUI.jpg differ diff --git a/dev/_static/images/OSWEC_WECSim_GlobalRef.jpg b/dev/_static/images/OSWEC_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..5a354f2c3 Binary files /dev/null and b/dev/_static/images/OSWEC_WECSim_GlobalRef.jpg differ diff --git a/dev/_static/images/OSWEC_heaveForces.PNG b/dev/_static/images/OSWEC_heaveForces.PNG new file mode 100644 index 000000000..e7a120cc9 Binary files /dev/null and b/dev/_static/images/OSWEC_heaveForces.PNG differ diff --git a/dev/_static/images/OSWEC_pitchResponse.PNG b/dev/_static/images/OSWEC_pitchResponse.PNG new file mode 100644 index 000000000..0d9e8ea82 Binary files /dev/null and b/dev/_static/images/OSWEC_pitchResponse.PNG differ diff --git a/dev/_static/images/OSWEC_plotEta.PNG b/dev/_static/images/OSWEC_plotEta.PNG new file mode 100644 index 000000000..88abeda03 Binary files /dev/null and b/dev/_static/images/OSWEC_plotEta.PNG differ diff --git a/dev/_static/images/OSWEC_plotSpectrum.PNG b/dev/_static/images/OSWEC_plotSpectrum.PNG new file mode 100644 index 000000000..66bcf5191 Binary files /dev/null and b/dev/_static/images/OSWEC_plotSpectrum.PNG differ diff --git a/dev/_static/images/OSWEC_plotWaves.PNG b/dev/_static/images/OSWEC_plotWaves.PNG new file mode 100644 index 000000000..1e7bff1b4 Binary files /dev/null and b/dev/_static/images/OSWEC_plotWaves.PNG differ diff --git a/dev/_static/images/PTOSIMINPUTFILE.PNG b/dev/_static/images/PTOSIMINPUTFILE.PNG new file mode 100644 index 000000000..fa86352e1 Binary files /dev/null and b/dev/_static/images/PTOSIMINPUTFILE.PNG differ diff --git a/dev/_static/images/PTOSimBlock1.png b/dev/_static/images/PTOSimBlock1.png new file mode 100644 index 000000000..1393f9459 Binary files /dev/null and b/dev/_static/images/PTOSimBlock1.png differ diff --git a/dev/_static/images/PTOSimBlock1OSWEC.png b/dev/_static/images/PTOSimBlock1OSWEC.png new file mode 100644 index 000000000..5d1e82468 Binary files /dev/null and b/dev/_static/images/PTOSimBlock1OSWEC.png differ diff --git a/dev/_static/images/PTOSimClass_diagram.png b/dev/_static/images/PTOSimClass_diagram.png new file mode 100644 index 000000000..63cd19085 Binary files /dev/null and b/dev/_static/images/PTOSimClass_diagram.png differ diff --git a/dev/_static/images/Physics.png b/dev/_static/images/Physics.png new file mode 100644 index 000000000..0100030f2 Binary files /dev/null and b/dev/_static/images/Physics.png differ diff --git a/dev/_static/images/RM3_Geom.png b/dev/_static/images/RM3_Geom.png new file mode 100644 index 000000000..1de3a4352 Binary files /dev/null and b/dev/_static/images/RM3_Geom.png differ diff --git a/dev/_static/images/RM3_WECSim.JPG b/dev/_static/images/RM3_WECSim.JPG new file mode 100644 index 000000000..ab64bcdf7 Binary files /dev/null and b/dev/_static/images/RM3_WECSim.JPG differ diff --git a/dev/_static/images/RM3_WECSim_Body.jpg b/dev/_static/images/RM3_WECSim_Body.jpg new file mode 100644 index 000000000..fae29f724 Binary files /dev/null and b/dev/_static/images/RM3_WECSim_Body.jpg differ diff --git a/dev/_static/images/RM3_WECSim_GUI.JPG b/dev/_static/images/RM3_WECSim_GUI.JPG new file mode 100644 index 000000000..547dfc6d5 Binary files /dev/null and b/dev/_static/images/RM3_WECSim_GUI.JPG differ diff --git a/dev/_static/images/RM3_WECSim_GlobalRef.jpg b/dev/_static/images/RM3_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..6e2d92413 Binary files /dev/null and b/dev/_static/images/RM3_WECSim_GlobalRef.jpg differ diff --git a/dev/_static/images/RM3_vizMarker.jpg b/dev/_static/images/RM3_vizMarker.jpg new file mode 100644 index 000000000..e5f3ef8d6 Binary files /dev/null and b/dev/_static/images/RM3_vizMarker.jpg differ diff --git a/dev/_static/images/RM3withPTOSimBlocks.png b/dev/_static/images/RM3withPTOSimBlocks.png new file mode 100644 index 000000000..e614f7fc4 Binary files /dev/null and b/dev/_static/images/RM3withPTOSimBlocks.png differ diff --git a/dev/_static/images/SliderandCrankMechanism.png b/dev/_static/images/SliderandCrankMechanism.png new file mode 100644 index 000000000..e40f9e69e Binary files /dev/null and b/dev/_static/images/SliderandCrankMechanism.png differ diff --git a/dev/_static/images/WEC-Sim_Lib.PNG b/dev/_static/images/WEC-Sim_Lib.PNG new file mode 100644 index 000000000..350ce8ccc Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_PTOSim.png b/dev/_static/images/WEC-Sim_Lib_PTOSim.png new file mode 100644 index 000000000..90b75bb6f Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_PTOSim.png differ diff --git a/dev/_static/images/WEC-Sim_Lib_bodies.PNG b/dev/_static/images/WEC-Sim_Lib_bodies.PNG new file mode 100644 index 000000000..d97c1fdc5 Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_bodies.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_cable.PNG b/dev/_static/images/WEC-Sim_Lib_cable.PNG new file mode 100644 index 000000000..591a3aa1f Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_cable.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_constraints.PNG b/dev/_static/images/WEC-Sim_Lib_constraints.PNG new file mode 100644 index 000000000..beea4c8a4 Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_constraints.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_frames.PNG b/dev/_static/images/WEC-Sim_Lib_frames.PNG new file mode 100644 index 000000000..0ccd6a7bc Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_frames.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_mooring.PNG b/dev/_static/images/WEC-Sim_Lib_mooring.PNG new file mode 100644 index 000000000..95f9a9462 Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_mooring.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_pto.PNG b/dev/_static/images/WEC-Sim_Lib_pto.PNG new file mode 100644 index 000000000..b430fe8a5 Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_pto.PNG differ diff --git a/dev/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG b/dev/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG new file mode 100644 index 000000000..386a6ddb5 Binary files /dev/null and b/dev/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG differ diff --git a/dev/_static/images/WEC-Sim_flowChart.png b/dev/_static/images/WEC-Sim_flowChart.png new file mode 100644 index 000000000..ed0b95b60 Binary files /dev/null and b/dev/_static/images/WEC-Sim_flowChart.png differ diff --git a/dev/_static/images/WECCCOMP_PTO_Extension.png b/dev/_static/images/WECCCOMP_PTO_Extension.png new file mode 100644 index 000000000..9ed26f563 Binary files /dev/null and b/dev/_static/images/WECCCOMP_PTO_Extension.png differ diff --git a/dev/_static/images/WECSimMoorDyn.png b/dev/_static/images/WECSimMoorDyn.png new file mode 100644 index 000000000..17d54eaeb Binary files /dev/null and b/dev/_static/images/WECSimMoorDyn.png differ diff --git a/dev/_static/images/codeFeatures.png b/dev/_static/images/codeFeatures.png new file mode 100644 index 000000000..0624a15aa Binary files /dev/null and b/dev/_static/images/codeFeatures.png differ diff --git a/dev/_static/images/code_structure/PTOSimClass_diagram.png b/dev/_static/images/code_structure/PTOSimClass_diagram.png new file mode 100644 index 000000000..ecd60f274 Binary files /dev/null and b/dev/_static/images/code_structure/PTOSimClass_diagram.png differ diff --git a/dev/_static/images/code_structure/bemio_diagram.PNG b/dev/_static/images/code_structure/bemio_diagram.PNG new file mode 100644 index 000000000..d15b7a3c5 Binary files /dev/null and b/dev/_static/images/code_structure/bemio_diagram.PNG differ diff --git a/dev/_static/images/code_structure/body_diagram.PNG b/dev/_static/images/code_structure/body_diagram.PNG new file mode 100644 index 000000000..4876850ac Binary files /dev/null and b/dev/_static/images/code_structure/body_diagram.PNG differ diff --git a/dev/_static/images/code_structure/cable_diagram.PNG b/dev/_static/images/code_structure/cable_diagram.PNG new file mode 100644 index 000000000..aaf9d9c0d Binary files /dev/null and b/dev/_static/images/code_structure/cable_diagram.PNG differ diff --git a/dev/_static/images/code_structure/constraint_diagram.PNG b/dev/_static/images/code_structure/constraint_diagram.PNG new file mode 100644 index 000000000..b5aa83cc1 Binary files /dev/null and b/dev/_static/images/code_structure/constraint_diagram.PNG differ diff --git a/dev/_static/images/code_structure/mooring_diagram.PNG b/dev/_static/images/code_structure/mooring_diagram.PNG new file mode 100644 index 000000000..1ba6570fc Binary files /dev/null and b/dev/_static/images/code_structure/mooring_diagram.PNG differ diff --git a/dev/_static/images/code_structure/pto_diagram.PNG b/dev/_static/images/code_structure/pto_diagram.PNG new file mode 100644 index 000000000..bc6cb89f2 Binary files /dev/null and b/dev/_static/images/code_structure/pto_diagram.PNG differ diff --git a/dev/_static/images/code_structure/ptosim_diagram.PNG b/dev/_static/images/code_structure/ptosim_diagram.PNG new file mode 100644 index 000000000..66803ee90 Binary files /dev/null and b/dev/_static/images/code_structure/ptosim_diagram.PNG differ diff --git a/dev/_static/images/code_structure/simulation_diagram.png b/dev/_static/images/code_structure/simulation_diagram.png new file mode 100644 index 000000000..f7e4faf2e Binary files /dev/null and b/dev/_static/images/code_structure/simulation_diagram.png differ diff --git a/dev/_static/images/code_structure/wave_diagram.PNG b/dev/_static/images/code_structure/wave_diagram.PNG new file mode 100644 index 000000000..1b202023b Binary files /dev/null and b/dev/_static/images/code_structure/wave_diagram.PNG differ diff --git a/dev/_static/images/compPerformanceBetweenOption1Option2.png b/dev/_static/images/compPerformanceBetweenOption1Option2.png new file mode 100644 index 000000000..b78ec6d13 Binary files /dev/null and b/dev/_static/images/compPerformanceBetweenOption1Option2.png differ diff --git a/dev/_static/images/coordinateSystem.png b/dev/_static/images/coordinateSystem.png new file mode 100644 index 000000000..e0cf3018a Binary files /dev/null and b/dev/_static/images/coordinateSystem.png differ diff --git a/dev/_static/images/declutchTimeSweep.png b/dev/_static/images/declutchTimeSweep.png new file mode 100644 index 000000000..9fbd26f93 Binary files /dev/null and b/dev/_static/images/declutchTimeSweep.png differ diff --git a/dev/_static/images/declutching.png b/dev/_static/images/declutching.png new file mode 100644 index 000000000..106c326f6 Binary files /dev/null and b/dev/_static/images/declutching.png differ diff --git a/dev/_static/images/dev/library_format.png b/dev/_static/images/dev/library_format.png new file mode 100644 index 000000000..fc183a741 Binary files /dev/null and b/dev/_static/images/dev/library_format.png differ diff --git a/dev/_static/images/dev/mask_dev_body.png b/dev/_static/images/dev/mask_dev_body.png new file mode 100644 index 000000000..9a04dfc51 Binary files /dev/null and b/dev/_static/images/dev/mask_dev_body.png differ diff --git a/dev/_static/images/dev/mask_dev_grf.png b/dev/_static/images/dev/mask_dev_grf.png new file mode 100644 index 000000000..25ca2a742 Binary files /dev/null and b/dev/_static/images/dev/mask_dev_grf.png differ diff --git a/dev/_static/images/dev/mask_user_grf.png b/dev/_static/images/dev/mask_user_grf.png new file mode 100644 index 000000000..ef40295c5 Binary files /dev/null and b/dev/_static/images/dev/mask_user_grf.png differ diff --git a/dev/_static/images/dev/mask_user_grf_waveOptions.png b/dev/_static/images/dev/mask_user_grf_waveOptions.png new file mode 100644 index 000000000..6ab65356d Binary files /dev/null and b/dev/_static/images/dev/mask_user_grf_waveOptions.png differ diff --git a/dev/_static/images/extractMaskVariables.PNG b/dev/_static/images/extractMaskVariables.PNG new file mode 100644 index 000000000..e1ec9d240 Binary files /dev/null and b/dev/_static/images/extractMaskVariables.PNG differ diff --git a/dev/_static/images/hyd_pto_sim.PNG b/dev/_static/images/hyd_pto_sim.PNG new file mode 100644 index 000000000..f97da3763 Binary files /dev/null and b/dev/_static/images/hyd_pto_sim.PNG differ diff --git a/dev/_static/images/impedance.png b/dev/_static/images/impedance.png new file mode 100644 index 000000000..b196202b2 Binary files /dev/null and b/dev/_static/images/impedance.png differ diff --git a/dev/_static/images/latchTimeSweep.png b/dev/_static/images/latchTimeSweep.png new file mode 100644 index 000000000..35a97d5c9 Binary files /dev/null and b/dev/_static/images/latchTimeSweep.png differ diff --git a/dev/_static/images/latching.png b/dev/_static/images/latching.png new file mode 100644 index 000000000..0a14666c4 Binary files /dev/null and b/dev/_static/images/latching.png differ diff --git a/dev/_static/images/moorDynInput.png b/dev/_static/images/moorDynInput.png new file mode 100644 index 000000000..b3baaf681 Binary files /dev/null and b/dev/_static/images/moorDynInput.png differ diff --git a/dev/_static/images/mpcForce.png b/dev/_static/images/mpcForce.png new file mode 100644 index 000000000..e1930456c Binary files /dev/null and b/dev/_static/images/mpcForce.png differ diff --git a/dev/_static/images/mpcForceChange.png b/dev/_static/images/mpcForceChange.png new file mode 100644 index 000000000..dcad50b7b Binary files /dev/null and b/dev/_static/images/mpcForceChange.png differ diff --git a/dev/_static/images/mpcPos.png b/dev/_static/images/mpcPos.png new file mode 100644 index 000000000..a80b4b5d1 Binary files /dev/null and b/dev/_static/images/mpcPos.png differ diff --git a/dev/_static/images/mpcPower.png b/dev/_static/images/mpcPower.png new file mode 100644 index 000000000..dc5a80d48 Binary files /dev/null and b/dev/_static/images/mpcPower.png differ diff --git a/dev/_static/images/mpcSimulink.png b/dev/_static/images/mpcSimulink.png new file mode 100644 index 000000000..8caae4a8b Binary files /dev/null and b/dev/_static/images/mpcSimulink.png differ diff --git a/dev/_static/images/mpcVel.png b/dev/_static/images/mpcVel.png new file mode 100644 index 000000000..c04d46f79 Binary files /dev/null and b/dev/_static/images/mpcVel.png differ diff --git a/dev/_static/images/multiple_accumulators.PNG b/dev/_static/images/multiple_accumulators.PNG new file mode 100644 index 000000000..68e7647bc Binary files /dev/null and b/dev/_static/images/multiple_accumulators.PNG differ diff --git a/dev/_static/images/nonlinearEllipsoid.png b/dev/_static/images/nonlinearEllipsoid.png new file mode 100644 index 000000000..b59779910 Binary files /dev/null and b/dev/_static/images/nonlinearEllipsoid.png differ diff --git a/dev/_static/images/nonlinearMesh.png b/dev/_static/images/nonlinearMesh.png new file mode 100644 index 000000000..cf32d35ac Binary files /dev/null and b/dev/_static/images/nonlinearMesh.png differ diff --git a/dev/_static/images/nonlinearWEC.png b/dev/_static/images/nonlinearWEC.png new file mode 100644 index 000000000..fd4b9622d Binary files /dev/null and b/dev/_static/images/nonlinearWEC.png differ diff --git a/dev/_static/images/oceanCurrentProfiles.png b/dev/_static/images/oceanCurrentProfiles.png new file mode 100644 index 000000000..ea817b8fc Binary files /dev/null and b/dev/_static/images/oceanCurrentProfiles.png differ diff --git a/dev/_static/images/option2Schematic.jpg b/dev/_static/images/option2Schematic.jpg new file mode 100644 index 000000000..6c503c518 Binary files /dev/null and b/dev/_static/images/option2Schematic.jpg differ diff --git a/dev/_static/images/oswec_pto_sim.PNG b/dev/_static/images/oswec_pto_sim.PNG new file mode 100644 index 000000000..d11674c57 Binary files /dev/null and b/dev/_static/images/oswec_pto_sim.PNG differ diff --git a/dev/_static/images/oswec_pto_sim_conn.PNG b/dev/_static/images/oswec_pto_sim_conn.PNG new file mode 100644 index 000000000..0aad3a8f7 Binary files /dev/null and b/dev/_static/images/oswec_pto_sim_conn.PNG differ diff --git a/dev/_static/images/overview/HYDPTOSIMOSWEC.PNG b/dev/_static/images/overview/HYDPTOSIMOSWEC.PNG new file mode 100644 index 000000000..6b632e7fb Binary files /dev/null and b/dev/_static/images/overview/HYDPTOSIMOSWEC.PNG differ diff --git a/dev/_static/images/overview/OSWEC_sim.JPG b/dev/_static/images/overview/OSWEC_sim.JPG new file mode 100644 index 000000000..c486c3309 Binary files /dev/null and b/dev/_static/images/overview/OSWEC_sim.JPG differ diff --git a/dev/_static/images/overview/OSWEC_with_ptosim.png b/dev/_static/images/overview/OSWEC_with_ptosim.png new file mode 100644 index 000000000..5a6c0d754 Binary files /dev/null and b/dev/_static/images/overview/OSWEC_with_ptosim.png differ diff --git a/dev/_static/images/overview/b2b_comparison.png b/dev/_static/images/overview/b2b_comparison.png new file mode 100644 index 000000000..80c164e0f Binary files /dev/null and b/dev/_static/images/overview/b2b_comparison.png differ diff --git a/dev/_static/images/overview/b2b_comparison2.png b/dev/_static/images/overview/b2b_comparison2.png new file mode 100644 index 000000000..e7abc408a Binary files /dev/null and b/dev/_static/images/overview/b2b_comparison2.png differ diff --git a/dev/_static/images/overview/ellipsoid_iso_side.png b/dev/_static/images/overview/ellipsoid_iso_side.png new file mode 100644 index 000000000..e9020ae58 Binary files /dev/null and b/dev/_static/images/overview/ellipsoid_iso_side.png differ diff --git a/dev/_static/images/overview/gbm_iso_side.png b/dev/_static/images/overview/gbm_iso_side.png new file mode 100644 index 000000000..08615f7cf Binary files /dev/null and b/dev/_static/images/overview/gbm_iso_side.png differ diff --git a/dev/_static/images/overview/mcr_powerMatrix.png b/dev/_static/images/overview/mcr_powerMatrix.png new file mode 100644 index 000000000..43b1cd7fa Binary files /dev/null and b/dev/_static/images/overview/mcr_powerMatrix.png differ diff --git a/dev/_static/images/overview/mcr_waveElev-heaveResp.png b/dev/_static/images/overview/mcr_waveElev-heaveResp.png new file mode 100644 index 000000000..be88f3072 Binary files /dev/null and b/dev/_static/images/overview/mcr_waveElev-heaveResp.png differ diff --git a/dev/_static/images/overview/nlhydro_comparison.png b/dev/_static/images/overview/nlhydro_comparison.png new file mode 100644 index 000000000..29114d8ab Binary files /dev/null and b/dev/_static/images/overview/nlhydro_comparison.png differ diff --git a/dev/_static/images/overview/nlhydro_comparison4.png b/dev/_static/images/overview/nlhydro_comparison4.png new file mode 100644 index 000000000..692f5a553 Binary files /dev/null and b/dev/_static/images/overview/nlhydro_comparison4.png differ diff --git a/dev/_static/images/overview/numOpt_comparison.png b/dev/_static/images/overview/numOpt_comparison.png new file mode 100644 index 000000000..5df3e0a9a Binary files /dev/null and b/dev/_static/images/overview/numOpt_comparison.png differ diff --git a/dev/_static/images/overview/oc6_iso_side.png b/dev/_static/images/overview/oc6_iso_side.png new file mode 100644 index 000000000..44d62bd21 Binary files /dev/null and b/dev/_static/images/overview/oc6_iso_side.png differ diff --git a/dev/_static/images/overview/oswec_iso_side.png b/dev/_static/images/overview/oswec_iso_side.png new file mode 100644 index 000000000..5d89477a8 Binary files /dev/null and b/dev/_static/images/overview/oswec_iso_side.png differ diff --git a/dev/_static/images/overview/oswec_ptosim.JPG b/dev/_static/images/overview/oswec_ptosim.JPG new file mode 100644 index 000000000..6fdf33c9b Binary files /dev/null and b/dev/_static/images/overview/oswec_ptosim.JPG differ diff --git a/dev/_static/images/overview/overview_diagram.JPG b/dev/_static/images/overview/overview_diagram.JPG new file mode 100644 index 000000000..5c4a7b583 Binary files /dev/null and b/dev/_static/images/overview/overview_diagram.JPG differ diff --git a/dev/_static/images/overview/passiveYaw_comparison.png b/dev/_static/images/overview/passiveYaw_comparison.png new file mode 100644 index 000000000..313b6cb0d Binary files /dev/null and b/dev/_static/images/overview/passiveYaw_comparison.png differ diff --git a/dev/_static/images/overview/rm3_iso_side.png b/dev/_static/images/overview/rm3_iso_side.png new file mode 100644 index 000000000..916827c65 Binary files /dev/null and b/dev/_static/images/overview/rm3_iso_side.png differ diff --git a/dev/_static/images/overview/sphere_freedecay_iso_side.png b/dev/_static/images/overview/sphere_freedecay_iso_side.png new file mode 100644 index 000000000..ae8cdad1e Binary files /dev/null and b/dev/_static/images/overview/sphere_freedecay_iso_side.png differ diff --git a/dev/_static/images/overview/wecccomp_controller.png b/dev/_static/images/overview/wecccomp_controller.png new file mode 100644 index 000000000..e84a762fc Binary files /dev/null and b/dev/_static/images/overview/wecccomp_controller.png differ diff --git a/dev/_static/images/overview/wecccomp_diagram.png b/dev/_static/images/overview/wecccomp_diagram.png new file mode 100644 index 000000000..6cf6f989c Binary files /dev/null and b/dev/_static/images/overview/wecccomp_diagram.png differ diff --git a/dev/_static/images/overview/wecccomp_iso_side.png b/dev/_static/images/overview/wecccomp_iso_side.png new file mode 100644 index 000000000..50d15a5db Binary files /dev/null and b/dev/_static/images/overview/wecccomp_iso_side.png differ diff --git a/dev/_static/images/overview/wecccomp_simscape_exp.png b/dev/_static/images/overview/wecccomp_simscape_exp.png new file mode 100644 index 000000000..e5a30af19 Binary files /dev/null and b/dev/_static/images/overview/wecccomp_simscape_exp.png differ diff --git a/dev/_static/images/overview/wigley_iso_side.png b/dev/_static/images/overview/wigley_iso_side.png new file mode 100644 index 000000000..d78be89d0 Binary files /dev/null and b/dev/_static/images/overview/wigley_iso_side.png differ diff --git a/dev/_static/images/pGainSweep.png b/dev/_static/images/pGainSweep.png new file mode 100644 index 000000000..9b4f7e138 Binary files /dev/null and b/dev/_static/images/pGainSweep.png differ diff --git a/dev/_static/images/piGainSweep.png b/dev/_static/images/piGainSweep.png new file mode 100644 index 000000000..5a8799328 Binary files /dev/null and b/dev/_static/images/piGainSweep.png differ diff --git a/dev/_static/images/piPTOSimulink.png b/dev/_static/images/piPTOSimulink.png new file mode 100644 index 000000000..ebe0fe78a Binary files /dev/null and b/dev/_static/images/piPTOSimulink.png differ diff --git a/dev/_static/images/pto_sim_lib.png b/dev/_static/images/pto_sim_lib.png new file mode 100644 index 000000000..356b915f5 Binary files /dev/null and b/dev/_static/images/pto_sim_lib.png differ diff --git a/dev/_static/images/pto_sim_lin.PNG b/dev/_static/images/pto_sim_lin.PNG new file mode 100644 index 000000000..ad65ecd67 Binary files /dev/null and b/dev/_static/images/pto_sim_lin.PNG differ diff --git a/dev/_static/images/pto_sim_lin_conn.PNG b/dev/_static/images/pto_sim_lin_conn.PNG new file mode 100644 index 000000000..9a759e3a6 Binary files /dev/null and b/dev/_static/images/pto_sim_lin_conn.PNG differ diff --git a/dev/_static/images/reactiveWithPTOCC.png b/dev/_static/images/reactiveWithPTOCC.png new file mode 100644 index 000000000..05a4fb3c2 Binary files /dev/null and b/dev/_static/images/reactiveWithPTOCC.png differ diff --git a/dev/_static/images/reactiveWithPTOCCPower.png b/dev/_static/images/reactiveWithPTOCCPower.png new file mode 100644 index 000000000..7131b9681 Binary files /dev/null and b/dev/_static/images/reactiveWithPTOCCPower.png differ diff --git a/dev/_static/images/reactiveWithPTOOpt.png b/dev/_static/images/reactiveWithPTOOpt.png new file mode 100644 index 000000000..8d8e6c8c8 Binary files /dev/null and b/dev/_static/images/reactiveWithPTOOpt.png differ diff --git a/dev/_static/images/reactiveWithPTOOptPower.png b/dev/_static/images/reactiveWithPTOOptPower.png new file mode 100644 index 000000000..f07d4e2ff Binary files /dev/null and b/dev/_static/images/reactiveWithPTOOptPower.png differ diff --git a/dev/_static/images/reactiveWithPTOSweep.png b/dev/_static/images/reactiveWithPTOSweep.png new file mode 100644 index 000000000..c53c5a229 Binary files /dev/null and b/dev/_static/images/reactiveWithPTOSweep.png differ diff --git a/dev/_static/images/rectangles.png b/dev/_static/images/rectangles.png new file mode 100644 index 000000000..7607c0406 Binary files /dev/null and b/dev/_static/images/rectangles.png differ diff --git a/dev/_static/images/rm3with_pto_sim.PNG b/dev/_static/images/rm3with_pto_sim.PNG new file mode 100644 index 000000000..155fa28ab Binary files /dev/null and b/dev/_static/images/rm3with_pto_sim.PNG differ diff --git a/dev/_static/images/rotary.PNG b/dev/_static/images/rotary.PNG new file mode 100644 index 000000000..a7953cc94 Binary files /dev/null and b/dev/_static/images/rotary.PNG differ diff --git a/dev/_static/images/rotary_inside.PNG b/dev/_static/images/rotary_inside.PNG new file mode 100644 index 000000000..aac420e92 Binary files /dev/null and b/dev/_static/images/rotary_inside.PNG differ diff --git a/dev/_static/images/rotary_lookup.PNG b/dev/_static/images/rotary_lookup.PNG new file mode 100644 index 000000000..53ec6d51c Binary files /dev/null and b/dev/_static/images/rotary_lookup.PNG differ diff --git a/dev/_static/images/rotational_pto.PNG b/dev/_static/images/rotational_pto.PNG new file mode 100644 index 000000000..c72e11cc9 Binary files /dev/null and b/dev/_static/images/rotational_pto.PNG differ diff --git a/dev/_static/images/translational_pto.PNG b/dev/_static/images/translational_pto.PNG new file mode 100644 index 000000000..8e1686a76 Binary files /dev/null and b/dev/_static/images/translational_pto.PNG differ diff --git a/dev/_static/images/wec_sim_header.png b/dev/_static/images/wec_sim_header.png new file mode 100644 index 000000000..59911a3d5 Binary files /dev/null and b/dev/_static/images/wec_sim_header.png differ diff --git a/dev/_static/jquery.js b/dev/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/dev/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/dev/_static/language_data.js b/dev/_static/language_data.js new file mode 100644 index 000000000..367b8ed81 --- /dev/null +++ b/dev/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/dev/_static/minus.png b/dev/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/dev/_static/minus.png differ diff --git a/dev/_static/plus.png b/dev/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/dev/_static/plus.png differ diff --git a/dev/_static/pygments.css b/dev/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/dev/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/dev/_static/searchtools.js b/dev/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/dev/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/dev/_static/sphinx_highlight.js b/dev/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/dev/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/dev/developer/advanced_features.html b/dev/developer/advanced_features.html new file mode 100644 index 000000000..b36f0cc60 --- /dev/null +++ b/dev/developer/advanced_features.html @@ -0,0 +1,464 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+
+

Added Mass

+
+

Theoretical Implementation

+

Added mass is a special multi-directional fluid dynamic phenomenon that most +physics software cannot account for well. +Modeling difficulties arise because the added mass force is proportional to acceleration. +However most time-domain simulations are attempting to use the calculated forces to determine +a body’s acceleration, which then determines the velocity and position at the next time step. +Solving for acceleration when forces are dependent on acceleration creates an algebraic loop.

+

The most robust solution is to combine the added mass matrix with the rigid body’s mass and inertia, +shown in the manipulation of the governing equation below:

+
+\[\begin{split}M\ddot{X_i} &= \Sigma F(t,\omega) - A\ddot{X_i} \\ +(M+A)\ddot{X_i} &= \Sigma F(t,\omega) \\ +M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega)\end{split}\]
+

where capital \(M\) is the mass matrix, \(A\) is the added mass, and subscript \(i\) represents the timestep being solved for. +In this case, the adjusted body mass matrix is defined as the sum of the translational mass (\(m\)), inertia tensor (\(I\)), and the added mass matrix:

+
+\[\begin{split}M_{adjusted} = \begin{bmatrix} + m + A_{1,1} & A_{1,2} & A_{1,3} & A_{1,4} & A_{1,5} & A_{1,6} \\ + A_{2,1} & m + A_{2,2} & A_{2,3} & A_{2,4} & A_{2,5} & A_{2,6} \\ + A_{3,1} & A_{3,2} & m + A_{3,3} & A_{3,4} & A_{3,5} & A_{3,6} \\ + A_{4,1} & A_{4,2} & A_{4,3} & I_{1,1} + A_{4,4} & -I_{2,1} + A_{4,5} & -I_{3,1} + A_{4,6} \\ + A_{5,1} & A_{5,2} & A_{5,3} & I_{2,1} + A_{5,4} & I_{2,2} + A_{5,5} & -I_{3,2} + A_{5,6} \\ + A_{6,1} & A_{6,2} & A_{6,3} & I_{3,1} + A_{6,4} & I_{3,2} + A_{6,5} & I_{3,3} + A_{6,6} \\ + \end{bmatrix}\end{split}\]
+

This formulation is desirable because it removes the acceleration dependence from the right hand side of the governing equation. +Without this treatment, the acceleration causes an unsolvable algebraic loop. +There are alternative approximations to solve the algebraic loop, but simulation robustness and stability become increasingly difficult.

+

The core issue with this combined mass formulation is that Simscape Multibody, and most other physics software, do not allow a generic body to have a degree-of-freedom specific mass. +For example, a rigid body can’t have one mass for surge motion and another mass for heave motion. +Simscape rigid bodies only have one translational mass, a 1x3 moment of inertia matrix, and 1x3 product of inertia matrix.

+
+
+

WEC-Sim’s Implementation

+

Due to this limitation, WEC-Sim cannot combine the body mass and added mass on the left-hand side of the equation of motion (as shown above). +The algebaric loop can be solved by predicting the acceleration at the current time step, and using that to calculate the added mass force. +But this method can cause numerical instabilities. +Instead, WEC-Sim decreases the added mass force magnitude by moving some components of added mass into the body mass, while a modified added mass force is calculated with the remainder of the added mass coefficients.

+

There is a 1-1 mapping between the body’s inertia tensor and rotational added mass coefficients. +These added mass coefficients are entirely lumped with the body’s inertia. +Additionally, the surge-surge (1,1), sway-sway (2,2), heave-heave (3,3) added mass coefficients correspond to the translational mass of the body, but must be treated identically.

+

WEC-Sim implements this added mass treatment using both a modified added mass matrix and a modified body mass matrix:

+
+\[\begin{split}M\ddot{X_i} &= \Sigma F(t,\omega) - A\ddot{X_i} \\ +(M+dMass)\ddot{X_i} &= \Sigma F(t,\omega) - (A-dMass)\ddot{X_i} \\ +M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega) - A_{adjusted}\ddot{X_i} \\\end{split}\]
+

where \(dMass\) is the change in added mass and defined as:

+
+\[\begin{split}dMass &= \begin{bmatrix} + \alpha Y & 0 & 0 & 0 & 0 & 0 \\ + 0 & \alpha Y & 0 & 0 & 0 & 0 \\ + 0 & 0 & \alpha Y & 0 & 0 & 0 \\ + 0 & 0 & 0 & A_{4,4} & -A_{5,4} & -A_{6,4} \\ + 0 & 0 & 0 & A_{5,4} & A_{5,5} & -A_{6,5} \\ + 0 & 0 & 0 & A_{6,4} & A_{6,5} & A_{6,6} \\ + \end{bmatrix} \\ +Y &= (A_{1,1} + A_{2,2} + A_{3,3}) \\ +\alpha &= body(iBod).adjMassFactor\end{split}\]
+

The resultant definition of the body mass matrix and added mass matrix are then:

+
+\[\begin{split}M &= \begin{bmatrix} + m + \alpha Y & 0 & 0 & 0 & 0 & 0 \\ + 0 & m + \alpha Y & 0 & 0 & 0 & 0 \\ + 0 & 0 & m + \alpha Y & 0 & 0 & 0 \\ + 0 & 0 & 0 & I_{4,4} + A_{4,4} & -(I_{5,4} + A_{5,4}) & -(I_{6,4} + A_{6,4}) \\ + 0 & 0 & 0 & I_{5,4} + A_{5,4} & I_{5,5} + A_{5,5} & -(I_{6,5} + A_{6,5}) \\ + 0 & 0 & 0 & I_{6,4} + A_{6,4} & I_{6,5} + A_{6,5} & I_{6,6} + A_{6,6} \\ + \end{bmatrix} \\ +A_{adjusted} &= \begin{bmatrix} + A_{1,1} - \alpha Y & A_{1,2} & A_{1,3} & A_{1,4} & A_{1,5} & A_{1,6} \\ + A_{2,1} & A_{2,2} - \alpha Y & A_{2,3} & A_{2,4} & A_{2,5} & A_{2,6} \\ + A_{3,1} & A_{3,2} & A_{3,3} - \alpha Y & A_{3,4} & A_{3,5} & A_{3,6} \\ + A_{4,1} & A_{4,2} & A_{4,3} & 0 & A_{4,5} + A_{5,4} & A_{4,6} + A_{6,4} \\ + A_{5,1} & A_{5,2} & A_{5,3} & 0 & 0 & A_{5,6} + A_{6,5} \\ + A_{6,1} & A_{6,2} & A_{6,3} & 0 & 0 & 0 \\ + \end{bmatrix}\end{split}\]
+
+

Note

+

We should see that \(A_{4,5} + A_{5,4} = A_{4,6} + A_{6,4} = A_{5,6} + A_{6,5} = 0\), but there may be numerical differences in the added mass coefficients which are preserved.

+
+

Though the components of added mass and body mass are manipulated in WEC-Sim, the total system is unchanged. +This manipulation does not affect the governing equations of motion, only the implementation.

+

The fraction of translational added mass that is moved into the body mass is determined by body(iBod).adjMassFactor, whose default value is \(2.0\). +Advanced users may change this weighting factor in the wecSimInuptFile to create the most robust simulation possible. +To see its effects, set body(iB).adjMassFactor = 0 and see if simulations become unstable.

+

This manipulation does not move all added mass components. +WEC-Sim still contains an algebraic loop due to the acceleration dependence of the remaining added mass force from \(A_{adjusted}\), and components of the Morison Element force. +WEC-Sim solves the algebraic loop using a Simulink Transport Delay with a very small time delay (1e-8). +This blocks extrapolates the previous acceleration by 1e-8 seconds, which results in a known acceleration for the added mass force. +The small extraplation solves the algebraic loop but prevents large errors that arise when extrapolating the acceleration over an entire time step. +This will convert the algebraic loop equation of motion to a solvable one:

+
+\[\begin{split}M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega) - A_{adjusted}\ddot{X}_{i - (1 + 10^{-8}/dt)} \\\end{split}\]
+
+
+

Working with the Added Mass Implementation

+

WEC-Sim’s added mass implementation should not affect a user’s modeling workflow. +WEC-Sim handles the manipulation and restoration of the mass and forces in the bodyClass functions adjustMassMatrix() called by initializeWecSim and restoreMassMatrix, storeForceAddedMass called by postProcessWecSim. +However viewing body.mass, body.inertia, body,inertiaProducts, body.hydroForce.fAddedMass between calls to initializeWecSim and postProcessWecSim will not show the input file definitions. +Users can get the manipulated mass matrix, added mass coefficients, added mass force and total force from body.hydroForce.storage after the simulation. +However, in the rare case that a user wants to manipulate the added mass force during a simulation, the change in mass, \(dMass\) above, must be taken into account. Refer to how body.calculateForceAddedMass() calculates the entire added mass force in WEC-Sim post-processing.

+
+

Note

+

If applying the method in body.calculateForceAddedMass() during the simulation, the negative of dMass must be taken: \(dMass = -dMass\). This must be accounted for because the definitions of mass, inertia, etc and their stored values are flipped between simulation and post-processing.

+
+
+

Note

+

Depending on the wave formulation used, \(A\) can either be a function of wave frequency \(A(\omega)\), or equal to the added mass at infinite wave frequency \(A_{\infty}\)

+
+
+
+
+

Morison Element

+

As a reminder from the WEC-Sim Theory Manual, the Morison force equation assumes that the fluid forces in an oscillating flow on a structure of slender cylinders or other similar geometries arise partly from pressure effects from potential flow and partly from viscous effects. A slender cylinder implies that the diameter, \(D\), is small relative to the wave length, \(\lambda\), which is generally satisfied when \(D/\lambda<0.1-0.2\). If this condition is not met, wave diffraction effects must be taken into account. Assuming that the geometries are slender, the resulting force can be approximated by a modified Morison formulation for each element on the body.

+
+

Fixed Body

+

For a fixed body in an oscillating flow the force imposed by the fluid is given by:

+
+(1)\[\vec{F}_{ME} = \underbrace{\rho \forall C_{m} \dot{\vec{u}}}_{\text{Inertia}} + \underbrace{\frac{1}{2} \rho A C_{D} \vec{u} | \vec{u} |}_{Drag}\]
+

where \(\vec{F}_{ME}\) is the Morison element hydrodynamic force, \(\rho\) is the fluid density, \(\forall\) is the displaced volume, \(C_{m}\) is the inertia coefficient, \(A\) is the reference area, \(C_{D}\) is the drag coefficient, and \(u\) is the fluid velocity. The inertia coefficient is defined as:

+
+(2)\[C_{m} = 1 + C_{a}\]
+

where \(C_{a}\) is the added mass coefficient. The inertia term is the sum of the Froude- Krylov Force, \(\rho \forall \dot{u}\), and the hydrodynamic mass force, \(\rho C_{a} \forall \dot{u}\). The inertia and drag coefficients are generally obtained experimentally and have been found to be a function of the Reynolds (Re) and Kulegan Carpenter (KC) numbers

+
+(3)\[\text{Re} = \frac{U_{m}D}{\nu}~~\&~~ \text{KC} = \frac{U_{m}T}{D}~~\]
+

where \(U_{m}\) is the maximum fluid velocity, and \(\nu\) is the kinematic viscosity of the fluid, and \(T\) is the period of oscillation. Generally when KC is small then \(\vec{F}\) is dominated by the inertia term when the drag term dominates at high KC numbers. If the fluid velocity is sinusoidal then \(u\) is given by:

+
+(4)\[u(t) = U_{m} \sin \left( \sigma t \right)~~\]
+

where \(\sigma = 2\pi/T\). This can be taking further by considering the body is being is impinged upon by regular waves of the form:

+
+(5)\[\begin{split}\eta(x,t) & = A \cos \left( \sigma t - k \left[ x \cos \theta + y \sin \theta\right] \right) = \Re \left\lbrace -\frac{1}{g}\frac{\partial \phi_{I}}{\partial t} \bigg|_{z=0} \right\rbrace~~, \\ \phi_{I}(x,z,t) & = \Re \left\lbrace \frac{Ag}{\sigma} \frac{\cosh \left(k (z+h) \right)}{\cosh \left( kh \right)} i e^{i(\sigma t-k\left[ x \cos \theta + y \sin \theta\right])} \right\rbrace~~, \\ \sigma^{2} & = gk\tanh\left(kh\right)\end{split}\]
+

where \(\eta\) is the wave elevation, \(\phi_{I}\) is the incident wave potential, \(A\) is the wave amplitude, \(k\) is the wave number (defined as \(k=\frac{2\pi}{\lambda}\) where \(\lambda\) is the wave length), \(g\) is gravitational acceleration, \(h\) is the water depth, \(z\) is the vertical position in the water column, \(\theta\) is the wave heading. The fluid velocity can then be obtained by taking the graident of Eqn. (5) :

+
+(6)\[\begin{split}u (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial x} \right\rbrace = \frac{Agk}{\sigma} \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right) \cos\left(\theta\right)~~,\\ +v (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial y} \right\rbrace = \frac{Agk}{\sigma} \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right)\sin\left(\theta\right)~~,\\ +w (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial z} \right\rbrace = -\frac{Agk}{\sigma} \frac{\sinh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right)~~,\end{split}\]
+

The acceleration of the fluid particles will then be obtained by taking the time derivative of Eqn. (6) :

+
+(7)\[\begin{split}\dot{u} (x,z,t) & = \frac{\partial u}{\partial t} = -Agk \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right) \cos\left(\theta\right)~~,\\ +\dot{v} (x,z,t) & = \frac{\partial v}{\partial t} = -Agk \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right) \sin\left(\theta\right)~~,\\ +\dot{w} (x,z,t) & = \frac{\partial w}{\partial t} = -Agk \frac{\sinh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right)~~,\end{split}\]
+
+../_images/HorizontalVerticalOrbitalVelocity.jpg + +
+

Horizontal and vertical orbital velocity magnitude for a wave period of 10 s and water depth of 50 m with a wave heading of 0 rads.

+
+
+
+../_images/MagAngleOrbitalVelocity.jpg + +
+

Orbital velocity magnitude vectors for a wave period of 10 s and water depth of 50 m with a wave heading of 0 rads.

+
+
+
+
+

Moving Body

+

If the body is allowed to move in an oscillating flow then Eqn. (1) must be adjusted as follows:

+
+(8)\[\vec{F}_{ME} = \rho \forall \dot{\vec{u}} + \rho \forall C_{a} \left( \dot{\vec{u}} - \dot{\vec{U}} \right) + \frac{1}{2}\rho C_{D} A \left( \vec{u} - \vec{U} \right) \left| \vec{u} - \vec{U} \right|~~\]
+

where \(U\) is the body velocity. In the calculations performed by WEC-Sim, it is assumed that the body does not alter the wave field and the fluid velocity and acceleration can be calculated from the incident wave potential as from Eqn. (6) and (7).

+
+

Review of Rigid Body Dynamics

+

A rigid body is an idealization of a solid body in which deformation is neglected. In other words, the distance between any two given points of a rigid body remains constant in time regardless of external forces exerted on it. The position of the whole body is represented by its linear position together with its angular position with a global fixed reference frame. WEC-Sim calculates the position, velocity, and acceleration of the rigid body about its center of gravity; however, the placement of each morrison element will have a different local velocity that affects the fluid force. The relative velocity between point A and point B on a rigid body is given by:

+
+(9)\[\vec{U}_{A} = \vec{U}_{B} + \omega \times r_{BA}~~\]
+

where \(\omega\) is the angular velocity of the body and \(\times\) denotes the cross product. Taking the time derivative of Eqn. (9) provides the relative acceleration:

+
+(10)\[\vec{\dot{U}}_{A} = \vec{\dot{U}}_{B} + \omega \times \omega \times r_{BA} + \dot{\omega} \times r_{BA}~~\]
+
+
+
+

WEC-Sim Implementations

+

As discussed in the WEC-Sim user manual, there are two options to model a Morison element(s) and will be described here in greater detail so potential developers can modify the code to suit their modeling needs.

+
+

Option 1

+

In the first Morison element implementation option, the acceleration and velocity of the fluid flow are estimated at the Morison point of application, which can include both wave and current contributions, and then subtracts the body acceleration and velocity for the individual translational degrees of freedom (x-, y-, and z-components). The fluid flow properties are then used to calculate the Morison element force, indepenently for each degree of freedom, as shown by the following expressions:

+
+(11)\[\begin{split}F_{ME,x} & = \rho \forall \dot{u}_{x} + \rho \forall C_{a,x} \left( \dot{u}_{x} - \dot{U}_{x} \right) + \frac{1}{2}\rho C_{D,x} A_{x} \left( u_{x} - U_{x} \right) \left| u_{x} - U_{x} \right|~~, \\ +F_{ME,y} & = \rho \forall \dot{u}_{y} + \rho \forall C_{a,y} \left( \dot{u}_{y} - \dot{U}_{y} \right) + \frac{1}{2}\rho C_{D,y} A_{y} \left( u_{y} - U_{y} \right) \left| u_{y} - U_{y} \right|~~, \\ +F_{ME,z} & = \rho \forall \dot{u}_{z} + \rho \forall C_{a,z} \left( \dot{u}_{z} - \dot{U}_{z} \right) + \frac{1}{2}\rho C_{D,z} A_{z} \left( u_{z} - U_{z} \right) \left| u_{z} - U_{z} \right|~~, \\ +\vec{M} & = \vec{r} \times \vec{F} = \left[ r_{g,x}, r_{g,y}, r_{g,z} \right] \times \left[ F_{x}, F_{y}, F_{z} \right]\end{split}\]
+

where \(r_{g}\) is the lever arm from the center of gravity of the body to the Morison element point of application. Option 1 provides the most flexibility in setting independent Morison element properties for the x-, y-, and z-directions; however, a limitation arises that the fluid flow magnitude does not consider the other fluid flow components. Depending on the simulation enviroment this approach can provide the same theoretical results as taking the magnitude of the x-, y-, and z-components of the fluid flow, but is case dependent. A comparison between the outputs of Option 1 and Option 2 can be found later in the Developer Manual Morison Element documentation.

+
+
+

Option 2

+

The WEC-Sim Option 1 implementation solves for the of the Morison element force from the individual x-, y-, and z-components of the relative flow velocity and acceleration; however, this results in incorrect outputs at certain orientations of the flow and Morison Element. As opposed to solving for the x-, y-, and z-components of the Morison element force, the force can be calculated relative to the magnitude of the flow and distributed among its unit vector direction. Therefore the approach used in Option 2 is to decompose the fluid and body velocity and acceleration into tangential and normal components of the Morison element, as depicted in Figure Schematic of the water flow vector decomposition reletive to the Morison Element orientation.

+
+../_images/option2Schematic.jpg + +
+

Schematic of the water flow vector decomposition reletive to the Morison Element orientation.

+
+
+

In mathematics, for a given vector at a point on a surface, the vector can be uniquely decomposed into the sum of its tangential and normal components. The tangential component of the vector, \(v_{\parallel}\), is parallel to the surface while the normal component of the vectors, \(v_{\perp}\), is perpendicular to the surface which is used in relation to the central axis to the Morison element. The WEC-Sim input file was altered to consider a tangential and normal component for the drag coefficient [\(C_{d\perp}\) , \(C_{d\parallel}\)] , added mass coefficient [\(C_{a\perp}\) , \(C_{a\parallel}\)], characteristic area [\(A_{\perp}\) , \(A_{\parallel}\)], and the central axis vector of the ME = [ \(\vec{z} = `:math:`z_{x}\) , \(z_{y}\) , \(z_{z}\) ].

+

A general vector, \(\vec{k}\), can be decomposed into the normal component as a projection of vector k on to the central axis z as follows:

+
+(12)\[\vec{k}_{\parallel} = \frac{\vec{z} \cdot \vec{k}}{ || \vec{z} || } \frac{ \vec{z} }{ || \vec{z} || }\]
+

As the vector \(\vec{k}\) is uniquely decomposed into the sum of its tangential and normal components, the normal component can be defined as the difference between the vector \(\vec{k}\) and its tangential component as follows:

+
+(13)\[\vec{k}_{\perp} = \vec{k} - \vec{k}_{\parallel}\]
+

Using this vector multiplication, the tangential and normal components of the fluid flow can be obtained as follows:

+
+(14)\[\begin{split}\vec{u}_{\parallel} = \frac{\vec{z} \cdot \vec{u}}{ || \vec{z} || } \frac{ \vec{z} }{ || \vec{z} || } \\ +\vec{u}_{\perp} = \vec{u}-\vec{u}_{\perp}\end{split}\]
+

The Morison element force equation for a moving body relative to the fluid flow is modified to include the following decomposition of force components and consider the magnitude of the flow:

+
+(15)\[\begin{split}\vec{F}_{ME} = \rho C_{M,\parallel} \forall \left( \dot{\vec{u}}_{\parallel} - \dot{\vec{U}}_{\parallel} \right) + \frac{1}{2}\rho C_{d,\parallel} \left( \vec{v}_{\parallel} - \vec{U}_{\parallel} \right) \lvert \vec{v}_{\parallel} - \vec{U}_{\parallel} \rvert + \\ +\rho C_{M,\perp} \forall \left( \dot{\vec{u}}_{\perp} - \dot{\vec{U}}_{\perp} \right) + \frac{1}{2}\rho C_{d,\perp} \left( \vec{v}_{\perp} - \vec{U}_{\perp} \right) \lvert \vec{v}_{\perp} - \vec{U}_{\perp} \rvert\end{split}\]
+
+
+

Comparison of Performance Between Option 1 and Option 2

+

A simple test case, which defines a Morison element as vertical and stationary relative to horizontal fluid flow, was built to compare the Morison element force calculation between Option 1 and Option 2 within WEC-Sim. Theoretically, the magnitude of the Morison element force should remain constant as the orientation of the flow direction is rotated in the X-Y plane. The MF was calculated as the orientation of the flow was rotated about the z-axis from 1 to 360 degrees where the central axis of the ME is parallel wtih the z-axis. The remaining WEC-Sim input values for the simulation can be found in the following table.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variable Type

Variable Symbol

WEC-Sim Input Values

ME Central Axis

\(\vec{z}\)

[0, 0 , 1]

Fluid flow velocity

\(\vec{U}\)

[-1, 0, 0] \(m/s\)

Fluid flow acceleration

\(\vec{\dot{U}}\)

[-1, 0, 0] \(m/s^{2}\)

Drag Coefficient

\(C_{D}\)

[1, 1, 0]

Mass Coefficient

\(C_{a}\)

[1, 1, 0]

Area

\(A\)

[1, 1, 0]

Density

\(\rho\)

1000 \(kg/m^{3}\)

Displaced Volume

\(\forall\)

0.10 \(m^{3}\)

+
+../_images/compPerformanceBetweenOption1Option2.png + +
+

Graphical representation of the comparison between ME Option 1 and Option 2 within WEC-Sim.

+
+
+

\(F_{ME,1}\) and \(F_{ME,2}\) is the Morison element force output from Option 1 and Option 2 within WEC-Sim, respectively. Shown in the above figure, in Option 1 there is an oscillation in Morison element magnitude with flow direction while Option 2 demonstrates a constant force magnitude at any flow direction. The reason behind this performance is that Option 1 solves for the MF individually using the individual the x-, y-, and z- components of the flow while Option 2 calculates the force relative to the flow magnitude and distributed among the normal and tangential unit vectors of the flow.

+
+
+
+
+

Extract Mask Variables

+

The Simulink variable workspace is inaccesible in the MATLAB workspace by default. +Simulink variables can be imported to the MATLAB workspace using the block handle +of the Simulink block being probed. The block parameters can be used by developers +to programmatically set block parameters by being able to access the unique tags +that Simulink uses for a particular block parameter. This is also useful for the code +initialization of Simulink mask blocks. +The function ExtractMaskVariables() +located in sourcefunctionssimulinkmask, can be used to extract the block +parameters in following steps,

+
    +
  • Open the pertinent Simulink model,

  • +
  • Run the function with the address of the block being probed as the argument,

  • +
  • Explore the mask data structure in the MATLAB workspace.

  • +
+
+../_images/extractMaskVariables.PNG + +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/getting_started.html b/dev/developer/getting_started.html new file mode 100644 index 000000000..526966cda --- /dev/null +++ b/dev/developer/getting_started.html @@ -0,0 +1,183 @@ + + + + + + + + + Getting Started — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Getting Started

+

The WEC-Sim source code is hosted on WEC-Sim’s GitHub repository. +Please fork the WEC-Sim repository if you plan to contribute to the WEC-Sim code. +Forking the repository allows developers to create a personal copy of the WEC-Sim repository that can be edited idependently. +For details on creating and using a fork, refer to GitHub’s forking documentation.

+

Once you have forked the repository on GitHub, add the fork’s remote, and pull the fork into your local directory:

+
>> git remote add <USERNAME> https://github.com/<USERNAME>/WEC-Sim.git
+>> git pull <USERNAME> <branch>
+
+
+

Push local commits to fork on GitHub:

+
>> git push <USERNAME> <branch>
+
+
+

Pull updates from WEC-Sim origin:

+
>> git pull origin <branch>
+
+
+
+

Note

+

This example defines origin as WEC-Sim’s GitHub repository, and <USERNAME> as the developer’s fork. Develoeprs may use whatever convention they prefer, refer to GitHub documentation on configuring remotes

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/index.html b/dev/developer/index.html new file mode 100644 index 000000000..ef982d372 --- /dev/null +++ b/dev/developer/index.html @@ -0,0 +1,188 @@ + + + + + + + + + Developer Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/library.html b/dev/developer/library.html new file mode 100644 index 000000000..0262133c8 --- /dev/null +++ b/dev/developer/library.html @@ -0,0 +1,596 @@ + + + + + + + + + WEC-Sim Library — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

WEC-Sim Library

+

The WEC-Sim Library is in the $WECSIM/source/lib directory, and includes the following files:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Simulink Library

File name

WEC-Sim Library

WECSim_Lib.slx

Frames Sublibrary

WECSim_Lib_Frames.slx

Body Elements Sublibrary

WECSim_Lib_Body_Elements.slx

Constraints Sublibrary

WECSim_Lib_Constraints.slx

PTOs Sublibrary

WECSim_Lib_PTOs.slx

Cables Sublibrary

WECSim_Lib_Cables.slx

Moorings Sublibrary

WECSim_Lib_Moorings.slx

+

GitHub tracks when a change is made to a binary file (e.g. *.slx), but not the specific revisions made. +This makes tracking revisions to the WEC-Sim Library more challenging than revisions to text files (e.g. *.m). +The WEC-Sim Library is saved as a Custom Simulink Library with sublibaries. +To ensure backwards compatibility, a Forwarding Table is used.

+
+

Formatting

+

Please format the color of library blocks according to their function:

+ + + + + + + + + + + + + + + + + + + + + + + + +

Library Function

Color

Input

Green

Output

Red

From Workspace

Yellow

Simulink Function

Orange

Subsystem

Gray

Linked Block

Light Blue

+
+../_images/library_format.png + +
+

WEC-Sim Library blocks with color formatting

+
+
+
+
+

Library Development

+

When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes.

+

In order to modify blocks masks the variable being modified must be accesible to Simulink’s workspace. This can be acheived by running any wecSimInputFile.m script without executing WEC-Sim. Running the wecSimInputFile.m script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim’s class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., bodyClass, waveClass etc.).

+

Simulink then executes each block mask’s initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the wecSimInputFile.m script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library.

+
+

Note

+

This is especially important for the Wave Markers and for B2B

+
+
+ + +
+

MATLAB Merge Tool

+

It is recommended that developers use the MATLAB Merge Tool to compare library versions when there are merge conflicts. +The MATLAB Merge Tool allows users to compare changes directly in Simulink. +The merge tool will open a special Simulink GUI that allows users to compare code versions both textually and within the block diagram. +To use the tool, merge both branches locally and resolve any conflicts using the merge tool.

+

For example, take the branches <dev> and <new_feature> that each contain new WEC-Sim features. +In the Git for Windows command line, these changes can be merged using:

+
# Checkout the <dev> branch and pull the latest
+git checkout <dev>
+git pull <remote>/<dev>
+
+# Merge <new_feature> branch into <dev> branch
+git merge <new_feature>
+
+# Resolve library conflicts using the MATLAB merge tool
+git mergetool -t mlMerge source/lib/WEC-Sim/<library_file>.slx
+
+# Save desired revisions, then add and commit changes
+git add source/lib/WEC-Sim/<library_file>.slx
+git commit -m 'merge <dev> with <new_feature>'
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/overview.html b/dev/developer/overview.html new file mode 100644 index 000000000..187105fd7 --- /dev/null +++ b/dev/developer/overview.html @@ -0,0 +1,167 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

The WEC-Sim development team is currently engaged in continuous code development and support. +Efforts are made by the development team to improve the code’s flexibility, accuracy, and usability. +The Getting Started section describes the development team’s workflow for anyone who wishes to submit new WEC-Sim features for inclusion in future WEC-Sim releases. +The developer manual also documents specific WEC-Sim features that are especially relevant to WEC-Sim development. +It is intended as a reference for members of the (internal and external) development team when adding new features.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/pull_requests.html b/dev/developer/pull_requests.html new file mode 100644 index 000000000..f8618d5e3 --- /dev/null +++ b/dev/developer/pull_requests.html @@ -0,0 +1,181 @@ + + + + + + + + + Pull Requests — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Pull Requests

+

A stable version of WEC-Sim is maintained on the WEC-Sim main branch, and WEC-Sim releases are tagged on GitHub. +WEC-Sim development is performed on WEC-Sim dev branch using a fork-based workflow. +New WEC-Sim features are developed on forks of the WEC-Sim repository, and pull-requests are submitted to merge new features from a development fork into the main WEC-Sim repository. +Pull-requests for new WEC-Sim features should be submitted to the WEC-Sim dev branch. +The only exception to this workflow is for bug fixes; pull-request for bug fixes should be should submitted to the WEC-Sim main branch. +When a new version of WEC-Sim is released, the dev branch is pulled into main where all changes are incorporated into the code.

+

A pull request (PR) should focus on one update at a time. +This ensures that PR revisions are easily tracked, and keeps the repository history remains clean. +If working on multiple updates, please use different branches, and submit separate pull requests. +Once a PR is merged please delete legacy branches to keep your fork clean.

+

Prior to submitting a pull request, pull the latest commits from the WEC-Sim repository, resolve any merge conflicts, and commit revisions to your fork:

+
>> git pull origin <branch>
+>> git commit -m 'commit message'
+>> git push <USERNAME> <branch>
+
+
+

In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +Software Tests. +To submit a pull request, navigate to the WEC-Sim’s pull requests and submit a new pull request.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/developer/software_tests.html b/dev/developer/software_tests.html new file mode 100644 index 000000000..060cef3f3 --- /dev/null +++ b/dev/developer/software_tests.html @@ -0,0 +1,199 @@ + + + + + + + + + Software Tests — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Software Tests

+

WEC-Sim includes MATLAB Continuous Integration tests that check the source code’s stability and generate a build report. +The continuous integration tests are run each time a commit is made to the WEC-Sim GitHub repository, and the stability of each commit is available via WEC-Sim’s GitHub Actions. +Tests are run on both the WEC-Sim main and WEC-Sim dev branches. +To ensure stability across MATLAB distributions, WEC-Sim tests are also run on current and prior MATLAB releases. +Refer to MATLAB’s unit test framework and continuous integration documentation for more information.

+

When new features are added, tests should developed to verify functionality. +All tests should be run locally to ensure stability prior to submitting a pull request. +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +Pull Requests.

+
+

WEC-Sim Tests

+

The WEC-Sim tests are located in the $WECSIM/tests directory. +To execute the WEC-Sim tests locally and generates a build report, navigate to the $WECSIM directory (e.g. C:/User/Documents/GitHub/WEC-Sim), and type the following command in the MATLAB Command Window:

+
>> results = wecSimTest()
+
+
+Totals:
+   38 Passed, 0 Failed, 0 Incomplete.
+
+
+
+
+

WEC-Sim Applications Tests

+

The WEC-Sim Applications repository includes tests of each applications case. +To execute the WEC-Sim Applications tests locally and generates a build report, navigate to the $WECSIM_Applications directory (e.g. C:/User/Documents/GitHub/WEC-Sim), and type the following command in the MATLAB Command Window:

+
>> results = wecSimAppTest()
+
+
+Totals:
+   43 Passed, 0 Failed, 0 Incomplete
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/genindex.html b/dev/genindex.html new file mode 100644 index 000000000..0cf6fa169 --- /dev/null +++ b/dev/genindex.html @@ -0,0 +1,733 @@ + + + + + + + + Index — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | V + | W + | Y + | Z + +
+

A

+ + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

Q

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

Y

+ + +
+ +

Z

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/index.html b/dev/index.html new file mode 100644 index 000000000..154f7faa7 --- /dev/null +++ b/dev/index.html @@ -0,0 +1,200 @@ + + + + + + + + + WEC-Sim (Wave Energy Converter SIMulator) — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+_images/wec_sim_header.png + +
+
+
+
+

WEC-Sim (Wave Energy Converter SIMulator)

+

WEC-Sim (Wave Energy Converter SIMulator) +is an open-source software for simulating wave energy converters. The software is +developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape +Multibody. WEC-Sim has the ability to model devices that are comprised of +bodies, joints, power take-off systems, and mooring systems. WEC-Sim can model +both rigid bodies and flexible bodies with generalized body modes. Simulations +are performed in the time-domain by solving the governing wave energy converter +equations of motion in the 6 Cartesian degrees-of-freedom, plus any number of +user-defined modes. The WEC-Sim Applications repository contains a wide variety of +scenarios that WEC-Sim can be used to model, including desalination, mooring +dynamics, nonlinear hydrodynamic bodies, passive yawing, batch simulations and +many others. The software is very flexible and can be adapted to many scenarios +within the wave energy industry.

+
+

WEC-Sim Developers

+

WEC-Sim is a collaboration between the National Renewable Energy Laboratory +(NREL) and Sandia National Laboratories +(Sandia), +funded by the U.S. Department of Energy’s Water Power Technologies Office. +Due to the open source nature of the software, WEC-Sim has also had many external +contributions. +For more information refer to Acknowledgements.

+

Current members of the development team include:

+
    +
  • Dominic Forbush (Sandia)

  • +
  • Jeff Grasberger (Sandia)

  • +
  • Salman Husain (NREL - PI)

  • +
  • Adam Keester (Sandia)

  • +
  • Jorge Leon (Sandia)

  • +
  • David Ogden (NREL)

  • +
  • Kelley Ruehl (Sandia - PI)

  • +
  • Mohamed Shabara (NREL)

  • +
+

Former members of the development team include:

+
    +
  • Michael Lawson (NREL)

  • +
  • Carlos Michelen (Sandia)

  • +
  • Nathan Tom (NREL)

  • +
  • Jennifer Van Rij (NREL)

  • +
  • Yi-Hsiang Yu (NREL)

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/acknowledgements.html b/dev/introduction/acknowledgements.html new file mode 100644 index 000000000..ed9a32a39 --- /dev/null +++ b/dev/introduction/acknowledgements.html @@ -0,0 +1,185 @@ + + + + + + + + + Acknowledgements — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Acknowledgements

+
+

External Contributors

+

In addition to development by WEC-Sim Developers, WEC-Sim has had many contributors, including:

+
    +
  • Ratanak So (Oregon State University)

  • +
  • Matt Hall (University of Maine)

  • +
  • Brad Ling (Azura Wave)

  • +
  • Adam Nelessen (Georgia Institute of Technology)

  • +
  • Sam Kanner (University of California at Berkeley)

  • +
  • Chris McComb (Carnegie Mellon University)

  • +
  • Sam Edwards (University of Michigan)

  • +
+

The association with the listed organization is credited to when a contribution to WEC-Sim was made. The contributor may no longer be associated with the listed organization at this time.

+
+
+

Funding

+

Development and maintenance of the WEC-Sim code is funded by the U.S. Department of Energy’s Water Power Technologies Office. WEC-Sim code development is a collaboration between the National Renewable Energy Laboratory and Sandia National Laboratories.

+

The National Renewable Energy Laboratory is a national laboratory of the U.S. Department of Energy, Office of Energy Efficiency and Renewable Energy, operated by the Alliance for Sustainable Energy, LLC. under contract No. DE-AC36-08GO28308.

+

Sandia National Laboratories is a multi-mission laboratory managed and operated by National Technology and Engineering Solutions of Sandia, LLC., a wholly owned subsidiary of Honeywell International, Inc., for the U.S. Department of Energy’s National Nuclear Security Administration under contract DE-NA0003525.

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/index.html b/dev/introduction/index.html new file mode 100644 index 000000000..326d1d400 --- /dev/null +++ b/dev/introduction/index.html @@ -0,0 +1,201 @@ + + + + + + + + + Introduction — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/license.html b/dev/introduction/license.html new file mode 100644 index 000000000..718ddf2e7 --- /dev/null +++ b/dev/introduction/license.html @@ -0,0 +1,372 @@ + + + + + + + + + License — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

License

+

WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS). +The software is distributed under the Apache License 2.0.

+ +
+

Apache License 2.0

+
                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/overview.html b/dev/introduction/overview.html new file mode 100644 index 000000000..de0732b61 --- /dev/null +++ b/dev/introduction/overview.html @@ -0,0 +1,249 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

WEC-Sim (Wave Energy Converter SIMulator) is an open-source software for simulating wave energy converters. +It is developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape Multibody. +WEC-Sim has the ability to model devices that are comprised of hydrodynamic bodies, joints and constraints, power take-of systems, and mooring systems. +Simulations are performed in the time-domain by solving the governing wave energy converter equations of motion in the 6 rigid Cartesian degrees-of-freedom. +A body may also contain any number of generalized body modes to represent hydrodynamic effects in shear, torsion, bending, and others.

+
+../_images/WEC-Sim_flowChart.png + +
+

At a high level, the only external input WEC-Sim requires is hydrodynamic data from boundary element method (BEM) software such as WAMIT, NEMOH, Aqwa, and Capytaine. +The boundary element method data represents the hydrodynamic response of the device for a given wave frequency. +WEC-Sim uses this data to simulate devices in the time-domain where they can be coupled with controls, power take-off systems, and other external bodies and forces. +WEC-Sim outputs the motions, forces, and power for individual bodies, joints and PTOs in MATLAB for custom post-processing or coupling with external tools.

+

Several interfaces with Simulink are included that allow users to couple WEC-Sim with a wide variety of other models and scripts relevant to their devices. +Complex power take-off systems and advanced control algorithms are just two examples of the advanced tools that can be coupled with WEC-Sim.

+
+../_images/OSWEC_with_ptosim.png + +
+

Block diagram of an OSWEC device with hydraulic PTO created with PTO-Sim.

+
+
+
+../_images/wecccomp_diagram.png + +
+

Block diagram of the WECCCOMP device with advanced controller.

+
+
+

Together with PTO and control systems, WEC-Sim is able to model a wide variety of marine devices. +The WEC-Sim Applications repository contains a wide variety of scenarios that WEC-Sim can model. +This repository includes both demonstrations of WEC-Sim’s advanced features and applications of WEC-Sim to unique devices.

+

WEC-Sim’s capabilities include the ability to model both nonlinear hydrodynamic effects (Froude-Krylov forces and hydrostatic stiffness) and nonhydrodynamic bodies, body-to-body interactions, mooring systems, passive yawing. +WEC-Sim contains numerous numerical options and ability to perform highly customizable batch simulations. WEC-Sim can take in data from a variety of boundary element method software using its BEMIO (BEM-in/out) functionality and can output paraview files for visualization. +Some of its advanced features are highlighted in the figures below.

+ + + + + + + + + + + + + + + + +

Advanced Features Demonstration

nlh +Nonlinear hydrodynamics

num +Various numerical options

b2b +Body-to-body interactions

yaw +Passive yaw

mcr1 +Multiple case run: elevation

mcr2 +Multiple case run: power matrix

+

WEC-Sim can model a wide variety of marine renewable energy and offshore devices. +The figures below highlight a small sample of devices that WEC-Sim has successfully modeled in the past.

+ + + + + + + + + + + + + + + + + + + +

Sample of devices that have been with WEC-Sim

rm3 +Reference Model 3

oswec +Bottom-fixed Oscillating Surge WEC (OSWEC)

sphere +Hemisphere in Free Decay

ellipsoid +Ellipsoid

wigley +Wigley Ship Hull

gbm +Barge with Four Flexible Body Modes

wec3 +Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device

oc6p1 +OC6 Phase I DeepCwind Floating Semisubmersible

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/publications.html b/dev/introduction/publications.html new file mode 100644 index 000000000..78ccbe497 --- /dev/null +++ b/dev/introduction/publications.html @@ -0,0 +1,226 @@ + + + + + + + + + Publications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Publications

+

Refer to the WEC-Sim Signature Project page for a complete list of WEC-Sim publications, including publications written by users of the WEC-Sim code outside of the WEC-Sim development team. +Here is a list of publications written by the WEC-Sim multi-lab team about the development and application of WEC-Sim:

+

[1] Y.-H. Yu, M. Lawson, K. Ruehl, and C. Michelen, “Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool,” in Proceedings of the 2nd Marine Energy Technology Symposium, METS 2014, Seattle, WA, 2014.

+

[2] Y.-H. Yu, Y. Li, K. Hallett, and C. Hotimsky, “Design and Analysis for a Floating Oscillating Surge Wave Energy Converter,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[3] M. Lawson, Y.-H. Yu, A. Nelessen, K. Ruehl, and C. Michelen, “Implementing Nonlinear Buoyancy and Excitation Forces in the WEC-Sim Wave Energy Converter Modeling Tool,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[4] K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y.-H. Yu, “Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[5] M. Lawson, Y.-H. Yu, K. Ruehl, and C. Michelen, “Improving and Validating the WEC-Sim Wave Energy Converter Code,” in Proceedings of the 3rd Marine Energy Technology Symposium, METS 2015, DC, 2015.

+

[6] N. Tom, M. Lawson, and Y. Yu, “Demonstration of the Recent Additions in Modeling Capabilities for the WEC-Sim Wave Energy Converter Design Tool,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[7] R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen, “Development of PTO-SIM: A Power Performance Module for the Open-Source Wave Energy Converter Code WEC-SIM,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[8] M. Lawson, B. Garzon, F. Wendt, Y.-H. Yu, and C. Michelen, “COER Hydrodynamics Modeling Competition: Modeling the Dynamic Response of a Floating Body Using the WEC-SIM and FAST Simulation Tools,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[9] N. Tom, M. Lawson, and Y.-H. Yu, “Recent Additions in the Modeling Capabilities for the WEC-Sim-v1.1 Wave Energy Converter Design Tool,” in Proceedings of the 25th International Offshore and Polar Engineering Conference, ISOPE 2015, Kona, HI, 2015.

+

[10] R. So, S. Casey, S. Kanner, A. Simmons, and Brekken, T. K. A., “PTO-Sim: Development of a Power Take Off Modeling Tool for Ocean Wave Energy Conversion,” in Proceedings of the IEEE Power and Energy Society General Meeting, PES 2015, Denver, CO, 2015.

+

[11] A. Simmons, T. Brekken, P. Lomonaco, and C. Michelen, “Creating a Dynamometer for Experimental Validation of Power Take-Off Forces on a Wave Energy Converter,” in Proceedings of the IEEE Sustainability Technology Conference, SusTech 2015, Ogden, UT, 2015.

+

[12] A. Combourieu, M. Lawson, A. Babarit, K. Ruehl, A. Roy, R. Costello, P. L. Weywada, and H. Bailey, “WEC3: Wave Energy Converters modeling Code Comparison project,” in Proceedings of the 11th European Wave and Tidal Conference, EWTEC 2015, Nantes, France, 2015.

+

[13] K. Ruehl, C. Michelen, Y.-H. Yu, and M. Lawson, “Update on WEC-Sim Validation Testing and Code Development,” in Proceedings of the 4th Marine Energy Technology Symposium, METS 2016, DC, 2016.

+

[14] B. Bosma, K. Ruehl, A. Simmons, B. Gunawan, P. Lomonaco, and C. Kelley, “WEC-Sim Phase 1 Validation Testing – Experimental Setup and Initial Results,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[15] K. Ruehl, C. Michelen, B. Bosma, and Y.-H. Yu, “WEC-Sim Phase 1 Validation Testing – Numerical Modeling of Experiments,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[16] S. Sirnivas, Y.-H. Yu, M. Hall, and B. Bosma, 2016, “Coupled Mooring Analyses for the WEC-Sim Wave Energy Converter Design Tool,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[17] E. Quon, A. Platt, Y.-H. Yu, and M. Lawson, 2016, “Application of the Most Likely Extreme Response Method for Wave Energy Converters,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[18] R. So, C. Michelen, B. Bosma, P. Lenee-Bluhm, and T. K. A. Brekken, “Statistical Analysis of a 1:7 Scale Field Test Wave Energy Converter Using WEC-Sim,” IEEE Transactions on Sustainable Energy, vol. 8, no. 3, pp. 1118–1126, Jul. 2017.

+

[19] J. Van Rij, Y.-H. Yu, and Y. Guo, “Structural loads analysis for wave energy converters,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017.

+

[20] Y.-H. Yu and D. Jenne, “Analysis of a wave-powered, reverse-osmosis system and its economic availability in the United States,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017.

+

[21] J. Ringwood et al., “A competition for WEC control systems,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[22] F. Wendt et al., “International Energy Agency Ocean Energy Systems Task 10 Wave Energy Converter Modeling Verification and Validation,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[23] Y. Guo, Y.-H. Yu, and J. van Rij, “Inclusion of structural flexibility in design load analysis for wave energy converters,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[24] N. Tom, K. Ruehl, and F. Ferri, “Numerical model development and validation for the WECCCOMP control competition,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018.

+

[25] Y.-H. Yu, N. Tom, and D. Jenne, “Numerical analysis on hydraulic power take-off for wave energy converter and power smoothing methods,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018.

+
+

News Articles

+ + +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/introduction/release_notes.html b/dev/introduction/release_notes.html new file mode 100644 index 000000000..243b2ebd9 --- /dev/null +++ b/dev/introduction/release_notes.html @@ -0,0 +1,722 @@ + + + + + + + + + Release Notes — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Release Notes

+
+

Citing WEC-Sim

+

To cite WEC-Sim, please use the citation for WEC-Sim software release and/or cite the following WEC-Sim publication.

+
+

WEC-Sim v6.1

+

[1] Kelley Ruehl, Adam Keester, Dominic Forbush, Jeff Grasberger, Salman Husain, Jorge Leon, David Ogden, and Mohamed Shabara, “WEC-Sim v6.1”. Zenodo, September 16, 2024. https://doi.org/10.5281/zenodo.13770349.

+
@software{wecsim,
+  author       = {Kelley Ruehl,
+                  Adam Keester,
+                  Dominic Forbush,
+                  Jeff Grasberger,
+                  Salman Husain,
+                  Jorge Leon,
+                  David Ogden,
+                  Mohamed Shabara},
+  title        = {WEC-Sim v6.1},
+  month        = September,
+  year         = 2024,
+  publisher    = {Zenodo},
+  version      = {v6.1},
+  doi          = {10.5281/zenodo.10023797},
+  url          = {https://doi.org/10.5281/zenodo.13770349}
+}
+
+
+https://zenodo.org/badge/20451353.svg + +
+
+

Publication

+

[1] D. Ogden, K. Ruehl, Y.H. Yu, A. Keester, D. Forbush, J. Leon, N. Tom, “Review of WEC-Sim Development and Applications” in Proceedings of the 14th European Wave and Tidal Energy Conference, EWTEC 2021, Plymouth, UK, 2021.

+
+
+
+

WEC-Sim v6.1

+

New Features

+
    +
  • Update docs on main by @salhus in #1031

  • +
  • Save mooring library to R2020b by @akeeste in #1040

  • +
  • Update readAQWA.m by @salhus in #1096

  • +
  • Update plotRadiationIRF.m by @AlufaSam in #1102

  • +
  • Update readNEMOH.m for compatibility with NEMOH v3.0 by @nathanmtom in #1105

  • +
  • Remove direct github installations from docs environment by @H0R5E in #1149

  • +
  • Exclude R2020b and R2021a from Windows test runners by @H0R5E in #1166

  • +
  • Add BEMIO cleanup function by @dforbush2 in #1076

  • +
  • Remove dead code from wecSim.m by @akeeste in #1170

  • +
  • Update wecSim.m to new MoorDyn dll by @jtgrasb in #1177

  • +
  • Merge main commits to dev by @jtgrasb in #1183

  • +
  • Port testing PR #1186 to main by @H0R5E in #1187

  • +
  • Add R2023b to Windows tests by @H0R5E in #1186

  • +
  • Nemoh v3.0.2 Examples by @MShabara in #1204

  • +
  • Update paraview docs by @jtgrasb in #1227

  • +
  • Update default branch to main by @akeeste in #1235

  • +
  • Apply #1235 and #1241 to dev branch by @H0R5E in #1240

  • +
  • PTO Extension Feature by @Allison-File in #1198

  • +
  • Updating tests on main and dev by @kmruehl in #1250

  • +
  • Updating WEC-Sim Issue Templates by @kmruehl in #1247

  • +
  • Enable WEC-Sim to use MoorDyn v2 capabilities by @jtgrasb in #1212

  • +
  • Add missing mask initialization line in spherical constraint by @akeeste in #1264

  • +
  • Update readCAPYTAINE.m to read Khs from .nc by @salhus in #1263

  • +
  • Update readCapytaine - fix reading multiple bodies with <6 dofs by @akeeste in #1274

  • +
  • Reposition % for readability by @Gusmano-2-OSU in #1272

  • +
  • Update waveSpread calculation in irregular waves by @dforbush2 in #1290

  • +
  • Add new examples for updated version of NEMOH (NEMOHv3.0.2) by @ashleynchong in #1226

  • +
  • Pull main into dev by @kmruehl in #1297

  • +
  • Expand regression tests by @akeeste in #1273

  • +
  • BEMIO Unit Updates by @jniffene in #1296

  • +
  • Speed up writeBEMIOH5 by @akeeste in #1301

  • +
  • Update readAQWA.m by @jtgrasb in #1253

  • +
  • Variable hydrodynamics by @akeeste in #1248

  • +
  • Update readCapytaine - get Khs from .nc files when bodies have less than 6 DOFs by @akeeste in #1275

  • +
  • Adds the QTFs to WEC-Sim by @MShabara in #1242

  • +
  • QTF - Variable Hydro compatibility by @akeeste in #1312

  • +
  • Resolve conflicts between variable hydro and GBM by @akeeste in <https://github.com/WEC-Sim/WEC-Sim/pull/1317>`_

  • +
+

Bug Fixes

+
    +
  • Update to MoorDyn to fix MoorDyn crashing MATLAB session. by @AlixHaider in #1012

  • +
  • Fix Direct Drive PTO Output order by @jtgrasb in #1095

  • +
  • Fix accelerator modes issue by @jtgrasb in #1100

  • +
  • Bugfix for plotBEMIO bodies by @akeeste in #1207

  • +
  • Fix to #1217, nonlinFK and body block changed by @dforbush2 in #1220

  • +
  • Fix on pDis function call by @dforbush2 in #1229

  • +
  • Bug fixes for WEC-Sim GUI and Run From Simulink features by @akeeste in #1195

  • +
  • Fix sign bug in the Generator Equivalent Circuit Block in PTO-Sim - Rebase PR to main by @jleonqu in #1236

  • +
  • Fix direct drive bugs by @jtgrasb in #1256

  • +
  • Minor fix for formatting in Developer manual by @akeeste in #1280

  • +
  • Bad BEMIO fcn fix by @dforbush2 in #1289

  • +
+

New Contributors

+
    +
  • @AlixHaider made their first contribution in #1012

  • +
  • @AlufaSam made their first contribution in #1102

  • +
  • @Allison-File made their first contribution in #1198

  • +
  • @Gusmano-2-OSU made their first contribution in #1272

  • +
  • @ashleynchong made their first contribution in #1226

  • +
+

Issues and Pull Requests

+
    +
  • v6.1 Changelog

  • +
  • > 104 issues closed since v6.0

  • +
  • > 48 PRs merged since v6.0

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.13770349.svg + +
+
+

WEC-Sim v6.0

+

New Features

+
    +
  • initial commit largeXYDispOption by @dforbush2 in #877

  • +
  • Update coordinate system figure by @JiaMiGit in #931

  • +
  • Property validation for WEC-Sim objects by @jtgrasb in #904

  • +
  • Dev: adding ampSpectraForWS function by @dforbush2 in #907

  • +
  • Customizable DOFs for plotBEMIO by @akeeste in #944

  • +
  • Calculation_of_Ainf_using_radiationIRF.m by @salhus in #946

  • +
  • Update citation names by @akeeste in #954

  • +
  • Update getDofNames() by @akeeste in #957

  • +
  • included readCAPYTAINE() argument to explicitly define KH.dat & Hydro by @dav-og in #962

  • +
  • Extract mask variable by @salhus in #958

  • +
  • Add tests to check that SLX file versions do not exceed R2020b by @H0R5E in #919

  • +
  • Products of Inertia in WEC-Sim by @akeeste in #981

  • +
  • Pull bug fixes #954, #999, #1002 from master into dev by @akeeste in #1011

  • +
  • updating readNEMOH based on #983 by @kmruehl in #990

  • +
  • Remove ‘fixed’ mass option from OSWEC input file by @jtgrasb in #1024

  • +
  • Save the applied added mass time series by @akeeste in #1023

  • +
  • Update tutorials by @kmruehl in #1030

  • +
  • Control applications docs by @jtgrasb in #1018

  • +
  • Update read- and writeBEMIOH5 to allow for pressure integration for mean drift by @nathanmtom in #1046

  • +
  • Add function to read h5 file to hydro data structure by @jtgrasb in #1048

  • +
  • Update radiationIRF.m by @nathanmtom in #1045

  • +
  • Normalize quaternion to increase simulation robustness by @akeeste in #1049

  • +
  • Plot bemio features by @jtgrasb in #1034

  • +
  • Updates to Morison Element Implementation by @nathanmtom in #1052

  • +
  • Moving PTO-Sim to main WEC-Sim library by @jleonqu in #1057

  • +
  • Add windows runner to dev branch unit test workflow by @H0R5E in #1061

  • +
  • Update docs dependencies by @H0R5E in #1080

  • +
  • Type property pto sim by @jleonqu in #1064

  • +
  • Added mass updates by @akeeste in #1058

  • +
  • Feature paraview by @agmoore4 in #1081

  • +
  • Paraview documentation hyperlink fix by @agmoore4 in #1093

  • +
  • use capytaine v2 to compute hydrostatics by @dav-og in #1092

  • +
  • Update paraview doc images by @jtgrasb in #1098

  • +
  • readNEMOH update to be compatible with v3.0.0 release (but not QTF) by @nathanmtom in #1087

  • +
  • Add simple direct drive PTO model by @jtgrasb in #1106

  • +
  • Control+pto docs by @jtgrasb in #1108

  • +
  • MOST Capabilities - Continuation by @jtgrasb in #1127

  • +
  • Implement an FIR filter to calculate radiation forces by @salhus in #1071

  • +
  • Updating documentation to include links for the Advanced Features Web by @jleonqu in #1126

  • +
  • Multiple Wave Spectra by @salhus in #1130

  • +
  • Update WECSim_Lib_Body_Elements.slx for N Waves Applications by @salhus in #1133

  • +
  • Update to MoorDyn v2 by @RyanDavies19 in #1134

  • +
  • Updating WEC-Sim tests for dev branch by @kmruehl in #1142

  • +
+

Bug Fixes

+
    +
  • Remove fixed mass option by @akeeste in #856

  • +
  • Move run(‘stopWecSim’) to wecSim.m by @jtgrasb in #885

  • +
  • Pull bug fixes into dev by @akeeste in #900

  • +
  • Save slx files in 2020b fixes #920 by @jtgrasb in #923

  • +
  • Fix readCAPYTAINE by @jtgrasb in #884

  • +
  • Fixes saveViz feature for elevation import by @jtgrasb in #929

  • +
  • Fix wave elevation import with rampTime = 0 by @jtgrasb in #917

  • +
  • readCapytaine_fixes_for_reading_dataformats_correctly by @salhus in #947

  • +
  • Pull #954 into dev by @akeeste in #955

  • +
  • Bug fix for direction in readCapytaine by @akeeste in #999

  • +
  • Fix sign bug reported on issue #993 by @jleonqu in #102

  • +
  • Dev: reverts PR 910, fixing error in nonLinearBuoyancy by @dforbush2 in #1017

  • +
  • Fix the transpose of linear restoring matrix to make roll mode rows to be 0 by @salhus in #1032

  • +
  • Bugfix resolving documentation build error by @kmruehl in #1059

  • +
  • fix_readWAMIT_and_writeBEMIOh5 by @salhus in #1065

  • +
  • Pulling master bugfixes into dev by @kmruehl in #1101

  • +
  • Bug fixes for v6.0 by @akeeste in #1136

  • +
  • Path fix for BEMIO example by @akeeste in #1144

  • +
+

New Contributors

+
    +
  • @JiaMiGit made their first contribution in #931

  • +
  • @agmoore4 made their first contribution in #1081

  • +
  • @RyanDavies19 made their first contribution in #1134

  • +
+

Issues and Pull Requests

+
    +
  • >130 issues closed since v5.0.1

  • +
  • >74 PRs merged since v5.0.1

  • +
  • v6.0 Changelog

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.10023797.svg + +
+
+

WEC-Sim v5.0.1

+

New Features

+

This is a bug fix release. New features since the previous release are not included.

+

Bug Fixes

+
    +
  • Fix saveViz by @jtgrasb in #866

  • +
  • Fix typo in docs. by @mancellin in #898

  • +
  • Update documentation tutorials to fix OSWEC inertia by @jtgrasb in #894

  • +
  • CI: Split docs jobs | Add color to docs logs | Cancel runs on new push | Add 2021b to MATLAB versions by @H0R5E in #862

  • +
  • Mac path fixes and make outputDir public by @ahmedmetin in #874

  • +
  • wecSimPCT Fix (Master) by @yuyihsiang in #870

  • +
  • Fix image bug in PTO-Sim in Library Browser by @jleonqu in #896

  • +
  • update to v5.0 citation by @akeeste in #911

  • +
  • fix non-linear hydro by @dforbush2 in #910

  • +
  • Pull dev bugfixes into master by @akeeste @jtgrasb in #950 (includes #929 #917 #884 by @jtgrasb)

  • +
+

New Contributors

+
    +
  • @mancellin made their first contribution in #898

  • +
  • @ahmedmetin made their first contribution in #874

  • +
+

Issues and Pull Requests

+ +https://zenodo.org/badge/DOI/10.5281/zenodo.7121186.svg + +
+
+

WEC-Sim v5.0

+

New Features

+
    +
  • Refactoring classes and properties @kmruehl in #803, #822, #828, #832, @akeeste in #838

  • +
  • Refactoring docs by @kmruehl in #840

  • +
  • Refactor BEMIO functions, tests, and documentation @akeeste in #790, #812, @H0R5E in #839, @dav-og in #806

  • +
  • Run from sim updates by @akeeste in #737

  • +
  • Allow binary STL files by @akeeste in #760

  • +
  • Update Read_AQWA and AQWA examples by @jtgrasb in #761, #779, #797, #831

  • +
  • Rename plotWaves by @jtgrasb in #765

  • +
  • Update to normalize to handle sorting mean drift forces by @nathanmtom in #808 #809

  • +
  • Remove passiveYawTest.m by @jtgrasb in #807

  • +
  • Wave class wave gauge update by @nathanmtom in #801

  • +
  • New pto sim lib by @jleonqu in #821

  • +
  • Warning/Error flags by @jtgrasb in #826

  • +
  • Add Google Analytics 4 by @akeeste in #864

  • +
+

Documentation

+
    +
  • Update WEC-Sim’s Developer Documentation for the Morison Element Implementation by @nathanmtom in #796

  • +
  • Update response class API by @akeeste in #802

  • +
  • Doc_auto_gen_masks by @salhus in #842

  • +
  • Move documentation compilation to GitHub Actions by @H0R5E in #817

  • +
  • Add branch build in docs workflow for testing PRs by @H0R5E in #834

  • +
  • Update the WEC-Sim Theory Documentation to Clarify Wave Power Calculation by @nathanmtom in #847

  • +
  • Update documentation on mean drift and current by @akeeste in #800

  • +
+

Bug Fixes

+
    +
  • Fix cable library links. Resolves #770 by @akeeste in #774 #775

  • +
  • Fix rate transition error by @akeeste in #799

  • +
  • Fix cable implementation by @dforbush2 in #827

  • +
  • PTO-Sim bug fix by @jleonqu in #833

  • +
  • Bug fix for the regular wave power full expression by @nathanmtom in #841

  • +
  • Fix documentation on dev branch by @H0R5E in #816

  • +
  • Bug fix: responseClass reading the MoorDyn Lines.out file too early, resolves #811 by @akeeste in #814

  • +
+

Issues and Pull Requests

+
+
    +
  • >52 issues closed since v4.4

  • +
  • >44 PRs merged since v4.4

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.6555137.svg + +
+
+

WEC-Sim v4.4

+

New Features

+
+
    +
  • Added WEC-Sim Library blocks for cable, spherical constraint, and spherical pto #712 #675

  • +
  • Added feature to add/remove WEC-Sim path and create temp directory for each run #685 #686

  • +
  • Updated WEC-Sim Library to 2020b and saved Simulink Library Functions to (*.m) files #686 #654

  • +
  • Split WEC-Sim Library into sublibraries for each class #720

  • +
  • Restructured WEC-Sim Continuous Integration tests into class-based tests #620

  • +
  • Added wave visualization with wave markers and post-processing #736 #678

  • +
  • Moved nonlinear hydrodynamics and morison elements to properties of the Body Class #692

  • +
+
+

Documentation

+
+
    +
  • Added developer manual content for WEC-Sim Library, Run from Simulink, Simulink Functions, Added Mass, Software Tests #728

  • +
  • Added user manual content for troubleshooting WEC-Sim #641

  • +
  • Updated content for PTO-Sim, ParaView, WEC-Sim Applications and Tutorials #668 #642 #649 #643

  • +
  • Added multi-version documentation for master and dev branches #630

  • +
+
+

Bug Fixes

+
+
    +
  • Resolved bug with macro for ParaView 5.9 #459

  • +
  • Resolved bugs in BEMIO with Read_Capytaine, READ_AQWA, and Write_H5 functions #727 #694 #636

  • +
  • Resolved bug with variable time-step solver #656

  • +
+
+

Issues and Pull Requests**

+
+
    +
  • > 57 issues closed since v4.3

  • +
  • > 54 PRs merged since v4.3

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.5608563.svg + +
+
+

WEC-Sim v4.3

+

New Features

+
+
    +
  • Added the ability for WEC-Sim to be run directly from Simulink #503 #512 #548

  • +
  • Added capability to read Capytaine (.nc) output. Includes examples of running Capytaine with hydrostatics #464

  • +
  • Created a more accurate infinite frequency added mass calculation #517

  • +
  • Added ability for setInitDisp to intake multiple initial rotations #516 #586

  • +
+
+

Documentation

+
+
    +
  • Restructured into four manuals: introduction, theory, user and development #455 #557

  • +
  • Update of code structure section #455, links #649 , diagrams #643, paraview #642,

  • +
  • Added section on suggested troubleshooting #641

  • +
+
+

Continuous integration tests

+
+
    +
  • Overhaul and speed up of tests #508 #620

  • +
  • Extension of tests to the applications cases #7

  • +
+
+

Clean up

+
+
+
    +
  • Created issue templates on GitHub #575 #634

  • +
  • Updated Morison Element warning flags #408

  • +
  • Clean up response class methods #491 #514

  • +
+
+
    +
  • Clean up paraview output functions #490

  • +
+
+

Bug Fixes

+
+
    +
  • Paraview macros and .pvsm files #459

  • +
  • BEMIO read mean drift force in R2021a #636

  • +
  • PTO-Sim calling workspace #632

  • +
  • Combine_BEM Ainf initialization #611

  • +
+
+

Issues and Pull Requests

+
+
    +
  • > 100 issues closed since v4.2

  • +
  • > 45 PRs merged since v4.2

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.5122959.svg + +
+
+

WEC-Sim v4.2

+

New Features

+
+
    +
  • Added normal/tangential option for Morison Force (simu.morisonElement = 2) #408

  • +
  • Added Drag Body (body(i).nhBody=2) #423 #384

  • +
  • WEC-Sim output saved to structure #426

  • +
  • Added WEC-Sim parallel execution for batch runs (wecSimPCT) using MATLAB parallel computing toolbox #438

  • +
  • Added end stops to PTOs #445

  • +
+
+

Documentation

+
+
    +
  • Automatically compile docs with TravisCI #439

  • +
  • Generate docs for master and dev branches of WEC-Sim

  • +
+
+

Bug Fixes

+
+
    +
  • Resolved convolution integral bug for body-to-body interactions #444

  • +
  • Resolved PTO-Sim bug for linear to rotary conversion blocks #247 #485

  • +
  • Resolved variant subsystem labeling bug #486 #479

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.4391330.svg + +
+
+

WEC-Sim v4.1

+
    +
  • Added passive yaw

  • +
  • Revised spectral formulations per IEC TC114 TS 62600-2 Annex C

  • +
  • Updated examples on the WEC-Sim_Applications repository

  • +
  • Added unit tests with Jenkins

  • +
  • Added API documentation for WEC-Sim classes

  • +
  • Merged Pull Requests

    +
      +
    • Updated BEMIO for AQWA version comparability #373

    • +
    • Extended capabilities for ParaView visualization #355

    • +
    +
  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.3924765.svg + +
+
+

WEC-Sim v4.0

+
    +
  • Added mean drift force calculation

  • +
  • Added generalized body modes for simulating flexible WEC devices and for structure loading analysis

  • +
  • Updated BEMIO for mean drift force and generalized body modes

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.3827897.svg + +
+
+

WEC-Sim v3.1

+
    +
  • Added wave gauges for three locations

  • +
  • Added command line documentation for objects

  • +
  • Added error and warning flags

  • +
  • Converted Morison Elements to script instead of block

  • +
  • Converted WEC-Sim and PTO-Sim library files back to slx format

  • +
  • Fixed plot error in MATLAB 2018b

  • +
+
+
+

WEC-Sim v3.0

+
    +
  • Added option of equal energy spacing for irregular waves (default)

  • +
  • Added option to calculate the wave elevation at a location different from the origin

  • +
  • Added option to define gamma for JONSWAP spectrum

  • +
  • Improved the WEC-Sim simulation speed when using rapid-acceleration mode

  • +
  • Fixed path bug in BEMIO for LINUX/OSX users

  • +
  • Changed/Added following WEC-Sim parameters

    + +
  • +
+
+
+

WEC-Sim v2.2

+ +
+
+

WEC-Sim v2.1

+
    +
  • Added MATLAB version of BEMIO (to replace python version)

  • +
  • Added variable time-step option with ‘ode45’ by @ratanakso

  • +
  • Update to MCR, option to not re-load *.h5 file by @bradling

  • +
  • Update to waveClass to allow for definition of min/max wave frequency by @bradling

  • +
+
+
+

WEC-Sim v2.0

+
    +
  • Updated WEC-Sim Library (generalized joints/constraints/PTOs)

  • +
  • Body-to-body interactions for radiation forces

  • +
  • Morison forces

  • +
  • Batch run mode (MCR)

  • +
  • Mooring sub-library implemented in mooringClass (no longer in body or joint)

  • +
  • More realistic PTO and mooring modeling through PTO-Sim and integration with MoorDyn

  • +
  • Non-hydrodynamic body option

  • +
  • Visualization using ParaView

  • +
+
+
+

WEC-Sim v1.3

+
    +
  • Added Morison Elements

  • +
  • Body2Body Interactions

  • +
  • Multiple Case Runs (wecSimMCR)

  • +
  • Moordyn

  • +
  • Added Non-hydro Bodies

  • +
  • Morison Forces

  • +
  • Joint Updates

  • +
  • Visualization with Paraview

  • +
+
+
+

WEC-Sim v1.2

+
    +
  • Nonlinear Froude-Krylov hydrodynamics and hydrostatics

  • +
  • State space radiation

  • +
  • Wave directionality

  • +
  • User-defined wave elevation time-series

  • +
  • Imports nondimensionalized BEMIO hydrodynamic data (instead of fully dimensional coefficients)

  • +
  • Variant Subsystems implemented to improve code stability (instead of if statements)

  • +
  • Bug fixes

  • +
+
+
+

WEC-Sim v1.1

+
    +
  • WEC-Sim v1.1, available on GitHub

  • +
  • Improvements in code stability through modifications to the added mass, radiation damping calculations, and impulse response function calculations

  • +
  • Implementation of state space representation of radiation damping convolution integral calculation

  • +
  • New hydrodynamic data format based on BEMIO output, a python code that reads data from WAMIT, NEMOH, and AQWA and writes to the Hierarchical Data Format 5 (HDF5) format used by WEC-Sim.

  • +
  • Documentation available on WEC-Sim Website

  • +
+
+
+

WEC-Sim v1.0

+
    +
  • Initial release of WEC-Sim (originally on OpenEI, now on GitHub)

  • +
  • Available as a static download

  • +
  • Documentation available in PDF

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/acknowledgements.html b/dev/most/acknowledgements.html new file mode 100644 index 000000000..abcfcf930 --- /dev/null +++ b/dev/most/acknowledgements.html @@ -0,0 +1,176 @@ + + + + + + + + + Acknowledgements — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Acknowledgements

+

MOST software has been developed by the MOREnergy Lab of Politecnico di Torino, Italy.

+
+../_images/IMAGE_LogoPolitecnicodiTorino.jpg + +
+
+../_images/IMAGE_LogoMOREnergyLab.png + +
+
+

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/advanced_features.html b/dev/most/advanced_features.html new file mode 100644 index 000000000..006e87c15 --- /dev/null +++ b/dev/most/advanced_features.html @@ -0,0 +1,521 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+

In this section, a more detailed look will be taken at some of the operational aspects of the new features introduced with MOST. Specifically, we will +focus on the pre-processing part in which all the data necessary for simulating Floating Offshore Wind Turbines (FOWT) and hybrid platforms are obtained. +For the simulation and post-processing part, please refer to the theory section of MOST (Theory) and the advanced features of WEC-Sim (Advanced Features).

+
+

MOST-IO

+

The pre-processing phase of MOST takes place through the use of the mostIO.m script in the ‘’mostData’’ subfolder, through which the following scripts +are launched (in this order):

+
    +
  • run_turbsim.m : creation of the data structure describing the input wind speeds;

  • +
  • Create_Mooring_Matrix.m : creation of the look-up table describing the mooring forces;

  • +
  • BladeData.m : creation of the data structure concerning the characteristics of the airfoils constituting the turbine blades;

  • +
  • WTproperties.m : creation of the data structure concerningo the geometric and inertial characteristics of the wind turbine;

  • +
  • Steady_States.m : computation of the steady-state values of certain quantities of interest when the average wind speed varies and used for the calculation of some quantities concerning the control logic;

  • +
  • Controller.m : creation of the data used to simulate the control logics (Baseline [D3] or ROSCO [D4])

  • +
  • AeroLoads.m : creation of the aerodynamic loads look-up table (acting on the blades root).

  • +
+

In the next subsections, MOST features will be discussed in detail, in particular, the settings to be provided to obtain the required data and the +operations performed in the various codes will be explained.

+
+

Wind Features

+

Wind speed can be defined by choosing between the two options of the wind class:

+
    +
  • Constant wind conditions

  • +
  • Turbulent wind conditions

  • +
+

The constant wind speed is constant in time and space while the second option includes the temporal and spatial turbulence of the wind. Below is an +image of the Variant Subsystem through which one of the two wind options can be enabled.

+
+../_images/IMAGE_wind_Choice.png + +
+
+

+
+

The simulation of the wind turbine for turbulent wind conditions requires the generation of a look-up table which relates the temporal and spatial +variation of wind speed on the wind turbine rotor plane (yz plane). Therefore the wind speed is discretized for 3 variables (2 spatial parameters, +y and z, and the time). The look-up table is generated using run_turbsim.m which computes turbulent wind field based on Turbsim +executable. Mean wind speed can be defined in run_turbsim.m script, while other parameters can be set-up in the Turbsim_inputfile.txt file, +the main ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

NumGrid_Z

Vertical grid-point matrix dimension

NumGrid_Y

Horizontal grid-point matrix dimension

TimeStep

Time step [s]

AnalysisTime

Length of analysis time series [s]

UsableTime

Usable length of output time series [s]

HubHt

Hub height [m]

GridHeight

Grid height [m]

GridWidth

Grid width [m]

VFlowAng

Vertical mean flow (uptilt) angle [deg]

HFlowAng

Horizontal mean flow (skew) angle [deg]

TurbModel

Turbulence model (“IECKAI”=Kaimal, “IECVKM”=von Karman, “GP_LLJ”, “NWTCUP”, “SMOOTH”, “WF_UPW”, “WF_07D”, “WF_14D”, “TIDAL”)

IECstandard

Number of IEC 61400-x standard (x=1,2, or 3 with optional 61400-1 edition number)

IECturbc

IEC turbulence characteristic (“A”, “B”, “C” or the turbulence intensity in percent)

IEC_WindType

IEC turbulence type (“NTM”=normal, “xETM”=extreme turbulence, “xEWM1”=extreme 1-year wind, “xEWM50”=extreme 50-year wind, where x=wind turbine class 1, 2, or 3)

ETMc

IEC Extreme Turbulence Model “c” parameter [m/s]

WindProfileType

Wind profile type (“JET”;”LOG”=logarithmic;”PL”=power law;”H2L”=Log law for TIDAL spectral model;”IEC”=PL on rotor disk, LOG elsewhere)

RefHt

Height of the reference wind speed [m]

PLExp

Power law exponent [-]

Z0

Surface roughness length [m]

PC_UW

Hub mean u’w’ Reynolds stress

PC_UV

Hub mean u’v’ Reynolds stress

PC_VW

Hub mean v’w’ Reynolds stress

+

A detailed description of using Turbsim is given here [D2].

+

Aerodynamic wind loads calculation in the Simulink model requires the average wind speed for each blade. This is found by computing the average wind +speed for four discretized points along the blade length during the simulation. Relative wind speed for each blade is computed including the influence +of the horizontal hub speed and the pitch and yaw rotation of the hub.

+
+
+

Mooring Features

+

MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. Specifically, the mooring look-up table +simulates a mooring system consisting of a certain number of lines suspended between two points (anchor and fairlead) and angularly equispaced. +This option is based on the catenary equations similarly to the open-source code MAP++ [D1].

+

In the simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outpus (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called “moor_matrix” and created through the Create_Mooring_Matrix.m script, in which the following +variables are specified:

+
    +
  • Water density (kg/m^3): rho_water

  • +
  • Gravity acceleration (m/s^2): gravity

  • +
  • Water depth (m): depth

  • +
  • Mooring line diameter (m): d

  • +
  • Linear mass (kg/m): linear_mass

  • +
  • Number of lines: number_lines

  • +
  • Fairlead and anchor positions of the first line (m): nodes

  • +
  • Mooring lines unstretched length (m): L

  • +
  • Sectional stiffness (N): EA

  • +
  • Seabed friction coefficient: CB

  • +
+

In addition, the user can specify the domain of the look-up tables, specifically:

+
    +
  • Amplitude and discretisation along surge direction (m): X

  • +
  • Amplitude and discretisation along sway direction (m): Y

  • +
  • Amplitude and discretisation along heave direction (m): Z

  • +
  • Amplitude and discretisation around roll axis (rad): RX

  • +
  • Amplitude and discretisation around pitch axis (rad): RY

  • +
  • Amplitude and discretisation around yaw axis (rad): RZ

  • +
+

The code for generating the “moor_matrix” structure at first calculates the positions of the fairleads and anchors of the other lines, +in accordance with the specified number and in an angularly equispaced manner, after which, for each combination of the inputs (surge, +sway, heave, roll, pitch, and yaw) it calculates the new positions of the fairleads. Given these positions, for each line it performs a +numerical optimization by which the vertical force and the horizontal force (along the projection of the line in the xy plane) are +calculated. Specifically, by means of the typical catenary equations, it is possible to calculate (knowing the characteristics of a line) +the above-mentioned vertical and horizontal forces having as input the vertical and horizontal distances between the two ends of the +line, so, in this case the optimization procedure searches for forces such that the distances are as close as possible to those +specified. Once the vertical and horizontal forces are calculated for each line, the resulting force and torque in the global reference +frame are applied to the origin of the reference frame attached to the structure.

+
+
+

Wind Turbine Features

+

The wind turbine is modelled as a multi-body system including the tower, the nacelle, the hub, and the blades. The properties of each wind turbine component +are defined in two structures that can be generated using the provided BladeData.m and WTproperties.m MATLAB codes. In the first, the +variables concerning the blades are defined, specifically (see figure below for a better comprehension):

+
    +
  • Blade radius values for which other properties are defined: radius

  • +
  • Value, for each specified radius, of the pre-bending distance out of the rotor plane: BlCrvAC

  • +
  • Value, for each specified radius, of the pre-bending angle out of the rotor plane: BlCrvAng

  • +
  • Value, for each specified radius, of the pre-bending distance in the rotor plane: BlSwpAC

  • +
  • Value, for each specified radius, of the twist angle: twist

  • +
  • Value, for each specified radius, of the chord: chord

  • +
  • Index of the airfoil type corresponding to each specified radius: airfoil_index

  • +
  • Matrix containing, for each type of airfoil existing, the values of lift, drag and torque coefficients as a function of angle of attack: airfoil

  • +
+

The following figure [D9] shows some of the values mentioned above.

+
+../_images/IMAGE_blade_geom.png + +
+
+

+
+

In the second script, the geometric and inertial properties of the turbine components are defined. For each of them the mass and inertia are defined, +in addition, the following other variables must be entered (see figure below for a better comprehension):

+
    +
  • Tower offset position relative to sea water level (m): tower.offset

  • +
  • Tower height (m): tower.height

  • +
  • Tower relative center of mass (relative to tower offset) (m): tower.cog_rel

  • +
  • Nacelle relative center of mass (relative to tower top) (m): nacelle.cog_rel

  • +
  • Twr2Shft (deg): nacelle.Twr2Shft

  • +
  • Tilt angle (deg): nacelle.tiltangle

  • +
  • Overhang (m): hub.overhang

  • +
  • Hub height (m): hub.height

  • +
  • Hub radius (m): hub.Rhub

  • +
  • Precone angle (deg): hub.precone

  • +
  • Blades relative center of mass (relative to hub center) (m): blade.cog_rel

  • +
  • Blade discretization nodes to average the wind speed: blade.bladeDiscr

  • +
  • Generator efficiency: gen_eff

  • +
  • CAD file path

  • +
+
+../_images/IMAGE_geometry.png + +
+
+

+
+

Once these dimensions are known, the positions of the centre of mass of each component in the inertial reference frame are calculated (origin at sea +level and at the centre of the tower, as far as the horizontal plane is concerned), as well as the total mass and inertia.

+
+

Control Features

+

In MOST there is the possibility of using two different wind turbine control logics (Baseline [D3] and ROSCO [D4]) +and as explained in the Theory Manual the steps to be taken in order to obtain the data needed for their simulation are the calculation +of the stationary values and the calculation of the controller gains. The first task is performed by the script Steady_States.m in the subfolder +“Control”. Specifically, through this, the stationary values of power, rotor speed, thrust force, generator torque and collective blade pitch angle are computed +for both of the aforementioned control logics. The following variables must be specified in the script:

+
    +
  • Value of power produced under nominal conditions and under conditions where the wind speed is greater than the nominal one: Prated

  • +
  • Wind speed at which power begins to be produced (and therefore at which the generator torque becomes non-zero): v_cutin

  • +
  • Wind speed above which no power is produced, and the blades rotate to a safe position (feather condition): v_cutout

  • +
  • Rated first try wind speed, meaning that the actual wind speed (probably close to this) will be calculated later: v_rated_try

  • +
  • Rated first try rotor speed, meaning that the actual one (probably close to this) will be calculated later: omega_rated_try

  • +
  • Wind speed discretization, which indicates how many stationary values will be calculate: v_discr

  • +
  • Minimum allowed value of the rotor speed (setting used only for the calculation of stationary values related to the ROSCO controller): omega_min

  • +
  • Boundary wind speed value between zone 1.5 (zone with constant and equal to minimum rotor speed) and zone 2 (zone with optimal tip speed ratio), this value is used only for the ROSCO controller: vw_R2in_try

  • +
  • Ratio of the maximum allowed thrust to what there would be if no limits were imposed: max_Thrust_factor

  • +
+

The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal one (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is also the case of some turbine types for what concerns the ROSCO controller. +The first step performed in the code is the calculation of the actual nominal conditions (rated wind speed, rotor speed and blade pitch angle): by +means of a constrained optimisation, the values of wind speed, rotor speed and blade pitch angle are sought such that the first two are as close as +possible to those set for the first attempt, with the constraint of having a thrust not exceeding the maximum and a power output equal to the rated +one. In the case of the Baseline controller, the first constraint does not apply, in the case of the ROSCO controller, on the other hand, we first +calculate the nominal conditions without the thrust constraint, then calculate the maximum thrust by multiplying the nominal one by the thrust factor +defined in the settings and then repeat the calculation to find the correct nominal values. The optimisation relies on a function that calculates the +aerodynamic forces at the hub by solving the BEM (Blade Element Momentum) theory, for more information on how this function works see ([D6] , [D7]).

+

The second step, performed only in the case of ROSCO, involves finding the wind speed for which transition from zone 1.5 to zone 2 (see [D4]) occurs. +In both zones it is desired to maximize power, but in zone 1.5 is where there is the additional constraint of minimum rotor speed. Here, to maximize +power, the rotor speed would need to be less than the minimum rotor speed, and to partially compensate for the resulting power deficit, a blade pitch +angle greater than zero is used. The search for the frontier wind speed is done by an optimization that looks for the wind speed for which the +difference between the rotor speed that maximizes power without imposing constraints equals the minimum wind speed. To find the rotor speed that +maximizes power for a given wind speed, a second nested optimization is used.

+

Finally, the last step involves calculating the stationary values as the wind speed changes. It is performed by a constrained optimization through which +the rotor speed and blade pitch values are sought such that the power produced is maximized while maintaining it at or below the rated power and +respecting the maximum thrust limit. Once the rotor speed and blade pitch values have been found for each wind speed analysed, the steady-state +values of the other quantities of interest (power, thrust, and generator torque) are evaluated.

+

Once the steady-state values for the two control logics have been calculated, it is possible to build the data structures needed for controller +simulation by running the Controller.m script in the “Control” subfolder. In this script a few settings have to be defined, which can refer to +both logics or just the Baseline or ROSCO controller.

+

The common settings are as follows:

+
    +
  • Maximum allowable torque rate: torqueMaxRate

  • +
  • Maximum allowable blade pitch rate: thetaMaxRate

  • +
  • Values needed to define the state space used to filter the rotor speed before providing this as input to the controllers: omegaFilter

  • +
+

The settings only valid for ROSCO are:

+
    +
  • Natural frequency of the electric generator torque control loop: wn_C

  • +
  • Damping ratio of the electric generator torque control loop: csi_C

  • +
  • Natural frequency of the blade pitch control loop: wn_theta_ROSCO

  • +
  • Damping ratio of the blade pitch control loop: csi_theta_ROSCO

  • +
  • Constants used in the “Set Point Smoothing” module: kb and kt

  • +
  • Gain related to the velocity (along the surge) of the nacelle, used to control floating wind turbines: KV

  • +
  • Values needed to define the state space used to filter the wind speed before providing this as input to the controller: windFilter

  • +
  • Values needed to define the transfer function used to filter the nacelle speed before providing this as input to the controller: pitchFilter

  • +
  • Values needed to define the transfer function used as a filter in the “Set Point Smoothing” module: SPSFilter

  • +
+

The settings only valid for Baseline are:

+
    +
  • Natural frequency of the blade pitch control loop: wn_theta_BL

  • +
  • Damping ratio of the blade pitch control loop: csi_theta_BL

  • +
+

Regarding the Baseline controller, at the operational level, the torque law is simply computed by creating a biunivocal relationship between the +steady-state (as wind speed changes) values of rotor speed and generator torque. As for the blade pitch loop, at first the value of +\(K_P^\prime\) and \(K_I^\prime\) are calculated (see Baseline), after which the power to pitch sensitivity, as a function of blade pitch angle, +is computed for each stationary point. To do this centered finite differences are used by calculating power via a function that solves the +aerodynamics via BEM theory. Finally, we perform quadratic regression of \(\frac{dP}{d\theta_{bl}}\) so that we have, in simulation, a simple +relationship between blade pitch and power-to-pitch sensitivity.

+

As for the ROSCO controller, however, at the operational level, in the script the \(A\) and \(B_{\theta_{bl}}\) matrices are calculated for +each wind speed for which stationary values were computed through centered finite differences; regarding the \(B_{T_{gen}}\) matrix, it is +calculated only once since it is constant (see ROSCO). Once the matrices are known, the values of \(K_P\) and \(K_I\) for the two controls (generator +torque and blade pitch) are calculated. Finally, the minimum allowable blade pitch value is calculated using an optimization procedure; specifically, +for each wind speed in region 3 (a rotor speed equal to the nominal one is assumed in this region), the blade pitch angle such that the maximum thrust +occurs is found. It represents the minimum angle value that can be imposed, below which there will be a thrust greater than the maximum allowed.

+
+
+

Aerodynamic Loads Features

+

The look-up tables of aerodynamic loads are generated using the AeroLoads.m script; the aerodynamic forces and torques are calculated as a function +of three input parameters: the wind speed, the difference between the rotor speed and the stationary rotor speed for that wind speed, and the difference +between the blade pitch angle and the steady-state angle for that wind speed. In order to calculate the required look-up tables, the user will need to +define the following variables:

+
    +
  • Rotor speed discretization values: o_discr

  • +
  • Blade pitch discretization values: theta_discr

  • +
  • Discretization range of rotor speed values around steady-state one (rad/s): o_A

  • +
  • Discretization range of blade pitch values around steady-state one (rad): theta_A

  • +
+

The discretisation range is used to determine the aerodynamic loads near the steady states, which include all cases that are likely to be reached during +operating conditions.

+
+
+
+

References

+
+
+
+[D1] +

Preprint M Masciola, J Jonkman, and A Robertson. Implementation of a multisegmented, quasi-static cable model.

+
+
+[D2] +

Neil Davis Kelley and Bonnie J Jonkman. Overview of the turbsim stochastic inflow turbulence simulator. Technical Report, National Renewable Energy Lab.(NREL), Golden, CO (United States), 2005.

+
+
+[D3] +(1,2) +

Morten H. Hansen. Control design for a pitch-regulated, variable speed wind turbine. Risø National Laboratory, 2005. ISBN 8755034098.

+
+
+[D4] +(1,2,3) +

Nikhar J Abbas, Daniel S Zalkind, Lucy Pao, and Alan Wright. A reference open-source controller for fixed and floating offshore wind turbines. Wind Energy Science, 7(1):53–73, 2022.

+
+
+[D5] +

Evan Gaertner, Jennifer Rinker, Latha Sethuraman, Frederik Zahle, Benjamin Anderson, Garrett Barter, Nikhar Abbas, Fanzhong Meng, Pietro Bortolotti, Witold Skrzypinski, George Scott, Roland Feil, Henrik Bredmose, Katherine Dykes, Matt Shields, Christopher Allen, and Anthony Viselli. Definition of the iea wind 15-megawatt offshore reference wind turbine technical report. 2020.

+
+
+[D6] +

S Andrew Ning. A simple solution method for the blade element momentum equations with guaranteed convergence. Wind Energy, 17(9):1327–1345, 2014.

+
+
+[D7] +

S A Ning, G Hayman, R Damiani, and J Jonkman. Development and validation of a new blade element momentum skewed-wake model within aerodyn: preprint. 2015.

+
+
+[D8] +

Christopher Allen, Anthony Viselli, Habib Dagher Andrew Goupee, Evan Gaertner, Nikhar Abbas, Matthew Hall, and Garrett Barter. Definition of the umaine volturnus-s reference platform developed for the iea wind 15-megawatt offshore reference wind turbine technical report. 2020.

+
+
+[D9] +

J M Jonkman, G J Hayman, B J Jonkman, R R Damiani, and R E Murray. Aerodyn v15 user's guide and theory manual.

+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/index.html b/dev/most/index.html new file mode 100644 index 000000000..d05570219 --- /dev/null +++ b/dev/most/index.html @@ -0,0 +1,196 @@ + + + + + + + + + MOST Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/introduction.html b/dev/most/introduction.html new file mode 100644 index 000000000..855f14bf3 --- /dev/null +++ b/dev/most/introduction.html @@ -0,0 +1,211 @@ + + + + + + + + + Introduction — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Introduction

+

With MOST, it is possible to simulate Floating Offshore Wind Turbines (FOWTs) and hybrid platforms thanks to the development of a wind turbine model which can be coupled with the WEC-Sim library. MOST requires several user inputs similar to WEC-Sim including hydrodynamic bodies requiring hydrodynamic coefficients from Boundary Element Method (BEM) software (e.g. Nemoh, Wamit or Ansys Aqwa), mooring, constraints, and simulation input details. Differently to WEC-Sim, MOST also includes user inputs relative to the wind turbine and wind, which will be explained in the next sections.

+

Numerical codes added to WEC-Sim are the following:

+ + + + + + + + + + + + + + + + + + +

File Type

File name

Pre-processing Executables

mostIO.m, run_turbsim.m, Create_Mooring_Matrix.m, BladeData.m, WTproperties.m, Steady_States.m, Controller.m and AeroLoads.m

Post-Processing Functions

userDefinedFunction.m

New MATLAB Classes

windClass.m and windTurbineClass.m

MOST Simulink Library

MOST_Lib.slx

+

The pre-processing executables and post-processing function can be found in the WEC-Sim Applications MOST example while the new classes and Simulink library have been added to the WEC-Sim source directly.

+

Existing WEC-Sim source code has also been modified to include further option features relative to the new capabilities. The following codes have been modified:

+ + + + + + + + + + + + + + + +

File name

Description

initializeWecSim

Modified to add functions relative to the wind, wind turbine, and new mooring blocks. New functions are created in each relative class to read data prepared during the pre-processing by the user. Control parameters are also added to give user choice of which control logic to be used.

mooringClass

It is now also possible to calculate mooring loads (static loads) using non-linear look-up tables computed during pre-processing and with system displacements as input. Compared to previous versions, the mooringClass now also has a function by means of which look-up tables are loaded from a file whose name is the new property called “lookupTableFile”.

postProcessWecSim + responseClass

Modified to add wind turbine results in the WEC-Sim output structure. Examples of new outputs are the timeseries of wind turbine power, rotor speed, blade pitch, and nacelle acceleration.

+

The following diagram summarizes the workflow for the simulation of wave energy converters, which has now been updated to include the simulation of floating offshore wind turbines or hybrid devices. The portions of the code introduced with MOST are highlighted in grey, the portions executed by WEC-Sim codes in green, and what is carried out by external software in yellow.

+
+../_images/IMAGE_workflow.png + +
+
+

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/license.html b/dev/most/license.html new file mode 100644 index 000000000..be6ce9e4b --- /dev/null +++ b/dev/most/license.html @@ -0,0 +1,374 @@ + + + + + + + + + License — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

License

+

The software is distributed under the Apache License 2.0.

+ +
+

Apache License 2.0

+
                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/overview.html b/dev/most/overview.html new file mode 100644 index 000000000..3d465878f --- /dev/null +++ b/dev/most/overview.html @@ -0,0 +1,184 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

MOST (Matlab for Offshore Simulation Tool), is a simulation tool operating in the WEC-Sim environment for simulating floating offshore wind turbines, hybrid wind-wave energy converters, platforms with multiple turbines, etc. +MOST builds on WEC-Sim in MATLAB/Simulink to add windClass and windTurbineClass objects that can define a given turbine and weather conditions. +Currently, MOST supports single-tower, three-bladed, horizontal-axis wind turbines controlled by Baseline or ROSCO controllers and providing geometric and inertial data as input.

+
+

MOST Developers

+

MOST is developed and maintained by the MORE Energy Lab, Politecnico di Torino, Italy. +The WEC-Sim+MOST coupling is a collaboration between the MORE Energy Lab and the WEC-Sim developers at Sandia National Laboratories and the National Renewable Energy Lab.

+

Current members of the MOST development team include:

+
    +
  • Giovanni Bracco (PI)

  • +
  • Emilio Faraggiana

  • +
  • Alberto Ghigo

  • +
  • Davide Issoglio

  • +
  • Ermando Petracca

  • +
  • Massimo Sirigu

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/publications.html b/dev/most/publications.html new file mode 100644 index 000000000..526838c87 --- /dev/null +++ b/dev/most/publications.html @@ -0,0 +1,169 @@ + + + + + + + + + Publications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Publications

+

[1] M. Sirigu, E. Faraggiana, A. Ghigo, G. Bracco, “Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody” Journal of Physics: Conference Series. Vol. 2257. No. 1. IOP Publishing, 2022.

+

[2] E. Faraggiana, M. Sirigu, A. Ghigo, G. Bracco, G. Mattiazzo, “An efficient optimisation tool for floating offshore wind support structures.” Energy Reports 8 (2022): 9104-9118..

+

[3] M. Sirigu, E. Faraggiana, A. Ghigo, E. Petracca, G. Bracco, G. Mattiazzo. “Development of a simplified blade root fatigue analysis for floating offshore wind turbines.” Trends in Renewable Energies Offshore (2022): 935-941..

+

[4] Faraggiana, E., et al. “An optimal design of the Hexafloat floating platform for offshore wind turbines.” Trends in Renewable Energies Offshore: Proceedings of the 5th International Conference on Renewable Energies Offshore (RENEW 2022, Lisbon, Portugal, 8–10 November 2022). CRC Press, 2022.

+

[5] Petracca, Ermando, et al. “Design and techno-economic analysis of a novel hybrid offshore wind and wave energy system.” Energies 15.8 (2022): 2739.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/release_notes.html b/dev/most/release_notes.html new file mode 100644 index 000000000..992787ec8 --- /dev/null +++ b/dev/most/release_notes.html @@ -0,0 +1,194 @@ + + + + + + + + + Release Notes — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Release Notes

+
+

MOST v1.0.0 (within WEC-Sim v6.0)

+

New Features

+
    +
  • Addition of the windClass object

  • +
  • Addition of the windTurbineClass object

  • +
  • Addition of the MOST library

  • +
  • Release of a WEC-Sim+MOST Application

  • +
+
+
+

Citing MOST

+

When using MOST with WEC-Sim, please cite the following MOST publication in addition to the WEC-Sim software release and publication:

+
@inproceedings{sirigu2022development,
+  title={Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody},
+  author={Sirigu, M and Faraggiana, E and Ghigo, A and Bracco, G},
+  booktitle={Journal of Physics: Conference Series},
+  volume={2257},
+  number={1},
+  pages={012003},
+  year={2022},
+  organization={IOP Publishing}
+}
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/most/theory.html b/dev/most/theory.html new file mode 100644 index 000000000..61564bdb6 --- /dev/null +++ b/dev/most/theory.html @@ -0,0 +1,560 @@ + + + + + + + + + Theory — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Theory

+

In this section, the features introduced with MOST will be explored, offering some theoretical background to understand their use. +To do this, the workflow shown in the Introduction will be followed: Pre-processing, User Inputs, Simulation, +and Post-processing.

+
+

Pre-processing

+

In the pre-processing phase, it is possible to create all the data required for the simulation (except the hydrodynamic coefficients) by +launching the mostIO.m script, which will call up other codes, each dedicated to specific data (e.g. wind turbine, control, or mooring) +and described in this section. As with other WEC-Sim examples, the bemio.m script should still be used to load the hydrodynamic coefficient data.

+
+

Mooring look-up table

+

MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. +Specifically, the mooring look-up table simulates a mooring system consisting of a certain number of lines suspended between two points +(anchor and fairlead) and angularly equally spaced. This option is based on the catenary equations similarly to the open-source code MAP++ [D1]. +In the Simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outputs (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called “moor_matrix” and created through the Create_Mooring_Matrix.m script.

+
+
+

Wind input

+

This section describes how the input wind field is generated; there are two possible methods: to have constant wind speed (in time and space) or to +have a wind speed field in which turbulence and non-uniform spatial distribution are taken into account. It is possible to specify wind method in wecSimInputFile.m by initializing the windClass with “constant” or “turbulent”. +In the first case there will be a constant wind speed at all times and at every point on the rotor area, while the second case considers the spatial +and temporal turbulence of the wind. Regarding the second case, the scatter of the wind speed is obtained using an external code, Turbsim, developed +by NREL, and integrated within the MOST code. The user can launch the run_turbsim.m script (in “turbsim” subfolder) to create the wind input data +structure, specifying some properties such as mean velocity and turbulence intensity. For more information, it is recommended to read the Advanced Features or the +documentation of TurbSim [D2]. The resulting data structure consists of the wind speed +(in the surge direction) at each instant and for each node of a spatial grid covering the rotor area. During the simulation, the wind speed +corresponding to the blade nodes will be obtained by interpolating between the grid points via look-up tables.

+
+
+

Wind turbine properties

+

All wind turbine components are modelled as rigid bodies; this includes the tower, the nacelle, the hub, and the blades. The inertial and geometrical +properties of the components must be defined in a MATLAB structure, the user can use the script WTproperties.m (“turbine_properties” subfolder) to write the parameters of the +desired wind turbine. In particular, mass, moment of inertia, centre of mass relative to the reference, and centre of mass in the global reference +frame (whose origin is at the sea water level) are defined for each body. In addition, other parameters such as tilt and precone angles, tower +height, electrical generator efficiency, and CAD file names are set. The CAD files to define the geometry can be imported from external software. +They must be saved in the folder “geometry”. The user must set the name of the CAD files in “WTcomponents” struct to allow MOST to upload the files.

+../_images/IMAGE_geometry.png + +
+

+
+

In addition to the general characteristics of the wind turbine, the user must set the specific properties for the blades by launching the BladeData.m +script, which defines the needed data structure by taking the information from some text files in the “BladeData” subfolder. In these, lift, drag, and +torque coefficients are specified for each type of airfoil used, as well as certain geometric characteristics of the blades such as twist angle and +chord length as a function of radius and geometric characteristics related to pre-bending.

+
+
+

Control properties

+

This section explains how the MOST controller characteristics to be used in simulations are calculated. As mentioned earlier, it is possible to choose +between two control logics (Baseline [D3] and ROSCO [D4]), and, for the creation of the data required for the +simulation, it is necessary to know the steady-states values, i.e. the stationary values of certain quantities of interest when varying, in this case, +the wind speed, which is considered constant for this purpose. The first step in obtaining the data required for the simulation is therefore to run +the script called Steady_States.m in the subfolder “control” to perform this calculation. Specifically, through this, the stationary values +of power, rotor speed, thrust force, generator torque, and blade pitch angle are computed for both of the aforementioned control logics. +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal wind speed (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is the case for some turbine types in the ROSCO case.

+

Below is a figure representing an example of steady-state values for Baseline and ROSCO controllers for the IEA 15 MW reference wind turbine [D5].

+../_images/IMAGE_Steady_States.png + +
+

+
+

In the following, the Baseline and ROSCO control logics will be briefly explained; for more information refer to [D3] (Baseline) +and [D4] (ROSCO).

+
+

Baseline

+

Baseline is a conventional, variable-speed, variable collective pitch controller, which is made up of two independent systems:

+
    +
  • A generator torque controller (consisting of a generator speed-torque law) designed to maximize power extraction below nominal wind speed

  • +
  • A blades collective pitch controller designed to regulate rotor and generator speed above nominal wind speed

  • +
+
+
Generator torque controller
+

The generator-torque control law is designed to have three main regions and two transition ones between them. Aerodynamic torque acts as an +accelerating load, the generator torque, converting mechanical energy to electrical energy, acts as a braking load. The generator torque is computed +as a tabulated function of the filtered generator speed, incorporating 4 operational control regions: 1, 1.5, 2, and 3.

+
    +
  • Region 1: control region before cut-in wind speed, where the generator is detached from the rotor to allow the wind to accelerate the rotor for start-up. In this region, the generator torque is zero and no power is extracted from the wind.

  • +
  • Region 1.5: transition region called start-up region and permits a smooth transition between null and optimal torque.

  • +
  • Region 2: control region where extracted power is maximized. Here, to maintain the tip speed ratio constant at its optimal value, the generator torque is proportional to the square of the filtered generator speed. Aerodynamic torque can be expressed as:

    +
    +\[T_{\text {aero }}=\frac{1}{2} \rho \pi \frac{R^5}{\lambda^3} C_P\left(\lambda, \theta_{\text {bl }}\right) \cdot \Omega^2=k_{\text {opt }} \cdot \Omega^2\ \ \ \ \ \ (1)\]
    +

    Where \(k_{opt}\) is obtained with TSR (Tip Speed Ratio, \(λ\)) and blade pitch values that lead to maximum power coefficient: \(λ = λ_{opt}\), \(\theta_{bl} = 0^{\circ}\);

    +
  • +
  • Region 3: above rated condition region, where the generator torque is kept constant at its rated value. In this region pitch control is active to maintain rotor speed at its rated value.

  • +
+

The figure below shows an example of control law of the Baseline generator torque controller for the IEA 15 MW reference wind turbine [D5].

+../_images/IMAGE_Baseline_Torque_Law.png + +
+

+
+
+
+
Blade pitch controller
+

Regarding the blade pitch controller, it regulates the generator speed in region 3 (where wind speed exceeds its rated value) to maintain it at its nominal +value through a scheduled proportional-integral control (PI). In this region the torque is kept constant at its rated value (\(T_{gen} = T_{gen,r} = P_{r} / \Omega_{r}\)). +Aerodynamic torque \(T_{\mathrm{aero\ }}\) depends on wind speed, rotor speed and blade pitch, but assuming in this region rotor speed maintains +its rated value \(\Omega_r\) (this assumption can be made since the control objective is to track that value) and neglecting power to +wind speed sensitivity, linearization around rated condition is:

+
+\[ \begin{align}\begin{aligned}\begin{split}T_{\text {aero }} \approx T_{\text {aero }}\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)+\left.\frac{d T_{\text {aero }}\left(U_{\text {wind }}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\substack{U_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r}}\left(\theta_{b l}-\theta_{b l, r}\right)=\end{split}\\\begin{split}=\frac{P\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)}{\Omega_r}+\left.\frac{1}{\Omega_r} \frac{d P\left(U_{\text {wind}}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\begin{array}{c} \theta_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r \end{array}}\left(\theta_{b l}-\theta_{b l, r}\right)\ \ \ \ \ \ (2)\end{split}\end{aligned}\end{align} \]
+

where \(U_{wind,r}\) and \(\theta_{bl,r}\) are rated wind speed and blade pitch. Once first is chosen, \(\theta_{bl,r}\) is which one leads to a steady state +condition with extracted power equal to the rated one. So, aerodynamic torque expression becomes:

+
+\[T_{\mathrm{aero\ }}\approx\ \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r}\frac{dP}{d\theta_{bl}}\Delta\theta_{bl}\ \ \ \ \ \ (3)\]
+

Where \(\Delta \theta _{bl}\) represents a small perturbation of the blade pitch angle about its linearization point \(\theta_{bl,r}\). By +expressing the blade-pitch regulation starting from the speed perturbation with a proportional-integrative control law (PI), it is possible to write:

+
+\[\Delta \theta_{b l}=K_P \Delta \Omega+K_I \int_0^t \Delta \Omega d t\ \ \ (4)\]
+

Where \(K_P\) is the proportional gain and \(K_I\) the integrative gain; \(\Delta\Omega\) represents a small perturbation of rotor speed about its rated value: +\(\Delta\Omega=\ (\Omega-\Omega_r)\). Combining last equations found with the equilibrium equation of the rotor around its rotation axis +\((T_{\mathrm{aero\ }}-\ T_{\mathrm{gen\ }}= I_{\mathrm{eq\ }}\dot{\Omega})\), it is possible to obtain, once defined \(\Delta\Omega=\ \dot{\delta}\), +the following relation:

+
+\[\frac{P_r}{\Omega_r}+\frac{1}{\Omega_r} \frac{d P}{d \theta_{b l}}\left(K_P \dot{\delta}+K_I \delta\right)-\frac{P_r}{\Omega_r}=I_{e q} \ddot{\delta}\ \ \ (5)\]
+

Which can be rearranged as:

+
+\[I_{e q} \ddot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_P}{\Omega_r}\right] \dot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_I}{\Omega_r}\right] \delta=0\ \ \ (6)\]
+

That in the canonical form becomes:

+
+\[M \ddot{\delta}+C \dot{\delta}+K \delta=0 \ \ \ \ (7)\]
+

With: \(\ M= I_{eq}\), \(\\C= \left[-\frac{dP}{d\theta_{bl}}\frac{K_P}{\Omega_r}\right]\), \(\\K=\left[-\frac{dP}{d\theta_{bl}}\frac{K_I}{\Omega_r}\right]\)

+

Now it is possible to choose proportional and integral gains in order to obtain desired characteristics of the blade pitch control. Its characteristics +directly depend on natural frequency and damping ratio:

+
+\[\omega_n=\sqrt{\frac{M}{K}}\ \ ,\ \ \ \ \ \ \zeta=\frac{C}{2M\omega_{n\ }}\ \ \ \ \ \ (8)\]
+

Once defined \(\omega_{n}\) and \(\zeta\), expressions of proportional and integral gains become:

+
+\[K_P=\frac{2\ I_{eq}{\ \omega}_n\ \zeta{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_P^\prime}{\frac{dP}{d\theta_{bl}}}\ ,\ \ \ \ \ \ \ K_I=\frac{I_{eq\ }\omega_n^2{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_I^\prime}{\frac{dP}{d\theta_{bl}}}\ \ \ \ \ \ \ \ \ \ (9)\]
+

The term \(\frac{dP}{d\theta_{bl}}\) is the power to pitch sensitivity, which depends on wind speed and blade pitch (related each other as previously +mentioned) adopted during linearization. So, to always have the same system characteristic (\(\omega_n\) and \(\zeta\)), proportional and integral +gains must vary with a variation of blade pitch and so of wind speed. Figure below shows power to pitch sensitivity with respect to blade pitch; as can be +seen there, it can be well approximated with a quadratic regression, through which quadratic form that minimize sum of square error is computed. Thanks to +this regression, power to pitch sensitivity expression becomes of the form:

+
+\[\frac{dP}{d\theta_{bl}}\ \approx\ c_1{\theta_{bl}}^2+c_2\theta_{bl}+c_3\ \ \ \ \ \ (10)\]
+

\(\frac{dP}{d\theta_{bl}}\) is the power to pitch sensitivity and \(c_1 (W/{deg}^3)\), \(c_2 (W/{deg}^2)\) and \(c_3 (W/deg)\) are the +coefficients of its quadratic regression.

+../_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png + +
+

+
+

This approximation will make the calculation of controller gains computationally less demanding during simulation.

+
+
+
+

ROSCO

+

ROSCO controller (Reference Open-Source COntroller for fixed and floating offshore wind turbines) was developed by researchers at the Delft University +of Technology [D4] to provide a modular reference wind turbines controller that represent industry standards and performs comparably +or better than existing reference controllers, such as baseline, discussed in previous section. The primary functions of the controller are still to +maximize power in below-rated operations and to regulate rotor speed in above-rated ones, moreover, it also provides additional modules which can improve +control performances. ROSCO controller, as well as Baseline and most of other conventional ones, consists of two methods of actuation: generator torque +and collective blade pitch. Strategies of actuation are commonly separated into four main regions, with transition logic between them. Regions 1 and 4 +correspond to below cut-in and above cut-out wind speed conditions, these regions are generally out of interest for standard control purposes (performances +optimization) and so they will not be further discussed below. In region 1 generator torque is set to zero to allow the wind to accelerate the rotor for +start-up. In this region, no power is extracted. In region 4 blades are pitched to reduce thrust force to zero (feathering position).

+../_images/IMAGE_ROSCO_Power_Curve.png + +
+

+
+

Control strategies for regions 1.5, 2 and 3 are highly like those ones adopted in Baseline control. Region 2 is when wind speed is below rated condition, +here main goal is power extraction maximization. To do so, two methods can be used, a quadratic law (as in Baseline controller) of generator torque with +respect to rotor angular speed or a tip speed ratio (TSR) tracking to maintain the latter at its optimal value (in this case a wind speed estimation is needed). +Region 3 is when wind speed is above rated condition, here blade pitch is regulated to maintain rotor speed at its rated value and to stabilize platform (for +offshore floating wind turbines, through floating feedback module), while generator torque is kept constant at its rated value. Region 1.5 is a transition +region from cut-in wind speed and region 2. Here generator torque is regulated to maintain a defined minimum rotor speed and blades are pitched to compensate +resulting high values of TSR to improve power extraction.

+
+
ROSCO Implementation
+

Controller implementation starts from aerodynamic torque (\(T_{aero}\)) expression and rotor equilibrium equation:

+
+\[T_{aero}=\frac{1}{2}\ \rho\ A_D\ C_P\ (\lambda,\theta_{bl})\ \frac{{U_\infty}^3\ }{\Omega}\ \ \ \ \ \ (11)\]
+
+\[\dot{\Omega}=\frac{T_{\mathrm{aero\ }}-\ T_{gen}\ }{I_{\mathrm{eq\ }}}\ \ \ \ \ \ (12)\]
+

\(I_{\mathrm{eq\ }}\) is the rotor inertia, \(\rho\) is the air density, \(A_D\) is the rotor area, \(C_P\) is the power coefficient +and \(U_\infty\) is the undisturbed wind speed. The first-order linearization of eq 11 at some nominal steady-state operational point is:

+
+\[\begin{split}\Delta T_{aero}=\Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.\ \Delta\Omega+\Gamma_{\theta_{bl}}\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta\theta_{bl}+\Gamma_U\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta U\ \ \ \ \ \ (13)\end{split}\]
+

With: \(\ \ \ \Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\Omega\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.,{\ \ \ \ \ \Gamma}_{\theta_{bl}}\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\theta_{bl}\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\mathrm{,\ \ \ \ \ \ \ }\Gamma_U\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial U\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\)

+

“op” denotes the steady-state operational point at which linearization is made. Equation 12 can then be rewritten as (Δ denotes the perturbation from +steady state value “op” and \(\left \{ X_{op}=\lambda_{op},\\\ \theta_{bl, op} \right \}\)):

+
+\[\Delta \dot{\Omega}=A\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \Omega+B_{T_{g e n}} \Delta T_{g e n}+B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \theta_{b l}+B_U\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta U\ \ \ \ \ \ (14)\]
+

With:

+
+\[\begin{split}A\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{I_{\mathrm{eq}}} \frac{\partial T_{\text {aero }}}{\partial \lambda} \frac{\partial \lambda}{\partial \Omega} \\\end{split}\]
+
+\[\begin{split}\frac{\partial T_{\text {aero }}}{\partial \lambda}=\frac{1}{2} \rho A_{\mathrm{D}} R U_{\mathrm{op}}^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \lambda} \lambda_{\mathrm{op}}-C_{\mathrm{p}, \mathrm{op}}\right) \\\end{split}\]
+
+\[\begin{split}\frac{\partial \lambda}{\partial \Omega}=\frac{R}{U_{\mathrm{op}}}, \quad\left(\lambda=\frac{\Omega R}{U}\right) \\\end{split}\]
+
+\[\begin{split}B_{T_{g e n}}=-\frac{1}{I_{\mathrm{eq}}} \\\end{split}\]
+
+\[B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{2 I_{\mathrm{eq}}} \rho A_{\mathrm{D}} R U_{\mathrm{op}}{ }^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \theta_{b l}} \lambda_{\mathrm{op}}\right)\]
+

All derivatives are calculated at “op” conditions; \(\Delta U\), difference between actual wind speed and wind speed at linearization point, is considered +equal to zero during control tuning, that is computation of control gains. Both generator torque and blade pitch controllers are PI controllers, generically +defined as:

+
+\[y = K_P \ u + K_I \int_{0}^{T} u\ dt\ \ \ \ \ \ (15)\]
+

Where \(u\) represents the input and \(y\) the output, while \(K_P\) and \(K_I\) are respectively the proportional and integral gains. Generator torque +controller has as input and output:

+
+\[u=-\delta\Omega\ ,\ \ \ y=\Delta C_{gen}\ \ \ \ \ \ (16)\]
+

Blade pitch controller has as input and output:

+
+\[u=-\delta\Omega,\ \ \ y=\Delta\theta_{bl}\ \ \ \ \ \ (17)\]
+

\(\delta\Omega\) is defined as a perturbation from the reference speed:

+
+\[\Omega(t)=\Omega_{\mathrm{ref\ }}+\delta\Omega\longrightarrow-\delta\Omega=\Omega_{ref}-\Omega(t)\ \ \ \ \ \ (18)\]
+

While \(\Delta C_{gen}\) and \(\Delta\theta_{bl}\) are perturbations from steady state values:

+
+\[\theta_{bl}(t)={\theta_{bl}}_{\mathrm{op\ }}+\Delta\theta_{bl},{\ \ \ \ C}_{gen}(t)={C_{gen}}_{op}+\Delta C_{gen}\ \ \ \ \ \ (19)\]
+

Now, defining \(\Delta \Omega_{ref} =\Omega_{ref}-\Omega_{op}\) (assumed =0, since “op” point is chosen at a steady state condition with +\(\Omega_{op}=\Omega_{ref}\)), we can combine equation 14 with above definitions to obtain a differential equation that relates +\(\Delta \Omega =\Omega-\Omega_{op}\) and \(\Delta \Omega_{ref}\). Then, if the Laplace transform of this equation is considered, we arrive +to two closed-loop transfer functions (one for the generator torque module and the other for the blade pitch one) in the form:

+
+\[H(s)=\frac{\Delta \Omega(s)}{\Delta \Omega_{\mathrm{ref}}(s)}=\frac{B\left(K_P\left(x_{\mathrm{op}}\right) s+K_I\left(x_{\mathrm{op}}\right)\right)}{s^2+\left(B K_P\left(x_{\mathrm{op}}\right)-A\left(x_{\mathrm{op}}\right)\right) s+B K_I\left(x_{\mathrm{op}}\right)}\ \ \ \ \ \ (20)\]
+

Where \(B\) is \(B_{T_{gen}}\) or \(B_{\theta_{bl}}\), depending on which module is considered, since when generator torque loop is +considered, \(\Delta\theta_{bl}\) is set to zero and, when blade pitch loop is considered, \(\Delta T_{gen}\) can be equal to zero or +\(B_{T_{gen}}\) can be englobed in \(A\). Moreover, in both cases we consider \(\Delta U=0\). \(H(s)\) is a simple second order +system whose characteristics are strictly related to natural frequency and damping ratio of its canonical form. They can be defined, in order to +reach desired performance, choosing values of proportional and integral gains. If we call \(\omega_n\) the natural frequency and \(\zeta\) +the damping ratio, \(K_P\) and \(K_I\) expressions (varying with operational steady state point) are:

+
+\[K_P=\frac{1}{B\left(\boldsymbol{x}_{\mathrm{op}}\right)}\left(2 \zeta \omega_n+A\left(\boldsymbol{X}_{\mathrm{op}}\right)\right)\ \ \ \ \ \ (21)\]
+
+\[K_I=\frac{\omega_{\mathrm{n}}^2}{B\left(\boldsymbol{X}_{\mathrm{op}}\right)}\ \ \ \ \ \ (22)\]
+

Once transfer function of generator torque and blade pitch closed loop has been defined, and once way through which PI controllers’ gains are computed +has been explored, we can focus, specifically, on the two different modules to investigate the reference speed signals adopted and how the scheduling +of gains is performed, varying according to the conditions in which the system is.

+
+
+
Generator Torque Controller
+

Four different generator torque controllers are available in ROSCO, they are the possible combination between two methods for below wind speed operations +and two methods for above wind speed conditions. Regarding below rated operations, to maximize extracted power at each wind condition, a quadratic low +of generator torque with respect to rotor angular speed can be adopted. In this section we omit exploitation of this method since is the same adopted +in Baseline controller. Alternatively, a tip speed ratio tracking to maintain it at its optimal value can be adopted. If the wind speed can be measured +or estimated accurately, a generator torque controller can be designed to maintain the \(\lambda_{opt}\) and maximize power capture, so reference +rotor angular speed becomes:

+
+\[{\Omega_{ref}}_\tau=\frac{\lambda_{opt}\ \hat{U}}{R}\ \ \ \ \ \ (23)\]
+

Where subscript \(\tau\) indicates the reference speed of torque controller and \(\hat{U}\) is the estimated wind speed. From equations 14, 21 +and 22, it can be seen that integral gain \(K_I\) of generator torque controller is constant, whereas \(A\), so proportional gain \(K_P\), +are both dependent on \(U\) (wind speed). However, it was found that fixing \(K_P = K_P (U = Urated)\) does not negatively affect power production. +Regarding the two existing methods for above rated conditions, first of them considers a constant generator torque, defined as:

+
+\[T_{gen,ar}(t)=\ T_{rated}=\frac{P_{\mathrm{rated\ }}}{\Omega_{rated}}\ \ \ \ \ \ (24)\]
+

Where subscript “ar” means “above rated”. On the other hand, the second strategy considers a constant extracted power equal to its rated value, so +generator torque is defined as:

+
+\[T_{gen,ar}(t)=\frac{P_{\mathrm{rated\ }}}{\Omega}\ \ \ \ \ \ (25)\]
+
+
+
Blade Pitch Controller
+

Main goal of blade pitch controller is keeping rotor angular speed at its rated value, so reference speed is (both in below rated and above rated +conditions):

+
+\[\Omega_{\mathrm{ref\ },\theta_{bl}}=\Omega_{\mathrm{rated}}\ \ \ \ \ \ (26)\]
+

Where subscript \(\theta_{bl}\) means we refer to blade pitch controller. In below rated conditions, generator speed is lower than rated value, +so \(-\delta\Omega=\Omega_{ref}-\Omega\ >\ 0\) and, since gains are normally negative, \(\theta_{bl}\) is saturated at its minimum value, +defined by an additional module of ROSCO controller which will be discussed later. According to equations 21 and 22, to find controllers gain values, +\(B_{\theta_{bl}}\left({X}_{op}\right)\) and \(A\left({X}_{op}\right)\) should be computed. They change for any operation point at which +system is linearized, so they are function of \({X}_{op}=\ \left\{\lambda_{op},{\theta_{bl}}_{op}\right\}\). Linearization point can be the +optimal steady state values chosen during strategy definition, for which there is a unique relationship between \(\lambda_{op}\) and +\({\theta_{bl}}_{op}\). For this reason, \(B_{\theta_{bl}}\) and \(A\) can be expressed with respect to \({\theta_{bl}}_{op}\), +so gains’ values can be scheduled with \(\theta_{bl}\) as parameter.

+
+
+
Additional Control Modules
+

In this section principal additional modules are briefly discussed to understand their functions and how they modify control output; for more information +it is possible to consult [D4]. They are:

+
    +
  • Wind speed estimator : This module estimates wind sped used for TSR tracking in the generator torque controller. Employed algorithm is based on a continuous-discrete Kalman filter, which exploits system model, a wind auto regressive model and other information, like covariance matrices based on the expected wind field and measure’s confidence of rotor speed to estimate a mean wind speed across rotor area at each time.

  • +
  • Set Point Smoothing : Generator torque and blade pitch controllers will normally conflict with each other in near-rated operation due to incompatible reference rotor speed. To avoid this, a set point smoother can be employed; it shifts the speed reference signal of the inactive controller while the active one works. As an example, at above rated condition torque controller is the inactive one and vice versa. If TSR tracking were to be adopted for the torque generator, then the reference speed at high wind speeds would be higher than the one actually wanted (rated one), so the smoother brings the reference towards the rated speed and the resulting torque approaches the rated one, the one actually intended by adopting a constant torque strategy under above conditions.

  • +
  • Minimum pitch Saturation : This module defines a minimum value of blade pitch angle which will be used as a saturation limit during control operations. It mainly modifies expected blade pitch values in region 1.5 and near rated conditions and leads to two effects:

    +
    +
      +
    • Peak shaving : Near rated condition thrust value reaches the highest values, since below rated wind speed is lower and above rated condition blade pitching reduces that force. So, to limit loads, minimum pitch module imposes not null pitch angles also below rated wind speed, near that value.

    • +
    • Power maximization in low wind : In region 1.5, as mentioned in control region section, a minimum value of rotor speed is imposed, so at low wind speeds TSR deviates far from its optimal value. To compensate this fact and to increase power coefficient value in this condition, blade pitch is led to be greater.

    • +
    +
    +
  • +
  • Floating offshore wind turbine feedback : this module is though for FOWTs (Floating Offshore Wind Turbines) and introduces a new term in the PI blade pitch controller, which becomes:

    +
    +
    +\[\Delta \theta_{b l}=-k_{\mathrm{P}} \delta \Omega-k_{\mathrm{I}} \int_0^T \delta \Omega \mathrm{d} t+k_{\theta_{\text {bl,float }}} \dot{x}_t\ \ \ \ \ \ (27)\]
    +
    +

    Additional term is tower-top velocity \({\dot{x}}_t\) multiplied by \(k_{{\theta_{bl,float}}_\mathrm{\ }}\) gain. The latter is chosen from a +manipulation of rotor equilibrium equation and structure pitch equation, in which expression of thrust and power coefficients compare. The aim is to +find gains’ value that reduces rotor angular acceleration to tower speed sensitivity to mitigate structure pitch effect on rotor aerodynamic torque. +This expedient increases the average extracted power and stabilizes the structure.

    +
  • +
+
+

+
+

In this case, TSR tracking was chosen for torque control at wind speeds lower than nominal one and a constant torque equal to nominal in above rated +conditions. Furthermore, the wind speed is assumed to be a priori known, so the Kalmann filter constituting the estimation module will not be +exploited.

+
+
+
+
+

Aerodynamic Loads

+

The aerodynamic loads due to the interaction between wind and blades are determined during the simulation using look-up tables previously obtained +during pre-processing. Specifically, the “AeroLoads” script in the “aeroloads” subfolder handles this by using a function, based on BEM (Blade Element +Momentum Theory), which receives as input the wind speed, rotor speed, and blade pitch angle and outputs the aerodynamic forces and torques acting on +the blade root. For more information on the resolution of BEMT see [D6] and [D7]. The aerodynamic forces do not take into +account the flexibility of the blade (rigid body assumption), the deflection of the wake due to the rotor misalignment with respect to the wind and +the wake dynamics. The domain of the tables will consist of the wind speeds for which the stationary values were previously calculated and a number +of values of rotor speed and blade pitch angle evenly spaced around the stationary value corresponding to the wind speed. The look-up table of +the aerodynamic loads has only one input for the wind speed, so the average wind speed is determined by interpolating four points for each blade in +the wind grid along the blade length. The discretization points are defined by “blade.bladeDiscr” in WTproperties.m script. It is preferable to define +those points starting from the middle of the blade and not from the root because the wind speed has more influence at the final section of the blade. The horizontal hub speed, due to surge and pitch oscillation, is added to the wind speed. +Furthermore, the pitch motion and yaw motion of the hub multiplied by the distance from the hub of discretization points (blade.bladeDiscr) are also +added to wind speed.

+
+
+
+

User inputs

+

In addition to the settings defined in pre-processing, to use MOST it is necessary to define simulation settings and decide which input files (created +in the pre-processing) to use, this is done via the WEC-Sim library script wecSimInputFile.m.

+
+
+

Simulation

+

The simulation of floating wind turbines or hybrid systems is carried out in the Simulink environment using the WEC-Sim libraries and the MOST library +(“MOST_lib.slx”), for the wind turbine part and its control. In order to launch the simulation, it is necessary to use the wecSim.m executable, +which calls up wecSimInputFile.m for defining the input data and the initializeWecSim.m function for setting up the classes and defining the active +variant subsystems according to the settings made. Below is an example of a Simulink model for the simulation of a floating wind turbine.

+../_images/IMAGE_Volturn15MW_Simulink_example.png + +
+

+
+

The platform and mooring subsystems are libraries of WEC-Sim that solve the hydrodynamic and hydrostatic loads acting on the platform and the forces +due to moorings according to the settings and file names provided. The turbine subsystem is the MOST library, visible in the figure below.

+../_images/IMAGE_MOST_Library.png + +
+

+
+

The MOST model is mainly composed of rigid bodies (representing the various components of the turbine) connected via fixed joints or, in the case of +the link between the hub and nacelle, with a revolute joint. An example of a component (hub) can be seen in the figure below and includes the calculation of +inertial forces (in the “Body Properties” block) and weight force (in the “External Force and Torque” block). In the case of blades, aerodynamic forces +are also applied via a similar block.

+../_images/IMAGE_Body_Block_example.png + +
+

+
+

In the ‘Aerodynamics + Control’ subsystem, the aerodynamic forces and torque values of the generator and collective blade pitch are derived. In the +“Control” and “Blade wind speed” subsystems, variant subsystems are contained in which it is decided whether to use the Baseline or ROSCO controller +and whether to have constant or turbulent wind. With regard to wind block, here the relative speed with respect to the interested blade nodes is +calculated, receiving the movements of the structure and the wind field as inputs. Finally, the “AeroLoads” subsystem contains the look-up tables of +the aerodynamic loads obtained in pre-processing.

+../_images/IMAGE_Aeroload_Control_Submodel.png + +
+

+
+
+
+

Post-processing

+

Post-processing consists of processing the simulation output data and saving it, as well as of the possible creation of an (ASCII) text file containing +the simulation report. For this we rely on the WEC-Sim executables stopWecSim.m and postProcessWecSim.m, which use the rensponseClass for processing +the results, and on the userDefinedFunction.m script to plot time-domain simulation input and output by also exploiting some functions of the rensponseClass. +The responseClass contains all the output time-series and methods to plot and interact with the results. It is not initialized by the user; instead, it +is created automatically at the end of a WEC-Sim simulation. The responseClass does not input any parameter back to WEC-Sim, only taking output data from +the various objects and blocks. After WEC-Sim is done running, there will be a new variable called output saved to the MATLAB workspace. +The output object is an instance of the responseClass; it contains all the relevant time-series results of the simulation. +The figure below shows an example of some input-output plots from a simulation of the IEA 15 MW reference wind turbine mounted on the VolturnUS semi-submersible +platform ([D5] and [D8]).

+../_images/IMAGE_Results_Plots_example.png + +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/objects.inv b/dev/objects.inv new file mode 100644 index 000000000..24263f8a8 Binary files /dev/null and b/dev/objects.inv differ diff --git a/dev/search.html b/dev/search.html new file mode 100644 index 000000000..eee04c9a8 --- /dev/null +++ b/dev/search.html @@ -0,0 +1,161 @@ + + + + + + + + Search — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/dev/searchindex.js b/dev/searchindex.js new file mode 100644 index 000000000..bf56a29ad --- /dev/null +++ b/dev/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"API": [[26, null]], "Acknowledgements": [[8, null], [14, null]], "Added Mass": [[0, "added-mass"]], "Additional Control Modules": [[22, "additional-control-modules"]], "Advanced Features": [[0, null], [15, null], [25, null]], "Advanced Features Series": [[33, "advanced-features-series"]], "Aerodynamic Loads": [[22, "aerodynamic-loads"]], "Aerodynamic Loads Features": [[15, "aerodynamic-loads-features"]], "Apache License 2.0": [[10, "apache-license-2-0"], [18, "apache-license-2-0"]], "BEMIO": [[25, "bemio"], [33, "bemio"]], "BEMIO Functions": [[25, "bemio-functions"]], "BEMIO hydro Data Structure": [[25, "bemio-hydro-data-structure"]], "Baseline": [[22, "baseline"]], "Blade Pitch Controller": [[22, "id13"]], "Blade pitch controller": [[22, "blade-pitch-controller"]], "Body Blocks": [[28, "body-blocks"]], "Body Class": [[26, "body-class"], [28, "body-class"], [33, "body-class"]], "Body Class Initialization": [[28, "body-class-initialization"]], "Body Features": [[25, "body-features"]], "Body Mass and Geometry Features": [[25, "body-mass-and-geometry-features"]], "Body-To-Body Interactions": [[25, "body-to-body-interactions"]], "Body-to-Body Interactions": [[27, "body-to-body-interactions"]], "Boundary Element Method (BEM)": [[24, "boundary-element-method-bem"]], "Cable Block": [[28, "cable-block"]], "Cable Class": [[26, "cable-class"], [28, "cable-class"]], "Cable Class Initialization": [[28, "cable-class-initialization"]], "Cable Features": [[25, "cable-features"]], "Calculation of K_{r} from State Space Matrices": [[24, "calculation-of-k-r-from-state-space-matrices"]], "Callback Functions": [[3, "callback-functions"]], "Citing MOST": [[21, "citing-most"]], "Citing WEC-Sim": [[13, "citing-wec-sim"]], "Code Structure": [[28, null], [33, "code-structure"]], "Comparison of Performance Between Option 1 and Option 2": [[0, "comparison-of-performance-between-option-1-and-option-2"]], "Constraint Blocks": [[28, "constraint-blocks"]], "Constraint Class": [[26, "constraint-class"], [28, "constraint-class"]], "Constraint Class Initialization": [[28, "constraint-class-initialization"]], "Constraint and PTO Features": [[25, "constraint-and-pto-features"]], "Control Features": [[15, "control-features"]], "Control properties": [[22, "control-properties"]], "Controller Features": [[25, "controller-features"]], "Controls": [[27, "controls"]], "Convolution Integral Formulation": [[24, "convolution-integral-formulation"]], "Coordinate System": [[24, "coordinate-system"]], "Copyright": [[10, "copyright"], [18, "copyright"]], "Custom Parameters": [[3, "custom-parameters"]], "Debugging": [[31, "debugging"]], "Decay Tests": [[25, "decay-tests"]], "Declutching Control": [[25, "declutching-control"]], "Degenerate Mass Distribution": [[31, "degenerate-mass-distribution"]], "Desalination": [[27, "desalination"]], "Developer Manual": [[2, null]], "Device Geometry": [[32, "device-geometry"], [32, "user-tutorials-oswec-device-geometry"]], "Dispersion Relation": [[24, "dispersion-relation"]], "Download WEC-Sim": [[29, "download-wec-sim"]], "Drag Bodies": [[25, "drag-bodies"]], "Examples: Sphere Float with Various Controllers": [[25, "examples-sphere-float-with-various-controllers"]], "External Contributors": [[8, "external-contributors"]], "External Simulink/Simscape Blocks": [[28, "external-simulink-simscape-blocks"]], "Extract Mask Variables": [[0, "extract-mask-variables"]], "FAQs": [[31, "faqs"]], "Finite Impulse Response (FIR) Filters": [[25, "finite-impulse-response-fir-filters"]], "Fixed Body": [[0, "fixed-body"]], "Fixed Time-Step (ode4)": [[25, "fixed-time-step-ode4"]], "Formatting": [[3, "formatting"]], "Frame Block": [[28, "frame-block"]], "Free Decay": [[27, "free-decay"], [31, "free-decay"]], "Functions & External Codes": [[28, "functions-external-codes"]], "Funding": [[8, "funding"]], "Generalized Body Modes": [[24, "generalized-body-modes"], [25, "generalized-body-modes"], [27, "generalized-body-modes"]], "Generator Torque Controller": [[22, "id12"]], "Generator torque controller": [[22, "generator-torque-controller"]], "Geometry File": [[34, "geometry-file"]], "Getting Started": [[1, null], [29, null]], "Hydraulic PTO": [[24, "hydraulic-pto"]], "Hydrodynamic Data": [[34, "hydrodynamic-data"]], "Hydrodynamic Data File": [[31, "hydrodynamic-data-file"]], "Hydrostatic Stability": [[31, "hydrostatic-stability"]], "Identify Root Cause": [[31, "identify-root-cause"]], "Incorporating Joint/Actuation Stroke Limits": [[25, "incorporating-joint-actuation-stroke-limits"]], "Input File": [[34, "input-file"]], "Install ParaView and WEC-Sim Macros": [[25, "install-paraview-and-wec-sim-macros"]], "Install WEC-Sim": [[29, "install-wec-sim"]], "Installation": [[33, "installation"]], "Introduction": [[9, null], [17, null]], "Irregular Wave Binning": [[25, "irregular-wave-binning"]], "Irregular Wave Power": [[24, "irregular-wave-power"]], "Irregular Waves": [[24, "irregular-waves"], [31, "irregular-waves"]], "Irregular Waves with Seeded Phase": [[25, "irregular-waves-with-seeded-phase"]], "JONSWAP (JS) Spectrum": [[24, "jonswap-js-spectrum"]], "Large X-Y Displacements": [[25, "large-x-y-displacements"]], "Latching Control": [[25, "latching-control"]], "Library Development": [[3, "library-development"]], "Library Masks": [[3, "library-masks"]], "License": [[10, null], [18, null]], "Linear PTO": [[24, "linear-pto"]], "Loading a ParaView State File": [[25, "loading-a-paraview-state-file"]], "MATLAB Merge Tool": [[3, "matlab-merge-tool"]], "MATLAB Requirements": [[29, "matlab-requirements"]], "MOST Developers": [[19, "most-developers"]], "MOST Manual": [[16, null]], "MOST v1.0.0 (within WEC-Sim v6.0)": [[21, "most-citation"]], "MOST-IO": [[15, "most-io"]], "Mask Structure": [[3, "mask-structure"]], "Mechanical PTO": [[24, "mechanical-pto"]], "Model Files": [[32, "model-files"], [32, "user-tutorials-oswec-model-files"]], "Model Predictive Control (MPC)": [[25, "model-predictive-control-mpc"]], "Modifying Constraints and PTOs": [[25, "modifying-constraints-and-ptos"]], "MoorDyn": [[24, "id21"], [25, "moordyn"]], "MoorDyn Visualization in ParaView": [[25, "moordyn-visualization-in-paraview"]], "Mooring": [[24, "mooring"], [27, "mooring"]], "Mooring Blocks": [[28, "mooring-blocks"]], "Mooring Class": [[26, "mooring-class"], [28, "mooring-class"]], "Mooring Class Initialization": [[28, "mooring-class-initialization"]], "Mooring Features": [[15, "mooring-features"], [25, "mooring-features"]], "Mooring Lookup Table": [[24, "mooring-lookup-table"], [25, "mooring-lookup-table"]], "Mooring Matrix": [[24, "mooring-matrix"], [25, "mooring-matrix"]], "Mooring look-up table": [[22, "mooring-look-up-table"]], "Morison Element": [[0, "morison-element"]], "Morison Elements": [[24, "morison-elements"], [25, "morison-elements"]], "Moving Body": [[0, "moving-body"]], "Multiple Condition Run": [[27, "multiple-condition-run"]], "Multiple Condition Runs (MCR)": [[25, "multiple-condition-runs-mcr"]], "Multiple Wave-Spectra": [[25, "multiple-wave-spectra"]], "News Articles": [[12, "news-articles"]], "Non-Hydrodynamic Bodies": [[25, "non-hydrodynamic-bodies"]], "Nonhydrodynamic Body": [[27, "nonhydrodynamic-body"]], "Nonlinear Buoyancy and Froude-Krylov Excitation": [[25, "nonlinear-buoyancy-and-froude-krylov-excitation"]], "Nonlinear Buoyancy and Froude-Krylov Wave Excitation": [[24, "nonlinear-buoyancy-and-froude-krylov-wave-excitation"]], "Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid": [[25, "nonlinear-buoyancy-and-froude-krylov-wave-excitation-tutorial-heaving-ellipsoid"]], "Nonlinear Hydro Visualization in ParaView": [[25, "nonlinear-hydro-visualization-in-paraview"]], "Nonlinear Hydrodynamic Body": [[27, "nonlinear-hydrodynamic-body"]], "Nonlinear Settings": [[25, "nonlinear-settings"]], "Note on the Issue Board": [[31, "note-on-the-issue-board"]], "Numerical Methods": [[24, "numerical-methods"]], "Numerical Test Cases": [[31, "numerical-test-cases"]], "OSWEC Tutorial": [[32, "oswec-tutorial"]], "OSWEC with Hydraulic PTO": [[25, "oswec-with-hydraulic-pto"]], "Ocean Current": [[24, "ocean-current"], [25, "ocean-current"]], "Online Training Course": [[33, "online-training-course"]], "Open an Issue": [[31, "open-an-issue"]], "Option 1": [[0, "option-1"], [24, "option-1"]], "Option 2": [[0, "option-2"], [24, "option-2"]], "Option 3": [[24, "option-3"]], "Oscillating Surge WEC (OSWEC)": [[32, "oscillating-surge-wec-oswec"]], "Other Features": [[25, "other-features"]], "Other Tests": [[31, "other-tests"]], "Overview": [[4, null], [11, null], [19, null], [24, null], [33, "overview"]], "PTO Blocks": [[28, "pto-blocks"]], "PTO Class": [[26, "pto-class"], [28, "pto-class"]], "PTO Class Initialization": [[28, "pto-class-initialization"]], "PTO-Sim": [[25, "pto-sim"], [27, "pto-sim"]], "PTO-Sim Blocks": [[28, "pto-sim-blocks"]], "PTO-Sim Class": [[28, "pto-sim-class"]], "PTO-Sim Class Initialization": [[28, "pto-sim-class-initialization"]], "ParaView Visualization Parameters": [[25, "paraview-visualization-parameters"]], "Parallel Computing Toolbox (PCT)": [[25, "parallel-computing-toolbox-pct"]], "Parameter Specifics": [[3, "parameter-specifics"]], "Paraview Visualization": [[25, "paraview-visualization"], [27, "paraview-visualization"]], "Passive Control (Proportional)": [[25, "passive-control-proportional"]], "Passive Yaw": [[27, "passive-yaw"]], "Passive Yaw Implementation": [[25, "passive-yaw-implementation"]], "Pierson\u2013Moskowitz (PM) Spectrum": [[24, "pierson-moskowitz-pm-spectrum"]], "Plot Elevation": [[25, "plot-elevation"]], "Plot Forces": [[25, "plot-forces"]], "Plot Response": [[25, "plot-response"]], "Plot Spectrum": [[25, "plot-spectrum"]], "Post-processing": [[22, "post-processing"]], "Power Take-Off (PTO)": [[24, "power-take-off-pto"]], "Pre-processing": [[22, "pre-processing"]], "Publication": [[13, "publication"]], "Publications": [[12, null], [20, null]], "Pull Requests": [[5, null]], "RM3 PTO Extension": [[27, "rm3-pto-extension"]], "RM3 Tutorial": [[32, "rm3-tutorial"]], "RM3 with Direct Drive PTO": [[25, "rm3-with-direct-drive-pto"]], "RM3 with Hydraulic PTO": [[25, "rm3-with-hydraulic-pto"]], "RM3 with MoorDyn": [[25, "rm3-with-moordyn"]], "ROSCO": [[22, "rosco"]], "ROSCO Implementation": [[22, "rosco-implementation"]], "Radiation Force calculation": [[25, "radiation-force-calculation"]], "Ramp Function": [[24, "ramp-function"]], "Reactive Control (Proportional-Integral)": [[25, "reactive-control-proportional-integral"]], "Reactive Control with Direct Drive Power Take-Off": [[25, "reactive-control-with-direct-drive-power-take-off"]], "Realization Theory": [[24, "realization-theory"]], "References": [[15, "references"], [24, "references"], [25, "references"], [32, "references"]], "Regular Wave Power": [[24, "regular-wave-power"]], "Regular Waves": [[24, "regular-waves"]], "Release Notes": [[13, null], [21, null]], "Response Class": [[26, "response-class"], [28, "response-class"]], "Review Relevant Documentation": [[31, "review-relevant-documentation"]], "Review of Rigid Body Dynamics": [[0, "review-of-rigid-body-dynamics"]], "Run from Simulink": [[3, "run-from-simulink"]], "Running WEC-Sim": [[25, "running-wec-sim"], [34, "running-wec-sim"]], "Running as Function": [[25, "running-as-function"]], "Running from Simulink": [[25, "running-from-simulink"]], "STL File Generation": [[25, "stl-file-generation"]], "Save Visualization": [[25, "save-visualization"]], "Search WEC-Sim Issues": [[31, "search-wec-sim-issues"]], "Series 1 - Multiple Condition Runs (MCR)": [[33, "series-1-multiple-condition-runs-mcr"]], "Series 10 - Desalination": [[33, "series-10-desalination"]], "Series 11 - WEC-Sim Visualization": [[33, "series-11-wec-sim-visualization"]], "Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation": [[33, "series-2-nonlinear-buoyancy-and-froude-krylov-wave-excitation"]], "Series 3 - Non-hydrodynamic Bodies": [[33, "series-3-non-hydrodynamic-bodies"]], "Series 4 - Body-to-Body Interactions": [[33, "series-4-body-to-body-interactions"]], "Series 5 - PTO-Sim": [[33, "series-5-pto-sim"]], "Series 6 - WEC-Sim Controls": [[33, "series-6-wec-sim-controls"]], "Series 7 - Modeling Cables": [[33, "series-7-modeling-cables"]], "Series 8 - Using MoorDyn with WEC-Sim": [[33, "series-8-using-moordyn-with-wec-sim"]], "Series 9 - Modeling OWC Devices": [[33, "series-9-modeling-owc-devices"]], "Setting PTO or Constraint Extension": [[25, "setting-pto-or-constraint-extension"]], "Simulation": [[22, "simulation"]], "Simulation Class": [[26, "simulation-class"], [28, "simulation-class"]], "Simulation Class Initialization": [[28, "simulation-class-initialization"]], "Simulation Features": [[25, "simulation-features"]], "Simulink Functions": [[3, "simulink-functions"]], "Simulink Model": [[34, "simulink-model"]], "Sinusoidal Steady-State Response": [[24, "sinusoidal-steady-state-response"]], "Software Tests": [[6, null]], "Solution Singularity": [[31, "solution-singularity"]], "Source Details": [[28, "source-details"]], "State Space": [[24, "state-space"]], "State-Space Representation": [[25, "state-space-representation"]], "Step 1. Add WEC-Sim to the MATLAB Path": [[29, "step-1-add-wec-sim-to-the-matlab-path"]], "Step 1: Pre-Processing": [[34, "step-1-pre-processing"]], "Step 1: Run BEMIO": [[32, "step-1-run-bemio"], [32, "user-tutorials-oswec-step-one"]], "Step 2. Verify the Path": [[29, "step-2-verify-the-path"]], "Step 2: Build Simulink Model": [[32, "step-2-build-simulink-model"], [32, "user-tutorials-oswec-step-two"]], "Step 2: Generate Hydrodata File": [[34, "step-2-generate-hydrodata-file"]], "Step 3. Add WEC-Sim Library to Simulink": [[29, "step-3-add-wec-sim-library-to-simulink"]], "Step 3: Build Simulink Model": [[34, "step-3-build-simulink-model"]], "Step 3: Write wecSimInputFile.m": [[32, "step-3-write-wecsiminputfile-m"], [32, "user-tutorials-oswec-step-three"]], "Step 4. Test the Installation": [[29, "step-4-test-the-installation"]], "Step 4: Run WEC-Sim": [[32, "step-4-run-wec-sim"], [32, "user-tutorials-oswec-step-four"]], "Step 4: Write wecSimInputFile.m": [[34, "step-4-write-wecsiminputfile-m"]], "Step 5: Post-processing": [[32, "step-5-post-processing"], [32, "user-tutorials-oswec-step-five"]], "Step 5: Run WEC-Sim": [[34, "step-5-run-wec-sim"]], "Summary": [[3, "summary"]], "Terminology": [[24, "terminology"]], "Theoretical Implementation": [[0, "theoretical-implementation"]], "Theory": [[22, null]], "Theory & Workflow": [[33, "theory-workflow"]], "Theory Manual": [[23, null]], "Time-Domain Formulation": [[24, "time-domain-formulation"]], "Time-Step Features": [[25, "time-step-features"]], "Training Materials": [[33, null]], "Troubleshooting": [[31, null]], "Tutorial": [[33, "tutorial"]], "Tutorial: OSWEC with PTO-Sim": [[25, "tutorial-oswec-with-pto-sim"]], "Tutorial: RM3 with PTO-Sim": [[25, "tutorial-rm3-with-pto-sim"]], "Tutorials": [[32, null]], "Two-Body Point Absorber (RM3)": [[32, "two-body-point-absorber-rm3"]], "Units": [[24, "units"]], "User Manual": [[30, null]], "User inputs": [[22, "user-inputs"]], "Variable Time-Step (ode45)": [[25, "variable-time-step-ode45"]], "Viscous Damping": [[24, "viscous-damping"], [25, "viscous-damping"]], "Viscous Damping and Morison Elements": [[24, "viscous-damping-and-morison-elements"], [25, "viscous-damping-and-morison-elements"]], "Viscous Drag": [[31, "viscous-drag"]], "Visualization Markers": [[27, "visualization-markers"]], "WEC-Sim (Wave Energy Converter SIMulator)": [[7, null]], "WEC-Sim Applications": [[27, null]], "WEC-Sim Applications Tests": [[6, "wec-sim-applications-tests"]], "WEC-Sim Case Files": [[34, "wec-sim-case-files"]], "WEC-Sim Classes": [[28, "wec-sim-classes"]], "WEC-Sim Developers": [[7, "wec-sim-developers"]], "WEC-Sim Examples": [[32, "wec-sim-examples"]], "WEC-Sim Implementations": [[0, "wec-sim-implementations"]], "WEC-Sim Issues": [[31, "wec-sim-issues"]], "WEC-Sim Library": [[3, null], [28, "wec-sim-library"]], "WEC-Sim Post-Processing": [[25, "wec-sim-post-processing"]], "WEC-Sim Source Code": [[28, "wec-sim-source-code"]], "WEC-Sim Tests": [[6, "wec-sim-tests"]], "WEC-Sim Visualization": [[25, "wec-sim-visualization"]], "WEC-Sim Visualization in ParaView": [[25, "wec-sim-visualization-in-paraview"]], "WEC-Sim v1.0": [[13, "id251"]], "WEC-Sim v1.1": [[13, "id250"]], "WEC-Sim v1.2": [[13, "id249"]], "WEC-Sim v1.3": [[13, "id248"]], "WEC-Sim v2.0": [[13, "id247"]], "WEC-Sim v2.1": [[13, "id246"]], "WEC-Sim v2.2": [[13, "id245"]], "WEC-Sim v3.0": [[13, "id244"]], "WEC-Sim v3.1": [[13, "id243"]], "WEC-Sim v4.0": [[13, "id242"]], "WEC-Sim v4.1": [[13, "id239"]], "WEC-Sim v4.2": [[13, "id226"]], "WEC-Sim v4.3": [[13, "id198"]], "WEC-Sim v4.4": [[13, "id174"]], "WEC-Sim v5.0": [[13, "id137"]], "WEC-Sim v5.0.1": [[13, "id121"]], "WEC-Sim v6.0": [[13, "id56"]], "WEC-Sim v6.1": [[13, "id1"], [13, "id3"]], "WEC-Sim\u2019s Implementation": [[0, "wec-sim-s-implementation"]], "WECCCOMP": [[27, "wecccomp"]], "Wave Class": [[26, "wave-class"], [28, "wave-class"], [33, "wave-class"]], "Wave Class Initialization": [[28, "wave-class-initialization"]], "Wave Directional Spreading": [[25, "wave-directional-spreading"]], "Wave Directionality": [[25, "wave-directionality"]], "Wave Features": [[25, "wave-features"]], "Wave Gauge Placement": [[25, "wave-gauge-placement"]], "Wave Markers": [[25, "wave-markers"]], "Wave Spectra": [[24, "wave-spectra"]], "Wind Features": [[15, "wind-features"]], "Wind Turbine Features": [[15, "wind-turbine-features"]], "Wind input": [[22, "wind-input"]], "Wind turbine properties": [[22, "wind-turbine-properties"]], "Workflow": [[34, null]], "Working with the Added Mass Implementation": [[0, "working-with-the-added-mass-implementation"]], "Write HDF5": [[27, "write-hdf5"]], "Writing Input File from Mask": [[3, "writing-input-file-from-mask"]], "Writing Mask Parameters from Input File": [[3, "writing-mask-parameters-from-input-file"]], "Writing Your Own h5 File": [[25, "writing-your-own-h5-file"]], "elevationImport": [[28, "elevationimport"]], "irregular": [[28, "irregular"]], "noWave": [[28, "nowave"]], "noWaveCIC": [[28, "nowavecic"]], "regular": [[28, "regular"]], "regularCIC": [[28, "regularcic"]], "spectrumImport": [[28, "spectrumimport"]]}, "docnames": ["developer/advanced_features", "developer/getting_started", "developer/index", "developer/library", "developer/overview", "developer/pull_requests", "developer/software_tests", "index", "introduction/acknowledgements", "introduction/index", "introduction/license", "introduction/overview", "introduction/publications", "introduction/release_notes", "most/acknowledgements", "most/advanced_features", "most/index", "most/introduction", "most/license", "most/overview", "most/publications", "most/release_notes", "most/theory", "theory/index", "theory/theory", "user/advanced_features", "user/api", "user/applications", "user/code_structure", "user/getting_started", "user/index", "user/troubleshooting", "user/tutorials", "user/webinars", "user/workflow"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinxcontrib.bibtex": 9}, "filenames": ["developer/advanced_features.rst", "developer/getting_started.rst", "developer/index.rst", "developer/library.rst", "developer/overview.rst", "developer/pull_requests.rst", "developer/software_tests.rst", "index.rst", "introduction/acknowledgements.rst", "introduction/index.rst", "introduction/license.rst", "introduction/overview.rst", "introduction/publications.rst", "introduction/release_notes.rst", "most/acknowledgements.rst", "most/advanced_features.rst", "most/index.rst", "most/introduction.rst", "most/license.rst", "most/overview.rst", "most/publications.rst", "most/release_notes.rst", "most/theory.rst", "theory/index.rst", "theory/theory.rst", "user/advanced_features.rst", "user/api.rst", "user/applications.rst", "user/code_structure.rst", "user/getting_started.rst", "user/index.rst", "user/troubleshooting.rst", "user/tutorials.rst", "user/webinars.rst", "user/workflow.rst"], "indexentries": {"adjmassfactor (objects.bodyclass attribute)": [[26, "objects.bodyClass.adjMassFactor", false]], "b2b (objects.simulationclass attribute)": [[26, "objects.simulationClass.b2b", false]], "base (objects.cableclass attribute)": [[26, "objects.cableClass.base", false]], "bem (objects.waveclass attribute)": [[26, "objects.waveClass.bem", false]], "bodies (objects.responseclass attribute)": [[26, "objects.responseClass.bodies", false]], "bodyclass (class in objects)": [[26, "objects.bodyClass", false]], "bodyclass (objects.bodyclass attribute)": [[26, "objects.bodyClass.bodyClass", false]], "cableclass (class in objects)": [[26, "objects.cableClass", false]], "cableclass (objects.cableclass attribute)": [[26, "objects.cableClass.cableClass", false]], "cablelength (objects.cableclass attribute)": [[26, "objects.cableClass.cableLength", false]], "cables (objects.responseclass attribute)": [[26, "objects.responseClass.cables", false]], "calcspectralmoment() (in module functions.bemio)": [[25, "functions.BEMIO.calcSpectralMoment", false]], "calculateforceaddedmass() (objects.bodyclass method)": [[26, "objects.bodyClass.calculateForceAddedMass", false]], "calcwavenumber() (in module functions.bemio)": [[25, "functions.BEMIO.calcWaveNumber", false]], "callmoordynlib() (objects.mooringclass method)": [[26, "objects.mooringClass.callMoorDynLib", false]], "centerbuoyancy (objects.bodyclass attribute)": [[26, "objects.bodyClass.centerBuoyancy", false]], "centergravity (objects.bodyclass attribute)": [[26, "objects.bodyClass.centerGravity", false]], "checkinputs() (objects.cableclass method)": [[26, "objects.cableClass.checkInputs", false]], "checkinputs() (objects.constraintclass method)": [[26, "objects.constraintClass.checkInputs", false]], "checkinputs() (objects.mooringclass method)": [[26, "objects.mooringClass.checkInputs", false]], "checkinputs() (objects.ptoclass method)": [[26, "objects.ptoClass.checkInputs", false]], "cicdt (objects.simulationclass attribute)": [[26, "objects.simulationClass.cicDt", false]], "cicendtime (objects.simulationclass attribute)": [[26, "objects.simulationClass.cicEndTime", false]], "closemoordynlib() (objects.mooringclass method)": [[26, "objects.mooringClass.closeMoorDynLib", false]], "combinebem() (in module functions.bemio)": [[25, "functions.BEMIO.combineBEM", false]], "constraintclass (class in objects)": [[26, "objects.constraintClass", false]], "constraintclass (objects.constraintclass attribute)": [[26, "objects.constraintClass.constraintClass", false]], "constraints (objects.responseclass attribute)": [[26, "objects.responseClass.constraints", false]], "current (objects.waveclass attribute)": [[26, "objects.waveClass.current", false]], "damping (objects.cableclass attribute)": [[26, "objects.cableClass.damping", false]], "damping (objects.ptoclass attribute)": [[26, "objects.ptoClass.damping", false]], "direction (objects.waveclass attribute)": [[26, "objects.waveClass.direction", false]], "dof (objects.bodyclass attribute)": [[26, "objects.bodyClass.dof", false]], "domainsize (objects.simulationclass attribute)": [[26, "objects.simulationClass.domainSize", false]], "dt (objects.simulationclass attribute)": [[26, "objects.simulationClass.dt", false]], "dtout (objects.simulationclass attribute)": [[26, "objects.simulationClass.dtOut", false]], "elevationfile (objects.waveclass attribute)": [[26, "objects.waveClass.elevationFile", false]], "endtime (objects.simulationclass attribute)": [[26, "objects.simulationClass.endTime", false]], "equilibriumposition (objects.ptoclass attribute)": [[26, "objects.ptoClass.equilibriumPosition", false]], "excitationirf (objects.bodyclass attribute)": [[26, "objects.bodyClass.excitationIRF", false]], "excitationirf() (in module functions.bemio)": [[25, "functions.BEMIO.excitationIRF", false]], "explorer (objects.simulationclass attribute)": [[26, "objects.simulationClass.explorer", false]], "extension (objects.constraintclass attribute)": [[26, "objects.constraintClass.extension", false]], "extension (objects.ptoclass attribute)": [[26, "objects.ptoClass.extension", false]], "fir (objects.simulationclass attribute)": [[26, "objects.simulationClass.FIR", false]], "flex (objects.bodyclass attribute)": [[26, "objects.bodyClass.flex", false]], "follower (objects.cableclass attribute)": [[26, "objects.cableClass.follower", false]], "gamma (objects.waveclass attribute)": [[26, "objects.waveClass.gamma", false]], "gbmdof (objects.bodyclass attribute)": [[26, "objects.bodyClass.gbmDOF", false]], "geometryfile (objects.bodyclass attribute)": [[26, "objects.bodyClass.geometryFile", false]], "gravity (objects.simulationclass attribute)": [[26, "objects.simulationClass.gravity", false]], "h5file (objects.bodyclass attribute)": [[26, "objects.bodyClass.h5File", false]], "hardstops (objects.constraintclass attribute)": [[26, "objects.constraintClass.hardStops", false]], "hardstops (objects.ptoclass attribute)": [[26, "objects.ptoClass.hardStops", false]], "height (objects.waveclass attribute)": [[26, "objects.waveClass.height", false]], "hydrostiffness (objects.bodyclass attribute)": [[26, "objects.bodyClass.hydroStiffness", false]], "inertia (objects.bodyclass attribute)": [[26, "objects.bodyClass.inertia", false]], "inertia (objects.cableclass attribute)": [[26, "objects.cableClass.inertia", false]], "inertiaproducts (objects.bodyclass attribute)": [[26, "objects.bodyClass.inertiaProducts", false]], "inertiaproducts (objects.cableclass attribute)": [[26, "objects.cableClass.inertiaProducts", false]], "initial (objects.bodyclass attribute)": [[26, "objects.bodyClass.initial", false]], "initial (objects.cableclass attribute)": [[26, "objects.cableClass.initial", false]], "initial (objects.constraintclass attribute)": [[26, "objects.constraintClass.initial", false]], "initial (objects.mooringclass attribute)": [[26, "objects.mooringClass.initial", false]], "initial (objects.ptoclass attribute)": [[26, "objects.ptoClass.initial", false]], "lineardamping (objects.bodyclass attribute)": [[26, "objects.bodyClass.linearDamping", false]], "lineardamping (objects.cableclass attribute)": [[26, "objects.cableClass.linearDamping", false]], "loadlookuptable() (objects.mooringclass method)": [[26, "objects.mooringClass.loadLookupTable", false]], "location (objects.constraintclass attribute)": [[26, "objects.constraintClass.location", false]], "location (objects.mooringclass attribute)": [[26, "objects.mooringClass.location", false]], "location (objects.ptoclass attribute)": [[26, "objects.ptoClass.location", false]], "lookuptable (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTable", false]], "lookuptablefile (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTableFile", false]], "lookuptableflag (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTableFlag", false]], "marker (objects.waveclass attribute)": [[26, "objects.waveClass.marker", false]], "mass (objects.bodyclass attribute)": [[26, "objects.bodyClass.mass", false]], "mass (objects.cableclass attribute)": [[26, "objects.cableClass.mass", false]], "matrix (objects.mooringclass attribute)": [[26, "objects.mooringClass.matrix", false]], "mcrexcelfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.mcrExcelFile", false]], "mcrmatfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.mcrMatFile", false]], "meandrift (objects.bodyclass attribute)": [[26, "objects.bodyClass.meanDrift", false]], "mode (objects.simulationclass attribute)": [[26, "objects.simulationClass.mode", false]], "moordyn (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDyn", false]], "moordyn (objects.responseclass attribute)": [[26, "objects.responseClass.moorDyn", false]], "moordyninputfile (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynInputFile", false]], "moordynlines (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynLines", false]], "moordynnodes (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynNodes", false]], "mooring (objects.responseclass attribute)": [[26, "objects.responseClass.mooring", false]], "mooringclass (class in objects)": [[26, "objects.mooringClass", false]], "morisondt (objects.simulationclass attribute)": [[26, "objects.simulationClass.morisonDt", false]], "morisonelement (objects.bodyclass attribute)": [[26, "objects.bodyClass.morisonElement", false]], "name (objects.bodyclass attribute)": [[26, "objects.bodyClass.name", false]], "name (objects.cableclass attribute)": [[26, "objects.cableClass.name", false]], "name (objects.constraintclass attribute)": [[26, "objects.constraintClass.name", false]], "name (objects.mooringclass attribute)": [[26, "objects.mooringClass.name", false]], "name (objects.ptoclass attribute)": [[26, "objects.ptoClass.name", false]], "nonhydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.nonHydro", false]], "nonlineardt (objects.simulationclass attribute)": [[26, "objects.simulationClass.nonlinearDt", false]], "nonlinearhydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.nonlinearHydro", false]], "normalizebem() (in module functions.bemio)": [[25, "functions.BEMIO.normalizeBEM", false]], "nummoordyn (objects.simulationclass attribute)": [[26, "objects.simulationClass.numMoorDyn", false]], "orientation (objects.cableclass attribute)": [[26, "objects.cableClass.orientation", false]], "orientation (objects.constraintclass attribute)": [[26, "objects.constraintClass.orientation", false]], "orientation (objects.ptoclass attribute)": [[26, "objects.ptoClass.orientation", false]], "paraview (objects.bodyclass attribute)": [[26, "objects.bodyClass.paraview", false]], "paraview (objects.cableclass attribute)": [[26, "objects.cableClass.paraview", false]], "paraview (objects.simulationclass attribute)": [[26, "objects.simulationClass.paraview", false]], "period (objects.waveclass attribute)": [[26, "objects.waveClass.period", false]], "phaseseed (objects.waveclass attribute)": [[26, "objects.waveClass.phaseSeed", false]], "plotaddedmass() (in module functions.bemio)": [[25, "functions.BEMIO.plotAddedMass", false]], "plotbemio() (in module functions.bemio)": [[25, "functions.BEMIO.plotBEMIO", false]], "plotelevation() (objects.waveclass method)": [[26, "objects.waveClass.plotElevation", false]], "plotexcitationirf() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationIRF", false]], "plotexcitationmagnitude() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationMagnitude", false]], "plotexcitationphase() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationPhase", false]], "plotforces() (objects.responseclass method)": [[26, "objects.responseClass.plotForces", false]], "plotradiationdamping() (in module functions.bemio)": [[25, "functions.BEMIO.plotRadiationDamping", false]], "plotradiationirf() (in module functions.bemio)": [[25, "functions.BEMIO.plotRadiationIRF", false]], "plotresponse() (objects.responseclass method)": [[26, "objects.responseClass.plotResponse", false]], "plotspectrum() (objects.waveclass method)": [[26, "objects.waveClass.plotSpectrum", false]], "plotstl() (objects.bodyclass method)": [[26, "objects.bodyClass.plotStl", false]], "pressure (objects.simulationclass attribute)": [[26, "objects.simulationClass.pressure", false]], "pretension (objects.cableclass attribute)": [[26, "objects.cableClass.preTension", false]], "pretension (objects.ptoclass attribute)": [[26, "objects.ptoClass.pretension", false]], "ptoclass (class in objects)": [[26, "objects.ptoClass", false]], "ptoclass (objects.ptoclass attribute)": [[26, "objects.ptoClass.ptoClass", false]], "ptos (objects.responseclass attribute)": [[26, "objects.responseClass.ptos", false]], "ptosim (objects.responseclass attribute)": [[26, "objects.responseClass.ptoSim", false]], "qtfs (objects.bodyclass attribute)": [[26, "objects.bodyClass.QTFs", false]], "quaddrag (objects.bodyclass attribute)": [[26, "objects.bodyClass.quadDrag", false]], "quaddrag (objects.cableclass attribute)": [[26, "objects.cableClass.quadDrag", false]], "radiationirf() (in module functions.bemio)": [[25, "functions.BEMIO.radiationIRF", false]], "radiationirfss() (in module functions.bemio)": [[25, "functions.BEMIO.radiationIRFSS", false]], "ramptime (objects.simulationclass attribute)": [[26, "objects.simulationClass.rampTime", false]], "ratetransition (objects.simulationclass attribute)": [[26, "objects.simulationClass.rateTransition", false]], "readaqwa() (in module functions.bemio)": [[25, "functions.BEMIO.readAQWA", false]], "readbemioh5() (in module functions.bemio)": [[25, "functions.BEMIO.readBEMIOH5", false]], "readcapytaine() (in module functions.bemio)": [[25, "functions.BEMIO.readCAPYTAINE", false]], "readnemoh() (in module functions.bemio)": [[25, "functions.BEMIO.readNEMOH", false]], "readwamit() (in module functions.bemio)": [[25, "functions.BEMIO.readWAMIT", false]], "reloadh5data (objects.simulationclass attribute)": [[26, "objects.simulationClass.reloadH5Data", false]], "responseclass (class in objects)": [[26, "objects.responseClass", false]], "responseclass (objects.responseclass attribute)": [[26, "objects.responseClass.responseClass", false]], "reversedimensionorder() (in module functions.bemio)": [[25, "functions.BEMIO.reverseDimensionOrder", false]], "rho (objects.simulationclass attribute)": [[26, "objects.simulationClass.rho", false]], "savestructure (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveStructure", false]], "savetext (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveText", false]], "saveviz() (objects.responseclass method)": [[26, "objects.responseClass.saveViz", false]], "saveworkspace (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveWorkspace", false]], "setcg() (objects.cableclass method)": [[26, "objects.cableClass.setCg", false]], "setinitdisp() (objects.bodyclass method)": [[26, "objects.bodyClass.setInitDisp", false]], "setinitdisp() (objects.cableclass method)": [[26, "objects.cableClass.setInitDisp", false]], "setinitdisp() (objects.constraintclass method)": [[26, "objects.constraintClass.setInitDisp", false]], "setinitdisp() (objects.mooringclass method)": [[26, "objects.mooringClass.setInitDisp", false]], "setinitdisp() (objects.ptoclass method)": [[26, "objects.ptoClass.setInitDisp", false]], "simmechanicsfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.simMechanicsFile", false]], "simulationclass (class in objects)": [[26, "objects.simulationClass", false]], "simulationclass (objects.simulationclass attribute)": [[26, "objects.simulationClass.simulationClass", false]], "solver (objects.simulationclass attribute)": [[26, "objects.simulationClass.solver", false]], "spectrumfile (objects.waveclass attribute)": [[26, "objects.waveClass.spectrumFile", false]], "spectrumtype (objects.waveclass attribute)": [[26, "objects.waveClass.spectrumType", false]], "spread (objects.waveclass attribute)": [[26, "objects.waveClass.spread", false]], "starttime (objects.simulationclass attribute)": [[26, "objects.simulationClass.startTime", false]], "statespace (objects.simulationclass attribute)": [[26, "objects.simulationClass.stateSpace", false]], "stiffness (objects.cableclass attribute)": [[26, "objects.cableClass.stiffness", false]], "stiffness (objects.ptoclass attribute)": [[26, "objects.ptoClass.stiffness", false]], "variablehydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.variableHydro", false]], "viz (objects.bodyclass attribute)": [[26, "objects.bodyClass.viz", false]], "viz (objects.cableclass attribute)": [[26, "objects.cableClass.viz", false]], "viz (objects.waveclass attribute)": [[26, "objects.waveClass.viz", false]], "volume (objects.bodyclass attribute)": [[26, "objects.bodyClass.volume", false]], "waterdepth (objects.waveclass attribute)": [[26, "objects.waveClass.waterDepth", false]], "wave (objects.responseclass attribute)": [[26, "objects.responseClass.wave", false]], "waveclass (class in objects)": [[26, "objects.waveClass", false]], "windturbine (objects.responseclass attribute)": [[26, "objects.responseClass.windTurbine", false]], "writebemioh5() (in module functions.bemio)": [[25, "functions.BEMIO.writeBEMIOH5", false]], "writetext() (objects.responseclass method)": [[26, "objects.responseClass.writeText", false]], "yaw (objects.bodyclass attribute)": [[26, "objects.bodyClass.yaw", false]], "zerocross (objects.simulationclass attribute)": [[26, "objects.simulationClass.zeroCross", false]]}, "objects": {"functions.BEMIO": [[25, 0, 1, "", "calcSpectralMoment"], [25, 0, 1, "", "calcWaveNumber"], [25, 0, 1, "", "combineBEM"], [25, 0, 1, "", "excitationIRF"], [25, 0, 1, "", "normalizeBEM"], [25, 0, 1, "", "plotAddedMass"], [25, 0, 1, "", "plotBEMIO"], [25, 0, 1, "", "plotExcitationIRF"], [25, 0, 1, "", "plotExcitationMagnitude"], [25, 0, 1, "", "plotExcitationPhase"], [25, 0, 1, "", "plotRadiationDamping"], [25, 0, 1, "", "plotRadiationIRF"], [25, 0, 1, "", "radiationIRF"], [25, 0, 1, "", "radiationIRFSS"], [25, 0, 1, "", "readAQWA"], [25, 0, 1, "", "readBEMIOH5"], [25, 0, 1, "", "readCAPYTAINE"], [25, 0, 1, "", "readNEMOH"], [25, 0, 1, "", "readWAMIT"], [25, 0, 1, "", "reverseDimensionOrder"], [25, 0, 1, "", "writeBEMIOH5"]], "objects": [[26, 1, 1, "", "bodyClass"], [26, 1, 1, "", "cableClass"], [26, 1, 1, "", "constraintClass"], [26, 1, 1, "", "mooringClass"], [26, 1, 1, "", "ptoClass"], [26, 1, 1, "", "responseClass"], [26, 1, 1, "", "simulationClass"], [26, 1, 1, "", "waveClass"]], "objects.bodyClass": [[26, 2, 1, "", "QTFs"], [26, 2, 1, "", "adjMassFactor"], [26, 2, 1, "", "bodyClass"], [26, 3, 1, "", "calculateForceAddedMass"], [26, 2, 1, "", "centerBuoyancy"], [26, 2, 1, "", "centerGravity"], [26, 2, 1, "", "dof"], [26, 2, 1, "", "excitationIRF"], [26, 2, 1, "", "flex"], [26, 2, 1, "", "gbmDOF"], [26, 2, 1, "", "geometryFile"], [26, 2, 1, "", "h5File"], [26, 2, 1, "", "hydroStiffness"], [26, 2, 1, "", "inertia"], [26, 2, 1, "", "inertiaProducts"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "linearDamping"], [26, 2, 1, "", "mass"], [26, 2, 1, "", "meanDrift"], [26, 2, 1, "", "morisonElement"], [26, 2, 1, "", "name"], [26, 2, 1, "", "nonHydro"], [26, 2, 1, "", "nonlinearHydro"], [26, 2, 1, "", "paraview"], [26, 3, 1, "", "plotStl"], [26, 2, 1, "", "quadDrag"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "variableHydro"], [26, 2, 1, "", "viz"], [26, 2, 1, "", "volume"], [26, 2, 1, "", "yaw"]], "objects.cableClass": [[26, 2, 1, "", "base"], [26, 2, 1, "", "cableClass"], [26, 2, 1, "", "cableLength"], [26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "damping"], [26, 2, 1, "", "follower"], [26, 2, 1, "", "inertia"], [26, 2, 1, "", "inertiaProducts"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "linearDamping"], [26, 2, 1, "", "mass"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 2, 1, "", "paraview"], [26, 2, 1, "", "preTension"], [26, 2, 1, "", "quadDrag"], [26, 3, 1, "", "setCg"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "stiffness"], [26, 2, 1, "", "viz"]], "objects.constraintClass": [[26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "constraintClass"], [26, 2, 1, "", "extension"], [26, 2, 1, "", "hardStops"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "location"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 3, 1, "", "setInitDisp"]], "objects.mooringClass": [[26, 3, 1, "", "callMoorDynLib"], [26, 3, 1, "", "checkInputs"], [26, 3, 1, "", "closeMoorDynLib"], [26, 2, 1, "", "initial"], [26, 3, 1, "", "loadLookupTable"], [26, 2, 1, "", "location"], [26, 2, 1, "", "lookupTable"], [26, 2, 1, "", "lookupTableFile"], [26, 2, 1, "", "lookupTableFlag"], [26, 2, 1, "", "matrix"], [26, 2, 1, "", "moorDyn"], [26, 2, 1, "", "moorDynInputFile"], [26, 2, 1, "", "moorDynLines"], [26, 2, 1, "", "moorDynNodes"], [26, 2, 1, "", "name"], [26, 3, 1, "", "setInitDisp"]], "objects.ptoClass": [[26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "damping"], [26, 2, 1, "", "equilibriumPosition"], [26, 2, 1, "", "extension"], [26, 2, 1, "", "hardStops"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "location"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 2, 1, "", "pretension"], [26, 2, 1, "", "ptoClass"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "stiffness"]], "objects.responseClass": [[26, 2, 1, "", "bodies"], [26, 2, 1, "", "cables"], [26, 2, 1, "", "constraints"], [26, 2, 1, "", "moorDyn"], [26, 2, 1, "", "mooring"], [26, 3, 1, "", "plotForces"], [26, 3, 1, "", "plotResponse"], [26, 2, 1, "", "ptoSim"], [26, 2, 1, "", "ptos"], [26, 2, 1, "", "responseClass"], [26, 3, 1, "", "saveViz"], [26, 2, 1, "", "wave"], [26, 2, 1, "", "windTurbine"], [26, 3, 1, "", "writeText"]], "objects.simulationClass": [[26, 2, 1, "", "FIR"], [26, 2, 1, "", "b2b"], [26, 2, 1, "", "cicDt"], [26, 2, 1, "", "cicEndTime"], [26, 2, 1, "", "domainSize"], [26, 2, 1, "", "dt"], [26, 2, 1, "", "dtOut"], [26, 2, 1, "", "endTime"], [26, 2, 1, "", "explorer"], [26, 2, 1, "", "gravity"], [26, 2, 1, "", "mcrExcelFile"], [26, 2, 1, "", "mcrMatFile"], [26, 2, 1, "", "mode"], [26, 2, 1, "", "morisonDt"], [26, 2, 1, "", "nonlinearDt"], [26, 2, 1, "", "numMoorDyn"], [26, 2, 1, "", "paraview"], [26, 2, 1, "", "pressure"], [26, 2, 1, "", "rampTime"], [26, 2, 1, "", "rateTransition"], [26, 2, 1, "", "reloadH5Data"], [26, 2, 1, "", "rho"], [26, 2, 1, "", "saveStructure"], [26, 2, 1, "", "saveText"], [26, 2, 1, "", "saveWorkspace"], [26, 2, 1, "", "simMechanicsFile"], [26, 2, 1, "", "simulationClass"], [26, 2, 1, "", "solver"], [26, 2, 1, "", "startTime"], [26, 2, 1, "", "stateSpace"], [26, 2, 1, "", "zeroCross"]], "objects.waveClass": [[26, 2, 1, "", "bem"], [26, 2, 1, "", "current"], [26, 2, 1, "", "direction"], [26, 2, 1, "", "elevationFile"], [26, 2, 1, "", "gamma"], [26, 2, 1, "", "height"], [26, 2, 1, "", "marker"], [26, 2, 1, "", "period"], [26, 2, 1, "", "phaseSeed"], [26, 3, 1, "", "plotElevation"], [26, 3, 1, "", "plotSpectrum"], [26, 2, 1, "", "spectrumFile"], [26, 2, 1, "", "spectrumType"], [26, 2, 1, "", "spread"], [26, 2, 1, "", "viz"], [26, 2, 1, "", "waterDepth"]]}, "objnames": {"0": ["mat", "function", "MATLAB function"], "1": ["mat", "class", "MATLAB class"], "2": ["mat", "attribute", "MATLAB attribute"], "3": ["mat", "method", "MATLAB method"]}, "objtypes": {"0": "mat:function", "1": "mat:class", "2": "mat:attribute", "3": "mat:method"}, "terms": {"": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "0": [0, 3, 6, 9, 16, 22, 24, 25, 26, 28, 29, 31, 32, 34], "000": [25, 32], "002": 25, "01": [25, 32], "012003": 21, "01341": 24, "02": 25, "0378": 25, "05": 25, "057f_": 24, "06": 25, "07": 24, "085": 32, "08go28308": 8, "09": 24, "091": 32, "1": [3, 9, 10, 12, 15, 18, 20, 21, 22, 23, 25, 26, 28, 31], "10": [0, 12, 13, 20, 22, 24, 25, 26, 28, 29, 32, 34], "100": [12, 13, 25, 26, 28, 32, 34], "1000": [0, 25, 26, 28], "10000": 25, "1001": 25, "1002": 13, "10023797": 13, "1011": 13, "1012": 13, "1017": 13, "1018": 13, "102": 13, "1023": 13, "1024": 13, "1025": 25, "1030": 13, "1031": 13, "1032": 13, "1034": 13, "104": [13, 24], "1040": 13, "1045": 13, "1046": 13, "1048": 13, "1049": 13, "105": 25, "1052": 13, "1057": 13, "1058": 13, "1059": 13, "1061": 13, "1064": 13, "1065": 13, "1071": 13, "1076": 13, "1080": 13, "1081": 13, "1087": 13, "1092": 13, "1093": 13, "1095": 13, "1096": 13, "1098": 13, "11": [12, 22, 25, 32], "1100": 13, "1101": 13, "1102": 13, "1105": 13, "1106": 13, "110791": 25, "1108": 13, "1118": 12, "1126": [12, 13], "1127": 13, "1130": 13, "1133": 13, "1134": 13, "1136": 13, "1142": 13, "1144": 13, "1149": 13, "1166": 13, "1170": 13, "1177": 13, "1183": 13, "1186": 13, "1187": 13, "1195": 13, "1198": 13, "11th": [12, 24], "12": [12, 22, 24, 25], "120": 25, "1200000": [25, 32], "1204": 13, "1207": 13, "1212": 13, "1217": 13, "1220": 13, "1226": 13, "1227": 13, "1229": 13, "1235": 13, "1236": 13, "1240": 13, "1241": 13, "1242": 13, "1247": 13, "1248": 13, "1250": 13, "1253": 13, "1256": 13, "1263": 13, "1264": 13, "127": 32, "127000": [32, 34], "1272": 13, "1273": 13, "1274": 13, "1275": 13, "1280": 13, "1289": 13, "1290": 13, "1296": 13, "1297": 13, "12th": [12, 24], "13": [12, 22, 25], "130": 13, "1301": 13, "1312": 13, "1317": 13, "1327": 15, "1333e7": 25, "1341": 24, "1345": 15, "13770349": 13, "1392": 25, "14": [12, 22, 25], "142": 25, "149": 24, "14th": 13, "15": [12, 15, 20, 22, 24, 25], "150": 25, "154": 24, "1592791": 29, "16": [12, 13, 22, 24, 25], "17": [12, 15, 22, 24], "170": 25, "18": [12, 22, 25], "180": 25, "1862": 25, "1868": 25, "189": 24, "19": [12, 22], "1950": 24, "1962": 24, "1964": 24, "1969": 24, "1973": 24, "1978": 24, "1996": 24, "1a": 31, "1b": 31, "1e": [0, 25, 26], "1e5": 25, "1kb": 31, "1m": 25, "1st": 25, "1x2": 26, "1x3": [0, 25, 26], "1x6": [25, 26], "2": [3, 9, 12, 15, 16, 20, 22, 23, 25, 26, 28, 31], "20": [12, 22, 25, 32], "200": [25, 26], "2004": [10, 18], "2005": [15, 24], "2006": [24, 25], "2008": 24, "2012": 24, "2013": 12, "2014": [10, 12, 15, 18, 24, 32], "2015": [12, 15, 24, 25], "2016": 12, "2017": [12, 25], "2018": 12, "2018b": 13, "2019": [24, 25, 28], "2019a": 25, "2020": [12, 15, 24, 25], "2020b": 13, "2021": [12, 13, 25], "2021b": 13, "2022": [12, 15, 20, 21], "2024": 13, "20907301": [25, 32], "21": [12, 22, 24, 25, 32], "21105": 24, "21306090": [25, 32], "2195": 24, "22": [12, 22], "2216": 24, "225": 32, "2257": [20, 21], "23": [12, 13, 22], "230": 25, "24": [12, 22, 25, 32], "241": 25, "247": 13, "25": [12, 22, 25], "2500": 25, "25th": 12, "26": 22, "265": 24, "27": 22, "2739": 20, "275": 24, "2784": 25, "28": [25, 32], "28542224": [25, 32], "287": 24, "29": [25, 32], "2a": 31, "2b": 31, "2f_": 24, "2fjoss": 24, "2kh": 24, "2m": 22, "2nd": [12, 24, 25, 32], "3": [0, 3, 9, 10, 11, 12, 15, 18, 20, 22, 23, 25, 26, 27, 28], "30": 32, "300": 25, "3000": 25, "301": 32, "306": 32, "32": 24, "33rd": 12, "341721e6": 25, "342": 25, "34th": 12, "35": 25, "355": 13, "35th": 12, "36": 24, "360": 0, "3600000": 25, "36th": 12, "37": 32, "37085481": [25, 32], "373": 13, "375264e6": 25, "37th": 12, "38": 6, "384": 13, "3a": 31, "3b": 31, "3d": [25, 26], "3dof": [25, 28, 32], "3fk": 25, "3rd": 12, "3sc": 25, "3x1": 26, "3x3": 26, "4": [0, 9, 10, 12, 18, 20, 22, 24, 25, 26, 28, 31], "40": 25, "400": [25, 32, 34], "407": 32, "408": 13, "41": 24, "419": 32, "423": 13, "426": 13, "43": 6, "4352": 24, "4364": 24, "438": 13, "439": 13, "44": [13, 24], "444": 13, "445": 13, "45": 13, "455": 13, "459": 13, "464": 13, "478": 25, "479": 13, "48": 13, "481": [25, 32], "485": 13, "486": 13, "490": 13, "491": 13, "499": 25, "4a": 31, "4th": 12, "5": [0, 10, 12, 13, 15, 18, 20, 22, 24, 25, 28, 29], "50": [0, 10, 15, 18, 25], "500": 25, "503": 13, "508": 13, "512": 13, "514": 13, "516": 13, "517": 13, "5181": 24, "5190": 24, "52": 13, "5281": 13, "53": 15, "54": 13, "542": 32, "548": 13, "557": 13, "56": 25, "57": [13, 25, 32], "575": 13, "586": 13, "590": 24, "5e6": 25, "5th": 20, "6": [0, 7, 10, 11, 12, 13, 15, 18, 22, 24, 25, 26, 28], "60": 26, "603": 24, "61": 25, "611": 13, "61400": 15, "615": 32, "620": 13, "62399": 24, "62600": [13, 24, 28], "63": [24, 25], "630": [13, 25], "632": 13, "634": 13, "636": 13, "641": 13, "642": 13, "643": 13, "649": 13, "654": 13, "656": 13, "66": [25, 32], "6664": 25, "668": 13, "675": 13, "678": 13, "685": [13, 24], "686": 13, "6894": 25, "69": 24, "692": 13, "694": 13, "6dof": [3, 24, 26, 28], "6i": 25, "6x1": 26, "6x6": [25, 26, 28], "6x6xn": 26, "7": [0, 10, 12, 13, 15, 18, 22, 24, 25, 26, 28, 29], "70": 25, "700": 25, "705": 24, "712": 13, "714": 24, "72": 32, "720": 13, "727": [13, 32], "728": 13, "73": 15, "736": 13, "737": 13, "74": 13, "75": [24, 25], "760": 13, "761": 13, "765": 13, "77": 25, "770": 13, "774": 13, "775": 13, "779": 13, "790": 13, "796": 13, "797": 13, "799": 13, "7th": 24, "8": [0, 10, 12, 18, 20, 22, 24, 25, 28, 32, 34], "80": 25, "800": 13, "801": 13, "802": 13, "803": 13, "806": 13, "807": 13, "808": 13, "809": 13, "81": 26, "811": 13, "812": 13, "814": 13, "816": 13, "817": 13, "82": [25, 32], "821": 13, "822": 13, "826": 13, "827": 13, "828": 13, "831": 13, "832": 13, "833": 13, "834": 13, "838": 13, "839": 13, "84": 25, "840": 13, "841": 13, "842": 13, "84416": 24, "847": 13, "85": 25, "850": [25, 32], "856": 13, "85e6": [32, 34], "86": 25, "862": 13, "864": 13, "866": 13, "86e9": 25, "870": [13, 25], "874": 13, "8755034098": 15, "877": 13, "878": 32, "884": 13, "885": 13, "894": 13, "896": 13, "898": 13, "9": [0, 10, 12, 13, 15, 18, 22, 25, 26, 28, 29, 32, 34], "90": 25, "900": 13, "904": 13, "907": [13, 32], "91": 25, "910": 13, "9104": 20, "911": 13, "9118": 20, "917": 13, "919": 13, "920": 13, "923": 13, "929": 13, "931": 13, "935": 20, "94": 32, "941": 20, "944": 13, "94407091": [25, 32], "94419614": [25, 32], "946": 13, "947": 13, "95": 25, "950": 13, "954": 13, "955": 13, "957": 13, "958": 13, "96": 25, "962": 13, "981": 13, "983": 13, "99": 25, "990": 13, "993": 13, "999": [13, 25, 26, 32, 34], "A": [0, 3, 5, 10, 11, 12, 13, 15, 18, 20, 21, 22, 24, 25, 28, 29, 31, 34], "AND": [10, 18], "AS": [10, 18], "And": [25, 27], "As": [0, 3, 15, 22, 25, 34], "At": [11, 25, 28], "But": 0, "By": [22, 25], "FOR": [10, 18], "For": [0, 1, 3, 7, 10, 15, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "If": [0, 3, 5, 10, 18, 22, 24, 25, 26, 28, 29, 31, 34], "In": [0, 3, 5, 6, 8, 10, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32, 34], "It": [3, 4, 11, 15, 17, 22, 24, 25, 26, 27, 28, 31, 34], "Its": 22, "NOT": 26, "Near": 22, "No": [8, 20, 25], "Not": [10, 18], "OF": [10, 18], "OR": [10, 18], "On": [22, 25], "One": [3, 25, 26, 27], "That": 22, "The": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "Then": [22, 25], "There": [0, 25, 26, 28, 31, 32], "These": [0, 3, 25, 27, 28, 31, 32], "To": [0, 3, 5, 6, 13, 15, 22, 24, 29, 31, 32], "With": [17, 22, 25], "_": [0, 13, 22, 24, 25], "_common_input_fil": 25, "_n": 22, "_r": 22, "_t": 22, "a1": 32, "a2": 32, "a3": 32, "a_": [0, 22, 24, 25], "a_d": [22, 24], "a_r": 24, "abba": 15, "abil": [3, 7, 11, 13, 25, 28], "abl": [0, 3, 11, 28, 34], "about": [0, 3, 12, 22, 24, 25, 26, 28, 32, 34], "abov": [0, 3, 10, 15, 18, 22, 24, 25, 26, 28, 31, 33], "absolut": 26, "absorb": [24, 25, 29, 30], "ac36": 8, "acaus": 25, "acc": 26, "acceler": [0, 13, 15, 17, 22, 24, 25, 26, 28], "accept": [3, 10, 18], "acces": 3, "access": [0, 3, 25, 29, 31], "accompani": 28, "accomplish": 25, "accord": [3, 15, 22, 24, 25], "accordingli": 25, "account": [0, 22, 24, 25, 27, 28], "accumul": [25, 26, 28], "accur": [13, 22, 24, 25, 31], "accuraci": [3, 4, 24, 25, 31], "acheiv": 3, "achiev": 25, "acknowledg": [7, 9, 10, 16, 18], "across": [6, 22, 24, 25], "act": [10, 15, 18, 22, 24, 25, 26, 32], "action": [6, 13, 29], "activ": [22, 28, 31, 34], "actual": [15, 22, 25, 26], "actualaddedmassforc": 26, "actuat": [22, 26, 28], "ad": [2, 3, 4, 6, 13, 17, 22, 24, 25, 26, 28, 29, 34], "adam": [7, 8, 13], "adapt": 7, "add": [1, 3, 10, 13, 17, 18, 19, 24, 25, 28, 31], "addendum": [10, 18], "addit": [3, 8, 10, 12, 15, 18, 21, 24, 25, 26, 27, 28, 29, 31, 32, 34], "addition": [0, 24, 25, 28, 32, 34], "addlindisp": 26, "addpath": 29, "address": [0, 3, 31], "addtion": 25, "addwecsimsourc": 29, "adequ": [25, 28], "adjac": [24, 25], "adjmassfactor": [0, 26], "adjust": [0, 24, 25, 28], "adjustmassmatrix": 0, "administr": 8, "admitt": 25, "adopt": 22, "advanc": [2, 3, 11, 13, 16, 22, 24, 27, 28, 29, 30, 31, 32, 34], "advanced_featur": 27, "advis": [10, 18], "aero": 22, "aerodyn": 15, "aeroload": [15, 17, 22], "affect": [0, 3, 22, 25], "afford": 25, "afo": 25, "aforement": [15, 22], "after": [0, 15, 22, 25, 26, 28, 31], "ag": 0, "again": [25, 31], "against": [3, 10, 18], "agenc": 12, "aggreg": 25, "agk": 0, "agmoore4": 13, "agre": [10, 18], "agreement": [10, 18], "ah1": [25, 34], "ah1filenam": 25, "ahmedmetin": 13, "ai": 25, "aid": 31, "aim": [22, 24], "ainf": [13, 25], "air": 22, "airfoil": [15, 22], "airfoil_index": 15, "akeest": 13, "al": [12, 20, 25], "alain": 25, "alan": 15, "alberto": 19, "algebar": 0, "algebra": 0, "algorithm": [11, 22, 24, 25, 33], "align": 25, "alixhaid": 13, "all": [0, 3, 5, 6, 10, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "alleg": [10, 18], "allen": 15, "alli": 25, "allianc": 8, "alliedmot": 25, "allison": 13, "allow": [0, 1, 3, 11, 13, 15, 22, 24, 25, 26, 27, 28, 29, 32], "almost": 25, "alon": [10, 18], "along": [10, 15, 18, 22, 24, 25, 26, 27, 28, 33], "alongsid": [10, 18], "alpha": [0, 24], "alreadi": [25, 32], "also": [0, 3, 4, 6, 7, 11, 15, 17, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "alter": 0, "altern": [0, 22, 24, 25, 31], "although": 25, "alufasam": 13, "alwai": [3, 22, 24, 25, 32], "amax": 25, "american": 24, "amin": 25, "among": [0, 25, 34], "amplitud": [0, 15, 24, 25], "ampspectraforw": 13, "an": [0, 3, 7, 10, 11, 12, 13, 15, 18, 20, 22, 24, 25, 26, 27, 28, 29, 32, 33, 34], "analys": [12, 15], "analysi": [12, 13, 15, 20, 24, 25, 32], "analysistim": 15, "analyt": 13, "ancellin": 24, "anchor": [15, 22, 27], "anderson": 15, "andrew": [15, 24], "angfreq": 25, "angl": [15, 22, 24, 25, 26], "angular": [0, 22, 24, 25, 26, 28], "angularli": [15, 22], "ani": [0, 3, 5, 7, 10, 11, 18, 22, 24, 25, 26, 28, 29, 32], "anim": 25, "annex": 13, "annot": [10, 18], "anoth": [0, 3, 25, 27, 28, 31], "ansi": [17, 24], "anthoni": 15, "anyon": 4, "anywher": 34, "ap_a": 25, "ap_b": 25, "apach": [9, 16], "api": [13, 25, 28, 30], "apli": 26, "appear": [3, 10, 18, 24], "append": 25, "appendix": [10, 18], "appli": [0, 10, 13, 15, 18, 22, 24, 25, 26, 28], "applic": [0, 2, 7, 10, 11, 12, 13, 17, 18, 21, 24, 25, 26, 28, 30, 31, 32, 33], "approach": [0, 22, 24, 25, 26, 28], "appropri": [10, 18, 25, 27, 31, 32], "approx": [22, 24], "approxim": [0, 22, 24, 25, 28, 31], "apr": 24, "april": 12, "aqwa": [11, 13, 17, 24, 25, 27, 32, 34], "ar": [0, 3, 4, 5, 6, 7, 10, 11, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "arbitrari": 25, "arctic": [12, 24], "area": [0, 22, 24, 25, 26, 28, 31], "area_i": 26, "area_n": 26, "area_t": 26, "area_x": 26, "area_z": 26, "aren": 25, "argument": [0, 13, 24, 25], "aris": [0, 10, 18, 24], "arm": 0, "around": [15, 22, 24], "arrai": [22, 25, 26, 27, 28], "arriv": 22, "arrow": 25, "articl": 9, "ascend": 25, "ascii": [22, 26], "ashleynchong": 13, "asilomar": 24, "ask": 31, "aspect": [3, 15, 24, 25], "assembli": 25, "assert": [10, 18], "assign": [3, 26], "assist": [25, 31], "associ": [8, 10, 18, 24, 26, 28], "assum": [0, 10, 15, 18, 22, 24, 25, 26, 28, 31], "assumpt": [22, 24, 25], "asympot": 24, "atanh": 25, "attach": [10, 15, 18, 25, 27], "attack": 15, "attempt": [0, 15, 25, 31], "attribut": [3, 10, 18, 28], "augment": 25, "august": 12, "aur": [24, 25], "author": [10, 13, 18, 21], "authorship": [10, 18], "auto": [3, 22], "automat": [13, 22, 25, 26, 28, 29], "avail": [3, 6, 10, 12, 13, 18, 22, 24, 25, 28, 29, 31, 32, 33, 34], "averag": [15, 22, 24, 25], "avg": 25, "avi": 25, "avoid": [22, 24], "awai": 32, "award": 12, "ax": [25, 26], "axi": [0, 15, 19, 22, 24, 25, 26, 28], "axial": 24, "axisanglelist": 26, "axislimit": [25, 26], "axisymmetr": 25, "az": 25, "azimuth": 26, "azura": 8, "b": [0, 10, 12, 15, 18, 22, 24, 25, 26, 28, 31], "b1": 24, "b10": 24, "b11": 24, "b12": 24, "b13": 24, "b14": 24, "b15": 24, "b16": 24, "b17": 24, "b18": 24, "b19": 24, "b2": 24, "b20": 24, "b21": 24, "b2b": [3, 25, 26, 27], "b3": 24, "b4": 24, "b5": 24, "b6": 24, "b7": 24, "b8": 24, "b9": 24, "b_": [15, 22, 24, 25], "b_d": 24, "b_r": 24, "b_u": 22, "ba": 0, "babarit": [12, 24, 25], "bacelli": 25, "back": [13, 22, 25, 28], "background": 22, "backward": 3, "bad": 13, "bailei": 12, "balanc": 31, "band": 24, "bar": 25, "barg": [11, 25, 27], "barnett": 24, "barter": 15, "base": [3, 5, 10, 13, 15, 18, 22, 24, 25, 26, 27, 28, 31, 32, 33, 34], "baseconnect": [25, 26, 28], "baselin": [15, 19], "basi": [10, 18], "basic": 32, "batch": [7, 11, 13, 25, 27, 28], "becaus": [0, 15, 22, 24, 25, 31, 32], "becom": [0, 15, 22, 24, 25, 32], "been": [0, 10, 11, 14, 15, 17, 18, 22, 24, 25, 28, 32], "beetween": 28, "befor": [3, 15, 22, 25, 28, 31], "begin": [0, 3, 15, 22, 24, 25], "behalf": [10, 18], "behav": 25, "behavior": 31, "behaviour": 25, "behind": 0, "being": [0, 3, 24, 25, 26, 28, 31, 32, 33], "below": [0, 3, 10, 11, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "bem": [11, 15, 17, 22, 23, 25, 26, 27, 28, 31, 33, 34], "bem_data": 28, "bemdata": 28, "bemio": [11, 13, 22, 24, 27, 28, 29, 30, 31, 34], "bemt": 22, "benchmark": [24, 25], "bend": [11, 15, 22, 24, 25], "benefici": [10, 18, 25], "benjamin": 15, "berkelei": 8, "best": 25, "better": [15, 22, 25], "between": [3, 7, 8, 13, 15, 19, 22, 24, 25, 26, 28, 31, 34], "big": 33, "bigg": 0, "bin": 28, "binari": [3, 13], "bind": [10, 18], "biunivoc": 15, "bl": [15, 22], "blade": [15, 17, 19, 20, 26], "bladedata": [15, 17, 22], "bladediscr": [15, 22], "bladepitch": 26, "bladerootload": 26, "blank": 31, "blcrvac": 15, "blcrvang": 15, "block": [0, 3, 11, 13, 17, 22, 25, 26, 29, 30, 31, 32, 33, 34], "blswpac": 15, "blue": [3, 25], "bluhm": 12, "bmatrix": [0, 24], "bode": 25, "bodi": [3, 7, 11, 12, 13, 15, 17, 22, 23, 30, 31, 34], "body2": 25, "body2bodi": 13, "bodyblockhandl": 3, "bodyclass": [0, 3, 25, 26, 28, 32, 34], "bodyclasscallback": 3, "bodynam": 26, "bodynum": 26, "bold": 31, "boldsymbol": [22, 24], "bonni": 15, "booktitl": 21, "bortolotti": 15, "bosma": 12, "both": [0, 3, 6, 7, 11, 12, 15, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "bottom": [11, 24, 25, 26], "bound": [25, 26], "boundari": [11, 15, 17, 23, 25, 34], "bouw": 24, "box": 28, "bracco": [19, 20, 21], "brad": 8, "bradl": 13, "brake": [22, 25], "branch": [1, 3, 5, 6, 13], "break": 24, "breakpoint": [15, 22], "bredmos": 15, "brekken": [12, 24, 25], "bretschneid": 32, "brief": 28, "briefli": 22, "brien": 24, "bring": 22, "browser": [13, 25, 29], "brushless": 25, "bshaft": 25, "bu": 25, "bug": [5, 13, 31], "bugfix": 13, "build": [6, 13, 15, 19, 28], "built": [0, 25], "bulk": 28, "bulkmodulu": 25, "buoi": [27, 28], "buoyanc": [12, 23, 26, 28, 34], "buoyant": [25, 26, 31], "burden": 3, "busan": 12, "button": [3, 25], "c": [6, 10, 12, 13, 15, 18, 22, 24, 25, 28, 29, 32], "c1": 25, "c2": 25, "c3": 25, "c4": 25, "c5": 25, "c6": 25, "c7": 25, "c_": [0, 22, 24, 25], "c_1": 22, "c_2": 22, "c_3": 22, "c_d": 24, "c_p": 22, "c_r": 24, "ca": [3, 12, 24, 25, 26, 32], "ca_i": 26, "ca_n": 26, "ca_t": 26, "ca_x": 26, "ca_z": 26, "cabbel": 24, "cabl": [3, 13, 15, 30], "cableclass": [25, 26, 28], "cabledamp": [25, 28], "cablelength": 26, "cablenam": [25, 26, 28], "cablestiff": [25, 28], "cad": [15, 22, 25, 34], "cal": [25, 34], "calcspectralmo": 25, "calcuat": 24, "calcul": [0, 3, 13, 15, 17, 22, 26, 28, 31, 32, 33, 34], "calculateforceaddedmass": [0, 26], "calculation_of_ainf_using_radiationirf": 13, "calcwavenumb": 25, "california": 8, "call": [0, 3, 13, 15, 17, 22, 25, 26, 28, 29, 31, 32], "caller": [25, 28], "callmoordynlib": 26, "camera": 25, "can": [0, 1, 3, 7, 11, 15, 17, 19, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "canada": 12, "cancel": [3, 13, 25], "cannot": [0, 3, 10, 18, 25, 31], "canon": 22, "capabl": [11, 12, 13, 17, 24, 25, 28], "capacit": 25, "capit": 0, "captur": [22, 24, 25], "capytain": [11, 13, 24, 25, 27, 32, 34], "care": 31, "carefulli": 31, "carlo": 7, "carlson": 24, "carnegi": 8, "carpent": 0, "carri": [10, 17, 18, 22], "cartesian": [7, 11], "cartwright": 24, "case": [0, 3, 6, 11, 13, 15, 22, 24, 25, 27, 28, 29, 30, 32, 33], "casei": 12, "catch": 25, "categor": 25, "categori": [3, 28], "catenari": [15, 22, 25, 27], "caus": [0, 10, 18, 24, 26], "causal": [24, 25], "caution": 25, "cb": [15, 24, 25, 26], "cd": [3, 25, 26, 28, 29], "cd_n": 26, "cd_t": 26, "cd_x": 26, "cd_y": 26, "cd_z": 26, "cdot": [0, 22, 24], "celer": 25, "cell": [25, 26], "cellpressures_hydrostat": 26, "cellpressures_tim": 26, "cellpressures_wavelinear": 26, "cellpressures_wavenonlinear": 26, "center": [0, 15, 24, 25, 26, 28, 32, 34], "centerbuoy": [26, 28], "centerbuoyancyparam": 3, "centergrav": [25, 26, 28], "centergravityparam": 3, "centr": [12, 15, 22], "central": 0, "centroid": 25, "certain": [0, 3, 10, 15, 18, 22, 25, 29], "cfg": 25, "cg": [24, 25, 26], "ch": 24, "chain": 25, "challeng": 3, "chang": [0, 3, 5, 10, 13, 15, 18, 22, 25, 27, 31], "changelog": 13, "char": 26, "charact": [10, 18], "character": [24, 25, 32], "characterist": [0, 15, 22, 24, 25, 26, 28], "charg": [10, 18, 28], "check": [3, 6, 13, 25, 26, 28, 29, 31], "checkbox": 3, "checkinput": 26, "checkout": 3, "checkvalv": 26, "choic": 17, "choos": [10, 15, 18, 22, 25], "chop": 25, "chord": [15, 22], "chosen": [3, 22, 25, 28], "chri": 8, "christoph": 15, "ci": 13, "cic": [27, 31], "cicdt": [25, 26], "cicendtim": [26, 31], "circ": 22, "circuit": [13, 24, 25, 28], "citat": 13, "cite": [9, 16], "cl": 25, "claim": [10, 18], "clarif": 31, "clarifi": [3, 13, 31], "class": [3, 13, 15, 17, 22, 24, 25, 30, 31, 32, 34], "classnam": 28, "clean": [3, 5, 13], "cleanup": 13, "clear": [25, 29], "clearli": 24, "click": [25, 28, 32], "clone": 29, "close": [12, 13, 15, 22, 24, 25, 26, 28, 31], "closemoordynlib": 26, "co": [0, 12, 15, 24, 25], "code": [0, 1, 3, 4, 5, 6, 8, 10, 12, 13, 15, 17, 18, 22, 24, 25, 27, 29, 30, 31, 32, 34], "coe": 25, "coeff": 25, "coeffic": 26, "coeffici": [0, 13, 15, 17, 22, 24, 25, 26, 27, 28, 33, 34], "coer": 12, "cog": 26, "cog_rel": 15, "coil": 25, "coincid": 26, "collabor": [7, 8, 19], "collect": [15, 22], "colleg": 12, "color": [3, 13, 25, 26], "column": [0, 25, 26, 28], "com": [1, 13, 24, 25, 27, 29], "combin": [0, 10, 15, 18, 22, 24, 25, 28], "combine_bem": 13, "combinebem": 25, "combourieu": 12, "come": [3, 24, 29], "command": [3, 6, 13, 25, 28, 29, 32, 34], "comment": 25, "commerci": [10, 18, 25], "commit": [1, 3, 5, 6, 13], "common": [3, 10, 15, 18, 24, 25, 28, 31], "commonli": 22, "commun": [10, 18], "comp": 26, "compar": [0, 3, 13, 17, 22, 24, 25, 31], "comparison": [12, 24, 25], "compat": [3, 13, 25, 29], "compens": [15, 22], "competit": [11, 12, 25, 27], "compil": [10, 13, 18, 25, 28], "complet": [12, 25, 31, 32], "complex": [3, 11, 24, 25, 28], "compli": [10, 15, 18, 22], "complianc": [10, 18], "compon": [0, 15, 22, 24, 25, 26, 28, 34], "compos": [22, 25], "comprehens": [15, 25], "compress": [25, 26, 28], "compris": [7, 11, 28], "comput": [10, 13, 15, 17, 18, 22, 24, 26, 29, 32, 34], "computation": 22, "concaten": 25, "concept": 25, "concern": 15, "concerningo": 15, "condit": [0, 10, 15, 18, 19, 22, 24, 26, 28, 30, 32, 34], "conduct": 25, "conf": 24, "confer": [12, 13, 20, 21, 24], "confid": 22, "configur": [1, 10, 18, 24, 28], "confirm": [25, 31], "conflict": [3, 5, 13, 22], "conjug": 25, "conjunct": [25, 34], "connect": [22, 24, 25, 26, 28, 31, 32], "connnect": 25, "consecut": [25, 26], "consequenti": [10, 18], "conserv": [25, 26], "consid": [0, 22, 24, 25], "consider": 25, "consist": [10, 15, 18, 22, 24, 25, 27, 28, 31, 32, 34], "conspicu": [10, 18], "constant": [0, 15, 22, 24, 25, 28], "constitut": [10, 15, 18, 22], "constrain": [15, 25, 28, 32], "constraint": [3, 11, 13, 15, 17, 24, 30, 31, 32, 34], "constraint1": [25, 32, 34], "constraintclass": [25, 26, 28, 32, 34], "constraintnam": [26, 28], "constru": [10, 18], "construct": [24, 25], "constructor": 26, "consult": 22, "contact": 24, "contain": [0, 3, 7, 10, 11, 15, 18, 22, 24, 25, 26, 27, 28, 32, 34], "content": [10, 13, 18, 25, 29], "context": 3, "continu": [3, 4, 6, 13, 22, 24, 25, 26, 31], "contour": 24, "contract": [8, 10, 18], "contrain": 28, "contraintclass": 26, "contribut": [0, 1, 7, 8, 10, 12, 13, 18, 24, 25, 26, 29], "contributor": [9, 10, 13, 18, 29], "contributori": [10, 18], "control": [10, 11, 12, 13, 17, 18, 19, 24, 26, 28, 30, 32], "conveni": [31, 32], "convent": [1, 22, 24, 25], "converg": [15, 25], "convers": [10, 12, 13, 18, 24, 25, 28], "convert": [0, 11, 12, 13, 17, 19, 22, 24, 25, 28, 32, 34], "convolut": [3, 13, 23, 25, 26, 28, 31, 32], "coordin": [13, 23, 25, 26, 28, 34], "coorespond": 27, "copi": [1, 3, 10, 18, 25, 29, 31], "copyright": [9, 16], "core": 0, "coreform": 25, "corioli": 24, "cork": 12, "correct": [3, 15, 24, 25, 29, 31], "correctli": [3, 25, 26, 28, 29, 31, 34], "correspond": [0, 3, 15, 22, 24, 25, 26, 27, 28, 32, 34], "cosh": 0, "cosin": 25, "cost": 25, "costello": 12, "could": 25, "couldn": 25, "count": 25, "counterclaim": [10, 18], "counterpart": 3, "coupl": [11, 12, 17, 19, 25, 27, 28], "cours": [12, 30], "covari": 22, "cover": [22, 24, 25, 27], "crank": [25, 28], "crash": 13, "crc": 20, "creat": [0, 1, 3, 11, 12, 13, 15, 17, 22, 25, 26, 28, 31, 32, 34], "create_mooring_matrix": [15, 17, 22], "creation": [15, 22], "credit": 8, "crest": 24, "critic": [3, 32, 34], "cross": [0, 10, 18, 25, 26], "csi_c": 15, "csi_theta_bl": 15, "csi_theta_rosco": 15, "cube": [25, 26], "cubit": 25, "cummin": 24, "current": [0, 3, 4, 6, 7, 13, 19, 23, 26, 31, 34], "custom": [11, 25, 28, 32, 34], "customari": [10, 18], "customiz": [11, 13], "customvisibilitycallback": 3, "cut": 22, "cylind": [0, 24, 25, 28], "d": [0, 10, 12, 13, 15, 18, 22, 24, 25], "d1": [15, 22], "d2": [15, 22], "d3": [15, 22], "d4": [15, 22], "d5": [15, 22], "d6": [15, 22], "d7": [15, 22], "d8": [15, 22], "d9": 15, "d_": 24, "d_d": 24, "d_r": 24, "dagher": 15, "dai": 12, "damag": [10, 18], "damiani": 15, "damp": [3, 13, 15, 22, 23, 26, 27, 28, 31, 32, 34], "dampen": 24, "damper": [24, 25], "daniel": 15, "dash": 25, "dasin": 24, "dat": [13, 25, 34], "data": [0, 3, 11, 13, 15, 17, 19, 22, 24, 26, 27, 28, 32, 33], "databas": 34, "dataset": 25, "date": [10, 18], "dav": 13, "davi": 15, "david": [7, 13, 19, 24, 25], "dc": 12, "dd": 25, "ddot": [0, 22, 24], "de": [8, 10, 18], "dead": 13, "debug": 30, "decai": [11, 24, 28, 30], "decemb": 12, "decid": 22, "declutch": 27, "decompos": 0, "decomposit": [0, 24], "decreas": [0, 3, 25, 26, 31], "dedic": 22, "deep": [24, 25], "deepcwind": [11, 24, 25], "deepli": 25, "deepwat": 25, "default": [0, 3, 13, 24, 25, 26, 28, 34], "defend": [10, 18], "deficit": 15, "defin": [0, 1, 3, 7, 10, 13, 15, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "definit": [0, 3, 10, 13, 15, 18, 22, 24, 25, 28, 32, 34], "deflect": 22, "deform": [0, 24], "deg": [15, 22, 25, 26], "degre": [0, 7, 11, 15, 22, 24, 25, 26, 27, 28, 31, 34], "delai": 0, "delclutch": 25, "delcuth": 25, "delet": [3, 5, 25], "delft": 22, "delhommeau": 24, "deliber": [10, 18], "delta": [22, 24, 25], "demand": 22, "demonstr": [0, 11, 12, 25, 27, 32], "denot": [0, 22, 24, 34], "dens": 25, "densiti": [0, 15, 22, 24, 25, 26, 28], "denver": 12, "depart": [7, 8, 12], "depend": [0, 3, 13, 22, 24, 25, 27, 28], "depict": 0, "depth": [0, 15, 24, 25, 26], "deriv": [0, 10, 18, 22, 24, 25, 31], "desalin": [7, 25, 30], "descend": 24, "describ": [0, 3, 4, 10, 15, 18, 22, 24, 25, 28, 31, 32, 33, 34], "descript": [15, 17, 25, 28, 31, 34], "design": [10, 12, 15, 18, 20, 22, 24, 25, 28, 32, 34], "desir": [0, 3, 15, 22, 24, 25, 28, 31, 32], "destblocknam": 3, "detach": 22, "detail": [0, 1, 3, 15, 17, 24, 25, 27, 30, 34], "detect": 28, "determin": [0, 10, 15, 18, 22, 24, 25, 28, 34], "detract": 31, "dev": [3, 5, 6, 13], "develoepr": 1, "develop": [0, 1, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 28, 29, 31, 32, 33, 34], "deviat": 22, "devic": [7, 11, 13, 17, 24, 25, 28, 31, 34], "devis": 25, "df": 24, "dforbush2": 13, "di": [14, 19], "dia": 24, "diagon": 24, "diagram": [3, 11, 13, 17, 25, 28, 34], "dialog": [3, 25], "diamet": [0, 15, 24], "differ": [0, 3, 5, 10, 13, 15, 17, 18, 22, 24, 25, 27, 28, 31, 32], "differenti": [22, 24, 25, 28], "difficult": [0, 3, 24, 31], "difficulti": [0, 31], "diffract": [0, 24, 25], "diffractionforc": 25, "digit": 25, "dimens": [15, 25, 26, 32], "dimension": [13, 24], "direciton": 26, "direct": [0, 10, 13, 15, 18, 22, 24, 26, 28, 31, 32], "direction": [13, 24], "directli": [3, 13, 17, 22, 24, 25, 28, 31], "directori": [1, 3, 6, 13, 24, 25, 27, 28, 29, 32, 34], "disabl": 26, "disableal": 26, "disclaim": [10, 18], "discret": [3, 15, 22, 24, 25, 28], "discretis": 15, "discuss": [0, 10, 15, 18, 22, 24, 33], "disk": 15, "dispar": 25, "dispers": [23, 25], "displac": [0, 17, 24, 26, 27, 28, 31], "displai": [10, 18, 29], "dissip": [25, 32], "distanc": [0, 15, 22, 24, 25, 26], "distinct": [3, 24, 25, 28, 32], "distribut": [0, 6, 10, 18, 22, 24, 25, 26], "divers": [15, 22], "divid": [25, 28], "dll": [13, 26], "dmass": 0, "dn": 25, "do": [0, 10, 13, 15, 18, 22, 25, 28, 29, 31], "doc": [13, 28], "doc_auto_gen_mask": 13, "document": [0, 1, 3, 4, 6, 10, 13, 18, 22, 25, 27, 28, 29, 34], "doe": [0, 3, 10, 12, 15, 18, 22, 24, 25, 28, 31, 32, 33], "doesn": [13, 25], "dof": [13, 24, 25, 26, 27, 28], "doi": [13, 24], "domain": [0, 7, 11, 15, 22, 23, 25, 28, 34], "domains": [25, 26], "domin": [0, 7, 13, 25], "don": 3, "done": [15, 22, 25, 28, 31, 32], "donload": 33, "dot": [0, 22, 24, 25], "doubl": [25, 28, 32], "down": 25, "download": [13, 25, 28, 30, 31, 33, 34], "dp": [15, 22], "drag": [0, 13, 15, 22, 24, 26, 28, 32], "dramat": 24, "drift": [13, 24, 25, 26], "drive": [13, 24, 26, 28], "drivetrain": 25, "drogu": 24, "drop": [25, 32], "dt": [0, 22, 25, 26, 28, 32, 34], "dtfenonlin": 13, "dtme": 13, "dtnl": 13, "dtnsrdc": 24, "dtout": [25, 26], "due": [0, 7, 15, 22, 24, 25, 26], "durat": 25, "dure": [0, 3, 15, 17, 22, 24, 25, 26, 28, 32, 34], "dx": 25, "dy": 25, "dyke": 15, "dylib": 26, "dynam": [7, 11, 12, 22, 24, 25, 28], "dynamomet": 12, "dz": 25, "e": [0, 3, 6, 12, 15, 17, 20, 21, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "ea": 15, "each": [0, 3, 6, 10, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "earli": 13, "earlier": [22, 24], "eas": 31, "easi": [3, 31, 34], "easier": [24, 25], "easiest": [29, 32], "easili": [3, 5, 25, 27, 29], "econom": [12, 20], "edit": [1, 3, 15, 25], "editor": 3, "editori": [10, 18], "edward": 8, "eer": 12, "effect": [0, 11, 22, 24, 25, 31], "effici": [8, 15, 20, 22, 25], "effmodel": 25, "effort": [4, 31], "efftabledeltap": 25, "efftablemecheff": 25, "efftableshaftspe": 25, "efftablevoleff": 25, "egeland": 24, "eight": 28, "either": [0, 3, 10, 18, 25, 26, 28], "elabor": [10, 18, 25], "electr": [15, 22, 25, 26, 28], "electri": 25, "electricgen": 25, "electricgeneratorec": 25, "electromagnet": 25, "electron": [10, 18], "element": [2, 3, 11, 13, 15, 17, 22, 23, 26, 28, 31, 32, 34], "elev": [0, 3, 11, 13, 24, 26, 27, 28, 32], "elevationdata": 28, "elevationfil": [25, 26, 28], "elevationimport": [25, 26, 32], "elevationtospectrum": 28, "elipsoid": 25, "ellipsoid": [11, 27], "els": 3, "elsewher": 15, "emilio": 19, "empir": 24, "emploi": 22, "empti": [24, 25], "enabl": [3, 13, 15, 25, 34], "encompass": 26, "encourag": 24, "end": [0, 3, 10, 13, 15, 18, 22, 24, 25, 26, 28, 32, 34], "endtim": [25, 26, 28, 32, 34], "energi": [8, 10, 11, 12, 13, 15, 17, 18, 19, 20, 22, 24, 25, 28, 32], "engag": 4, "engin": [8, 10, 12, 18, 24, 25], "englob": 22, "enhanc": 25, "enk": 24, "enough": 31, "ensur": [3, 5, 6, 25, 31], "enter": [15, 28], "entir": [0, 3, 24, 25], "entiti": [10, 18], "enviro": 0, "environ": [13, 19, 22, 24], "eq": 22, "eqn": 0, "equal": [0, 13, 15, 22, 24, 25, 26, 28], "equalenergi": 25, "equat": [0, 3, 7, 11, 15, 22, 24, 25, 28, 34], "equilibrium": [22, 25, 26, 31, 32], "equilibriumposit": 26, "equispac": 15, "equival": [13, 24, 25, 28], "erica": 27, "erlend": 24, "ermando": [19, 20], "error": [0, 3, 13, 22, 26, 29, 31], "errorifloadnewmodel": 29, "ertekin": 24, "especi": [3, 4, 25, 28, 31], "essenti": [3, 24, 25, 31], "establish": [12, 25], "estim": [0, 22, 25], "et": [12, 20, 25], "eta": [0, 24, 25], "etabuttoncallback": 3, "etadata": 25, "etc": [0, 3, 19, 25, 26, 28, 31], "etmc": 15, "european": [12, 13, 24], "evalu": [15, 24, 31], "evan": 15, "even": [10, 18], "evenli": [22, 24], "event": [10, 18, 24], "everi": [22, 25, 28, 29, 31], "ew": 24, "ewtec": [12, 13], "ewtec2015": 24, "ex": [25, 28, 34], "ex_im": 25, "ex_k": 25, "ex_ma": 25, "ex_ph": 25, "ex_r": 25, "ex_t": 25, "ex_w": 25, "exact": 25, "exactli": 24, "examin": [24, 25], "exampl": [0, 1, 3, 10, 11, 13, 17, 18, 22, 24, 27, 28, 29, 30, 31, 33, 34], "exc": 24, "exce": [13, 22, 25], "exceed": [15, 25], "excel": [25, 27], "except": [3, 5, 10, 18, 22, 24, 25], "excit": [3, 12, 23, 26, 28, 34], "excitationforc": 25, "excitationirf": [25, 26], "exclud": [10, 13, 18, 25], "exclus": [10, 18], "excoeff": 25, "execut": [3, 6, 10, 13, 15, 17, 18, 22, 25, 26, 27, 28, 32, 34], "exercis": [10, 18, 25], "exert": [0, 24, 25, 26], "exhibit": 25, "exist": [15, 17, 22, 25, 31], "exp": 24, "expand": 13, "expect": [22, 25, 31], "expedi": 22, "expens": 25, "experi": [12, 25, 28], "experienc": 25, "experiment": [0, 12, 24, 25, 27, 32], "expertis": 12, "explain": [15, 17, 22, 31], "explicitli": [10, 13, 18, 24], "exploit": 22, "explor": [0, 3, 12, 22, 25, 26, 29, 34], "expon": [15, 24], "exponenti": 24, "export": [25, 34], "express": [0, 10, 13, 18, 22, 24], "extend": 13, "extens": [13, 26, 30, 32], "extent": 25, "extern": [0, 4, 7, 9, 11, 17, 22, 29, 30], "extra": 25, "extract": [2, 13, 22, 24, 25, 28, 33], "extractmaskvari": 0, "extrapl": 0, "extrapol": 0, "extrem": [12, 15, 25, 31], "f": [0, 12, 24, 26, 28], "f_": [0, 24, 25], "face": [3, 25, 26], "facet": 26, "facil": 12, "facilit": 24, "fact": 22, "factor": [0, 15, 24, 25], "faddedmass": 0, "fail": [6, 31], "failur": [10, 18, 31], "fair": 31, "fairlead": [15, 22, 26], "falc": 25, "fall": 31, "faln": 24, "familiar": [25, 32], "fanzhong": 15, "faq": 30, "far": [15, 22, 25], "faraggiana": [19, 20, 21], "fare": 12, "farm": 12, "fashion": 25, "fast": [12, 20, 21], "faster": 25, "fatigu": 20, "fault": 27, "fcn": 13, "fd": 24, "feather": [15, 22], "featur": [2, 3, 4, 5, 6, 11, 13, 16, 17, 21, 22, 24, 27, 28, 29, 30, 31, 32, 34], "februari": 12, "fed": 25, "fee": [10, 18], "feed": [24, 28], "feedback": [22, 25], "feedthrough": 24, "feil": 15, "ferri": 12, "fetch": 24, "few": [15, 25], "fexcpredict": 25, "fidel": [24, 28], "field": [0, 12, 15, 22, 24, 25, 26, 28], "fifth": 24, "fifti": [10, 18], "fig": 26, "figur": [0, 3, 11, 13, 15, 22, 24, 25, 26, 29, 31, 32, 34], "file": [0, 10, 11, 13, 15, 17, 18, 22, 26, 27, 28, 29, 30, 33], "filedir": 25, "filenam": [3, 25, 26], "fileparam": 3, "filepath": 3, "filter": [13, 15, 22], "final": [15, 22, 32], "find": [15, 22, 24], "finit": [15, 24, 31], "fir": [13, 26], "first": [0, 3, 13, 15, 22, 24, 25, 26, 28, 31, 32], "fit": [10, 18, 25, 31], "five": 28, "fix": [5, 11, 13, 15, 22, 26, 27, 28, 32, 34], "fix_readwamit_and_writebemioh5": 13, "fk_im": 25, "fk_ma": 25, "fk_ph": 25, "fk_re": 25, "fkforc": 25, "flag": [3, 13, 25, 26, 28], "flap": [25, 27, 32, 34], "flex": [25, 26, 28], "flexibl": [0, 3, 4, 7, 11, 12, 13, 22, 24, 25, 26, 27, 28], "flight": 12, "flip": 0, "float": [11, 12, 15, 17, 19, 20, 21, 22, 24, 26, 27, 28, 31, 32], "floor": 27, "flow": [0, 15, 24, 25, 26, 31], "flowrat": 25, "flowrateaccumul": 25, "fluid": [0, 24, 25, 26, 27, 28], "flux": 24, "focu": [5, 15, 22], "focus": [25, 33], "folder": [3, 22, 25, 26, 27, 28, 29], "follow": [0, 3, 6, 10, 13, 15, 17, 18, 21, 22, 24, 25, 26, 28, 29, 31, 32, 34], "followerconnect": [25, 26, 28], "foolproof": 31, "foral": [0, 24], "forbush": [7, 13, 25], "forc": [0, 3, 11, 12, 13, 15, 22, 24, 26, 28, 31, 32, 33, 34], "forceactu": 26, "forceaddedmass": 26, "forceconstraint": 26, "forceexcit": 26, "forceinternalmechan": 26, "forcelineardamp": 26, "forcemoor": 26, "forcemorisonandvisc": 26, "forceradiationdamp": 26, "forcerestor": 26, "forcetot": 26, "fork": [1, 5], "form": [0, 10, 18, 22, 24, 25, 28, 34], "format": [2, 13, 25, 26, 28, 34], "former": 7, "formul": [0, 13, 23, 25, 27], "formula": [24, 25], "forthcom": 25, "forward": [3, 12], "found": [0, 15, 17, 22, 24, 25, 27, 28], "four": [11, 13, 15, 22, 25, 27, 28, 29], "fourth": [24, 25], "fowt": [15, 17, 22], "fr": 24, "frac": [0, 15, 22, 24, 25], "fraction": 0, "frame": [0, 3, 15, 22, 25, 26, 32], "frameless": 25, "framework": 6, "franc": [12, 24], "francisco": [12, 32], "frederik": 15, "free": [10, 11, 18, 24, 25, 26, 28, 30, 32], "free_decai": 25, "freedom": [0, 7, 11, 15, 22, 24, 25, 26, 27, 28, 31, 34], "freeli": 25, "freemdom": 24, "frequenc": [0, 3, 11, 13, 15, 22, 24, 25, 26, 28, 31, 34], "frequent": 31, "friction": [15, 24, 26], "from": [0, 1, 2, 5, 10, 11, 13, 15, 17, 18, 22, 26, 27, 28, 29, 31, 32, 33, 34], "front": [24, 25, 31], "frontier": 15, "froud": [0, 11, 13, 23, 26, 34], "full": [10, 13, 18, 24, 26, 31, 32], "fullfil": 29, "fulli": [13, 24, 25], "function": [0, 2, 6, 11, 13, 15, 17, 22, 23, 26, 29, 30, 31, 32, 33, 34], "functionnam": 28, "fund": [7, 9, 31, 32], "fundament": 32, "further": [0, 17, 22, 24, 25, 28], "furthermor": [22, 25], "futur": [4, 25, 31], "fx": [15, 22, 25], "fy": [15, 22, 25], "fz": [15, 22, 25], "g": [0, 3, 6, 15, 17, 20, 21, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "ga": 28, "gaertner": 15, "gain": [15, 22, 25], "gamma": [13, 22, 24, 26, 28], "gamma_": 22, "gamma_u": 22, "garrett": 15, "garzon": 12, "gashydaccumul": 25, "gather": 24, "gato": 25, "gaug": [13, 26], "gbm": [13, 24, 25, 26], "gbmdof": 26, "gdf": 34, "gen": [15, 22], "gen_eff": 15, "gener": [0, 3, 6, 7, 10, 11, 12, 13, 15, 18, 23, 26, 28, 29, 30, 31, 32, 33], "genpath": 29, "gentorqu": 26, "geometr": [15, 19, 22], "geometri": [0, 22, 24, 26, 27, 28], "geometryfil": [25, 26, 28, 32, 34], "geomfil": 28, "geophys": 24, "georg": 15, "georgia": 8, "geq": 24, "geq1": 24, "german": 24, "get": [0, 2, 3, 4, 13, 25, 30, 31], "getdialogcontrol": 3, "getdofnam": 13, "getparamet": 3, "gh": 24, "ghigo": [19, 20, 21], "gienapp": 24, "gif": [25, 26], "giorgio": 25, "giovanni": 19, "git": [1, 3, 5, 13, 29, 31], "github": [1, 3, 5, 6, 10, 13, 18, 27, 28, 29, 31], "give": [10, 17, 18, 28], "given": [0, 3, 11, 15, 19, 24, 25, 26, 27, 28, 34], "gk": [0, 24], "global": [0, 3, 15, 22, 25, 26, 28, 32, 34], "glyph": 25, "go": [25, 26, 27, 29, 31], "goal": 22, "golden": 15, "gome": 25, "good": [25, 31], "goodwil": [10, 18], "googl": 13, "goto": 28, "goupe": [15, 24], "govern": [0, 7, 10, 11, 18], "gp_llj": 15, "grai": 3, "graident": 0, "grant": [10, 18], "graphic": 0, "graphiccolor": 25, "grasberg": [7, 13], "gravit": [0, 24, 25], "graviti": [0, 15, 24, 25, 26, 28, 31, 32, 34], "greater": [0, 3, 15, 22, 25, 26, 31], "greatli": [3, 24], "green": [3, 17, 25], "grei": 17, "grid": [15, 22, 25], "gridheight": 15, "gridwidth": 15, "grossli": [10, 18], "ground": [25, 32], "group": [24, 28], "grove": 24, "growth": 24, "guarante": 15, "gui": [3, 13, 32, 34], "guid": [15, 31], "gunawan": 12, "guo": 12, "gusmano": 13, "gx": 25, "gy": 25, "gz": 25, "h": [0, 12, 13, 15, 22, 24, 25, 28], "h0r5e": 13, "h2l": 15, "h5": [3, 13, 24, 26, 27, 28, 29, 31, 32, 34], "h5button": 3, "h5buttoncallback": 3, "h5file": 26, "h_": 24, "ha": [3, 7, 8, 10, 11, 14, 17, 18, 22, 24, 25, 28, 31, 32], "habib": 15, "had": [7, 8, 31], "hal": 24, "half": 25, "hall": [8, 12, 15, 24], "hallett": [12, 32], "hand": [0, 15, 22, 24, 25], "handl": [0, 13, 22, 24, 25, 26], "hankel": 24, "hansen": 15, "har": 12, "hard": 25, "harder": 25, "hardstop": [25, 26], "hardstopcallback": 3, "hardwar": [3, 25, 32], "harmless": [10, 18], "harmon": 24, "harvest": 25, "haskind": 25, "hasselman": 24, "hasselmann": 24, "hat": [22, 24], "have": [0, 1, 3, 10, 11, 13, 15, 17, 18, 22, 24, 25, 28, 29, 31], "hayman": 15, "hdf5": [13, 25, 26, 30, 31, 32, 34], "hdfgroup": 34, "hdfview": 34, "head": [0, 24, 25], "header": [25, 31], "heav": [0, 15, 22, 24, 27, 32], "heavili": 28, "height": [15, 22, 24, 25, 26, 27, 28, 32, 34], "help": [3, 12, 25, 31, 33], "hemispher": 11, "henc": 25, "henrik": 15, "henriqu": 25, "here": [0, 12, 15, 22, 24, 25, 31, 33], "herebi": [10, 18], "herein": [10, 18], "hertz": 24, "hexafloat": 20, "hflowang": 15, "hi": 12, "hidden": 3, "hide": 3, "hierarch": [13, 25], "high": [0, 11, 22, 25, 26, 28, 34], "higher": [15, 22, 24, 26], "highest": 22, "highli": [11, 22, 24, 25, 27, 31], "highlight": [11, 17, 25, 27, 31], "hil": 32, "hing": [25, 32], "hinsdal": 12, "histor": 3, "histori": [5, 25, 26], "hit": 32, "hjulstad": 24, "hold": [10, 18, 24, 25, 28], "homepag": 34, "honeywel": 8, "hope": 31, "horizon": 25, "horizont": [0, 15, 19, 22, 24], "host": [1, 25, 29, 33], "hotimski": [12, 32], "hover": 3, "how": [0, 3, 12, 15, 22, 25, 27, 28, 29, 32, 33, 34], "howev": [0, 3, 10, 15, 18, 22, 24, 25, 29, 31, 34], "hsiang": [7, 24], "hst": 25, "html": [10, 18], "http": [1, 10, 13, 18, 24, 25, 27, 29, 34], "hub": [15, 22, 26], "hubht": 15, "hull": [11, 25], "husain": [7, 13], "hybrid": [15, 17, 19, 20, 22, 24, 25], "hydpistoncompress": 25, "hydraul": [11, 12, 23, 26, 28], "hydraulicacc": 25, "hydrauliccyl": 25, "hydraulicmotor": [25, 26], "hydro": [13, 26, 27, 28, 31], "hydro2": 25, "hydro3": 25, "hydrodata": [25, 29, 31, 32], "hydrodynam": [0, 7, 11, 12, 13, 17, 22, 24, 26, 28, 30, 32], "hydroforc": [0, 26], "hydroforceindex": 26, "hydroforceindexiniti": 26, "hydrograph": 24, "hydrohanam": 26, "hydrostat": [11, 13, 22, 24, 25, 26, 28, 34], "hydrostatics_0": [25, 34], "hydrostatics_1": [25, 34], "hydrostatics_sub_dir": 25, "hydrostatiscs_0": 25, "hydrostiff": [26, 31], "hyperbol": 24, "hyperlink": 13, "hz": [24, 28], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "i_": [0, 22, 24], "ib": 0, "ibod": 0, "ideal": [0, 25], "ident": [0, 3, 25, 28], "identif": 24, "identifi": [3, 25, 27], "idepend": 1, "iea": [15, 22], "iec": [13, 15, 24, 28], "iec_windtyp": 15, "ieckai": 15, "iecstandard": 15, "iecturbc": 15, "iecvkm": 15, "ieee": [12, 25], "ii": [10, 18, 25], "iii": [10, 18], "ilin": 25, "illustr": 24, "imag": [13, 15, 25, 28], "imaginari": 25, "imbal": 31, "immedi": [3, 31], "impact": [24, 25, 31], "impart": 25, "imped": 25, "imperfect": 25, "imping": 0, "implement": [3, 12, 13, 15, 24, 26, 27, 28, 31, 32, 33, 34], "impli": [0, 10, 18, 24, 25], "import": [0, 3, 10, 13, 18, 22, 24, 25, 27, 28, 32], "importbodygeometri": 25, "impos": [0, 15, 22, 25], "improv": [4, 10, 12, 13, 18, 22, 25, 31], "impuls": [13, 24, 26, 28, 33], "inabl": [10, 18], "inacces": 0, "inaccur": 31, "inact": 22, "inadequ": 25, "inc": 8, "incid": [0, 24, 25, 26, 28], "incident": [10, 18], "includ": [0, 3, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 32, 34], "inclus": [4, 10, 12, 18, 25], "incom": [24, 25, 26, 28, 32], "incompat": 22, "incomplet": [6, 31], "incompress": 24, "incorpor": [5, 10, 18, 22], "incorrect": 0, "increas": [13, 22, 24, 25, 26, 31], "increasingli": 0, "increment": 25, "incur": [10, 18], "indefinit": 31, "indemn": [10, 18], "indemnifi": [10, 18], "indepen": 0, "independ": [0, 22, 24, 25, 26], "index": [10, 15, 18, 24, 25, 26, 28], "indic": [10, 15, 18, 22, 24, 25, 26, 31], "indirect": [10, 18], "individu": [0, 3, 10, 11, 18, 25], "induc": [24, 25], "industri": [7, 22, 24, 25], "ineffici": 25, "inerti": [15, 19, 22, 25, 26], "inertia": [0, 13, 15, 22, 24, 25, 26, 28, 31, 32, 34], "inertiaproduct": [0, 26], "infilebuttoncallback": 3, "infin": 24, "infinit": [0, 13, 24, 25, 28, 31], "inflow": 15, "influenc": [15, 22, 24, 28], "inform": [3, 6, 7, 10, 15, 18, 22, 24, 25, 28, 29, 31, 32, 34], "infring": [10, 18], "infti": [0, 22, 24, 25], "inher": [25, 31], "inid": 25, "initi": [0, 3, 12, 13, 22, 24, 25, 26, 27, 31, 32, 34], "initializewecsim": [0, 17, 22, 25, 32], "initil": 26, "inproceed": 21, "input": [0, 11, 13, 15, 16, 17, 19, 24, 25, 26, 28, 31, 32], "inputdata": 25, "inputorcustomcallback": 3, "insert": 24, "insid": [3, 25], "insignificantli": 31, "instabl": 0, "instal": [13, 30, 31, 32, 34], "instanc": [3, 22, 25, 26, 28, 29, 32, 34], "instant": 22, "instantan": [24, 25, 26, 28, 34], "instanti": [28, 32, 34], "instead": [0, 13, 22, 25, 28], "institut": [8, 10, 18, 24], "instruct": [3, 25, 29, 32, 33], "insuffici": 31, "int_": [22, 24], "int_0": 22, "intak": 13, "integ": [25, 26], "integar": 25, "integr": [3, 6, 13, 22, 23, 26, 28, 31, 32], "intend": [4, 22, 24, 31], "intens": [15, 22], "intention": [10, 18, 31], "interact": [11, 13, 22, 24, 28, 30], "interdepend": 3, "interest": [15, 22, 25, 27], "interfac": [10, 11, 18, 25, 31], "interi": 26, "intern": [3, 4, 8, 12, 20, 24, 26], "interplai": [3, 25], "interpol": [22, 24, 25, 26, 28], "intertia": 28, "interv": 25, "intop_": [24, 25], "intop_0": 25, "introduc": [15, 17, 22], "introduct": [13, 16, 22], "invari": 24, "investig": [22, 31], "inviscid": [24, 31], "involv": [15, 24], "io": [10, 16, 18], "iop": [20, 21], "ireland": 12, "irf": [24, 25, 31], "irr": 31, "irregular": [3, 13, 23, 26, 32], "irrevoc": [10, 18], "irrot": 24, "isbn": 15, "isequ": 3, "isol": 25, "isop": 12, "issoglio": 19, "issu": [0, 10, 13, 18, 30], "ital": 31, "itali": [14, 19], "item": 3, "iter": [25, 28], "its": [0, 3, 10, 11, 12, 13, 18, 22, 24, 25, 26, 28, 29, 31, 32], "ixi": 26, "ixx": 26, "ixz": 26, "iyi": [26, 32], "iyz": 26, "izz": 26, "j": [12, 13, 15, 25, 26, 28], "januari": [10, 12, 18], "jcc": 25, "jeff": [7, 13], "jem": 25, "jenkin": 13, "jenn": 12, "jennif": [7, 15], "jerica": 24, "jet": [12, 15], "jiamigit": 13, "jleonqu": 13, "jn": 24, "jniffen": 13, "job": 13, "john": 12, "johnson": 24, "joint": [7, 11, 13, 22, 24, 26, 28, 31, 32, 34], "jonkman": 15, "jonswap": [13, 28], "jorg": [7, 13], "joss": 24, "journal": [20, 21, 24], "jtgrasb": 13, "jul": 12, "juli": 12, "june": [12, 24], "just": [11, 15], "k": [0, 12, 13, 22, 24, 25, 32], "k1": 25, "k2": 25, "k_": [22, 25], "k_e": 24, "k_h": 25, "k_i": [15, 22, 25], "k_p": [15, 22, 25], "k_r": 24, "ka": 25, "kaimal": 15, "kalman": 22, "kalmann": 22, "kanner": [8, 12, 32], "karman": 15, "katherin": 15, "kb": 15, "kc": 0, "ke": 25, "keep": [3, 5, 22, 25, 31], "keester": [7, 13], "kellei": [7, 12, 13, 15, 25], "kept": 22, "kernel": 24, "kg": [0, 15, 24, 25, 26, 32, 34], "kh": [0, 13, 24, 25, 34], "kh_0": [25, 34], "kh_1": [25, 34], "kilogram": 24, "kind": [10, 18], "kinemat": [0, 24, 25], "kitaigorodskii": 24, "kmruehl": 13, "kn": 25, "know": [12, 15, 22], "knowledg": 25, "known": [0, 15, 22, 25], "kona": 12, "korea": 12, "kristiansen": 24, "krokstad": 24, "kruseman": 24, "krylov": [0, 11, 13, 23, 26, 34], "kt": 15, "kulegan": 0, "kung": 24, "kurniawan": 24, "kv": 15, "kw": 25, "l": [12, 15, 22, 24], "la": 25, "lab": [12, 14, 15, 19], "label": [13, 25], "laboratori": [7, 8, 10, 12, 15, 18, 19], "lack": 31, "lambda": [0, 22, 24], "lambda_": [22, 24], "languag": [10, 18], "laplac": [22, 24], "larg": [0, 24, 27, 28, 29, 31], "larger": [25, 31], "largexydisplac": 25, "largexydispopt": 13, "last": [15, 22, 24, 27, 29], "lastli": [25, 34], "latch": 27, "later": [0, 15, 22, 25], "latest": [3, 5, 29], "latha": 15, "latter": [22, 28], "launch": [15, 22], "law": [10, 15, 18, 22, 24, 25, 26], "lawson": [7, 12, 32], "lawsuit": [10, 18], "layout": [25, 31], "lbrace": 0, "ldot": 24, "lead": [22, 25], "learn": 27, "least": [10, 18, 28, 34], "leav": 25, "led": 22, "lee": 24, "left": [0, 22, 24, 25], "legaci": [5, 25], "legal": [10, 18], "lene": 12, "length": [0, 15, 22, 24, 25, 26], "leon": [7, 13], "leq": 24, "less": [3, 13, 15, 22, 25], "level": [11, 15, 22, 24, 25, 26, 28, 34], "lever": 0, "leverag": 12, "lf": [13, 29, 31], "li": [12, 24, 25, 32, 34], "liabil": [10, 18], "liabl": [10, 18], "lib": [3, 13, 25, 26, 28], "librari": [2, 13, 17, 21, 22, 25, 30, 31, 32, 33, 34], "library_fil": 3, "licens": [9, 16], "licensor": [10, 18], "lien": [24, 25], "lift": [15, 22], "light": 3, "like": [12, 15, 22, 25, 31], "limit": [0, 3, 10, 15, 18, 22, 24, 26, 32], "lindbeck": 27, "line": [3, 13, 15, 22, 24, 25, 26, 27, 28], "line1": 26, "line2": 26, "linear": [0, 13, 15, 17, 22, 23, 25, 26, 28, 34], "linear_mass": 15, "lineardamp": [25, 26, 31], "linearli": 24, "ling": 8, "link": [3, 10, 13, 18, 22, 25, 28, 31], "linkag": 24, "linspac": 25, "linux": 13, "lisbon": 20, "lisfilenam": 25, "list": [3, 8, 10, 12, 18, 25, 26, 28, 29, 32, 33, 34], "literatur": 24, "litig": [10, 18], "littl": 25, "llc": [8, 10, 18], "lmc": 25, "ln": 24, "load": [3, 12, 13, 17, 24, 26, 28], "load_h5": 25, "loadfil": 25, "loadinputfilecallback": 3, "loadlookupt": 26, "loc": 26, "local": [0, 1, 3, 6, 25, 28, 29], "locat": [0, 6, 13, 24, 25, 26, 27, 28, 32, 34], "lock": 25, "log": [13, 15], "logarithm": 15, "logic": [15, 17, 22], "lomonaco": 12, "long": [3, 31], "longer": [8, 13, 25], "longrightarrow": 22, "look": [15, 17, 25, 26, 28], "lookup": [23, 26, 28], "lookupt": 26, "lookuptablefil": [17, 25, 26], "lookuptableflag": 26, "loop": [0, 3, 15, 22, 25, 32], "lope": 25, "loss": [10, 18, 24, 25], "lost": 26, "low": [22, 25, 26], "lower": [22, 24, 25, 26], "lowerlimitbound": 25, "lowerlimitdamp": 25, "lowerlimitspecifi": [3, 25], "lowerlimitstiff": 25, "lowerlimittransitionregionwidth": 25, "lti": 24, "luci": 15, "lump": [0, 24, 25, 26, 28], "lunar": 12, "lvert": 0, "m": [0, 3, 5, 12, 13, 15, 17, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33], "m0": 24, "m3": 24, "m_": [0, 24], "m_k": 24, "mac": 13, "macro": [13, 28], "made": [3, 4, 6, 8, 10, 13, 18, 22, 24, 25], "madrid": 12, "magnet": [24, 25, 26], "magnitud": [0, 25], "mai": [0, 1, 3, 8, 10, 11, 12, 18, 24, 25, 28, 29, 31, 32, 34], "mail": [10, 18], "main": [5, 6, 8, 10, 13, 15, 18, 22, 25, 29, 34], "mainli": 22, "maintain": [3, 5, 15, 19, 22, 24, 31], "mainten": 8, "major": 25, "make": [3, 10, 12, 13, 18, 22, 25, 31], "malfunct": [10, 18], "manag": [8, 10, 18], "mancellin": 13, "mani": [7, 8, 15, 25, 27, 31], "manipul": [0, 22, 25], "manner": [15, 25, 31], "manual": [0, 3, 4, 13, 15, 24, 25, 28, 29, 32, 34], "map": [0, 15, 22], "march": 12, "marin": [11, 12, 24, 25, 32], "mark": [10, 18, 25], "marker": [3, 13, 26, 30], "markov": 24, "masciola": 15, "mask": [2, 13, 25, 34], "maskparamet": 3, "maskvar": 3, "maskviz": 3, "mass": [2, 13, 15, 22, 24, 26, 28, 32, 34], "massimo": 19, "massless": 25, "master": 13, "mat": [3, 25, 26, 27, 28], "match": 25, "materi": 30, "math": 0, "mathbf": 24, "mathemat": 0, "mathrm": 22, "mathwork": 3, "matlab": [0, 2, 6, 7, 11, 12, 13, 15, 17, 19, 22, 25, 26, 27, 28, 30, 31, 32, 34], "matlabpath": 29, "matric": [15, 22, 25], "matrix": [0, 11, 13, 15, 22, 23, 26, 27, 28], "matt": [8, 15], "matthew": [15, 24], "matthieu": 24, "mattiazzo": 20, "max": [13, 25, 26], "max_thrust_factor": 15, "maxim": [15, 22, 25], "maximum": [0, 15, 22, 25], "maximumheight": 26, "maynooth": 12, "mccomb": 8, "mcr": [13, 27, 32, 34], "mcrbuildgain": 25, "mcrbuildtim": 25, "mcrexcelfil": [25, 26], "mcrmatfil": [3, 25, 26], "mcropt1": 27, "mcropt2": 27, "mcropt3": 27, "mcropt4": 27, "md": 24, "me": [0, 24, 25], "mean": [10, 13, 15, 17, 18, 22, 24, 25, 26, 34], "meandrift": [25, 26], "measur": [22, 24, 25, 28], "mechan": [10, 18, 22, 23, 25, 26, 27, 28, 29, 34], "media": [10, 18], "medium": [10, 18], "meerburg": 24, "meet": [10, 12, 18, 25], "megaflux": 25, "megawatt": 15, "mellon": 8, "member": [4, 7, 19, 28], "memori": 24, "meng": 15, "ment": 25, "mention": [15, 22], "meparam": 3, "merchant": [10, 18], "mere": [10, 18], "merg": [2, 5, 6, 13], "mergetool": 3, "mesh": [25, 26, 31, 34], "meshmagick": 25, "messag": [3, 5, 26, 31], "met": [0, 12, 24], "metab": 3, "meter": [24, 25], "method": [0, 3, 11, 12, 13, 15, 17, 22, 23, 25, 26, 27, 28, 34], "mf": 0, "mf0310": 25, "mfp": 25, "michael": 7, "michelen": [7, 12, 24, 32], "michigan": 8, "middl": 22, "might": 25, "mike": 25, "mileston": 12, "min": [13, 26], "mingw": 25, "minim": [22, 24], "minimum": [15, 22, 25], "minor": [13, 25], "minu": 25, "misalign": 22, "miss": 13, "mission": 8, "mitig": 22, "mix": 25, "mk": 24, "mller": 24, "mlmerg": 3, "mmx": 25, "mn": 25, "moan": 24, "modal": [24, 25], "mode": [3, 7, 11, 13, 23, 26, 28, 30], "model": [0, 3, 7, 11, 12, 13, 15, 17, 20, 21, 22, 24, 26, 27, 28, 29, 31], "modelfil": 28, "modif": [10, 13, 18, 24], "modifi": [0, 3, 10, 17, 18, 22, 24, 27, 28, 29, 32], "modul": [12, 15, 24, 25], "modular": 22, "moham": [7, 13], "moment": [0, 22, 24, 25, 26, 28, 32, 34], "momentum": [15, 22, 26], "month": 13, "moodyn": 25, "moor": [3, 7, 11, 12, 13, 17, 23, 30, 31, 32, 33, 34], "moor_matrix": [15, 22], "moordyn": [13, 23, 26, 27, 28, 29], "moordyncal": 28, "moordynconnect": 28, "moordyninputfil": 26, "moordynlin": [25, 26], "moordynnod": [25, 26], "mooringclass": [13, 17, 24, 25, 26, 28], "mooringlookupt": 28, "mooringmatrix": [26, 28], "mooringnam": 28, "more": [3, 6, 7, 10, 13, 15, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "morenergi": 14, "moreov": 22, "morison": [2, 3, 13, 23, 26], "morisondt": [25, 26], "morisonel": [3, 13, 25, 26], "morrison": 0, "morten": 15, "moskowitz": [28, 32], "most": [0, 3, 12, 13, 14, 17, 20, 22, 24, 25, 28], "most_lib": [17, 22], "mostdata": 15, "mostio": [15, 17, 22], "motion": [0, 7, 11, 22, 24, 25, 26, 28, 31, 32, 34], "motionmechan": 26, "motor": [25, 26, 28], "mount": 22, "move": [12, 13, 24, 25, 32], "movement": [22, 24, 25], "mpcfcn": 25, "mshabara": 13, "much": [25, 31], "muliawan": 24, "multi": [0, 7, 8, 11, 12, 13, 15], "multibodi": [0, 7, 11, 20, 21, 24, 29, 31, 34], "multidirect": 32, "multipl": [0, 5, 11, 13, 19, 24, 26, 28, 30, 32, 34], "multipli": [15, 22, 25], "multiseg": 15, "multisurf": 34, "murrai": 15, "must": [0, 3, 5, 6, 10, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "mw": 22, "mx": [15, 22, 25], "my": [15, 22, 25], "mz": [15, 22, 25], "n": [12, 13, 15, 22, 24, 25, 26, 32], "n_": 26, "n_x": 26, "n_y": 26, "n_z": 26, "na0003525": [8, 10, 18], "nacel": [15, 17, 22, 26], "nacelleacceler": 26, "name": [3, 10, 13, 15, 17, 18, 22, 25, 26, 28, 32, 34], "nan": 26, "nangl": 26, "nant": [12, 24], "narrow": 24, "nasa": 12, "nat": 25, "nathan": 7, "nathanmtom": 13, "nation": [7, 8, 10, 12, 15, 18, 19], "nativ": 25, "natur": [7, 15, 22, 25], "navig": [5, 6, 25, 29, 32], "nb": 25, "nc": [13, 25], "ndof": 25, "ndt": 25, "ndw": 25, "necessari": [3, 15, 22, 24, 25, 28, 31], "necessarili": [10, 18, 25, 31], "need": [0, 15, 22, 24, 25, 28, 29, 34], "neg": [0, 22, 25, 26], "neglect": [0, 22, 24, 25], "neglig": [10, 18], "neil": 15, "nelessen": [8, 12], "nemoh": [11, 13, 17, 24, 25, 27, 32, 34], "nemohv3": 13, "nest": 15, "net": [24, 25, 26], "netcdf": 25, "neutral": 25, "nevarez": 25, "new": [3, 4, 5, 6, 9, 13, 15, 17, 21, 22, 24, 25, 27, 28, 29, 31, 32], "new_featur": 3, "newer": 29, "newfoundland": 12, "newman": 24, "newslett": 12, "next": [0, 3, 12, 15, 17, 25, 31, 32], "nf": 25, "nh": 25, "nhbodi": 13, "nikhar": 15, "ning": 15, "nm": [24, 25, 32, 34], "nmpc": 25, "node": [15, 22, 24, 25, 26], "nolt": 24, "nomin": [15, 22], "non": [3, 10, 13, 15, 17, 18, 22, 24, 26, 27, 31], "nondimension": [13, 24], "nonhydro": [3, 25, 26, 27, 28], "nonhydro_bodi": 25, "nonhydrodyam": 28, "nonhydrodynam": [11, 26, 28, 30], "nonhydroparam": 3, "nonlinear": [7, 11, 12, 13, 23, 26, 28, 30, 31, 34], "nonlinearbuoy": 13, "nonlineardt": [25, 26], "nonlinearhydro": [25, 26, 31], "nonlinfk": 13, "nonumb": 24, "nonzero": [24, 26], "nor": 31, "normal": [0, 10, 13, 15, 18, 22, 24, 25, 26], "normalizebem": 25, "north": 24, "norwai": 12, "note": [9, 16, 24, 25, 27, 32], "noth": [10, 18], "notic": [10, 18], "notwithstand": [10, 18], "novel": [20, 31], "novemb": [12, 20], "now": [3, 13, 17, 22, 25, 29], "nowav": [26, 31], "nowavec": [31, 32], "nrel": [7, 12, 15, 22], "nrx": 25, "nry": 25, "nrz": 25, "nsm": [32, 34], "ntess": [10, 18], "nth": 25, "ntm": 15, "nu": 0, "nuclear": 8, "nui": 12, "null": 22, "num": 3, "number": [0, 3, 7, 11, 15, 21, 22, 24, 25, 26, 28, 31], "number_lin": 15, "numer": [0, 11, 12, 15, 17, 23, 25, 27, 28, 30, 32], "numgrid_i": 15, "numgrid_z": 15, "nummoordyn": 26, "numpointsi": [25, 26], "numpointsx": [25, 26], "nwtcup": 15, "nx": 25, "nx2": 26, "ny": 25, "nz": 25, "o": [12, 24, 25], "o_a": 15, "o_discr": 15, "obj": 26, "object": [3, 10, 13, 18, 19, 21, 22, 25, 26, 28, 34], "objectclass": 28, "oblig": [10, 18], "observ": [24, 25], "obtain": [0, 10, 15, 18, 22, 24, 25, 28, 29, 31], "oc6": [11, 25], "occur": [15, 22, 25, 31], "ocean": [12, 23], "octob": 12, "ode4": [26, 27], "ode45": [13, 26, 27], "off": [3, 7, 11, 12, 23, 26, 27, 28, 29], "offer": [10, 18, 22, 25], "offic": [7, 8, 12], "offset": 15, "offshor": [11, 12, 15, 17, 19, 20, 21, 22, 24], "often": [24, 25], "og": 13, "ogden": [7, 12, 13], "ok": 25, "olav": 24, "olber": 24, "oldest": 29, "oma": [12, 24, 32], "omax": 25, "omega": [0, 22, 24, 25], "omega_": [22, 24], "omega_min": 15, "omega_n": 22, "omega_r": 22, "omega_rated_tri": 15, "omegafilt": 15, "omit": 22, "onc": [1, 5, 15, 22, 24, 25, 29, 31, 32], "one": [0, 5, 10, 15, 18, 22, 24, 25, 26, 28, 31, 32, 34], "ones": [15, 22, 25], "onli": [0, 3, 5, 10, 11, 15, 18, 22, 24, 25, 26, 28, 32, 34], "onlin": 30, "onth": 25, "op": 22, "opac": [25, 26], "open": [0, 3, 7, 11, 12, 15, 22, 24, 25, 28, 29, 32], "openei": 13, "openor": [12, 24], "oper": [8, 15, 19, 22, 25, 32], "oppos": [0, 25], "opposit": [25, 31], "opt": [22, 25], "optim": [15, 20, 22, 24, 25], "optimalgaincalc": 25, "optimis": [15, 20, 21], "option": [3, 11, 13, 15, 17, 22, 23, 25, 26, 28, 29, 31, 32, 34], "opyion": 26, "orang": 3, "orbit": 0, "order": [3, 5, 6, 13, 15, 22, 24, 25, 26, 28, 32, 34], "ordinari": 24, "oregon": [8, 12], "org": [10, 13, 18, 24, 34], "organ": [3, 8, 12, 21, 31], "orient": [0, 25, 26, 28, 34], "origin": [1, 5, 10, 13, 15, 18, 22, 25, 29, 32, 34], "oscil": [0, 11, 12, 22, 24, 25, 28, 30, 31], "osmosi": 12, "osu": 13, "oswec": [11, 13, 27, 29, 30, 31, 34], "oswec_hydraulic_crank_pto": 25, "oswec_hydraulic_pto": 25, "oswec_nonlinear_viz": 25, "osx": [13, 26], "other": [0, 3, 7, 10, 11, 15, 18, 22, 24, 26, 27, 28, 29, 30, 34], "otherwis": [10, 18, 25, 26, 28], "out": [10, 11, 13, 15, 17, 18, 22, 25, 32], "outperform": 25, "outpu": 15, "output": [0, 3, 11, 13, 15, 17, 22, 24, 25, 26, 27, 28, 29, 32, 34], "outputdata": 25, "outputdir": 13, "outputtxt": 26, "outsid": [12, 25, 28, 31], "outstand": [10, 18], "over": [0, 24, 25, 26], "overhang": 15, "overhaul": 13, "overlai": 25, "overli": 25, "overlin": [24, 25], "overrid": [25, 26], "overview": [2, 3, 9, 15, 16, 23, 25, 32], "overwrit": 28, "overwritten": 28, "own": [8, 10, 13, 18, 27, 31, 32, 34], "owner": [10, 18], "ownership": [10, 18], "p": [12, 22, 24, 25], "p_": [22, 24], "p_r": 22, "pacif": 24, "packet": 24, "page": [12, 21, 29, 31], "pai": 25, "panel": [24, 25], "pao": 15, "parallel": [0, 13, 29, 32, 34], "paramet": [0, 13, 15, 17, 22, 24, 26, 28, 31, 32, 34], "parametr": 28, "paraview": [11, 13, 26, 28, 30], "paraview_visu": 25, "pars": [28, 32, 34], "parser": 13, "part": [3, 10, 15, 18, 22, 24, 25], "parti": [10, 18, 28], "partial": [0, 15, 22, 24], "particl": [0, 24], "particular": [0, 10, 15, 18, 22, 25, 31], "particularli": [24, 25, 28], "partli": [0, 24], "pass": [5, 6, 28, 31, 34], "passiv": [7, 11, 13, 26, 30], "passiveyaw": 25, "passiveyawtest": 13, "past": [11, 25, 31], "patent": [10, 18], "path": [3, 13, 15, 25, 26, 31, 32, 34], "pathwai": 25, "pbi": 25, "pc_uv": 15, "pc_uw": 15, "pc_vw": 15, "pcc": 25, "pct": [29, 32, 34], "pde": 26, "pdest": 3, "pdf": 13, "pdi": 13, "pe": 12, "peak": [15, 22, 24, 25, 26, 28], "per": [13, 24, 25, 26, 28], "percent": [10, 15, 18], "perez": 24, "perform": [5, 7, 10, 11, 12, 15, 18, 22, 24, 25, 28, 31], "period": [0, 24, 25, 26, 27, 28, 32, 34], "perman": [3, 26], "permiss": [10, 18], "permit": 22, "permut": 25, "perp": 0, "perpendicular": [0, 25], "perpetu": [10, 18], "person": 1, "pertain": [10, 18], "pertin": [0, 3, 25], "perturb": 22, "petracca": [19, 20], "petroleum": 24, "phase": [3, 11, 12, 13, 15, 22, 24, 26, 27, 28], "phaserand": 13, "phasese": [13, 25, 26], "phenomena": 24, "phenomenon": 0, "phi": 24, "phi_": [0, 24, 25], "physic": [0, 3, 20, 21, 24, 25, 31, 34], "pi": [0, 7, 19, 22, 24, 25], "pictur": 33, "pierson": [28, 32], "pietro": 15, "pile": 24, "pipelin": 25, "piprecharg": 25, "piston": [24, 25, 26, 28], "pistoncf": 26, "pistonncf": 26, "pistonstrok": 25, "pitch": [15, 17, 24, 25, 26, 28, 32], "pitchfilt": 15, "pixel": [25, 26], "pl": 15, "place": [3, 10, 15, 18, 25, 32, 34], "placement": 0, "plai": [25, 32], "plan": 1, "planar": [24, 28], "plane": [0, 15, 25], "plant": 25, "plate": [25, 32], "platform": [15, 17, 19, 20, 22], "platt": 12, "pleas": [1, 3, 5, 13, 15, 21, 24, 25, 29, 31, 33, 34], "plexp": 15, "plot": [13, 22, 26, 27, 28, 32, 33], "plotaddedmass": 25, "plotbemio": [13, 25], "plotbodi": 25, "plotdirect": 25, "plotdof": 25, "plotelev": [25, 26], "plotexcitationirf": 25, "plotexcitationmagnitud": 25, "plotexcitationphas": 25, "plotforc": [25, 26], "plotfreqdep": 25, "plotradiationdamp": 25, "plotradiationirf": [13, 25], "plotrespons": [25, 26], "plotspectrum": [25, 26], "plotstl": [25, 26], "plotwav": 13, "plu": [7, 25], "plymouth": 13, "pm": [25, 26, 28], "pmax": 25, "pmin": 25, "pmlineargener": 26, "pmrotarygener": 26, "point": [0, 15, 22, 24, 25, 26, 27, 28, 29, 30], "polar": 12, "pole": 24, "politecnico": [14, 19], "pond": 12, "popul": [3, 25], "popup": 3, "port": [13, 32], "portion": [17, 25], "portug": 20, "posit": [0, 15, 22, 24, 25, 26, 27, 28, 31], "positiontargetprior": 25, "positiontargetspecifi": 25, "positiontargetvalu": 25, "possibl": [0, 3, 10, 15, 17, 18, 22, 25, 26, 28, 31], "possibli": 28, "post": [0, 11, 13, 15, 16, 17, 28, 30, 33, 34], "postprocesswecsim": [0, 17, 22], "pot": 34, "potenti": [0, 24, 25], "power": [7, 8, 10, 11, 12, 13, 15, 17, 18, 22, 23, 26, 27, 28, 32], "powerinternalmechan": 26, "pp": 12, "pr": [5, 13], "practic": 25, "prate": 15, "pre": [3, 15, 16, 17, 25, 28], "preced": 3, "precis": 25, "precon": [15, 22], "precursor": 34, "predict": [0, 24, 27], "prefer": [1, 10, 18, 22], "prefil": 25, "preliminari": [12, 32], "prepar": [10, 17, 18], "preprint": 15, "preprocess": 3, "prescrib": [25, 26], "presenc": [24, 25], "present": [3, 25, 32, 33], "preserv": 0, "press": 20, "pressur": [0, 13, 24, 25, 26], "pressureaccumul": 25, "pressuredi": 13, "pressureglyph": 25, "presum": 25, "pretens": [25, 26], "prevent": [0, 25, 28], "previou": [0, 13, 17, 22, 25, 31], "previous": [22, 25, 31], "primari": 22, "primarili": [3, 25, 28], "prime": [15, 22], "primit": 25, "princip": 22, "principl": 32, "print": 3, "prior": [5, 6, 25], "priori": 22, "prioriti": [25, 26], "probabl": [15, 26], "probe": 0, "problem": [24, 25, 29, 31], "proc": 24, "proce": 25, "procedur": 15, "proceed": [12, 13, 20, 24, 32], "process": [0, 3, 11, 13, 15, 16, 17, 28, 30, 31, 33], "processor": 34, "produc": [15, 24, 25, 29], "product": [0, 10, 13, 18, 22, 24, 25, 26], "profil": [15, 24], "program": [25, 34], "programmat": [0, 25], "progress": [24, 31], "project": [0, 12, 15, 24, 27, 32], "promin": [10, 18], "prompt": 3, "propag": [24, 25], "proper": 24, "properi": 26, "properli": [3, 26, 28, 31], "properti": [0, 3, 13, 15, 17, 24, 25, 26, 28, 32, 34], "proport": [0, 22], "propos": 24, "propuls": 12, "provid": [0, 3, 10, 15, 18, 19, 22, 24, 25, 28, 29, 31, 32, 33, 34], "psourc": 3, "pto": [3, 11, 12, 13, 23, 30, 31, 32, 34], "pto1": [25, 32, 34], "ptoclass": [25, 26, 28, 32, 34], "ptodamp": 28, "ptonam": [26, 28], "ptosim": [25, 26, 28], "ptosimclass": [25, 26, 28], "ptosimnam": 28, "ptosimnum": 28, "ptosimtyp": 28, "ptostiff": 28, "public": [9, 16, 21, 24], "publicli": [10, 18], "publish": [13, 20, 21], "pull": [1, 2, 3, 6, 13, 29], "purpos": [10, 18, 22, 25, 28, 31], "pursu": 24, "push": [1, 5, 13], "pvd": 25, "pvsm": [13, 25], "pwd": 29, "py": 25, "python": [13, 24, 25, 28], "q": [22, 24], "qtf": [13, 24, 26], "quad": 22, "quaddrag": [25, 26, 28, 31], "quadprog": 25, "quadrat": [15, 22, 24, 25, 26], "qualiti": [25, 28, 34], "quantiti": [15, 22, 27, 28], "quasi": [15, 22, 24], "quaternion": 13, "question": 31, "quickli": 31, "quit": 25, "quon": 12, "r": [0, 12, 15, 22, 25], "r2": 25, "r2020b": [13, 29], "r2021a": 13, "r2023b": 13, "r2t": 25, "r_": [0, 24, 25], "ra": 25, "ra_k": 25, "ra_t": 25, "ra_w": 25, "rad": [0, 15, 24, 25, 26, 28, 32, 34], "radian": 24, "radiat": [3, 13, 24, 26, 28, 31, 34], "radiationcoeffici": 25, "radiationirf": [13, 25], "radiationirfss": 25, "radiu": [15, 22], "ramp": [23, 25, 26, 28, 32, 34], "rampt": 13, "ramptim": [13, 25, 26, 28, 32, 34], "random": [24, 25, 26], "randomli": [25, 28], "randpredefin": 13, "rang": [15, 24, 25, 28], "rank": 24, "rao": 25, "rapid": [13, 25, 26], "rard": 24, "rare": 0, "ratanak": [8, 25], "ratanakso": 13, "rate": [13, 15, 22, 25, 26], "ratetransit": 26, "rather": [24, 25], "ratio": [15, 22, 25], "rbg": 25, "rbrace": 0, "re": [0, 13, 24, 26, 31], "reach": [12, 15, 22, 25], "reacquir": 34, "reaction": [24, 32], "reactiv": [27, 28], "read": [3, 13, 17, 22, 24, 25, 26, 28, 31, 32, 34], "read_aqwa": 13, "read_capytain": 13, "readabl": [10, 13, 18], "readaqwa": [13, 25], "readbemioh5": 25, "readcapytain": [13, 25], "readcapytaine_fixes_for_reading_dataformats_correctli": 13, "reader": 24, "readi": [29, 32], "readnemoh": [13, 25, 34], "readwamit": 25, "real": [24, 25, 26], "realist": [13, 24, 25, 27, 28, 31], "realiz": 25, "realli": 25, "rearrang": 22, "reason": [0, 10, 18, 22, 24, 25], "rebas": 13, "recalcul": 31, "receiv": [10, 12, 18, 22, 28], "recent": 12, "recipi": [10, 18], "recogn": 25, "recommend": [3, 22, 24, 25, 26, 27, 29, 34], "recompil": 28, "reconcil": 31, "record": [3, 25, 33], "recreat": [25, 31], "rectcheckvalv": 25, "rectifi": [25, 28], "rectifyingcheckvalv": 25, "red": [3, 25], "redistribut": [10, 18], "reduc": [15, 22, 24, 25], "reduct": 24, "reevalu": 31, "ref": 22, "refactor": 13, "refer": [0, 1, 3, 4, 5, 6, 7, 11, 12, 22, 23, 26, 28, 29, 30, 31, 33, 34], "refht": 15, "refin": [25, 31], "reflect": [25, 34], "refresh": 29, "regard": [10, 15, 18, 22, 25], "regardless": [0, 25], "region": [15, 22, 26], "regress": [13, 15, 22], "regul": [15, 22], "regular": [0, 3, 13, 23, 25, 26, 27, 31, 32, 34], "regularc": [25, 27, 31, 32], "rel": [0, 15, 17, 22, 24, 25, 26, 28, 32], "relat": [0, 3, 15, 22, 23, 25, 28, 31], "relationship": [15, 22, 24, 28], "relcoord": 26, "releas": [4, 5, 6, 9, 12, 16, 25, 29, 32], "relet": 0, "relev": [4, 11, 22, 25, 27, 28, 32, 34], "reli": [15, 22, 24, 25, 29], "reload": 25, "reloadh5data": [25, 26], "remain": [0, 5, 10, 18, 25], "remaind": 0, "rememb": 25, "remind": 0, "remot": [1, 3], "remov": [0, 13, 29, 31], "removewecsimsourc": 29, "renam": [3, 13, 25, 32, 34], "renew": [7, 8, 10, 11, 12, 15, 18, 19, 20, 24, 25], "rensponseclass": 22, "reopen": 31, "reorder": [3, 25], "repeat": [15, 24, 25, 31], "replac": [13, 25], "report": [6, 13, 15, 20, 22, 24, 25, 27, 31], "reposit": 13, "repositori": [1, 5, 6, 7, 11, 13, 25, 27, 29], "repres": [0, 10, 11, 15, 18, 22, 24, 25, 28], "represent": [0, 13, 24], "reproduc": [10, 18, 24, 25], "reproduct": [10, 18], "request": [2, 6, 13, 31], "requir": [10, 11, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 30, 31, 32, 34], "research": [12, 22, 24, 25], "resist": [25, 26, 28], "resolut": [22, 25], "resolv": [3, 5, 13, 25], "reson": [24, 25], "resourc": 31, "respect": [0, 15, 22, 24, 25, 28], "respond": 31, "respons": [10, 11, 12, 13, 18, 23, 30, 31, 32, 33, 34], "responseclass": [13, 17, 22, 25, 26, 28], "respos": 25, "rest": 28, "restart": 29, "restor": [0, 13, 24, 25, 28, 31], "restoremassmatrix": [0, 26], "restrict": [25, 26, 28, 32], "restructur": 13, "result": [0, 3, 6, 10, 12, 15, 17, 18, 22, 24, 25, 26, 28, 31, 32, 33], "retain": [10, 18, 25], "retard": 24, "return": [3, 25, 26, 31], "revamp": 12, "reveal": 24, "revers": [12, 25], "reversedimensionord": 25, "revert": 13, "review": [3, 13, 24, 25], "revis": [3, 5, 10, 13, 18], "revolut": 22, "rewritten": 22, "reynold": [0, 15], "rgb": 25, "rgme": [25, 26], "rhino": [25, 34], "rho": [0, 22, 24, 25, 26], "rho_wat": 15, "rhub": 15, "ric": 24, "richter": 24, "right": [0, 10, 18, 22, 24, 25], "rightarrow": 24, "rigid": [7, 11, 22, 24, 25, 28, 32], "rij": [7, 12], "ringwood": 12, "rinker": 15, "rippl": 12, "rise": 31, "risk": [10, 18], "ris\u00f8": 15, "rload": 25, "rm3": [29, 30, 31], "rm3_b2b": 25, "rm3_chydraulic_pto": 25, "rm3_dd_pto": 25, "rm3_mcr": 25, "rm3_moordyn_viz": 25, "rm3fromsimulink": 32, "rm3moordyn": 25, "robertson": 15, "robust": [0, 13, 25, 28, 31], "rod": [25, 28], "roi": 12, "roland": 15, "role": 28, "roll": [13, 15, 22, 24, 25], "root": [15, 20, 22, 24], "rosco": [15, 19], "rosetta": 25, "rotari": [13, 24, 25, 26, 28], "rotarygener": 26, "rotat": [0, 13, 15, 22, 24, 25, 26, 28, 32, 34], "rotationmatrix": 26, "rotloc": 26, "rotor": [15, 17, 22, 24], "rotorspe": 26, "rough": 15, "rout": 25, "routin": 33, "row": [13, 26], "royalti": [10, 18], "rpf": 25, "rpm": 25, "ruehl": [7, 12, 13, 24, 25, 32], "rule": 24, "run": [0, 2, 6, 11, 13, 15, 22, 26, 28, 29, 30, 31], "run_turbsim": [15, 17, 22], "runb2b": 27, "runfreedecai": 27, "runner": 13, "runnl": 27, "runtim": [3, 26], "runyawcas": 27, "rvert": 0, "rx": [15, 24, 25], "ry": [15, 24, 25], "ryan": 25, "ryandavies19": 13, "rz": [15, 24, 25], "s_": 24, "s_f": 25, "sacrific": 25, "safe": 15, "sai": 25, "salhu": 13, "salin": 24, "salman": [7, 13], "sam": 8, "same": [0, 3, 22, 24, 25, 26, 28, 31, 32], "sampl": [11, 24, 25, 26], "san": [12, 32], "sandia": [7, 8, 10, 12, 18, 19], "sate": 24, "satisfi": [0, 24], "satur": 22, "save": [3, 13, 22, 26, 28, 29, 32, 34], "saveset": 26, "savestructur": [3, 26], "savetext": 26, "saveviz": [13, 25, 26], "saveworkspac": 26, "sc_im": 25, "sc_ma": 25, "sc_ph": 25, "sc_re": 25, "scale": [12, 24, 25, 32], "scan": 3, "scatter": [22, 25], "scenario": [7, 11, 24, 25], "schaaf": 24, "schedul": 22, "schemat": [0, 25], "scienc": 15, "scott": 15, "script": [3, 11, 13, 15, 22, 25, 27, 28, 29, 32], "sea": [12, 15, 22, 24, 25, 27], "seab": [15, 24, 25, 26, 28, 32], "search": [15, 24, 25, 28, 29], "seattl": [12, 32], "second": [0, 15, 22, 24, 25, 26, 28, 32], "section": [3, 4, 10, 13, 15, 17, 18, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "secur": 8, "see": [0, 10, 15, 18, 22, 24, 25, 27, 29, 32], "seed": [3, 26], "seek": 25, "seen": [22, 25], "segment": [24, 26], "select": [3, 24, 25, 28, 32], "selector": 25, "sell": [10, 18, 24], "semi": [22, 25], "semisubmers": [11, 24, 25], "sens": [25, 28], "sensit": [15, 22], "sent": [10, 18, 28], "separ": [5, 10, 18, 22, 24, 25, 26, 28], "septemb": [12, 13], "sequenc": 25, "seri": [13, 15, 20, 21, 22, 25, 26, 28, 30, 31, 32], "serv": [25, 31, 34], "servic": [10, 12, 18], "session": 13, "set": [0, 3, 12, 15, 22, 24, 26, 27, 28, 29, 31, 32, 33, 34], "set_param": 29, "setcg": 26, "sethuraman": 15, "setinitdisp": [13, 25, 26], "setup": [3, 12, 25, 27, 34], "sever": [3, 11, 17, 25, 27], "shabara": [7, 13], "shaft": 25, "shall": [10, 18], "shallow": 24, "shape": [24, 25], "share": [10, 12, 18, 27, 31], "shave": 22, "shear": [11, 25], "shield": 15, "shift": 22, "ship": [11, 24, 25], "shorelin": 24, "should": [0, 3, 5, 6, 22, 25, 26, 28, 29, 31, 32], "show": [0, 3, 15, 22, 25, 28, 32, 33, 34], "shown": [0, 3, 22, 24, 25, 28, 29, 32, 34], "side": [0, 12, 25, 31], "sigma": [0, 24], "sign": 13, "signal": [22, 25, 28, 34], "signatur": 12, "signifi": 25, "signific": [24, 25, 26, 28, 31], "significantli": 25, "sim": [1, 2, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 24, 26, 30], "sim_appl": [13, 25], "similar": [0, 3, 17, 22, 24, 25, 28, 31, 32], "similarli": [3, 15, 22, 25], "simmechan": [25, 26], "simmechanicsfil": [25, 26, 28, 32, 34], "simmon": [12, 24], "simpl": [0, 13, 15, 22, 24, 25, 32], "simpledd": 26, "simpler": 25, "simplest": 25, "simpli": [15, 25], "simplic": 25, "simplif": 24, "simplifi": [20, 24, 25], "simscap": [0, 7, 11, 20, 21, 25, 26, 27, 29, 30, 31, 34], "simu": [3, 13, 25, 26, 28, 31, 32, 34], "simul": [0, 3, 11, 12, 13, 15, 16, 17, 19, 20, 21, 24, 27, 29, 30, 31, 32, 34], "simulationclass": [3, 25, 26, 28, 32, 34], "simulink": [0, 2, 7, 11, 13, 15, 17, 19, 22, 24, 26, 30, 31], "simulink_model_nam": 33, "simultan": 25, "sin": [0, 24, 25], "sinc": [13, 15, 22, 25, 26, 28, 32], "sine": 24, "singl": [19, 24, 25, 28, 32], "singular": 24, "sinh": [0, 24], "sinusoid": [0, 23, 28, 32], "sirigu": [19, 20, 21], "sirigu2022develop": 21, "sirniva": 12, "situat": [24, 28], "six": [24, 28], "sixth": 24, "size": [24, 25, 26, 31], "skew": 15, "skrzypinski": 15, "slam": 24, "slender": [0, 24], "slice": 25, "slide": 33, "slider": 25, "slightli": [15, 22, 25], "sllibrarybrows": 29, "slow": 25, "slower": 24, "slx": [3, 13, 17, 22, 25, 28, 32, 33, 34], "small": [0, 11, 22, 24, 25, 28, 31], "smaller": 25, "smooth": [12, 15, 22], "smoother": 22, "smund": 24, "snl": 12, "so": [0, 3, 8, 12, 15, 22, 24, 25, 31], "societi": [12, 24, 25], "soft": 25, "softwar": [0, 2, 3, 5, 7, 10, 11, 12, 13, 14, 17, 18, 21, 22, 24, 25, 31, 33, 34], "sole": [10, 18], "solid": 0, "solut": [0, 8, 10, 15, 18, 24, 25, 28, 34], "solv": [0, 7, 11, 15, 22, 24, 25, 28, 31, 34], "solvabl": 0, "solver": [3, 7, 11, 13, 24, 25, 26, 27, 28], "some": [0, 3, 11, 15, 22, 25, 28, 31, 33], "sort": [13, 25], "sought": 15, "sourc": [1, 3, 6, 7, 10, 11, 12, 15, 17, 18, 22, 24, 25, 29, 30, 32, 33, 34], "sourcefunctionssimulinkmask": 0, "sous": 24, "south": 12, "space": [3, 12, 13, 15, 22, 23, 26, 31, 32], "spain": 12, "span": 32, "spar": [25, 27, 32], "spatial": [15, 22], "speci": 26, "special": [0, 3, 10, 18, 25, 27, 31], "specif": [0, 4, 10, 13, 15, 18, 22, 24, 25, 28, 31], "specifi": [15, 22, 24, 25, 26, 27, 28, 34], "spectra": [13, 23, 28], "spectral": [13, 15, 24, 25, 28], "spectrum": [3, 13, 26, 27, 28, 32], "spectrumbuttoncallback": 3, "spectrumdata": 28, "spectrumfil": [3, 26, 28], "spectrumimport": [26, 32], "spectrumtyp": [25, 26, 28], "sped": 22, "speed": [13, 15, 17, 22, 24, 25, 26, 31], "spend": 31, "sphere": [26, 27], "spherempc": 25, "spheric": [13, 25, 28], "spike": 31, "split": [3, 13, 25], "spread": 26, "spreadsheet": 27, "spring": [24, 25, 26], "spsfilter": 15, "sq": 24, "sqrt": [22, 24, 25], "squar": [22, 24, 25], "srcblocknam": 3, "ss": [24, 25], "ss_a": 25, "ss_b": 25, "ss_c": 25, "ss_conv": 25, "ss_d": 25, "ss_k": 25, "ss_o": 25, "ss_r2": 25, "st": 12, "stabil": [0, 6, 13, 22, 25, 26, 29], "stabl": [5, 25, 31], "stai": 25, "stand": 24, "standard": [15, 22, 24, 25, 26, 28], "starrett": 25, "start": [2, 4, 22, 25, 26, 27, 28, 30, 32, 34], "startendtim": 26, "starttim": [25, 26, 28, 32, 34], "startup": 29, "state": [3, 8, 10, 12, 13, 15, 18, 22, 23, 26, 27, 28, 31, 32], "statement": [10, 13, 18, 31], "statespac": [25, 26, 31], "static": [13, 15, 17, 22, 24, 29], "stationari": [0, 15, 22, 24], "statist": [12, 24, 25, 26, 27], "stator": 24, "steadi": [15, 22, 23, 28, 31], "steady_st": [15, 17, 22], "step": [0, 3, 13, 15, 22, 24, 26, 27, 28, 31], "stiff": [11, 15, 24, 25, 26, 28, 31, 32, 34], "still": [0, 22, 24, 25, 28, 31], "stl": [3, 13, 26, 28, 32, 34], "stlbutton": 3, "stlbuttoncallback": 3, "stochast": 15, "stop": [3, 13, 25, 31], "stoppag": [10, 18], "stopwecsim": [13, 22, 25], "storag": [0, 25, 29], "store": [0, 3], "storeforceaddedmass": [0, 26], "stori": 12, "storm": 24, "strategi": [22, 25], "strength": 24, "stress": 15, "stretch": [24, 25, 28], "strictli": 22, "string": [3, 25, 26], "strong": 24, "strongli": 24, "struct": [22, 25, 26], "structur": [0, 12, 13, 15, 17, 20, 22, 24, 26, 30, 32, 34], "studi": [24, 25], "style": [25, 26], "sub": [13, 24, 25, 26, 28], "subfold": [15, 22, 29], "subject": [10, 18, 24, 25], "sublibari": 3, "sublibrari": [3, 13], "sublicens": [10, 18], "submerg": 25, "submers": 22, "submiss": [10, 18], "submit": [4, 5, 6, 10, 18, 31], "submodul": [13, 27], "suboptim": 25, "subscript": [0, 22], "subsect": [15, 24, 25], "subsequ": [10, 18, 25], "subset": 3, "subsidiari": 8, "substack": 22, "substanti": 25, "subsystem": [3, 13, 15, 22, 25, 28], "subtract": 0, "success": 12, "successfulli": [11, 25], "sudden": 25, "suffici": [24, 25, 28, 31], "suggest": [13, 26], "suit": [0, 25], "sum": [0, 22, 24, 25, 26], "sum_": 24, "summar": [17, 27, 28], "summari": [25, 26], "sun": 24, "super": 25, "superposit": [24, 25], "supersed": [10, 18], "suppli": [24, 28, 31, 32], "support": [4, 10, 12, 18, 19, 20, 24, 25, 28, 31, 34], "sure": [3, 25], "surfac": [0, 15, 24, 25, 26, 28, 31, 32, 34], "surg": [0, 11, 12, 15, 22, 24, 25, 30], "surround": 25, "suspend": [15, 22], "sustain": [8, 12, 24, 25], "sustech": 12, "svd": 24, "swai": [0, 15, 22, 24, 25], "sweep": 25, "swell": [24, 25], "swl": 32, "symbol": 0, "symposium": [12, 32], "synthesi": 24, "syst": 24, "system": [0, 7, 10, 11, 12, 13, 15, 17, 18, 20, 22, 23, 25, 26, 27, 28, 34], "t": [0, 3, 12, 13, 22, 24, 25, 26, 28], "t_": [15, 22, 24, 25], "t_0": 25, "tab": 3, "tabl": [0, 3, 15, 17, 23, 26, 28, 34], "tabul": 22, "tag": [0, 5, 24, 29, 31], "taghipour": 24, "take": [0, 3, 7, 11, 12, 15, 22, 23, 28, 29, 31], "taken": [0, 15, 22, 24, 25], "tallest": 24, "tangent": 24, "tangenti": [0, 13, 25, 26], "tanh": [0, 24, 25], "target": 25, "task": [12, 15, 25, 31], "tau": [22, 24], "tau_": 24, "taut": [25, 28], "taylor": 24, "tc114": 13, "td": 24, "team": [4, 7, 12, 19, 27, 31, 33, 34], "teamer": 12, "tec": 25, "tech": 12, "technic": [15, 24, 25], "techno": 20, "technologi": [7, 8, 10, 12, 18, 22, 24, 25, 32], "ted": 25, "temp": 13, "temperatur": 24, "templat": [13, 31], "tempor": [15, 22], "ten": 25, "tend": [24, 25], "tension": [24, 25, 26, 28], "tensor": [0, 32], "term": [0, 10, 18, 22, 24, 25, 28], "termin": [10, 18], "terminologi": 23, "test": [0, 2, 5, 12, 13, 24, 27, 28, 30], "tether": 25, "text": [0, 3, 10, 18, 22, 24, 26, 31], "textual": 3, "than": [3, 13, 15, 22, 24, 25, 26, 27, 29, 31], "thank": [17, 22], "thei": [1, 3, 11, 22, 24, 25, 28, 31, 33, 34], "them": [3, 15, 22, 25, 31], "themfor": 33, "theoret": [22, 24, 25], "theori": [0, 10, 13, 15, 16, 18, 25, 31], "therefor": [0, 15, 22, 24, 25], "thereof": [10, 18], "theta": [0, 22, 24, 25], "theta_": [15, 22, 24], "theta_a": 15, "theta_discr": 15, "thetamaxr": 15, "thi": [0, 1, 3, 5, 8, 10, 11, 13, 15, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "thing": 25, "think": 28, "third": [10, 18, 24, 25, 28, 32], "thorough": 31, "thoroughli": 31, "those": [3, 10, 15, 18, 22, 25, 28, 31], "though": [0, 22], "three": [3, 13, 15, 19, 22, 24, 25, 28], "threshold": [25, 26], "through": [3, 10, 13, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32], "throughout": 24, "throw": 3, "thrust": [15, 22], "thu": [24, 25], "ti": [3, 28, 34], "tidal": [12, 13, 15, 24], "tie": 3, "tild": 24, "tilt": [15, 22], "tiltangl": 15, "time": [0, 3, 5, 6, 7, 8, 11, 13, 15, 22, 23, 26, 27, 28, 29, 31, 32, 34], "timeseri": [17, 26], "timesperfram": [25, 26], "timestep": [0, 15, 25, 26], "tip": [15, 22], "titl": [10, 13, 18, 21], "todai": 12, "togeth": [0, 11, 24, 31], "tom": [7, 12, 13], "tomorrow": 12, "tonn": 32, "too": [3, 13, 25, 31], "tool": [2, 11, 12, 19, 20, 32], "toolbox": [13, 29, 32, 34], "tooltip": 3, "top": [15, 22, 25, 26, 34], "topic": [25, 27, 31, 33], "torino": [14, 19], "torqu": [15, 24, 25, 26, 28], "torquemaxr": 15, "torsion": [11, 24], "tort": [10, 18], "total": [0, 6, 15, 24, 25], "toward": [22, 32], "tower": [15, 19, 22, 26], "towerbaseload": 26, "towertopload": 26, "track": [3, 5, 10, 13, 18, 22], "trade": [10, 18], "trademark": [10, 18], "tradit": 25, "train": [12, 25, 30], "transact": [12, 24, 25], "transfer": [10, 15, 18, 22, 25, 26], "transform": [10, 18, 22, 25], "transient": 24, "transit": [13, 15, 22, 26], "translat": [0, 10, 18, 24, 25, 26, 28, 32], "transport": 0, "transpos": 13, "travel": 24, "travisci": 13, "treat": 0, "treatment": 0, "trend": 20, "trondheim": 12, "troubleshoot": [13, 29, 30], "true": [25, 28], "try": [15, 32], "tsr": 22, "tune": [22, 25, 31], "turbin": [17, 19, 20, 21], "turbine_properti": 22, "turbinepow": 26, "turbmodel": 15, "turbsim": [15, 22], "turbsim_inputfil": 15, "turbul": [15, 22], "turn": [3, 25, 26], "tutori": [13, 27, 28, 30, 34], "twist": [15, 22], "two": [0, 11, 15, 22, 24, 25, 28, 29, 30, 31], "twr2shft": 15, "txt": [15, 25, 26], "type": [0, 3, 6, 10, 13, 15, 17, 18, 22, 24, 25, 26, 28, 29, 32, 34], "typenumb": 28, "typic": [3, 15, 25, 28], "typo": 13, "u": [0, 7, 8, 10, 12, 15, 18, 22, 24], "u_": [0, 22, 24], "uigetfil": 3, "uk": 13, "umain": 15, "unabl": 25, "unachiev": 25, "unchang": [0, 24], "unconstrain": 28, "under": [3, 8, 10, 15, 18, 22, 25, 32], "underbrac": 0, "understand": [3, 22, 25], "undistrub": 25, "undisturb": [22, 24, 25, 32], "unforc": 24, "unfortun": 31, "uniform": [22, 24, 26], "union": [10, 18], "uniqu": [0, 11, 22, 25], "unit": [0, 6, 12, 13, 15, 23, 25, 26], "univers": [8, 12, 22], "unless": [10, 18, 24, 25, 31], "unlik": 25, "unnecessarili": 25, "unphys": 31, "unrealist": 24, "unsolv": 0, "unspecifi": 25, "unstabl": [0, 31], "unstretch": [15, 25], "untun": 25, "up": [3, 12, 13, 15, 17, 25, 26, 27, 28, 29, 31, 32, 33], "updat": [1, 3, 5, 12, 13, 17, 25, 26, 29, 33], "upload": [22, 31], "upon": [0, 12, 24, 25], "upper": [15, 22, 25], "upperlimitbound": 25, "upperlimitdamp": 25, "upperlimitspecifi": [3, 25], "upperlimitstiff": 25, "upperlimittransitionregionwidth": 25, "uptilt": 15, "upward": 24, "urat": 22, "url": [13, 24, 25], "us": [0, 1, 3, 5, 7, 10, 11, 12, 13, 15, 17, 18, 21, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "usa": 32, "usabl": [4, 15], "usabletim": 15, "usag": 25, "user": [0, 3, 6, 7, 11, 12, 13, 15, 16, 17, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "userdefinedelev": 24, "userdefinedfunct": [17, 22, 25, 32], "userdefinedfunctionsmcr": 25, "usernam": [1, 5], "usual": 25, "ut": 12, "util": [3, 24, 25, 31], "v": [0, 15, 24, 25, 31], "v009t09a078": 24, "v1": [9, 12, 16, 33], "v15": 15, "v2": [9, 24, 25, 33], "v3": 9, "v4": 9, "v5": 9, "v6": [9, 16], "v_": [0, 25], "v_0": 24, "v_cutin": 15, "v_cutout": 15, "v_discr": 15, "v_rated_tri": 15, "valid": [3, 12, 13, 15, 24, 25, 26, 32], "valu": [0, 3, 15, 22, 24, 25, 26, 27, 28, 31], "valv": [25, 26, 28], "van": [7, 12], "varargin": 25, "vari": [15, 22, 24, 25, 27, 28], "variabl": [2, 3, 13, 15, 22, 24, 26, 27, 28, 32], "variablehydro": 26, "variablenam": 25, "varianc": 24, "variant": [13, 15, 22, 28], "variat": [15, 22, 25, 26, 28], "varieti": [7, 11], "variou": [3, 11, 15, 22, 24, 27, 28, 31], "vdot": 24, "vec": [0, 24], "vector": [0, 24, 25, 26, 28], "veloc": [0, 15, 22, 24, 25, 26, 28], "ver": 29, "verbal": [10, 18], "veri": [0, 7, 25, 31, 32], "verif": [12, 25, 32], "verifi": [6, 25], "versa": 22, "versatil": 27, "version": [3, 5, 10, 12, 13, 17, 18, 25, 29], "versu": 26, "vertic": [0, 15, 24, 25], "vessel": 24, "vflowang": 15, "vi0": 25, "via": [6, 15, 22, 24, 25, 28, 29], "vice": 22, "victor": 25, "video": [12, 25, 26], "view": [0, 25, 28, 29, 34], "viewer": 25, "viscos": [0, 24], "viscou": [0, 23, 26, 28], "viselli": 15, "visibl": [3, 22, 25, 29], "visit": 24, "visual": [11, 13, 26, 28, 30, 34], "visualis": 26, "viz": [25, 26], "vme": [25, 26], "vo": 25, "vol": [12, 20], "voltag": [25, 26], "volturnu": [15, 22], "volum": [0, 21, 24, 25, 26, 28, 31], "von": 15, "vtk": [25, 26], "vtp": 26, "vw_r2in_tri": 15, "w": [0, 15, 22, 24, 25], "w64": 25, "wa": [0, 3, 8, 10, 12, 18, 22, 25, 29, 32, 34], "wai": [22, 25, 27, 28, 29, 31], "wait": 25, "wake": [15, 22], "walden": 24, "wamit": [11, 13, 17, 24, 25, 27, 32, 34], "want": [0, 22, 25, 27, 28], "warn": [13, 25], "warranti": [10, 18], "water": [0, 7, 8, 12, 15, 22, 24, 25, 26, 31, 34], "waterdepth": [25, 26], "wave": [0, 3, 8, 11, 12, 13, 17, 19, 20, 23, 27, 30, 32, 34], "wave_mark": 25, "waveclass": [3, 13, 25, 26, 28, 32, 34], "waveclasscallback": 3, "wavegamma": 28, "wavegauge1elev": 26, "wavegauge2elev": 26, "wavegauge3elev": 26, "waveheight": 28, "wavelength": 24, "wavenumb": 25, "waveperiod": 28, "wavespectrum": 28, "wavespread": 13, "wavestar": [11, 25, 27], "wavetyp": [26, 28], "we": [0, 15, 22, 24, 29, 31, 34], "weakli": [24, 25], "weather": 19, "web": 13, "webinar": [12, 28, 33], "webpag": 34, "websit": [10, 13, 18, 25], "webstor": 24, "wec": [1, 2, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 24, 26, 30], "wec3": 12, "wecccomp": [11, 12, 25, 30], "wecsim": [3, 6, 13, 22, 24, 25, 28, 29, 31, 32, 34], "wecsim_appl": 6, "wecsim_lib": [3, 28], "wecsim_lib_body_el": [3, 13], "wecsim_lib_c": 3, "wecsim_lib_constraint": 3, "wecsim_lib_fram": 3, "wecsim_lib_moor": 3, "wecsim_lib_pto": 3, "wecsimapptest": 6, "wecsimfcn": [25, 32, 34], "wecsiminputfil": [3, 22, 25, 26, 28, 31, 33], "wecsiminputfile_customparamet": 3, "wecsiminputfile_simulinkcustomparamet": [3, 25], "wecsiminuptfil": 0, "wecsimmcr": [13, 25, 27, 31, 32, 34], "wecsimpct": [13, 25, 31, 32, 34], "wecsimsourc": 29, "wecsimtest": 6, "weight": [0, 22], "welcom": 31, "well": [0, 15, 22, 25, 27, 34], "wendt": 12, "were": [15, 22, 25], "wet": [24, 31, 34], "weywada": 12, "wf_07d": 15, "wf_14d": 15, "wf_upw": 15, "what": [3, 15, 17, 33], "whatev": 1, "wheeler": 24, "when": [0, 3, 4, 5, 6, 8, 13, 15, 21, 22, 24, 25, 26, 27, 28, 31, 32, 34], "whenev": [3, 31], "where": [0, 5, 10, 11, 15, 18, 22, 24, 25, 28, 29, 34], "wherea": [3, 22, 25], "wherev": [10, 18], "whether": [10, 18, 22, 25], "which": [0, 3, 10, 15, 17, 18, 22, 24, 25, 26, 27, 28, 31, 32, 34], "while": [0, 10, 15, 17, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "who": [4, 25, 28, 29, 31], "whole": [0, 10, 18], "wholli": 8, "whom": [10, 18], "whose": [0, 17, 22, 26], "why": 31, "wide": [7, 11, 32], "widen": 25, "width": [15, 25], "wiglei": [11, 25], "wilson": 25, "win": 12, "wind": [12, 17, 19, 20, 21, 24, 25], "windclass": [17, 19, 21, 22], "windfilt": 15, "window": [3, 6, 13, 25, 26, 28, 29, 32, 34], "windpow": 12, "windprofiletyp": 15, "windspe": 26, "windturbin": 26, "windturbineclass": [17, 19, 21, 26], "windturbinenam": 26, "winner": 12, "wish": [4, 25, 28, 29, 31], "within": [0, 3, 7, 10, 15, 16, 18, 22, 24, 25, 28, 29, 34], "without": [0, 3, 10, 15, 18, 24, 25, 27, 31], "witold": 15, "wmax": 25, "wmin": 25, "wn_c": 15, "wn_theta_bl": 15, "wn_theta_rosco": 15, "word": 0, "work": [5, 10, 12, 15, 18, 22, 25, 31, 32, 34], "workflow": [0, 4, 5, 13, 17, 22, 25, 28, 30, 31], "workspac": [0, 3, 13, 22, 25, 26, 28, 32], "world": 12, "worldwid": [10, 18], "worskpac": 3, "would": [3, 15, 22, 24, 25, 28], "wpto": 12, "wright": 15, "write": [10, 13, 18, 22, 26, 28, 30], "write_h5": 13, "writebemioh5": [13, 25], "writeblocksfrominput": 3, "writeinputfromblock": 3, "writelinefromvar": 3, "writetext": 26, "written": [3, 10, 12, 18, 25, 26, 27], "wtcompon": 22, "wtih": 0, "wtproperti": [15, 17, 22], "www": [10, 18, 24, 25, 34], "x": [0, 15, 22, 24, 26, 28, 32], "x3": 25, "x_": [22, 24], "x_i": [0, 25], "x_r": 24, "x_rot": 26, "xbodi": 34, "xetm": 15, "xewm1": 15, "xewm50": 15, "xi_piston": 25, "xl": 25, "xy": 15, "y": [0, 12, 13, 15, 22, 24, 26, 28, 32], "yaw": [7, 11, 13, 15, 22, 24, 26, 30], "ye": [24, 26], "year": [13, 15, 21], "yellow": [3, 17], "yi": [7, 24], "you": [1, 10, 18, 25, 27, 29, 31], "your": [1, 5, 10, 18, 27, 31, 32, 34], "yu": [7, 12, 13, 24, 32], "yuan": 24, "yuyihsiang": 13, "yz": 15, "z": [0, 15, 24, 25, 26, 28, 32], "z0": 15, "z_": [0, 25], "z_i": 25, "zahl": 15, "zalkind": 15, "zenodo": 13, "zero": [15, 22, 24, 25, 26, 28, 31], "zerocross": 26, "zeta": 22, "zone": 15, "\u00e3": 25, "\u00e5": 24, "\u00e9": [24, 25], "\u03b4": 22, "\u03bb": 22, "\u03bb_": 22}, "titles": ["Advanced Features", "Getting Started", "Developer Manual", "WEC-Sim Library", "Overview", "Pull Requests", "Software Tests", "WEC-Sim (Wave Energy Converter SIMulator)", "Acknowledgements", "Introduction", "License", "Overview", "Publications", "Release Notes", "Acknowledgements", "Advanced Features", "MOST Manual", "Introduction", "License", "Overview", "Publications", "Release Notes", "Theory", "Theory Manual", "Overview", "Advanced Features", "API", "WEC-Sim Applications", "Code Structure", "Getting Started", "User Manual", "Troubleshooting", "Tutorials", "Training Materials", "Workflow"], "titleterms": {"": 0, "0": [10, 13, 18, 21], "1": [0, 13, 24, 29, 32, 33, 34], "10": 33, "11": 33, "2": [0, 10, 13, 18, 24, 29, 32, 33, 34], "3": [13, 24, 29, 32, 33, 34], "4": [13, 29, 32, 33, 34], "5": [32, 33, 34], "6": 33, "7": 33, "8": 33, "9": 33, "To": 25, "absorb": 32, "acknowledg": [8, 14], "actuat": 25, "ad": 0, "add": 29, "addit": 22, "advanc": [0, 15, 25, 33], "aerodynam": [15, 22], "an": 31, "apach": [10, 18], "api": 26, "applic": [6, 27], "articl": 12, "baselin": 22, "bem": 24, "bemio": [25, 32, 33], "between": 0, "bin": 25, "blade": 22, "block": 28, "board": 31, "bodi": [0, 24, 25, 26, 27, 28, 32, 33], "boundari": 24, "build": [32, 34], "buoyanc": [24, 25, 33], "cabl": [25, 26, 28, 33], "calcul": [24, 25], "callback": 3, "case": [31, 34], "caus": 31, "cite": [13, 21], "class": [26, 28, 33], "code": [28, 33], "comparison": 0, "comput": 25, "condit": [25, 27, 33], "constraint": [25, 26, 28], "contributor": 8, "control": [15, 22, 25, 27, 33], "convert": 7, "convolut": 24, "coordin": 24, "copyright": [10, 18], "cours": 33, "current": [24, 25], "custom": 3, "damp": [24, 25], "data": [25, 31, 34], "debug": 31, "decai": [25, 27, 31], "declutch": 25, "degener": 31, "desalin": [27, 33], "detail": 28, "develop": [2, 3, 7, 19], "devic": [32, 33], "direct": 25, "direction": 25, "dispers": 24, "displac": 25, "distribut": 31, "document": 31, "domain": 24, "download": 29, "drag": [25, 31], "drive": 25, "dynam": 0, "element": [0, 24, 25], "elev": 25, "elevationimport": 28, "ellipsoid": 25, "energi": 7, "exampl": [25, 32], "excit": [24, 25, 33], "extens": [25, 27], "extern": [8, 28], "extract": 0, "faq": 31, "featur": [0, 15, 25, 33], "file": [3, 25, 31, 32, 34], "filter": 25, "finit": 25, "fir": 25, "fix": [0, 25], "float": 25, "forc": 25, "format": 3, "formul": 24, "frame": 28, "free": [27, 31], "from": [3, 24, 25], "froud": [24, 25, 33], "function": [3, 24, 25, 28], "fund": 8, "gaug": 25, "gener": [22, 24, 25, 27, 34], "geometri": [25, 32, 34], "get": [1, 29], "h5": 25, "hdf5": 27, "heav": 25, "hydraul": [24, 25], "hydro": 25, "hydrodata": 34, "hydrodynam": [25, 27, 31, 33, 34], "hydrostat": 31, "identifi": 31, "implement": [0, 22, 25], "impuls": 25, "incorpor": 25, "initi": 28, "input": [3, 22, 34], "instal": [25, 29, 33], "integr": [24, 25], "interact": [25, 27, 33], "introduct": [9, 17], "io": 15, "irregular": [24, 25, 28, 31], "issu": 31, "j": 24, "joint": 25, "jonswap": 24, "k_": 24, "krylov": [24, 25, 33], "larg": 25, "latch": 25, "librari": [3, 28, 29], "licens": [10, 18], "limit": 25, "linear": 24, "load": [15, 22, 25], "look": 22, "lookup": [24, 25], "m": [32, 34], "macro": 25, "manual": [2, 16, 23, 30], "marker": [25, 27], "mask": [0, 3], "mass": [0, 25, 31], "materi": 33, "matlab": [3, 29], "matric": 24, "matrix": [24, 25], "mcr": [25, 33], "mechan": 24, "merg": 3, "method": 24, "mode": [24, 25, 27], "model": [25, 32, 33, 34], "modifi": 25, "modul": 22, "moor": [15, 22, 24, 25, 26, 27, 28], "moordyn": [24, 25, 33], "morison": [0, 24, 25], "moskowitz": 24, "most": [15, 16, 19, 21], "move": 0, "mpc": 25, "multipl": [25, 27, 33], "new": 12, "non": [25, 33], "nonhydrodynam": 27, "nonlinear": [24, 25, 27, 33], "note": [13, 21, 31], "nowav": 28, "nowavec": 28, "numer": [24, 31], "ocean": [24, 25], "ode4": 25, "ode45": 25, "off": [24, 25], "onlin": 33, "open": 31, "option": [0, 24], "oscil": 32, "oswec": [25, 32], "other": [25, 31], "overview": [4, 11, 19, 24, 33], "owc": 33, "own": 25, "parallel": 25, "paramet": [3, 25], "paraview": [25, 27], "passiv": [25, 27], "path": 29, "pct": 25, "perform": 0, "phase": 25, "pierson": 24, "pitch": 22, "placement": 25, "plot": 25, "pm": 24, "point": 32, "post": [22, 25, 32], "power": [24, 25], "pre": [22, 34], "predict": 25, "process": [22, 25, 32, 34], "properti": 22, "proport": 25, "pto": [24, 25, 26, 27, 28, 33], "public": [12, 13, 20], "pull": 5, "r": 24, "radiat": 25, "ramp": 24, "reactiv": 25, "realiz": 24, "refer": [15, 24, 25, 32], "regular": [24, 28], "regularc": 28, "relat": 24, "releas": [13, 21], "relev": 31, "represent": 25, "request": 5, "requir": 29, "respons": [24, 25, 26, 28], "review": [0, 31], "rigid": 0, "rm3": [25, 27, 32], "root": 31, "rosco": 22, "run": [3, 25, 27, 32, 33, 34], "save": 25, "search": 31, "seed": 25, "seri": 33, "set": 25, "sim": [0, 3, 6, 7, 13, 21, 25, 27, 28, 29, 31, 32, 33, 34], "simscap": 28, "simul": [7, 22, 25, 26, 28], "simulink": [3, 25, 28, 29, 32, 34], "singular": 31, "sinusoid": 24, "softwar": 6, "solut": 31, "sourc": 28, "space": [24, 25], "specif": 3, "spectra": [24, 25], "spectrum": [24, 25], "spectrumimport": 28, "sphere": 25, "spread": 25, "stabil": 31, "start": [1, 29], "state": [24, 25], "steadi": 24, "step": [25, 29, 32, 34], "stl": 25, "stroke": 25, "structur": [3, 25, 28, 33], "summari": 3, "surg": 32, "system": 24, "tabl": [22, 24, 25], "take": [24, 25], "terminologi": 24, "test": [6, 25, 29, 31], "theoret": 0, "theori": [22, 23, 24, 33], "time": [24, 25], "tool": 3, "toolbox": 25, "torqu": 22, "train": 33, "troubleshoot": 31, "turbin": [15, 22], "tutori": [25, 32, 33], "two": 32, "unit": 24, "up": 22, "us": 33, "user": [22, 30], "v1": [13, 21], "v2": 13, "v3": 13, "v4": 13, "v5": 13, "v6": [13, 21], "variabl": [0, 25], "variou": 25, "verifi": 29, "viscou": [24, 25, 31], "visual": [25, 27, 33], "wave": [7, 24, 25, 26, 28, 31, 33], "wec": [0, 3, 6, 7, 13, 21, 25, 27, 28, 29, 31, 32, 33, 34], "wecccomp": 27, "wecsiminputfil": [32, 34], "wind": [15, 22], "within": 21, "work": 0, "workflow": [33, 34], "write": [3, 25, 27, 32, 34], "x": 25, "y": 25, "yaw": [25, 27], "your": 25}}) \ No newline at end of file diff --git a/dev/theory/index.html b/dev/theory/index.html new file mode 100644 index 000000000..a385ec924 --- /dev/null +++ b/dev/theory/index.html @@ -0,0 +1,225 @@ + + + + + + + + + Theory Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/theory/theory.html b/dev/theory/theory.html new file mode 100644 index 000000000..ff62aa90f --- /dev/null +++ b/dev/theory/theory.html @@ -0,0 +1,1294 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

Modeling wave energy converters (WECs) involves the interaction between the +incident waves, device motion, power-take-off (PTO mechanism), and mooring. +WEC-Sim uses a radiation and diffraction method [B1, B2] to +predict power performance and design optimization. The radiation and +diffraction method generally obtains the hydrodynamic forces from a +frequency-domain boundary element method (BEM) solver using linear coefficients +to solve the system dynamics in the time domain.

+
+../_images/Physics.png +
+
+
+

Coordinate System

+

The WEC-Sim Coordinate System figure illustrates a +3-D floating point absorber subject to incoming waves in water. The figure also +defines the coordinates and the 6 degree of freedom (DOF) in WEC-Sim. The +WEC-Sim coordinate system assumes that the positive X-axis defines a wave angle +heading of zero (e.g., a wave propagating with along a zero-degree direction is +moving in the +X direction). The positive Z-axis is in the vertical upwards +direction, and the positive Y-axis direction is defined by the right-hand rule. +In the vectors and matrices used in the code, Surge (x), Sway (y), and Heave +(z) correspond to the first, second and third position respectively. Roll (Rx), +Pitch (Ry), and Yaw (Rz) correspond to the fourth, fifth, and sixth position +respectively.

+
+../_images/coordinateSystem.png + +
+
+

WEC-Sim Coordinate System

+
+
+
+
+
+

Units

+

All units within WEC-Sim are in the MKS (meters-kilograms-seconds system) and +angular measurements are specified in radians (except for wave directionality +which is defined in degrees).

+
+
+

Boundary Element Method (BEM)

+

In WEC-Sim, wave forcing components are modeled using linear coefficients +obtained from a frequency-domain potential flow Boundary Element Method (BEM) +solver (e.g., WAMIT [B3], Aqwa [B4], NEMOH [B5], and Capytaine [B6, B7]). +The BEM solutions are obtained by solving the Laplace equation +for the velocity potential, which assumes the flow is inviscid, incompressible, +and irrotational. More details on the theory for the frequency-domain BEM can +be found in [B3].

+

WEC-Sim imports nondimensionalized hydrodynamic coefficients from an *.h5 +data structure generated by BEMIO for the BEM solvers: WAMIT, +Aqwa, NEMOH or Capytaine. Alternatively, the *.h5 data structure can be +manually defined by the user. The WEC-Sim code scales the hydrodynamic +coefficients according to the equations below, where \(\rho\) is the water +density, \(\omega\) is the wave frequency in rad/s, and \(g\) is +gravity:

+
+\begin{gather*} +|\overline{F_{exc}(\omega)}| = \frac{|F_{exc}(\omega)|}{\rho g} \\ +\overline{A(\omega)} = \frac{A(\omega)}{\rho} \\ +\overline{B(\omega)} = \frac{B(\omega)}{\rho \omega} \\ +\overline{K_{hs}} = \frac{K_{hs}}{\rho g} +\end{gather*}

where \(F_{exc}\) is the wave-excitation force and torque vector, \(A\) +is the radiation added mass coefficient, \(B\) is the radiation wave +damping coefficient, and \(K_{hs}\) is the linear hydrostatic restoring +coefficient.

+
+
+

Time-Domain Formulation

+

A common approach to determining the hydrodynamic forces is to use linear wave +theory which assumes the waves are the sum of incident, radiated, and +diffracted wave components. The dynamic response of the system is calculated by +solving WEC system equations of motion [B2, B8]. The +equation of motion for a floating body about its center of gravity can be given +as:

+
+\[m\ddot{X}=F_{exc}(t)+F_{md}(t)+F_{rad}(t)+F_{pto}(t)+F_{v}(t)+F_{me}(t)+F_{B}(t)+F_{m}(t)\]
+

where \(\ddot{X}\) is the (translational and rotational) acceleration +vector of the device, \(m\) is the mass matrix, \(F_{exc}(t)\) is the +wave excitation force and torque (6-element) vector, \(F_{md}(t)\) is the +mean drift force and torque vector, \(F_{rad}(t)\) is the +force and torque vector resulting from wave radiation, \(F_{pto}(t)\) is +the PTO force and torque vector, \(F_{v}(t)\) is the damping force and +torque vector, \(F_{me}(t)\) is the Morison Element force and torque +vector, \(F_{B}(t)\) is the net buoyancy restoring force and torque vector, +and \(F_{m}(t)\) is the force and torque vector resulting from the mooring +connection.

+

\(F_{exc}(t)\) , \(F_{rad}(t)\) , and \(F_{B}(t)\) are calculated +using hydrodynamic coefficients provided by the frequency-domain BEM solver. +The radiation term includes an added-mass term, matrix \(A(\omega)\), and +wave damping term, matrix \(B(\omega)\), associated with the acceleration +and velocity of the floating body, respectively, and given as functions of +radian frequency (\(\omega\)) by the BEM solver. The wave excitation term +\(F_{exc}(\omega)\) includes a Froude-Krylov force component generated by +the undisturbed incident waves and a diffraction component that results from +the presence of the floating body. The buoyancy term \(F_{B}(t)\) depends +on the hydrostatic stiffness \(K_{hs}\) coefficient, displacement of the +body, and its mass.

+
+
+

Numerical Methods

+

WEC-Sim can be used for regular and irregular wave simulations, but note that +\(F_{rad}(t)\) is calculated differently for +sinusoidal steady-state response scenarios and random sea simulations. The +sinusoidal steady-state response is often used for simple WEC designs with +regular incoming waves. However, for random sea simulations or any simulations +where fluid memory effects of the system are essential, the convolution +integral method is recommended to represent the fluid memory retardation force +on the floating body. To speed computation of the convolution integral, the +state space representation method can be specified to approximate this +calculation as a system of linear ordinary differential equations.

+
+

Ramp Function

+

A ramp function (\(R_{f}\)), necessary to avoid strong transient flows at +the earlier time steps of the simulation, is used to calculate the wave +excitation force. The ramp function is given by

+
+\[\begin{split}R_{f}(t)=\begin{cases} +\frac{1}{2}(1+\cos(\pi+\frac{\pi t}{t_{r}})) & \frac{t}{t_{r}}<1\\ +1 & \frac{t}{t_{r}}\geq1 +\end{cases}\end{split}\]
+

where \(t\) is the simulation time and \(t_{r}\) is the ramp time.

+
+
+

Sinusoidal Steady-State Response

+

This approach assumes that the system response is in sinusoidal steady-state +form; therefore, it is only valid for regular wave simulations. The radiation +term can be calculated using the added mass and the wave radiation damping term +for a given wave frequency, which is obtained from

+
+\[F_{rad}(t)=-A(\omega)\ddot{X}-B(\omega)\dot{X}\]
+

where \(\dot{X}\) is the velocity vector of the floating body, +\(A(\omega)\) is the added mass matrix, and \(B(\omega)\) is the +radiation damping matrix.

+

The free surface profile is based on linear wave theory for a given wave +height, wave frequency, and water depth. The regular wave excitation force is +obtained from

+
+\[F_{exc}(t)=\Re\left[ R_{f}(t)\frac{H}{2}F_{exc}(\omega, \theta)e^{i\omega t} \right]\]
+

where \(\Re\) denotes the real part of the formula, \(R_{f}\) is the +ramp function, \(H\) is the wave height, \(F_{exc}\) is the frequency +dependent complex wave-excitation amplitude vector, and \(\theta\) is the +wave direction.

+

The mean drift force has two contributions:

+
+
    +
  • 2nd-order hydrodynamic pressure due to the first-order wave

  • +
  • Interaction between the first-order motion and the first-order wave

  • +
+
+

Currently, WEC-Sim only reads mean drift coefficients representing the first contribution. +The mean drift force can optionally be included if these coefficients are defined in the BEM data. +The mean drift force is obtained from:

+
+\[F_{md}(t)=\left(\frac{H}{2}\right)^2F_{md}(\omega,\theta)\]
+

The mean drift force is combined with the excitation force in the response class output.

+
+

Note

+

Currently, WEC-Sim only supports mean drift coefficients and QTF from WAMIT.

+
+
+
+

Convolution Integral Formulation

+

In the case of an irregular wave spectrum, the fluid memory has an important +impact on the WEC dynamics. This fluid memory effect is captured by the +convolution integral formulation based upon the Cummins equation +[B9] is used. The radiation term can be calculated by

+
+\[F_{rad}(t)=-A_{\infty}\ddot{X}-\intop_{0}^{t}K_{r}(t-\tau)\dot{X}(\tau)d\tau\]
+

where \(A_{\infty}\) is the added mass matrix at infinite frequency and +\(K_{r}\) is the radiation impulse response function. This representation +also assumes that there is no motion for \(t<0\). The radiation impulse +response function is defined as

+
+\[K_{r}(t) = \frac{2}{\pi} \intop_{0}^{\infty} B(\omega) cos(\omega t) d\omega\]
+

For regular waves, the equation described in the last subsection is used to +calculate the wave excitation vector. For irregular waves, the free surface +elevation is constructed from a linear superposition of a number of regular +wave components. Each regular wave component is extracted from a wave spectrum, +\(S(\omega)\), describing the wave energy distribution over a range of wave +frequencies, generally characterized by a significant wave height and peak wave +period. The irregular excitation force can be calculated as the real part of an +integral term across all wave frequencies as follows

+
+\[F_{exc}(t)=\Re\left[ R_{f}(t) \sum_{j=1}^{N} + F_{exc}(\omega_{j}, \theta) + e^{i(\omega_{j}t+\phi_{j})} + \sqrt{2S(\omega_{j})d\omega_{j}} \right]\]
+

where \(\phi\) is the randomized phase angle and \(N\) is the number of +frequency bands selected to discretize the wave spectrum. For repeatable +simulation of an irregular wave field \(S(\omega)\), WEC-Sim allows +specification of \(\phi\), refer to the Multiple Wave-Spectra +section.

+

Additionally, an excitation force impulse response function is defined +as

+
+\[K_{e}(t) = \frac{1}{2\pi} \intop_{-\infty}^{\infty} + F_{exc}(\omega,\theta)e^{i\omega t} d\omega\]
+

The excitation impulse response function is only used for the userDefinedElevation wave case.

+
+
+

State Space

+

It is highly desirable to represent the radiation convolution integral +described in the last subsection in state space (SS) form [B10]. This +has been shown to dramatically increase computational speeds +[B11] and allow utilization of conventional control methods +that rely on linear state space models. An approximation will need to be made +as \(K_{r}\) is solved from a set of partial differential equations where +as a linear state space is constructed from a set of ordinary differential +equations. In general, a linear system is desired such that:

+
+\[\begin{split}\dot{X}_{r} \left( t \right) = + \mathbf{A_{r}} X_{r} \left( t \right) + + \mathbf{B_{r}} \mathbf{u} (t);~~X_{r}\left( 0 \right) = 0~~ \nonumber \\ +\int_{0}^{t} \mathbf{K_{r}} \left( t- \tau \right) d\tau \approx + \mathbf{C_{r}} X_{r} \left( t \right) + + \mathbf{D_{r}} \mathbf{u} \left( t \right)~~\end{split}\]
+

with \(\mathbf{A_{r}},~\mathbf{B_{r}},~\mathbf{C_{r}},~\mathbf{D_{r}}\) +being the time-invariant state, input, output, and feed through matrices, while +\(u\) is the input to the system and \(X_{r}\) is the state vector +describing the convolution kernel as time progresses.

+
+

Calculation of \(K_{r}\) from State Space Matrices

+

The impulse response of a single-input zero-state state-space model is +represented by

+
+\[\begin{split}\dot{x} &= \mathbf{A_{r}} x + \mathbf{B_{r}} u \\ + y &= \mathbf{C_{r}} x\end{split}\]
+

where \(u\) is an impulse. If the initial state is set to \(x(0)= +\mathbf{B_{r}} u\) the response of the unforced (\(u=0\)) system

+
+\[\begin{split}\dot{x} &= \mathbf{A_{r}} x \\ + y &= \mathbf{C_{r}} x\end{split}\]
+

is clearly equivalent to the zero-state impulse response. The impulse response +of a continuous system with a nonzero \(\mathbf{D_r}\) matrix is infinite +at \(t=0\); therefore, the lower continuity value +\(\mathbf{C_{r}}\mathbf{B_{r}}\) is reported at \(t=0\). The general +solution to a linear time invariant (LTI) system is given by:

+
+\[x(t) = e^{\mathbf{A_{r}}t} x(0) + + \int_{0}^{t} e^{\mathbf{A_{r}}(t-\tau)} \mathbf{B_{r}} u (\tau) d\tau~~\]
+

where \(e^{\mathbf{A_{r}}}\) is the matrix exponential and the calculation +of \(K_{r}\) follows:

+
+\[K_{r}(t) = \mathbf{C_{r}}e^{\mathbf{A_{r}}t}\mathbf{B_{r}}~~\]
+
+
+

Realization Theory

+

The state space realization of the hydrodynamic radiation coefficients can be +pursued in the time domain (TD). This consists of finding the minimal order of +the system and the discrete time state matrices +(\(\mathbf{A_{d}},~\mathbf{B_{d}},~\mathbf{C_{d}},~\mathbf{D_{d}}\)) from +samples of the impulse response function. This problem is easier to handle for +a discrete-time system than for continuous-time. The reason being is that the +impulse response function of a discrete-time system is given by the Markov +parameters of the system:

+
+\[\mathbf{\tilde{K}_{r}} \left( t_{k} \right) = + \mathbf{C_{d}}\mathbf{A_{d}}^{k}\mathbf{B_{d}}~~\]
+

where \(t_{k}=k\Delta t\) for \(k=0,~1,~2,~\ldots\) with \(\Delta +t\) being the sampling period. The feedthrough matrix \(\mathbf{D_d}\) is +assumed to be zero in order to maintain causality of the system, as a non-zero +\(\mathbf{D_d}\) results in an infinite value at \(t=0\).

+

The most common algorithm to obtain the realization is to perform a Singular +Value Decomposition (SVD) on the Hankel matrix of the impulse response +function, as proposed by Kung [B12]. The order of the system and +state-space parameters are determined from the number of significant singular +values and the factors of the SVD. The Hankel matrix (\(H\)) of the impulse +response function

+
+\[\begin{split}H = \begin{bmatrix} + \mathbf{K_{r}}(2) & \mathbf{K_{r}}(3) & \ldots & \mathbf{K_{r}}(n) \\ + \mathbf{K_{r}}(3) & \mathbf{K_{r}}(4) & \ldots & 0 \\ + \vdots & \vdots & \ddots & \vdots \\ + \mathbf{K_{r}}(n) & 0 & \cdots & 0 + \end{bmatrix} &\\\end{split}\]
+

can be reproduced exactly by the SVD as

+
+\[H = \mathbf{U} \Sigma \mathbf{V^{*}}\]
+

where \(\Sigma\) is a diagonal matrix containing the Hankel singular values +in descending order. Examination of the Hankel singular values reveals there +are only a small number of significant states and that the rank of \(H\) +can be greatly reduced without a significant loss in accuracy +[B11, B13]. Further detail into the SVD method and +calculation of the state space parameters will not be discussed here and the +reader is referred to [B11, B13].

+
+
+
+
+

Regular Waves

+

Regular waves are defined as planar sinusoidal waves, where the incident wave is defined as \(\eta(x,y,t)\) :

+
+\[\eta(x,y,t)= \frac{H}{2} \cos( \omega t - k (x\cos \theta + y\sin \theta) + \phi)\]
+

where \(H\) is the wave height, \(\omega\) is the wave frequency +(\(\omega = \frac{2\pi}{T}\)), \(k\) is the wave number (\(k = +\frac{2\pi}{\lambda}\)), \(\theta\) is the wave direction, and \(\phi\) +is the wave phase.

+
+

Dispersion Relation

+

For ocean waves, the dispersion relation is a relation between the wave angular frequency and the wave number (i.e. wavelength). +The dispersion relation is derived using separation of variables to satisfy the free surface kinematic and dynamic boundary conditions. +For a more detailed derivation please the reader is referred here The dispersion relation that WEC-sim uses is defined as:

+
+\[\begin{split}\omega^{2} = gk\tanh\left(kh\right) \approx \begin{cases} +gk & \text{as } kh \rightarrow \infty \\ +gk^{2}h & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+

where \(\omega\) is the wave angular frequency (\(\omega = \frac{2\pi}{T}\)), \(g\) is gravitational acceleration, +\(k\) is the wave number (\(k=\frac{2\pi}{\lambda}\)), and \(h\) is the water depth. The dispersion relation can be +simplified if the floating body is located in deep water, \(h \rightarrow \infty\) . The simplification comes from the hyperbolic +tangent function having an asympote of 1 as its argument tends to infinity (\(\tanh \left( \infty \right) \rightarrow 1\)). +The deep water condition can still be met if the water depth is not infinite while the following expression holds \(kh \geq \pi\) . +The dispersion relation can then be used to derive the phase velocity which refers to the speed that an observer would need to travel for +the wave to appear stationary (unchanging). The phase velocity of a two-dimensional progressive wave is given by the following expression:

+
+\[\begin{split}c_{p} = \frac{\omega}{k} = \sqrt{\frac{g}{k}\tanh\left(kh\right)} \approx \begin{cases} +\sqrt{\frac{g}{k}}=\frac{g}{\omega} & \text{as } kh \rightarrow \infty \\ +\sqrt{gh} & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+
+
+

Regular Wave Power

+

The time-averaged power, per unit wave crest with, for a propagating water wave

+
+\[P_{w} = \frac{1}{2}\rho g A^{2} c_{g}\]
+

where \(\rho\) is the fluid density, \(g\) is gravitational acceleration, \(A\) is the wave amplitude, and \(c_{g}\) is wave group velocity. +The group velocity is the speed of propagation of a packet of waves which is always slower than the wave phase velocity. For a more detailed derivation on the +group velocity the reader is referred here. The group velocity of a two-dimensional progressive wave +is given by the following expression:

+
+\[c_{g} = \frac{\delta \omega}{\delta k} = \frac{1}{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right)\]
+

where \(\sinh\) is the hyperbolic sine function. The square root term is the phase velocity which can be used to simplify the group velocity expression as follows:

+
+\[\begin{split}c_{g} = \frac{1}{2} c_{p} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) \approx \begin{cases} +\frac{1}{2} c_{p} & \text{as } kh \rightarrow \infty \\ +1 & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+

Inserting the full expression for the group velocity into the wave power equation provides the following:

+
+\[P_{w} = \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left[ 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right]\]
+

Similar to the other wave property expressions, the wave power expression can be simplified for both deep and shallow water conditions as follows:

+
+\[\begin{split}P_{w} \approx +\begin{cases} +\frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}} = \frac{1}{8\pi}\rho g^{2} A^{2} T & \text{as } kh \rightarrow \infty \\ +\frac{1}{4}\rho g A^{2} \sqrt{gh} & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+
+

Note

+

The deep water condition is often used without proper validation of the wave environment which can have a significant effect on wave power. +WEC-Sim by default will calculate the wave power using the full expression, no simplification, unless the hydrodynamic data is imported with +the assumption of infinite water depth.

+
+
+
+
+

Irregular Waves

+

Irregular waves are modeled as the linear superposition of a large number of +harmonic waves at different frequencies and angles of incidence, where the +incident wave is defined as \(\eta(x,y,t)\) :

+
+\[\eta(x,y,t) = \sum_{i} \frac{H_{i}}{2} \cos( \omega_{i} t - + k_{i} (x\cos \theta_{i} + y \sin \theta_{i}) + \phi_{i})\]
+

where \(H\) is the wave height, \(\omega\) is the wave frequency +(\(\omega = \frac{2\pi}{T}\)), \(k\) is the wave number (\(k = +\frac{2\pi}{\lambda}\)), \(\theta\) is the wave direction, and \(\phi\) +is the wave phase (randomized for irregular waves).

+
+

Wave Spectra

+

The linear superposition of regular waves of distinct amplitudes and periods is +characterized in the frequency domain by a wave spectrum. Through statistical +analysis, spectra are characterized by specific parameters such as significant +wave height, peak period, wind speed, fetch length, and others. Common types of +wave spectra that are used by the offshore industry are discussed in the +following sections. The general form of the wave spectra available in WEC-Sim +is given by:

+
+\[S\left( f , \theta \right)= S\left( f \right)D\left( \theta \right)~~\]
+

where \(S\left( f\right)\) is the wave power spectrum, \(f\) is the +wave frequency (in Hertz), \(D\left( \theta \right)\) is the directional +distribution, and \(\theta\) is the wave direction (in Degrees). The +formulation of \(D\left( \theta \right)\) requires that

+
+\[\int_{0}^{\infty} \int_{-\pi}^{\pi} + S \left( f \right) D \left( \theta \right) d\theta df = + \int_{0}^{\infty} S\left( f \right) df\]
+

so that the total energy in the directional spectrum must be the same as the +total energy in the one-dimensional spectrum.

+
+\[S\left( f \right) = A_{ws} f^{-5}\exp\left[-B_{ws} f^{-4} \right]~~\]
+

where \(A_{ws}\) and \(B_{ws}\) are coefficients that vary depending on +the wave spectrum and \(\exp\) stands for the exponential function. +Spectral moments of the wave spectrum, denoted \(m_{k}~,~k=0, 1, 2,...\), +are defined as

+
+\[m_{k} = \int_{0}^{\infty} f^{k} S \left( f \right) df ~~\]
+

The spectral moment, \(m_{0}\) is the variance of the free surface which +allows one to define the mean wave height of the tallest third of waves, +significant wave height \(H_{m0}\) (in m), as:

+
+\[H_{m0} = 4 \sqrt{m_{0}}~~\]
+
+
+

Irregular Wave Power

+

The time-averaged wave power available for a given irregular sea state can be calcuated from:

+
+\[P_{w} = \rho g \int_{0}^{\infty} S \left( f \right) c_{g} \left( f \right) df\]
+

where the expression for group velocity for regular waves can be inserted for each frequency used +to describe the sea spectrum.

+
+

Pierson–Moskowitz (PM) Spectrum

+

The PM spectrum is applicable to a fully developed sea, when the growth of the +waves is not limited by the fetch [B14]. The two-parameter PM spectrum is +based on a significant wave height and peak wave frequency. For a given +significant wave height, the peak frequency can be varied to cover a range of +conditions including developing and decaying seas. In general, the parameters +depend strongly on wind speed, and also wind direction, fetch, and locations of +storm fronts. The spectral density of the surface elevation defined by the PM +spectrum [B15] is defined by:

+
+\[S_{PM}\left( f \right) = \frac{{H_{m0}}^2}{4} + \left( 1.057f_{p} \right)^{4} f^{-5} \exp + \left[-\frac{5}{4} \left( \frac{f_{p}}{f}\right)^{4} \right]\]
+

This implies coefficients of the general form:

+
+\[\begin{split}A_{ws} &= \frac{{H_{m0}}^2}{4}\left(1.057f_{p}\right)^{4} \approx + \frac{5}{16} {H_{m0}}^2 {f_{p}}^{4} \approx \frac{B_{ws}}{4}{H_{m0}}^2 \\ +B_{ws} &= \left(1.057f_{p}\right)^{4} \approx \frac{5}{4}{f_{p}}^{4}\end{split}\]
+

where \(H_{m0}\) is the significant wave height, \(f_{p}\) is the peak +wave frequency \(\left(=1/T_{p}\right)\), and \(f\) is the wave +frequency.

+
+
+

JONSWAP (JS) Spectrum

+

The JONSWAP (Joint North Sea Wave Project) spectrum is formulated as a +modification of the PM spectrum for developing sea sate in a fetch-limited +situation [B16]. The spectrum accounts for a higher peak and a narrower +spectrum in a storm situation for the same total energy as compared to the PM +spectrum. The spectral density of the surface elevation defined by the JS +spectrum [B15] is defined by:

+
+\[S_{JS}\left( f \right) = C_{ws} \left(\gamma\right) S_{PM} \gamma^{\alpha}\]
+

where \(\gamma\) is the nondimensional peak-shape parameter.

+

The normalizing factor, \(C_{ws}\left(\gamma\right)\), is defined as:

+
+\[C_{ws}\left(\gamma\right) = \frac{\int_{0}^{\infty} S_{PM}\left( f \right)df} + {\int_{0}^{\infty}S_{PM}\left(f\right)\gamma^{\alpha}df} = + 1 -0.287\ln\left(\gamma\right)\]
+

The peak-shape parameter exponent \(\alpha\) is defined as:

+
+\[\begin{split}\alpha = \exp \left[ -\left( \frac{\frac{f}{f_{p}}-1}{\sqrt{2} \sigma}\right)^{2} \right],~~ +\sigma = \begin{cases} 0.07 & f \leq f_{p} \\0.09 & f > f_{p} \end{cases} ~~\end{split}\]
+

The peak-shape parameter is defined based on the following relationship between +the significant wave height, \(H_{m0}\), and peak period, \(T_{p}\):

+
+\[\begin{split}\gamma = \begin{cases} + 5 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} \leq 3.6 \\ + \exp\left(5.75 - 1.15\frac{T_{p}}{\sqrt{H_{m0}}} \right) & \text{for } 3.6 \leq \frac{T_{p}}{\sqrt{H_{m0}}} \leq 5 \\ + 1 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} > 5 +\end{cases}\end{split}\]
+

with general form coefficients thus defined:

+
+\[\begin{split}A_{ws} &= \frac{B_{ws}}{4}{H_{m0}}^2 C_{ws}\left(\gamma \right) \gamma^{\alpha} \\ +B_{ws} &= \frac{5}{4}{f_{p}}^{4}\end{split}\]
+
+
+
+
+

Ocean Current

+

An ocean current is a continuous, directed movement of sea water generated by a number of forces acting upon the water, including wind, +the Coriolis effect, breaking waves, cabbeling, temperature and salinity differences, and other ocean phenomena. Depth contours, shoreline configurations, and +interactions with other currents influence a current’s direction and strength. Ocean current can vary in space and time, but are generally modeled assuming a +horizontally uniform flow field of constant velocity and direction, varying only as a function of depth.

+
+../_images/oceanCurrentProfiles.png + +
+
+

Ocean Current Profiles Within WEC-Sim

+
+
+
+

Within WEC-Sim there are three options to model ocean currents:

+
+

Option 1

+

In Option 1, the sub-surface current is depth independent and is equal to the current at the water surface:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+

where \(\theta_{c}\) is the current direction.

+
+
+

Option 2

+

In Option 2, the sub-surface current profile varies with depth following a 1/7th power law:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right]^{1/7} \left[ \cos \left(\theta_{c}\right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+

where \(d_{current}\) is the water depth where the sub-surface current is 0.

+
+
+

Option 3

+

In Option 3, the sub-surface current profile varies linearly with depth:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right] \left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+
+

Note

+

WEC-Sim does not adjust the linear wave hydrodynamics based on the presence +of ocean currents and assumes a linear superposition between current and +wave forces. The ocean current option is used only in the Morison Element +force calculation.

+
+
+
+
+

Power Take-Off (PTO)

+

Throughout the following sections, unless specification is made between linear +and rotary PTOs, units are not explicitly stated.

+
+

Linear PTO

+

The PTO mechanism is represented as a linear spring-damper system where the +reaction force is given by:

+
+\[F_{pto}=-K{}_{pto}X_{rel}-C_{pto}\dot{X}_{rel}\]
+

where \(K_{pto}\) is the stiffness of the PTO, \(C_{pto}\) is the +damping of the PTO, and \(X_{rel}\) and \(\dot{X}_{rel}\) are the +relative motion and velocity between two bodies. The instantaneous power +absorbed by the PTO is given by:

+
+\[P_{pto} = -F_{pto}\dot{X}_{rel} = \left(K_{pto}X_{rel} \dot{X}_{rel} + + C_{pto} \dot{X}^{2}_{rel} \right)\]
+
+
+

Hydraulic PTO

+

The PTO mechanism is modeled as a hydraulic system [B17], where the +reaction force is given by:

+
+\[F_{pto}=\Delta{} p_{piston}A_{piston}\]
+

where \(\Delta{} p_{piston}\) is the differential pressure of the hydraulic +piston and \(A_{piston}\) is the piston area. The instantaneous hydraulic +power absorbed by the PTO is given by:

+
+\[P_{pto}=-F_{pto}\dot{X}_{rel}\]
+
+
+

Mechanical PTO

+

The PTO mechanism is modeled as a direct-drive linear generator system +[B17], where the reaction force is given by:

+
+\[F_{pto}=(\frac{\pi}{\tau_{pm}})\lambda_{fd}i_{sq}\]
+

where \(\tau_{pm}\) is the magnet pole pitch (the center-to-center distance +of adjacent magnetic poles), \(\lambda_{fd}\) is the flux linkage of the +stator \(d\)-axis winding due to flux produced by the rotor magnets, and +\(i_{sq}\) is the stator \(q\)-axis current. The instantaneous +mechanical power absorbed by the PTO is given by:

+
+\[P_{pto}=-F_{pto}\dot{X}_{rel}\]
+

For more information about application of pto systems in WEC-Sim, refer to +Constraint and PTO Features section.

+
+
+
+

Mooring

+

The mooring load is represented using a linear quasi-static mooring stiffness +or by using the mooring forces calculated from MoorDyn, which is an +open-source lumped-mass mooring dynamics model.

+
+

Mooring Matrix

+

When linear quasi-static mooring stiffness is used, the mooring load can be +calculated by

+
+\[F_{m}=-K_{m}X-C_{m}\dot{X}\]
+

where \(K_{m}\) and \(C_{m}\) are the stiffness and damping matrices +for the mooring system, and \(X\) and \(\dot{X}\) are the displacement +and velocity of the body, respectively.

+
+
+

Mooring Lookup Table

+

The Mooring Lookup Table searches a user-supplied 6DOF force lookup table. +The lookup table must contain six parameters: the resultant mooring force in each degree of freedom. +Each force must be indexed by position in all six degrees of freedom, as shown below. +The mooringClass does not assume a value for empty indices or forces. +All degrees of freemdom must be initialized and supplied by the user. +The mooring force is linearly interpolated between indexed positions based on the instantaneous position of the mooring system using a Simulink N-D Lookup Table for each force component. +The fidelity of the mooring lookup table is entirely dependent on the user-defined input.

+
+
+

MoorDyn

+

MoorDyn discretizes each mooring line in a mooring system into evenly-sized +line segments connected by node points (see MoorDyn figure). The line mass is lumped at these node points along with +gravitational and buoyancy forces, hydrodynamic loads, and reactions from +contact with the seabed. Hydrodynamic drag and added mass +are calculated based on Morison’s equation. A mooring line’s axial stiffness +is modeled by applying a linear stiffness to each line segment in tension only. +A damping term is also applied in each segment to dampen non-physical resonance +caused by the lumped-mass discretization. Bending and torsional stiffnesses are +neglected. Bottom contact is represented by vertical stiffness and damping +forces applied at the nodes when a node is located below the seabed. +[B18, B19].

+
+../_images/MoorDyn_Graphic.png + +
+
+

MoorDyn mooring model elements

+
+
+
+

For more information about application of mooring systems in WEC-Sim, refer to +Mooring Features section.

+
+
+
+

Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+

The linear model assumes that the body motion and the waves consist of small +amplitudes in comparison to the wavelengths. A weakly nonlinear approach is +applied to account for the nonlinear hydrodynamic forces induced by the +instantaneous water surface elevation and body position. Rather than using the +BEM calculated linear wave-excitation and hydrostatic coefficients, the +nonlinear buoyancy and the Froude-Krylov force components can be obtained by +integrating the static and dynamic pressures over each panel along the wetted +body surface at each time step. Linear wave theory is used to determine the +flow velocity and pressure field, so the values become unrealistically large +for wetted panels that are above the mean water level. To correct this, the +Wheeler stretching method is applied [B20], which applies +a correction to the instantaneous wave elevation that forces its height to be +equal to the water depth when calculating the flow velocity and pressure,

+
+
+\[z^* = \frac{D(D+z)}{(D+\eta)} - D\]
+
+

where \(D\) is the mean water depth, and \(\eta\) is the z-value on the +instantaneous water surface.

+
+

Note

+

The nonlinear WEC-Sim method is not intended to model highly nonlinear hydrodynamic events, such as wave slamming and wave breaking.

+
+

For more information about application of nonlinear hydrodynamics in WEC-Sim, +refer to Nonlinear Buoyancy and Froude-Krylov Excitation section.

+
+
+

Viscous Damping and Morison Elements

+

Additional damping and added-mass can be added to the WEC system. This +facilitates experimental validation of the WEC-Sim code, particularly in the +event that the BEM hydrodynamic outputs are not sufficiently representative of +the physical system.

+
+

Viscous Damping

+

Linear damping and quadratic drag forces add flexibility to the definition of viscous forcing

+
+
+\[\begin{split}F_{v} &= -C_{v}\dot{X}-\frac{C_{d} \rho A_{d}}{2}\dot{X}|\dot{X}| \\ + &= -C_{v}\dot{X}-C_{D}\dot{X}|\dot{X}|\end{split}\]
+
+

where \(C_{v}\) is the linear (viscous) damping coefficient, \(C_{d}\) +is the quadratic drag coefficient, \(\rho\) is the fluid density, and +\(A_{d}\) is the characteristic area for drag calculation. Alternatively, +one can define \(C_{D}\) directly.

+

Because BEM codes are potential flow solvers and neglect the effects of +viscosity, \(F_{v}\) generally must be included to accurately model device +performance. However, it can be difficult to select representative drag +coefficients, as they depend on device geometry, scale, and relative velocity +between the body and the flow around it. Empirical data on the drag coefficient +can be found in various literature and standards, but is generally limited to +simple geometries evaluated at a limited number of scales and flow conditions. +For realistic device geometries, the use of computational fluid dynamic +simulations or experimental data is encouraged.

+
+
+

Morison Elements

+

The Morison Equation assumes that the fluid forces in an oscillating flow on a +structure of slender cylinders or other similar geometries arise partly from +pressure effects from potential flow and partly from viscous effects. A slender +cylinder implies that the diameter, D, is small relative to the wave length, +\(\lambda\), which is generally met when \(D/\lambda < 0.1 - 0.2\). If +this condition is not met, wave diffraction effects must be taken into account. +Assuming that the geometries are slender, the resulting force can be +approximated by a modified Morison formulation [B21]. The +formulation for each element on the body can be given as

+
+
+\[F_{me}=\rho\forall\dot{v} + \rho\forall C_{a}(\dot{v}-\ddot{X}) + + \frac{C_{d}\rho A_{d}}{2}(v-\dot{X})|v-\dot{X}|\]
+
+

where \(v\) is the fluid particle velocity due to the wave and current speed, +\(C_{a}\) is the coefficient of added mass, and \(\forall\) is the +displaced volume.

+
+

Note

+

WEC-Sim does not consider buoyancy effects when calculating the forces +from Morison elements.

+
+

For more information about application of Morison Elements in WEC-Sim, refer to +Morison Elements section.

+
+
+
+

Generalized Body Modes

+

Additional generalized body modes (GBM) are included to account for solving a +multibody system with relative body motions, dynamics, or structural +deformation. This implementation assumes the modal properties are given, +obtainable in closed-form expressions or with finite element analysis. Once the +hydrodynamic coefficients that include these additional flexible DOF are +obtained from the BEM solver, the 6DOF rigid body motion for each body and the +additional GBM DOFs are solved together in one system of equations. See this +example and Advanced Features for more details on implementing GBM.

+
+
+

Terminology

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Term or Variable

Definition

\(A(\omega)\)

Frequency dependent radiation added mass and inertia (kg and kg-m^2)

\(\overline{A(\omega)}\)

Normalized frequency dependent radiation added mass

\(A_{\infty}\)

Added mass and inertia at infinite frequency (kg and kg-m^2)

\(A_{d}\)

Characteristic drag area

\(\boldsymbol{A_d}\)

State space discrete time state matrix

\(\boldsymbol{A_r}\)

State space time-invariant state matrix

\(A_{ws}\)

Wave spectrum coefficient

\(\alpha\)

Wave spectrum coefficient (JONSWAP)

\(B(\omega)\)

Frequency dependent radiation wave damping (N/m/s)

\(\overline{B(\omega)}\)

Normalized frequency dependent radiation wave damping

\(\boldsymbol{B_d}\)

State space discrete time input matrix

\(\boldsymbol{B_r}\)

State space time-invariant input matrix

\(B_{ws}\)

Wave spectrum coefficient

BEM

Boundary Element Method

BEMIO

Boundary Element Method Input/Output

\(cg\)

Center of gravity

\(cb\)

Center of buoyancy

\(C_{a}\)

Morison element coefficient of added mass

\(C_{d}\)

Quadratic drag coefficient

\(C_{m}\)

Mooring damping matrix (N/m/s)

\(C_{pto}\)

PTO damping coefficient (N/m/s)

\(\boldsymbol{C_d}\)

State space discrete time output matrix

\(\boldsymbol{C_r}\)

State space time-invariant output matrix

\(C_{ws}\)

Wave spectrum coefficient (JONSWAP)

\(C_{v}\)

Linear viscous damping coefficient (N/m/s)

$CASE

WEC-Sim case directory

dof

Degree of freedom

\(D\)

Mean water depth

\(\boldsymbol{D_d}\)

State space discrete time feed through matrix

\(\boldsymbol{D_r}\)

State space time-invariant feed through matrix

\(\eta\)

Incident wave (m)

\(f\)

Wave frequency (Hz)

\(f_{p}\)

Peak wave frequency (Hz)

\(F_{B}\)

Net buoyancy restoring force (N) or torque (Nm)

\(F_{exc}\)

Wave excitation force (N) or torque (Nm)

\(\overline{F_{exc}}\)

Normalized wave excitation force (m^3) or torque (m^4)

\(F_{rad}\)

Wave radiation force (N) or torque (Nm)

\(F_{pto}\)

Power take-off force (N) or torque (Nm)

\(F_{me}\)

Morison element force (N) or torque (Nm)

\(F_{v}\)

Damping or friction force (N) or torque (Nm)

\(F_{m}\)

Mooring connection force (N) or torque (Nm)

\(g\)

Gravitational acceleration (m/s/s)

GBM

Generalized body mode

\(h\)

Water depth (m)

\(H\)

Wave height (m)

\(\boldsymbol{H}\)

Hankel matrix of the impulse response function

\(H_{s}\)

Significant wave height, mean wave height of the tallest third of waves (m)

\(H_{m0}\)

Spectrally derived significant wave height (m)

Heave (Z)

Motion along the Z-axis

IRF

Impulse Response function

JS

JONSWAP Spectrum

\(k\)

Wave number (rad/m), \(k = \frac{2\pi}{\lambda}\)

\(K_e\)

Excitation impulse response function

\(\overline{K_e}\)

Normalized excitation impulse response function

\(K_{hs}\)

Linear hydrostatic restoring coefficient (N/m)

\(\overline{K_{hs}}\)

Normalized linear hydrostatic restoring coefficient

\(K_{m}\)

Mooring stiffness matrix (N/m)

\(K_{pto}\)

PTO stiffness coefficient (N/m)

\(K_r\)

Radiation impulse response function

\(\overline{K_r}\)

Normalized radiation impulse response function

\(\lambda\)

Wave length (m)

\(\lambda_{fd}\)

Flux linkage

\(m\)

Mass of body (kg)

\(m_k\)

Spectral moment of k, for k = 0,1,2,…

\(\omega\)

Wave frequency (rad/s), \(\omega = \frac{2\pi}{T}\)

\(\phi\)

Wave phase (rad)

\(\sigma\)

Wave spectrum coefficient (JONSWAP)

\(\gamma\)

Wave spectrum nondimensional peak shape parameter

Pitch (RY)

Rotation about the Y-axis

PM

Pierson-Moskowitz Spectrum

\(P_{PTO}\)

Power from the PTO

PTO

Power Take-Off

\(R_{f}\)

Ramp function

\(\rho\)

Water density (kg/m3)

Roll (RX)

Rotation about the X-axis

Surge (X)

Motion along the X-axis

Sway (Y)

Motion along the Y-axis

\(S(\omega)\)

Frequency dependent wave spectrum

\(t\)

Simulation time (s)

\(t_{r}\)

Ramp time (s)

\(\theta\)

Wave direction (Degrees)

\(T_{p}\)

Peak period (s)

\(\tau\)

Magnetic pole pitch

\(\boldsymbol{u}\)

State space input

\(V_0\)

Displaced water volume (m^3)

$WECSIM

WEC-Sim source code directory

\(X\)

Translation and rotation displacement vector (m) or (rad)

\(X_r\)

State space state vector

Yaw (RZ)

Rotation about the Z-axis

+
+
+

References

+
+
+
+[B1] +

Ye Li and Yi-Hsiang Yu. A Synthesis of Numerical Methods for Modeling Wave Energy Converter-Point Absorbers. Renewable and Sustainable Energy Reviews, 16(6):4352–4364, 2012.

+
+
+[B2] +(1,2) +

Aurélien Babarit, J. Hals, M.J. Muliawan, A. Kurniawan, T. Moan, and J. Krokstad. Numerical Benchmarking Study of a Selection of Wave Energy Converters. Renewable Energy, 41:44–63, 2012.

+
+
+[B3] +(1,2) +

CH Lee and JN Newman. WAMIT User Manual. 2006.

+
+
+[B4] +

ANSYS Aqwa. URL: http://www.ansys.com/Products/Other+Products/ANSYS+AQWA (visited on May 21, 2014).

+
+
+[B5] +

Nemoh a Open source BEM. URL: http://openore.org/tag/nemoh/ (visited on May 21, 2014).

+
+
+[B6] +

Matthieu Ancellin and Frédéric Dias. Capytaine: a Python-based linear potential flow solver. Journal of Open Source Software, 4(36):1341, apr 2019. URL: https://doi.org/10.21105%2Fjoss.01341, doi:10.21105/joss.01341.

+
+
+[B7] +

Aurélien Babarit and Gérard Delhommeau. Theoretical and numerical aspects of the open source BEM solver NEMOH. In Proceedings of the 11th European Wave and Tidal Energy Conference (EWTEC2015). Nantes, France, 2015.

+
+
+[B8] +

Jerica D. Nolte and R. C. Ertekin. Wave power calculations for a wave energy conversion device connected to a drogue. Journal of Renewable and Sustainable Energy, 2014.

+
+
+[B9] +

WE Cummins. The Impulse Response Function and Ship Motions. Technical Report, David Taylor Model Dasin-DTNSRDC, 1962.

+
+
+[B10] +

Z. Yu and J. Falnes. State-space Modelling of a Vertical Cylinder in Heave. Applied Ocean Research, 5:265–275, 1996.

+
+
+[B11] +(1,2,3) +

R. Taghipour, T. Perez, and T. Moan. Hybrid Frequency-time Domain Models for Dynamic Response Analysis of Marine Structures. Ocean Engineering, 7:685–705, 2008.

+
+
+[B12] +

Sun-Yuan Kung. A new identification and model reduction algorithm via singular value decomposition. In Proc. 12th Asilomar Conf. Circuits, Syst. Comput., Pacific Grove, CA, 705–714. 1978.

+
+
+[B13] +(1,2) +

Erlend Kristiansen, Åsmund Hjulstad, and Olav Egeland. State-space representation of radiation forces in time-domain vessel models. Ocean Engineering, 32(17):2195–2216, 2005.

+
+
+[B14] +

W. J. Pierson and L. A. Moskowitz. Proposed Spectral Form for Fully Developed Wind Seas Based on the Similarity Theory of S. A. Kitaigorodskii. Geophysical Research, 69:5181–5190, 1964.

+
+
+[B15] +(1,2) +

IEC 62600-2. Marine Energy - Wave, Tidal, and other water current converters. URL: https://webstore.iec.ch/publication/62399 (visited on June 8, 2020).

+
+
+[B16] +

K. Hasselman, T.P. Barnett, E. Bouws, H. Carlson, D.E. Cartwright, K. Enke, J.A. Ewing, H. Gienapp, D.E. Hasselmann, P. Kruseman, A. Meerburg, P. Mller, D.J. Olbers, K. Richter, W. Sell, and H. Walden. Measurements of wind-wave growth and swell decay during the Joint North Sea Wave Project (JONSWAP). Technical Report 12, German Hydrographic Institute, 1973.

+
+
+[B17] +(1,2) +

R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen. Development of PTO-SIM: A Power Performance Module for the Open-Souse Wave Energy Converter Code WEC-SIM. In Proceedings of OMAE 2015. 2015.

+
+
+[B18] +

Matthew Hall and Andrew Goupee. Validation of a lumped-mass mooring line model with deepcwind semisubmersible model test data. Ocean Engineering, 104:590–603, 2015.

+
+
+[B19] +

Matthew Hall. Moordyn v2: new capabilities in mooring system components and load cases. In International Conference on Offshore Mechanics and Arctic Engineering, volume 84416, V009T09A078. American Society of Mechanical Engineers, 2020.

+
+
+[B20] +

J D Wheeler and others. Methods for calculating forces produced by irregular waves. In Offshore Technology Conference. 1969.

+
+
+[B21] +

J R Morison, M P O'brien, J W Johnson, and S A Schaaf. The force exerted by surface waves on piles. Petroleum Transactions, AIME, 189:149–154, 1950.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/advanced_features.html b/dev/user/advanced_features.html new file mode 100644 index 000000000..077cd51f7 --- /dev/null +++ b/dev/user/advanced_features.html @@ -0,0 +1,3471 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+

The advanced features documentation provides an overview of WEC-Sim features +and applications that were not covered in the WEC-Sim Tutorials. +The diagram below highlights some of WEC-Sim’s advanced features, details of +which will be described in the following sections. Most advanced features have +a corresponding example case within the WEC-Sim_Applications repository or the WEC-Sim/Examples +directory in the WEC-Sim source code. For those topics of interest, it is +recommended that users run and understand the output of an application while +reading the documentation on the feature.

+
+../_images/codeFeatures.png + +
+
+

BEMIO

+

The Boundary Element Method Input/Output (BEMIO) functions are used to +pre-process the BEM hydrodynamic data prior to running WEC-Sim. For more +information about the WEC-Sim workflow, refer to +Running WEC-Sim. The following section can also be +followed in conjunction with the cases in the WEC-Sim/Examples directory in the +WEC-Sim source code. This includes several cases with WAMIT, NEMOH, Aqwa, and Capytaine. +For more information, refer to Series 1 - Multiple Condition Runs (MCR). BEMIO functions perform the +following tasks:

+
    +
  • Read BEM results from WAMIT, NEMOH, Aqwa, or Capytaine.

  • +
  • Calculate the radiation and excitation impulse response functions (IRFs).

  • +
  • Calculate the state space realization for the radiation IRF.

  • +
  • Save the resulting data in Hierarchical Data Format 5 (HDF5).

  • +
  • Plot typical hydrodynamic data for user verification.

  • +
+
+

Note

+

Previously the python based BEMIO code was used for this purpose. The python BEMIO functions have been converted to MATLAB and are included in the WEC-Sim source code. The python based BEMIO code will remain available but will no longer be supported.

+
+
+

BEMIO Functions

+
+
+functions.BEMIO.readWAMIT(hydro, filename, exCoeff)
+

Reads data from a WAMIT output file.

+

If generalized body modes are used, the output directory must also +include the *.cfg, *.mmx, and *.hst files. +If simu.nonlinearHydro = 3 will be used, the output directory must also +include the *.3fk and *.3sc files.

+

See WEC-Sim/examples/BEMIO/WAMIT for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that WAMIT input data will be appended to

  • +
  • filename (string) – Path to the WAMIT output file

  • +
  • exCoeff (integer) – Flag indicating the type of excitation force coefficients to +read, ‘diffraction’ (default), ‘haskind’, or ‘rao’

  • +
+
+
Returns:
+

hydro – Structure of hydro data with WAMIT data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readNEMOH(hydro, filedir)
+

Reads data from a NEMOH working folder.

+

See WEC-Sim\examples\BEMIO\NEMOH for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that NEMOH input data will be appended to

  • +
  • filename (string) –

    Path to the NEMOH working folder, must include:

    +
    +
      +
    • Nemoh.cal

    • +
    • Mesh/Hydrostatics.dat (or Hydrostatiscs_0.dat, Hydrostatics_1.dat, etc. for multiple bodies)

    • +
    • Mesh/KH.dat (or ``KH_0.dat, KH_1.dat, etc. for multiple bodies)

    • +
    • Results/RadiationCoefficients.tec

    • +
    • Results/ExcitationForce.tec

    • +
    • Results/DiffractionForce.tec - If simu.nonlinearHydro = 3 will be used

    • +
    • Results/FKForce.tec - If simu.nonlinearHydro = 3 will be used

    • +
    +
    +

  • +
+
+
Returns:
+

hydro – Structure of hydro data with NEMOH data appended

+
+
Return type:
+

struct

+
+
+
+ +
+

Note

+
    +
  • Instructions on how to download and use the open source BEM code NEMOH are provided on the NEMOH website.

  • +
  • The NEMOH Mesh.exe code creates the Hydrostatics.dat and KH.dat files (among other files) for one input body at a time. For the readNEMOH function to work correctly in the case of a multiple body system, the user must manually rename Hydrostatics.dat and KH.dat files to Hydrostatics_0.dat, Hydrostatics_1.dat, …, and KH_0.dat, KH_1.dat,…, corresponding to the body order specified in the Nemoh.cal file.

  • +
+
+
+
+functions.BEMIO.readAQWA(hydro, ah1Filename, lisFilename)
+

Reads data from AQWA output files.

+

See WEC-Sim\examples\BEMIO\AQWA for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that Aqwa input data will be appended to

  • +
  • ah1Filename (string) – .AH1 AQWA output file

  • +
  • lisFilename (string) – .LIS AQWA output file

  • +
+
+
Returns:
+

hydro – Structure of hydro data with Aqwa data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readCAPYTAINE(hydro, filename, hydrostatics_sub_dir)
+

Reads data from a Capytaine netcdf file

+

See WEC-Sim\examples\BEMIO\CAPYTAINE for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that Capytaine input data will be appended to

  • +
  • filename (string) – Capytaine .nc output file

  • +
  • hydrostatics_sub_dir (string) – Path to directory where Hydrostatics.dat and KH.dat files are saved

  • +
+
+
Returns:
+

hydro – Structure of hydro data with Capytaine data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.normalizeBEM(hydro)
+

Normalizes BEM hydrodynamic coefficients in the same manner +that WAMIT outputs are normalized. Specifically, the linear restoring +stiffness is normalized as \(C_{i,j}/(\rho g)\); added mass is normalized as +\(A_{i,j}/\rho\); radiation damping is normalized as \(B_{i,j}/(\rho \omega)\); and, +exciting forces are normalized as \(X_i/(\rho g)\). And, if necessary, sort +data according to ascending frequency.

+

This function is not called directly by the user; it is automatically +implemented within the readWAMIT, readCAPYTAINE, readNEMOH, and readAQWA +functions.

+
+
Parameters:
+

hydro ([1 x 1] struct) – Structure of hydro data that will be normalized and sorted +depending on the value of hydro.code

+
+
Returns:
+

hydro – Normalized hydro data

+
+
Return type:
+

[1 x 1] struct

+
+
+
+ +
+
+functions.BEMIO.combineBEM(hydro)
+

Combines multiple BEM outputs into one hydrodynamic ‘system.’ This function +requires that all BEM outputs have the same water depth, wave frequencies, +and wave headings. This function would be implemented following multiple +readWAMIT, readNEMOH, readCAPYTAINE, or readAQWA and before radiationIRF, +radiationIRFSS, excitationIRF, writeBEMIOH5, or plotBEMIO function calls.

+

See WEC-Sim\examples\BEMIO\NEMOH for examples of usage.

+
+
Parameters:
+

hydro ([1 x n] struct) – Structures of hydro data that will be combined into a single +structure

+
+
Returns:
+

hydro – Combined structure.

+
+
Return type:
+

[1 x 1] struct

+
+
+
+ +
+
+functions.BEMIO.radiationIRF(hydro, tEnd, nDt, nDw, wMin, wMax)
+

Calculates the normalized radiation impulse response function. This is +equivalent to the radiation IRF in the theory section normalized by +\(\rho\):

+
+

\(\overline{K}_{r,i,j}(t) = {\frac{2}{\pi}}\intop_0^{\infty}{\frac{B_{i,j}(\omega)}{\rho}}\cos({\omega}t)d\omega\)

+
+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • tEnd (float) – Calculation range for the IRF, where the IRF is calculated from t += 0 to tEnd, and the default is 100 s

  • +
  • nDt (float) – Number of time steps in the IRF, the default is 1001

  • +
  • nDw (float) – Number of frequency steps used in the IRF calculation +(hydrodynamic coefficients are interpolated to correspond), the +default is 1001

  • +
  • wMin (float) – Minimum frequency to use in the IRF calculation, the default is +the minimum frequency from the BEM data

  • +
  • wMax (float) – Maximum frequency to use in the IRF calculation, the default is +the maximum frequency from the BEM data

  • +
+
+
Returns:
+

hydro – Structure of hydro data with radiation IRF

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.radiationIRFSS(hydro, Omax, R2t)
+

Calculates the state space (SS) realization of the normalized radiation IRF. +If this function is used, it must be implemented after the radiationIRF function.

+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • Omax (integer) – Maximum order of the SS realization, the default is 10

  • +
  • R2t (float) – \(R^2\) threshold (coefficient of determination) for the SS +realization, where \(R^2\) may range from 0 to 1, and the +default is 0.95

  • +
+
+
Returns:
+

hydro – Structure of hydro data with radiation IRF state space +coefficients

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.excitationIRF(hydro, tEnd, nDt, nDw, wMin, wMax)
+

Calculates the normalized excitation impulse response function:

+
+

\(\overline{K}_{e,i,\theta}(t) = {\frac{1}{2\pi}}\intop_{-\infty}^{\infty}{\frac{X_i(\omega,\theta)e^{i{\omega}t}}{{\rho}g}}d\omega\)

+
+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • tEnd (float) – Calculation range for the IRF, where the IRF is calculated from t += 0 to tEnd, and the default is 100 s

  • +
  • nDt (float) – Number of time steps in the IRF, the default is 1001

  • +
  • nDw (float) – Number of frequency steps used in the IRF calculation +(hydrodynamic coefficients are interpolated to correspond), the +default is 1001

  • +
  • wMin (float) – Minimum frequency to use in the IRF calculation, the default is +the minimum frequency from the BEM data

  • +
  • wMax (float) – Maximum frequency to use in the IRF calculation, the default is +the maximum frequency from the BEM data

  • +
+
+
Returns:
+

hydro – Structure of hydro data with excitation IRF

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readBEMIOH5(filename, number, meanDrift)
+

Function to read BEMIO data from an h5 file into a hydrodata structure +for the bodyClass

+
+
Parameters:
+
    +
  • filename (string) – Path to the BEMIO .h5 file to read

  • +
  • number (integer) – Body number to read from the .h5 file. For example, body(2) in +the input file must read body2 from the .h5 file.

  • +
  • meanDrift (integer) – Flag to optionally read mean drift force coefficients

  • +
+
+
Returns:
+

hydroData – Struct of hydroData used by the bodyClass. Different format than +the BEMIO hydro struct

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.reverseDimensionOrder(inputData)
+

This function reverse the order of the dimensions in data. +Called by readBEMIOH5() to permute data into the correct format.

+

This required permutation is a legacy of the Load_H5 +function that reordered dimensions of hydroData after reading

+
+
Parameters:
+

inputData (array) – Any numeric data array

+
+
Returns:
+

outputData – Input data array with the order of its dimensions reversed

+
+
Return type:
+

array

+
+
+
+ +
+
+functions.BEMIO.calcSpectralMoment(angFreq, S_f, order)
+
+
Parameters:
+
    +
  • angFreq ([1 n] float vector) – Vector of wave angular frequencies

  • +
  • S_f ([1 n] float vector) – Vector of wave spectra

  • +
  • order (float) – Order of the spectral moment

  • +
+
+
Returns:
+

mn – Spectral moment of the nth order

+
+
Return type:
+

float vector

+
+
+
+ +
+
+functions.BEMIO.calcWaveNumber(omega, waterDepth, g, deepWater)
+

Solves the wave dispersion relation \(\omega^2 = g k*tanh(k h)\) for +the wave number

+
+
Parameters:
+
    +
  • omega (float) – Wave frequency [rad/s]

  • +
  • waterDepth (float) – Water depth [m]

  • +
  • g (float) – Gravitational acceleration [m/s^2]

  • +
  • deepWater (integar) – waveClass flag inidicating a deep water wave [-]

  • +
+
+
Returns:
+

k – Wave number [m]

+
+
Return type:
+

float

+
+
+
+ +
+
+functions.BEMIO.writeBEMIOH5(hydro)
+

Writes the hydro data structure to a .h5 file.

+

See WEC-Sim\tutorials\BEMIO for examples of usage.

+
+
Parameters:
+

hydro ([1 x 1] struct) – Structure of hydro data that is written to hydro.file

+
+
+
+ +
+

Note

+

Technically, this step should not be necessary - the MATLAB data structure hydro is written to a *.h5 file by BEMIO and then read back into a new MATLAB data structure hydroData for each body by WEC-Sim. The reasons this step was retained were, first, to remain compatible with the python based BEMIO output and, second, for the simpler data visualization and verification capabilities offered by the *.h5 file viewer.

+
+
+
+functions.BEMIO.plotBEMIO(varargin)
+

Plots the added mass, radiation damping, radiation IRF, excitation force +magnitude, excitation force phase, and excitation IRF for each body in +the given degrees of freedom.

+

Usage: +plotBEMIO(hydro, hydro2, hydro3, ...)

+

See WEC-Sim\examples\BEMIO for additional examples.

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotAddedMass(varargin)
+

Plots the added mass for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotAddedMass(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotRadiationDamping(varargin)
+

Plots the radiation damping for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotRadiationDamping(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotRadiationIRF(varargin)
+

Plots the radiation IRF for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotRadiationIRF(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationMagnitude(varargin)
+

Plots the excitation force magnitude for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationMagnitude(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationPhase(varargin)
+

Plots the excitation force phase for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationPhase(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationIRF(varargin)
+

Plots the excitation IRF for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationIRF(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+

BEMIO hydro Data Structure

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variable

Format

Description

A

[nDOF,nDOF,Nf]

radiation added mass

Ainf

[nDOF,nDOF]

infinite frequency added mass

B

[nDOF,nDOF,Nf]

radiation wave damping

theta

[1,Nh]

wave headings (deg)

body

{1,Nb}

body names

cb

[3,Nb]

center of buoyancy

cg

[3,Nb]

center of gravity

code

string

BEM code (WAMIT, NEMOH, AQWA, or CAPYTAINE)

K_hs

[6,6,Nb]

hydrostatic restoring stiffness

dof

[1, Nb]

Degrees of freedom (DOF) for each body. Default DOF for each body is 6 plus number of possible generalized body modes (GBM).

ex_im

[nDOF,Nh,Nf]

imaginary component of excitation force or torque

ex_K

[nDOF,Nh,length(ex_t)]

excitation IRF

ex_ma

[nDOF,Nh,Nf]

magnitude of excitation force or torque

ex_ph

[nDOF,Nh,Nf]

phase of excitation force or torque

ex_re

[nDOF,Nh,Nf]

real component of excitation force or torque

ex_t

[1,length(ex_t)]

time steps in the excitation IRF

ex_w

[1,length(ex_w)]

frequency step in the excitation IRF

file

string

BEM output filename

fk_im

[nDOF,Nh,Nf]

imaginary component of Froude-Krylov contribution to the excitation force or torque

fk_ma

[nDOF,Nh,Nf]

magnitude of Froude-Krylov excitation component

fk_ph

[nDOF,Nh,Nf]

phase of Froude-Krylov excitation component

fk_re

[nDOF,Nh,Nf]

real component of Froude-Krylov contribution to the excitation force or torque

g

[1,1]

gravity

h

[1,1]

water depth

Nb

[1,1]

number of bodies

Nf

[1,1]

number of wave frequencies

Nh

[1,1]

number of wave headings

plotDofs

[length(plotDofs),2]

degrees of freedom to be plotted (default: [1,1;3,3;5,5])

plotBodies

[1,length(plotBodies)]

BEM bodies to be plotted (default: [1:Nb])

plotDirections

[1,length(plotDirections)]

indices indicating wave directions to plot from list of headings (default: [1])

ra_K

[nDOF,nDOF,length(ra_t)]

radiation IRF

ra_t

[1,length(ra_t)]

time steps in the radiation IRF

ra_w

[1,length(ra_w)]

frequency steps in the radiation IRF

rho

[1,1]

density

sc_im

[nDOF,Nh,Nf]

imaginary component of scattering contribution to the excitation force or torque

sc_ma

[nDOF,Nh,Nf]

magnitude of scattering excitation component

sc_ph

[nDOF,Nh,Nf]

phase of scattering excitation component

sc_re

[nDOF,Nh,Nf]

real component of scattering contribution to the excitation force or torque

ss_A

[nDOF,nDOF,ss_O,ss_O]

state space A matrix

ss_B

[nDOF,nDOF,ss_O,1]

state space B matrix

ss_C

[nDOF,nDOF,1,ss_O]

state space C matrix

ss_conv

[nDOF,nDOF]

state space convergence flag

ss_D

[nDOF,nDOF,1]

state space D matrix

ss_K

[nDOF,nDOF,length(ra_t)]

state space radiation IRF

ss_O

[nDOF,nDOF]

state space order

ss_R2

[nDOF,nDOF]

state space R2 fit

T

[1,Nf]

wave periods

Vo

[1,Nb]

displaced volume

w

[1,Nf]

wave frequencies

+
+
+

Writing Your Own h5 File

+

The most common way of creating a *.h5 file is using BEMIO to post-process the outputs of a BEM code. +This requires a single BEM solution that contains all hydrodynamic bodies and accounts for body-to-body interactions. +Some cases in which you might want to create your own h5 file are:

+
    +
  • Use experimentally determined coefficients or a mix of BEM and experimental coefficients.

  • +
  • Combine results from different BEM files and have the coefficient matrices be the correct size for the new total number of bodies.

  • +
  • Modify the BEM results for any other reason.

  • +
+

MATLAB and Python have functions to read and write *.h5 files easily. +WEC-Sim includes one function writeBEMIOH5 to help you create your own *.h5 file. +The first step is to have all the required coefficients and properties in Matlab in the correct hydroData format. +Then writeBEMIOH5 is used to create and populate the *.h5 file.

+
+
+
+

Simulation Features

+

This section provides an overview of WEC-Sim’s simulation class features; for +more information about the simulation class code structure, refer to +Simulation Class.

+
+

Running WEC-Sim

+

The subsection describes the various ways to run WEC-Sim. The standard method is +to type the command wecSim in the MATLAB command window when in a $CASE +directory. This is the same method described in the Workflow and +Tutorials sections.

+
+

Running as Function

+

WEC-Sim allows users to execute WEC-Sim as a function by using wecSimFcn. +This option may be useful for users who wish to devise their own batch runs, +isolate the WEC-Sim workspace, create a special set-up before running WEC-Sim, +or link to another software.

+
+ +
+
+

Multiple Condition Runs (MCR)

+

WEC-Sim allows users to easily perform batch runs by typing wecSimMCR into +the MATLAB Command Window. This command executes the Multiple Condition Run +(MCR) option, which can be initiated three different ways:

+
+

Option 1. Specify a range of sea states and PTO damping coefficients in +the WEC-Sim input file, example: +waves.height = 1:0.5:5; waves.period = 5:1:15; +pto(1).stiffness=1000:1000:10000; pto(1).damping=1200000:1200000:3600000;

+

Option 2. Specify the excel filename that contains a set of wave +statistic data in the WEC-Sim input file. This option is generally useful +for power matrix generation, example: +simu.mcrExcelFile = "<Excel file name>.xls"

+

Option 3. Provide a MCR case .mat file, and specify the filename in +the WEC-Sim input file, example: +simu.mcrMatFile = "<File name>.mat"

+
+

For Multiple Condition Runs, the *.h5 hydrodynamic data is only loaded +once. To reload the *.h5 data between runs, set simu.reloadH5Data =1 in +the WEC-Sim input file.

+

If the Simulink model relies upon From Workspace input blocks other than those utilized by the WEC-Sim library blocks (e.g. waves.elevationFile), these can be iterated through using Option 3. The MCR file header MUST be a cell containing the exact string 'LoadFile'. The pathways of the files to be loaded to the workspace must be given in the cases field of the MCR .mat file. WEC-Sim MCR will then run WEC-Sim in sequence, once for each file to be loaded. The variable name of each loaded file should be consistent, and specified by the From Workspace block.

+

For more information, refer to Series 1 - Multiple Condition Runs (MCR), and the RM3_MCR example on the WEC-Sim Applications repository.

+

The RM3_MCR examples on the WEC-Sim Applications repository demonstrate the +use of WEC-Sim MCR for each option above (arrays, .xls, .mat). The fourth case +demonstrates how to vary the wave spectrum input file in each case run by +WEC-Sim MCR.

+

The directory of an MCR case can contain a userDefinedFunctionsMCR.m +file that will function as the standard userDefinedFunctions.m file. +Within the MCR application, the userDefinedFunctionsMCR.m script +creates a power matrix from the PTO damping coefficient after all cases have +been run.

+

For more information, refer to Series 1 - Multiple Condition Runs (MCR).

+
+
+

Parallel Computing Toolbox (PCT)

+

WEC-Sim allows users to execute batch runs by typing wecSimPCT into the +MATLAB Command Window. This command executes the MATLAB Parallel Computing +Toolbox (PCT), +which allows parallel capability for Multiple Condition Runs (MCR) but adds +an additional MATLAB dependency to use this feature. Similar to MCR, this +feature can be executed in three ways (Options 1~3).

+

For PCT runs, the *.h5 hydrodynamic data must be reload, regardless the +setting for simu.reloadH5Data in the WEC-Sim input file.

+
+

Note

+

The userDefinedFunctionsMCR.m is not compatible with wecSimPCT. +Please use userDefinedFunctions.m instead.

+
+
+
+

Radiation Force calculation

+

The radiation forces are calculated at each time-step by the convolution of the body velocity and the +radiation Impulse Response Function – which is calculated using the cosine transform of the radiation-damping. +Speed-gains to the simulation can be made by using alternatives to the convolution operation, namely,

+
    +
  1. The State-Space Representation,

  2. +
  3. The Finite Impulse Response (FIR) Filters.

  4. +
+

Simulation run-times were benchmarked using the RM3 example simulated for 1000 s. Here is a summary of normalized +run-times when the radiation forces are calculated using different routes. The run-times are normalized by the +run-time for a simulation where the radiation forces are calculated using “Constant Coefficients” ( \(T_0\) ):

+
+
+ + + + + + + + + + + + + + + + + +

Radiation Force Calculation Approach

Normalized Run Time

Constant Coefficients

\(T_0\)

Convolution

\(1.57 \times T_0\)

State-Space

\(1.14 \times T_0\)

FIR Filter

\(1.35 \times T_0\)

+
+
+

State-Space Representation

+

The convolution integral term in the equation of motion can be linearized using +the state-space representation as described in the Theory Manual section. To +use a state-space representation, the simu.stateSpace simulationClass variable +must be defined in the WEC-Sim input file, for example:

+
+

simu.stateSpace = 1

+
+
+
+

Finite Impulse Response (FIR) Filters

+

By default, WEC-Sim uses numerical integration to calculate the convolution integral, while +FIR filters implement the same using a discretized convolution, by using FIR filters – digital filters +that are inherently stable. Convolution of Impulse Response Functions of Finite length, i.e., those +that dissipate and converge to zero can be accomplished using FIR filters. +The convolution integral can also be calculated using FIR filters by setting:

+
+

simu.FIR=1.

+
+
+

Note

+

By default simu.FIR=0, unless specified otherwise.

+
+
+
+
+

Time-Step Features

+

The default WEC-Sim solver is ‘ode4’. Refer to the NonlinearHydro example +on the WEC-Sim Applications +repository for a comparisons between ‘ode4’ to +‘ode45’. The following +variables may be changed in the simulationClass (where N is number of increment +steps, default: N=1):

+
    +
  • Fixed time-step: simu.dt

  • +
  • Output time-step: simu.dtOut=N*simu.dt

  • +
  • Nonlinear Buoyancy and Froude-Krylov Excitation time-step: simu.nonlinearDt=N*simu.dt

  • +
  • Convolution integral time-step: simu.cicDt=N*simu.dt

  • +
  • Morison force time-step: simu.morisonDt = N*simu.dt

  • +
+
+

Fixed Time-Step (ode4)

+

When running WEC-Sim with a fixed time-step, 100-200 time-steps per wave period +is recommended to provide accurate hydrodynamic force calculations (ex: simu.dt += T/100, where T is wave period). However, a smaller time-step may be required +(such as when coupling WEC-Sim with MoorDyn or PTO-Sim). To reduce the required +WEC-Sim simulation time, a different time-step may be specified for nonlinear +buoyancy and Froude-Krylov excitation and for convolution integral +calculations. For all simulations, the time-step should be chosen based on +numerical stability and a convergence study should be performed.

+
+
+

Variable Time-Step (ode45)

+

To run WEC-Sim with a variable time-step, the following variables must be +defined in the simulationClass:

+
    +
  • Numerical solver: simu.solver='ode45'

  • +
  • Max time-step: simu.dt

  • +
+

This option sets the maximum time step of the simulation (simu.dt) and +automatically adjusts the instantaneous time step to that required by MATLAB’s +differential equation solver.

+
+
+
+
+

Wave Features

+

This section provides an overview of WEC-Sim’s wave class features. For more +information about the wave class code structure, refer to +Wave Class. The various wave features can be +compared by running the cases within the WEC-Sim/Examples/RM3 and the +WEC-Sim/Examples/OSWEC directories.

+
+

Irregular Wave Binning

+

WEC-Sim’s default spectral binning method divides the wave spectrum into 499 +bins with equal energy content, defined by 500 wave frequencies. As a result, +the wave forces on the WEC using the equal energy method are only computed at +each of the 500 wave frequencies. The equal energy formulation speeds up the +irregular wave simulation time by reducing the number of frequencies the wave +train is defined by, and thus the number of frequencies for which the wave +forces are calculated. It prevents bins with very little energy from being +created and unnecessarily adding to the computational cost. The equal energy +method is specified by defining the following wave class variable in the +WEC-Sim input file:

+
+

waves.bem.option = 'EqualEnergy';

+
+

By comparison, the traditional method divides the wave spectrum into a +sufficiently large number of equally spaced bins to define the wave spectrum. +WEC-Sim’s traditional formulation uses 999 bins, defined by 1000 wave +frequencies of equal frequency distribution. To override WEC-Sim’s default +equal energy method, and instead use the traditional binning method, the +following wave class variable must be defined in the WEC-Sim input file:

+
+

waves.bem.option = 'Traditional';

+
+

Users may override the default number of wave frequencies by defining +waves.bem.count. However, it is on the user to ensure that the wave spectrum +is adequately defined by the number of wave frequencies, and that the wave +forces are not impacted by this change.

+
+
+

Wave Directionality

+

WEC-Sim has the ability to model waves with various angles of incidence, +\(\theta\). To define wave directionality in WEC-Sim, the following wave +class variable must be defined in the WEC-Sim input file:

+
+

waves.direction = <user defined wave direction(s)>; %[deg]

+
+

The incident wave direction has a default heading of 0 Degrees (Default = 0), +and should be defined as a column vector for more than one wave direction. For +more information about the wave formulation, refer to +Wave Spectra.

+
+
+

Wave Directional Spreading

+

WEC-Sim has the ability to model waves with directional spreading, +\(D\left( \theta \right)\). To define wave directional spreading in +WEC-Sim, the following wave class variable must be defined in the WEC-Sim input +file:

+
+

waves.spread = <user defined directional spreading>;

+
+

The wave directional spreading has a default value of 1 (Default = 1), and +should be defined as a column vector of directional spreading for each one wave +direction. For more information about the spectral formulation, refer to +Wave Spectra.

+
+

Note

+

Users must define appropriate spreading parameters to ensure energy is +conserved. Recommended directional spreading functions include +Cosine-Squared and Cosine-2s.

+
+
+
+

Multiple Wave-Spectra

+

The Wave Directional Spreading feature only allows splitting the same wave-front. +However, quite often mixed-seas are composed of disparate Wave-Spectra with unique +periods, heights, and directions. An example would be a sea-state composed of +swell-waves and chop-waves.

+

Assuming that the linear potential flow theory holds, the wave inputs to the system can be +super-imposed. This implies, the effects of multiple Wave-Spectra can be simulated, if the +excitation-forces for each Wave-Spectra is calculated, and added to the pertinent +Degree-of-Freedom.

+

WEC-Sim can simulate the dynamics of a body experiencing multiple Wave-Spectra each with +their unique directions, periods, and heights. In order to calculate the excitation-forces +for multiple Wave-Spectra, WEC-Sim automatically generates multiple instances of +excitation-force sub-systems. The user only needs to create multiple instances of +the waves class.

+

Here is an example for setting up multiple Wave-Spectra in the WEC-Sim input file:

+
waves(1)           = waveClass('regularCIC');   % Initialize Wave Class and Specify Type
+waves(1).height    = 2.5;                       % Wave Height [m]
+waves(1).period    = 8;                         % Wave Period [s]
+waves(1).direction = 0;                         % Wave Direction (deg.)
+waves(2)           = waveClass('regularCIC');   % Initialize Wave Class and Specify Type
+waves(2).height    = 2.5;                       % Wave Height [m]
+waves(2).period    = 8;                         % Wave Period [s]
+waves(2).direction = 90;                        % Wave Direction (deg.)
+
+
+
+

Note

+

1. If using a wave-spectra with different wave-heading directions, ensure that the BEM data has +the hydrodynamic coefficients corresponding to the desired wave-heading direction,

+

2. All wave-spectra should be of the same type, i.e., if waves(1) is initialized +as waves(1) = waveClass('regularCIC'), the following waves(#) object should +initialized the same way.

+
+

Addtionally, the multiple Wave-Spectra can be visualized as elaborated in Wave Markers. +The user needs to define the marker parameters for each Wave-Spectra, as one would for a single Wave-Spectra.

+

Here is an example of 2 Wave-Spectra being visualized using the wave wave-markers feature:

+
+../_images/Nwave.png + +
+

Here is a visualization of two Wave-Spectra, represented by red markers and blue markers respectively.

+
+
+

Irregular Waves with Seeded Phase

+

By default, the phase for all irregular wave cases are generated randomly. In +order to reproduce the same time-series every time an irregular wave simulation +is run, the following wave class variable may be defined in the WEC-Sim input +file:

+
+

waves.phaseSeed = <user defined seed>;

+
+

By setting waves.phaseSeed equal to 1,2,3,…,etc, the random wave phase +generated by WEC-Sim is seeded, thus producing the same random phase for each +simulation.

+
+
+

Wave Gauge Placement

+

Wave gauges can be included through the wave class parameters:

+
waves.marker.location
+waves.marker.size
+waves.marker.style
+
+
+

By default, the wave surface elevation at the origin is calculated by WEC-Sim. +In past releases, there was the option to define up to three numerical wave gauge +locations where WEC-Sim would also calculate the undisturbed linear incident wave +elevation. WEC-Sim now has the feature to define wave markers that oscillate +vertically with the undistrubed linear wave elevation (see Wave Markers). +This feature does not limit the number of point measurements of the undisturbed +free surface elevation and the time history calculation at the marker location +is identical to the previous wave gauge implementation. Users who desire to +continuing using the previous wave gauge feature will only need to update the +variable called within WEC-Sim and an example can be found in the +WECCCOMP Repository.

+
+

Note

+

The numerical wave markers (wave gauges) do not handle the incident wave interaction with the radiated or diffracted +waves that are generated because of the presence and motion of any hydrodynamic bodies.

+
+
+
+

Ocean Current

+

The speed of an ocean current can be included through the wave class parameters:

+
waves.current.option
+waves.current.speed
+waves.current.direction
+waves.current.depth
+
+
+

The current option determines the method used to propagate the surface current across the +specified depth. Option 0 is depth independent, option 1 uses a 1/7 power law, option 2 +uses linear variation with depth and option 3 specifies no ocean current. +The current.speed parameter represents the surface current speed, and current.depth +the depth at which the current speed decays to zero (given as a positive number). +See Ocean Current for more details on each method. +These parameters are used to calculate the fluid velocity in the Morison Element calculation.

+
+
+
+

Body Features

+

This section provides an overview of WEC-Sim’s body class features; for more +information about the body class code structure, refer to +Body Class.

+
+

Body Mass and Geometry Features

+

The mass of each body must be specified in the WEC-Sim input file. The +following features are available:

+
    +
  • Floating Body - the user may set body(i).mass = 'equilibrium' +which will calculate the body mass based on displaced volume and water +density. If simu.nonlinearHydro = 0, then the mass is calculated using the +displaced volume contained in the *.h5 file. If simu.nonlinearHydro = 1 +or simu.nonlinearHydro = 2, then the mass is calculated using the displaced +volume of the provided STL geometry file.

  • +
  • Fixed Body - if a body is fixed to the seabed using a fixed constraint, the mass +and moment of inertia may be set to arbitrary values such as 999 kg and [999 999 999] +kg-m^2. If the constraint forces on the fixed body are important, the mass and inertia +should be set to their real values.

  • +
  • Import STL - to read in the geometry (*.stl) into Matlab use the +body(i).importBodyGeometry() method in the bodyClass. This method will import the +mesh details (vertices, faces, normals, areas, centroids) into the +body(i).geometry property. This method is also used for nonlinear +buoyancy and Froude-Krylov excitation and ParaView visualization files. Users +can then visualize the geometry using the body(i).plotStl method.

  • +
+
+
+

Nonlinear Buoyancy and Froude-Krylov Excitation

+

WEC-Sim has the option to include the nonlinear hydrostatic restoring and +Froude-Krylov forces when solving the system dynamics of WECs, accounting for +the weakly nonlinear effect on the body hydrodynamics. To use nonlinear +buoyancy and Froude-Krylov excitation, the body(ii).nonlinearHydro bodyClass +variable must be defined in the WEC-Sim input file, for example:

+
+

body(ii).nonlinearHydro = 2

+
+

For more information, refer to the Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the NonlinearHydro +example on the WEC-Sim Applications +repository.

+
+

Nonlinear Settings

+

body(ii).nonlinearHydro - +The nonlinear hydrodynamics option can be used with the parameter: +body(ii).nonlinearHydro in your WEC-Sim input file. When any of the three +nonlinear options (below) are used, WEC-Sim integrates the wave pressure over +the surface of the body, resulting in more accurate buoyancy and Froude-Krylov +force calculations.

+
+

Option 1. body(ii).nonlinearHydro = 1 This option integrates the pressure +due to the mean wave elevation and the instantaneous body position.

+

Option 2. body(ii).nonlinearHydro = 2 This option integrates the pressure +due to the instantaneous wave elevation and the instantaneous body position. +This option is recommended if nonlinear effects need to be considered.

+
+

simu.nonlinearDt - +An option available to reduce the nonlinear simulation time is to specify a +nonlinear time step, simu.nonlinearDt=N*simu.dt, where N is number of +increment steps. The nonlinear time step specifies the interval at which the +nonlinear hydrodynamic forces are calculated. As the ratio of the nonlinear to +system time step increases, the computation time is reduced, again, at the +expense of the simulation accuracy.

+
+

Note

+

WEC-Sim’s nonlinear buoyancy and Froude-Krylov wave excitation option may +be used for regular or irregular waves but not with user-defined irregular +waves.

+
+
+
+

STL File Generation

+

When the nonlinear option is turned on, the geometry file (*.stl) +(previously only used for visualization purposes in linear simulations) is used +as the discretized body surface on which the nonlinear pressure forces are +integrated. As in the linear case, the STL mesh origin must be at a body’s center of gravity.

+

A good STL mesh resolution is required when using the nonlinear buoyancy and Froude-Krylov wave excitation in +WEC-Sim. The simulation accuracy will increase with increased surface +resolution (i.e. the number of discretized surface panels specified in the +*.stl file), but the computation time will also increase. +There are many ways to generate an STL file; however, it is important to verify +the quality of the mesh before running WEC-Sim simulations with the nonlinear +hydro flag turned on. An STL file can be exported from most CAD programs, but +few allow adequate mesh refinement. By default, most CAD programs write an STL +file similar to the left figure, with the minimum panels possible. +To accurately model nonlinear hydrodynamics in WEC-Sim, STL files should be refined to +have an aspect ratio close to one, and contain a high resolution in the vertical direction +so that an accurate instantaneous displaced volume can be calculated.

+
+../_images/rectangles.png + +
+

Many commercial and free software exist to convert between mesh formats and +refine STL files, including:

+ +
+
+

Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid

+

The body tested in the study is an ellipsoid with a cross- section +characterized by semi-major and -minor axes of 5.0 m and 2.5 m in the wave +propagation and normal directions, respectively . The ellipsoid is at its +equilibrium position with its origin located at the mean water surface. The +mass of the body is then set to 1.342×105 kg, and the center of gravity is +located 2 m below the origin.

+
+../_images/nonlinearEllipsoid.png + +
+

STL file with the discretized body surface is shown below (ellipsoid.stl)

+
+../_images/nonlinearMesh.png + +
+

The single-body heave only WEC model is shown below (nonLinearHydro.slx)

+
+../_images/nonlinearWEC.png + +
+

The WEC-Sim input file used to run the nonlinear hydro WEC-Sim simulation:

+
%% Simulation Data
+simu = simulationClass();               
+simu.simMechanicsFile = 'ellipsoid.slx';   
+simu.mode = 'normal';                   % Specify Simulation Mode ('normal','accelerator','rapid-accelerator')
+simu.explorer='off';                     % Turn SimMechanics Explorer (on/off)
+simu.startTime = 0;                     
+simu.rampTime = 50;                        
+simu.endTime=150;                       
+simu.dt = 0.05;                         
+simu.rho=1025;                                                                                                           
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                 
+waves.height = 4;                            
+waves.period = 6;   
+
+%% Body Data
+body(1) = bodyClass('../../hydroData/ellipsoid.h5');
+body(1).mass = 'equilibrium';           
+body(1).inertia = ...              
+    [1.375264e6 1.375264e6 1.341721e6];      
+body(1).geometryFile = '../../geometry/elipsoid.stl' ;    
+body(1).quadDrag.cd=[1 0 1 0 1 0];
+body(1).quadDrag.area=[25 0 pi*5^2 0 pi*5^5 0];
+body(1).nonlinearHydro = 2;                       % Non-linear hydro on/off
+
+%% PTO and Constraint Parameters
+% Fixed Constraint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 -12.5];        
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');              
+pto(1).stiffness=0;                             
+pto(1).damping=1200000;                      
+pto(1).location = [0 0 -12.5];
+
+
+

Simulation and post-processing is the same process as described in the +Tutorials section.

+
+
+
+

Viscous Damping and Morison Elements

+

WEC-Sim allows for the definition of additional damping and added-mass terms +to allow users to tune their models precisely. Viscous damping and Morison Element +may be defined for hydrodynamic, drag, or flexible bodies. It is highly recommended +that users add viscous or Morison drag to create a realistic model.

+

When the Morison Element +option is used in combination with a hydrodynamic or flexible body, it serves as a +tuning method. The equation of motion for hydrodynamic and flexible bodies with a +Morison Element is more complex than the traditional Morison Element formulation. +A traditional Morison Element may be created by using a drag body +(body(#).nonHydro=2) with body(#).morisonElement.option = 1 or 2. +For more information about the numerical formulation of viscous damping and +Morison Elements, refer to the theory section Viscous Damping and Morison Elements.

+
+

Viscous Damping

+

A viscous damping force in the form of a linear damping coefficient +\(C_{v}\) can be applied to each body by defining the following body class +parameter in the WEC-Sim input file (which has a default value of zero):

+
body(i).linearDamping
+
+
+

A quadratic drag force, proportional to the square of the body’s velocity, can +be applied to each body by defining the quadratic drag coefficient +\(C_{d}\), and the characteristic area \(A_{d}\) for drag calculation. +This is achieved by defining the following body class parameters in the WEC-Sim +input file (each of which have a default value of zero):

+
body(i).quadDrag.cd
+body(i).quadDrag.area
+
+
+

Alternatively, one can define \(C_{D}\) directly:

+
body(i).quadDrag.drag
+
+
+
+
+

Morison Elements

+

To use Morison Elements, the following body class variable must be +defined in the WEC-Sim input file with body(ii).morisonElement.option.

+

Implementation Option 0 Morison Elements are not included in the body force and moment calculations.

+

Implementation Option 1 allows for the Morison Element properties to be defined +independently for the x-, y-, and z-axis while Implementation Option 2 uses a +normal and tangential representation of the Morison Element properties. Note +that the two options allow the user flexibility to implement hydrodynamic +forcing that best suits their modeling needs; however, the two options have +slightly different calculation methods and therefore the outputs will not +necessarily provide the same forcing values. The user is directed to look at +the Simulink Morison Element block within the WEC-Sim library to better +determine which approach better suits their modeling requirements.

+

Morison Elements must be defined for each body using the +body(i).morisonElement property of the body class. This property +requires definition of the following body class parameters in the WEC-Sim input +file (each of which have a default value of zero(s)).

+

For body(ii).morisonElement.option  = 1

+
body(i).morisonElement.cd = [c_{dx} c_{dy} c_{dz}]
+body(i).morisonElement.ca = [c_{ax} c_{ay} c_{az}]
+body(i).morisonElement.area = [A_{x} A_{y} A_{z}]
+body(i).morisonElement.VME = [V_{me}]
+body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}]
+body(i).morisonElement.z = [0 0 0]
+
+
+
+

Note

+

For Option 1, the unit normal body(#).morisonElement.z must be +initialized as a [n x3] vector, where n is the number of Morison Elements, although it will not be used in the +hydrodynamic calculation.

+
+

For body(ii).morisonElement.option  = 2

+
body(i).morisonElement.cd = [c_{dn} c_{dt} 0]
+body(i).morisonElement.ca = [c_{an} c_{at} 0]
+body(i).morisonElement.area = [A_{n} A_{t} 0]
+body(i).morisonElement.VME = [V_{me}]
+body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}]
+body(i).morisonElement.z = [z_{x} z_{y} z_{z}]
+
+
+
+

Note

+

For Option 2, the body(i).morisonElement.cd, +body(i).morisonElement.ca, and +body(i).morisonElement.area variables need to be +initialized as [n x3] vector, where n is the number of Morison Elements, with the third column index set to zero. While +body(i).morisonElement.z is a unit normal vector that defines the +orientation of the Morison Element.

+
+

To better represent certain scenarios, an ocean current speed can be defined to +calculate a more accurate fluid velocity and acceleration on the Morison +Element. These can be defined through the wave class parameters +waves.current.option, waves.current.speed, waves.current.direction, +and waves.current.depth. See Ocean Current for more +detail on using these options.

+

The Morison Element time-step may also be defined as +simu.morisonDt = N*simu.dt, where N is number of increment steps. For an +example application of using Morison Elements in WEC-Sim, refer to the WEC-Sim +Applications repository +Free_Decay/1m-ME example.

+
+

Note

+

Morison Elements cannot be used with elevationImport.

+
+
+
+
+

Non-Hydrodynamic Bodies

+

For some simulations, it might be important to model bodies that do not have +hydrodynamic forces acting on them. This could be bodies that are completely +outside of the water but are still connected through a joint to the WEC bodies, +or it could be bodies deeply submerged to the point where the hydrodynamics may +be neglected. WEC-Sim allows for bodies which have no hydrodynamic forces +acting on them and for which no BEM data is provided.

+

To do this, use a Body Block from the WEC-Sim Library and initialize it in the +WEC-Sim input file as any other body but leave the name of the h5 file as +an empty string. Specify body(i).nonHydro = 1; and specify body name, +mass, moments of inertia, center of gravity, center of buoyancy, geometry file, +location, and displaced volume. You can also specify visualization options and +initial displacement.

+

To use non-hydrodynamic bodies, the following body class variable must be +defined in the WEC-Sim input file, for example:

+
body(i).nonHydro = 1
+
+
+

Non-hydrodynamic bodies require the following properties to be defined:

+
body(i).mass
+body(i).inertia
+body(i).centerGravity
+body(i).volume
+
+
+

In the case where only non-hydrodynamic and drag bodies are used, WEC-Sim does +not read an *.h5 file. Users must define these additional parameters to +account for certain wave settings as there is no hydrodynamic body present in +the simulation to define them:

+
waves.bem.range
+waves.waterDepth
+
+
+

For more information, refer to Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the Nonhydro_Body +example on the WEC-Sim Applications repository.

+
+
+

Drag Bodies

+

A body may be subjected to viscous drag or Morison forces, but does not +experience significant wave excitation or radiation. And example may be a +deeply-submerged heave plate of large surface area tethered to a float. In +these instances, the drag body implementation can be utilized by defining the +following body class variable:

+
body(i).nonHydro = 2
+
+
+

Drag bodies have zero wave excitation or radiation forces, but viscous forces +can be applied in the same manner as a hydrodynamic body via the parameters:

+
body(i).quadDrag.drag
+body(i).quadDrag.cd
+body(i).quadDrag.area
+body(i).linearDamping
+
+
+

or if using Morison Elements:

+
body(i).morisonElement.cd
+body(i).morisonElement.ca
+body(i).morisonElement.area
+body(i).morisonElement.VME
+body(i).morisonElement.rgME
+
+
+

which are described in more detail in the forthcoming section. At a minimum, it +is necessary to define:

+
body(i).mass
+body(i).inertia
+body(i).centerGravity
+body(i).volume
+
+
+

to resolve drag body dynamics. One can additionally describe initial body +displacement in the manner of a hydrodynamic body.

+
+
+

Body-To-Body Interactions

+

WEC-Sim allows for body-to-body interactions in the radiation force +calculation, thus allowing the motion of one body to impart a force on all +other bodies. The radiation matrices for each body (radiation wave damping and +added mass) required by WEC-Sim and contained in the *.h5 file. For +body-to-body interactions with N total hydrodynamic bodies, the *h5 +data structure is [(6*N), 6].

+

When body-to-body interactions are used, the augmented [(6*N), 6] matrices are +multiplied by concatenated velocity and acceleration vectors of all +hydrodynamic bodies. For example, the radiation damping force for body(2) in a +3-body system with body-to-body interactions would be calculated as the product +of a [1,18] velocity vector and a [18,6] radiation damping coefficients matrix.

+

To use body-to-body interactions, the following simulation class variable must +be defined in the WEC-Sim input file:

+
simu.b2b = 1
+
+
+

For more information, refer to Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the RM3_B2B example in +the WEC-Sim Applications +repository.

+
+

Note

+

By default, body-to-body interactions are off (simu.b2b = 0), and +only the \([1+6(i-1):6i, 1+6(i-1):6i]\) sub-matrices are used for each +body (where \(i\) is the body number).

+
+
+
+

Generalized Body Modes

+

To use this, select a Flex Body Block from the WEC-Sim Library (under Body +Elements) and initialize it in the WEC-Sim input file as any other body. +Calculating dynamic response of WECs considering structural flexibility using +WEC-Sim should consist of multiple steps, including:

+
    +
  • Modal analysis of the studied WEC to identify a set of system natural +frequencies and corresponding mode shapes

  • +
  • Construct discretized mass and impedance matrices using these structural +modes

  • +
  • Include these additional flexible degrees of freedom in the BEM code to +calculate hydrodynamic coefficients for the WEC device

  • +
  • Import the hydrodynamic coefficients to WEC-Sim and conduct dynamic analysis +of the hybrid rigid and flexible body system

  • +
+

The WEC-Sim Applications repository +contains a working sample of a barge with four additional degrees of freedom to +account for bending and shearing of the body. See this example for details on +how to implement and use generalized body modes in WEC-Sim.

+
+

Note

+

Generalized body modes module has only been tested with WAMIT, where BEMIO +may need to be modified for NEMOH, Aqwa and Capytaine.

+
+
+
+

Passive Yaw Implementation

+

For non-axisymmetric bodies with yaw orientation that changes substantially +with time, WEC-Sim allows a correction to excitation forces for large yaw +displacements. To enable this correction, add the following to your +wecSimInputFile:

+
body(ii).yaw.option = 1
+
+
+

Under the default implementation (body(ii).yaw.option = 0), WEC-Sim uses the +initial yaw orientation of the device relative to the incident waves to +calculate the wave excitation coefficients that will be used for the duration +of the simulation. When the correction is enabled, excitation coefficients are +interpolated from BEM data based upon the instantaneous relative yaw position. +For this to enhance simulation accuracy, BEM data must be available over the +range of observed yaw positions at a sufficiently dense discretization to +capture the significant variations of excitation coefficients with yaw +position. For robust simulation, BEM data should be available from -180 to 170 +degrees of yaw (or equivalent).

+

This can increase simulation time, especially for irregular waves, due to the +large number of interpolations that must occur. To prevent interpolation at +every time-step, body(ii).yaw.threshold (default 1 degree) can be specified in the +wecSimInputFile to specify the minimum yaw displacement (in degrees) that +must occur before another interpolation of excitation coefficients will be +calculated. The minimum threshold for good simulation accuracy will be device +specific: if it is too large, no interpolation will occur and the simulation +will behave as body(ii).yaw.option = 0, but overly small values may not +significantly enhance simulation accuracy while increasing simulation time.

+

When body(ii).yaw.option = 1, hydrostatic and radiation forces are +determined from the local body-fixed coordinate system based upon the +instantaneous relative yaw position of the body, as this may differ +substantially from the global coordinate system for large relative yaw values.

+

A demonstration case of this feature is included in the PassiveYaw example +on the WEC-Sim Applications +repository.

+
+

Note

+

Caution must be exercised when simultaneously using passive yaw and +body-to-body interactions. Passive yaw relies on interpolated BEM solutions +to determine the cross-coupling coefficients used in body-to-body +calculations. Because these BEM solutions are based upon the assumption of +small displacements, they are unlikely to be accurate if a large relative +yaw displacement occurs between the bodies.

+
+
+
+

Large X-Y Displacements

+

By default, the excitation force applied to the modeled body is calculated at the body’s CG position as defined in BEM. +If large lateral displacements (i.e., in the x or y direction by the default WEC-Sim coordinate system) are expected for the modeled device, it may be desirable to adjust the excitation force to account for this displacment.

+

When body(i).largeXYDisplacement.option = 1, the phase of the excitation force exerted on the body is adjusted based upon its displacement as

+

\(\phi_{displacement} = k \omega x(1)*cos(\frac{\theta \pi}{180}) + x(2).*sin(\frac{\theta \pi}{180})\)

+

where k is waves.wavenumber, x(1,2) is displacement in the (x,y) direction, \(\omega\) is waves.omega, and \(\theta\) is waves.direction (in degrees). +This phase is thus the same size as waves.phase, and is then summed with waves.phase to determine excitation force.

+

Note that this adjustment only affects the incident exciting waves, not the total wave field that is the superposition of exciting and radiating waves. +This implies that this adjustment is only valid for cases where the lateral velocity of the body is significantly less than the celerity of its radiated waves, and is thus not appropriate for sudden, rapid displacements.

+
+

Note

+

This feature has not been implemented for a user-defined wave elevation.

+
+
+
+
+

Constraint and PTO Features

+

This section provides an overview of WEC-Sim’s constraint and PTO classes; for +more information about the constraint and PTO classes’ code structure, refer to +Constraint Class and +PTO Class.

+
+

Modifying Constraints and PTOs

+

The default linear and rotational constraints and PTOs allow for heave and +pitch motions of the follower relative to the base. To obtain a linear or +rotational constraint in a different direction you must modify the constraint’s +or PTO’s coordinate orientation. The important thing to remember is that a +linear constraint or PTO will always allow motion along the joint’s Z-axis, and +a rotational constraint or PTO will allow rotation about the joint’s Y-axis. To +obtain translation along or rotation about a different direction relative to +the global frame, you must modify the orientation of the joint’s coordinate +frame. This is done by setting the constraint’s or PTO’s orientation.z +and orientation.y properties which specify the new direction of the Z- +and Y- joint coordinates. The Z- and Y- directions must be perpendicular to +each other.

+

As an example, if you want to constrain body 2 to surge motion relative to body +1 using a linear constraint, you would need the constraint’s Z-axis to point in +the direction of the global surge (X) direction. This would be done by setting +constraint(i).orientation.z=[1,0,0] and the Y-direction to any +perpendicular direction (can be left as the default y=[0 1 0]). In this +example, the Y-direction would only have an effect on the coordinate on which +the constraint forces are reported but not on the dynamics of the system. +Similarly if you want to obtain a yaw constraint you would use a rotational +constraint and align the constraint’s Y-axis with the global Z-axis. This would +be done by setting constraint(i).orientation.y=[0,0,1] and the +z-direction to a perpendicular direction (say [0,-1,0]).

+
+

Note

+

When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, +the loads and displacements are specified in the local (not global) +coordinate system. This is true for both the sensed (measured) and actuated +(commanded) loads and displacements.

+
+

Additionally, by combining constraints and PTOs in series you can obtain +different motion constraints. For example, a massless rigid rod between two +bodies, hinged at each body, can be obtained by using a two rotational +constraints in series, both rotating in pitch, but with different locations. A +roll-pitch constraint can also be obtained with two rotational constraints in +series; one rotating in pitch, and the other in roll, and both at the same +location.

+
+

Incorporating Joint/Actuation Stroke Limits

+

Beginning in MATLAB 2019a, hard-stops can be specified directly for PTOs and +translational or rotational constraints by specifying joint-primitive dialog +options in the wecSimInputFile.m. Limits are modeled as an opposing spring +damper force applied when a certain extents of motion are exceeded. Note that +in this implementation, it is possible that the constraint/PTO will exceed +these limits if an inadequate spring and/or damping coefficient is specified, +acting instead as a soft motion constraint. More detail on this implementation +can be found in the Simscape documentation. +To specify joint or actuation stroke limits for a PTO, the following parameters +must be specified in wecSimInputFile.m

+
+
+
code:
+

pto(i).hardStops.upperLimitSpecify = ‘on’

+
+
code:
+

pto(i).hardStops.lowerLimitSpecify = ‘on’

+
+
+
+

to enable upper and lower stroke limits, respectively. The specifics of the +limit and the acting forces at the upper and lower limits are described in turn +by

+
+

pto(i).hardStops.upperLimitBound +pto(i).hardStops.upperLimitStiffness +pto(i).hardStops.upperLimitDamping +pto(i).hardStops.upperLimitTransitionRegionWidth +pto(i).hardStops.lowerLimitBound +pto(i).hardStops.lowerLimitStiffness +pto(i).hardStops.lowerLimitDamping +pto(i).hardStops.lowerLimitTransitionRegionWidth

+
+

where pto(i) is replaced with constraint(i) on all of the above if the limits +are to be applied to a constraint.

+

In MATLAB versions prior to 2019a, specifying any of the above parameters will +have no effect on the simulation, and may generate warnings. It is instead +recommended that hard-stops are implemented in a similar fashion using an +Actuation Force/Torque PTO block in which the actuation force is specified in a +custom MATLAB Function block.

+
+
+
+

Setting PTO or Constraint Extension

+

The PTO and Constraint classes have an Extension value that +can be specified to define the initial displacement of +the PTO or constraint at the beginning of the simulation, allowing the user to set the +ideal position for maximum wave capture and energy generation. This documentation +will use the PTO as an example, but the proces is applicable to both translational, +rotational, or spherical PTOs and constraints. +Whereas the initial displacement feature only defines this updated position for the PTO, +the PTO Extension feature propagates the change in position to all bodies and joints +on the Follower side of the PTO block. This allows for an accurate reflection of the +initial locations of each component without having to calculate and individually +define each initial displacement or rotation. To set the extension of a PTO, the +following parameter must be specified in wecSimInputFile.m:

+
pto(i).extension.PositionTargetSpecify = '1'
+
+
+

to enable the joint’s target position value to be defined. The specifics of the +extension are described in turn by:

+
pto(i).extension.PositionTargetValue
+pto(i).extension.PositionTargetPriority
+
+
+

PositionTargetValue defines the extension magnitude and PositionTargetPriority +specifies Simulink’s priority in setting the initial target value in regards +to other constraints and PTOs. The priority is automatically set to “High” when +the extension is initialized but can be adjusted to “Low” if required by Simulink.

+

The figure below shows the PTO extension feature on the WECCCOMP model at 0.1 m. +The left image is at equilibrium (pto(i).extension.PositionTargetSpecify=0), +and the right image set as +pto(i).extension.PositionTargetSpecify=1 with the WEC body moving in +accordance with the set PTO Extension value.

+
+../_images/WECCCOMP_PTO_Extension.png + +
+
+

WECCCOMP Model PTO Extension

+
+
+
+

While this method generally fits most WEC models, there are specific +designs such as the RM3 that may have a larger DOF and are dependent on +the particular block orientation in the simulink model in terms of which +body blocks will move in response to a PTO initial extension. These specific +cases require extra setup on the users end if looking to define a +different body’s motion than the one automatically established. For the RM3 +model, a set PTO Extension value results in movement in the float body. +However, if the user would like the movement to be within the spar instead, +extra steps are required. To view examples of how to set the PTO Extension +for both the float as well as the spar view the RM3 PTO Extension examples +on the WEC-Sim Applications repository .

+

For the spherical PTO which can rotate about three axes, +pto(i).extension.PositionTargetValue must be a 1x3 array that specifying +three consecutive rotations about the Base frame’s axes in the X-Y-Z convention.

+
+

Note

+

The PTO extension is not valid for PTO already actuated by user-defined motion +(Translational PTO Actuation Motion, Rotational PTO Actuation Motion).

+
+
+
+

PTO-Sim

+

PTO-Sim is the WEC-Sim module responsible for accurately modeling a WEC’s +conversion of mechanical power to electrical power. While the PTO blocks native +to WEC-Sim are modeled as a simple linear spring-damper systems, PTO-Sim is +capable of modeling many power conversion chains (PCC) such as mechanical +and hydraulic drivetrains. PTO-Sim is made of native Simulink blocks +coupled with WEC-Sim, using WEC-Sim’s user-defined PTO blocks, where the +WEC-Sim response (relative displacement and velocity for linear motion and +angular position and velocity for rotary motion) is the PTO-Sim input. +Similarly, the PTO force or torque is the WEC-Sim input. For more information +on how PTO-Sim works, refer to [So et al., 2015] and Series 3 - Non-hydrodynamic Bodies.

+

The files for the PTO-Sim tutorials described in this section can be found in +the PTO-Sim examples on the WEC-Sim Applications repository . Four PTO examples are +contained in the PTO-Sim application and can be used as a starting point for +users to develop their own. They cover two WEC types and mechanical, hydraulic, +and electrial PTO’s:

+
+
+ + + + + + + + + + + + + + + + + +

PTO-Sim Application

Description

RM3_cHydraulic_PTO

RM3 with compressible hydraulic PTO

RM3_DD_PTO

RM3 with direct drive linear generator

OSWEC_Hydraulic_PTO

OSWEC with hydraulic PTO (adjustable rod)

OSWEC_Hydraulic_Crank_PTO

OSWEC with hydraulic PTO (crank)

+
+
+

Tutorial: RM3 with PTO-Sim

+

This section describes how to use RM3 with PTO-Sim. Two tutorials will be given +in this section: one for the RM3 with a hydraulic PTO and +another for the RM3 with a direct drive PTO.

+
+
RM3 with Hydraulic PTO
+

The hydraulic PTO example used in this section consists of a piston, a +rectifying valve, a high pressure accumulator, a hydraulic motor coupled to a +rotary generator, and a low pressure accumulator.

+
+../_images/HYDPHYMODEL.PNG + +
+

In this section, a step by step tutorial on how to set up and run the RM3 +simulation with PTO-Sim is provided. All the files used in WEC-Sim will remain +the same, but some may need to be added to the working folder. The wecSimInputFile.m must +be modified to add the definition of the different PTO-Sim blocks. The files used to run RM3 with +PTO-Sim case are the following:

+
    +
  • WEC-Sim input file: wecSimInputFile.m (make sure to set the PTO linear +damping to zero)

  • +
  • Simulink model: RM3.slx

  • +
  • Geometry file for each body: float.stl and plate.stl

  • +
  • Hydrodynamic data file(s): rm3.h5

  • +
  • Optional user defined post-processing file: userDefinedFunction.m

  • +
+

Simulink Model

+

The Simulink model can be built as follows:

+
    +
  • Step 1: Navigate to the RM3 example $WECSIM/examples/RM3.

  • +
  • Step 2: Open RM3.slx file and replace Translational PTO with +Translational PTO Actuation Force.

  • +
+
+../_images/translational_pto.PNG + +
+
    +
  • Step 3: Create a subsystem and rename it to PTO-Sim where the input is the response and +output is force.

  • +
+
+../_images/rm3with_pto_sim.PNG + +
+
    +
  • Step 4: Go to Simulink Library Browser to access the PTO-Sim Library.

  • +
+
+../_images/pto_sim_lib.png + +
+
    +
  • Step 5: By looking at the physical hydraulic PTO model as shown above, the user +can simply drag and drop PTO-Sim library blocks. Hydraulic cylinder, rectifying valve, and accumulator +blocks are located under the Hydraulic block. The electric generator equivalent circuit is located under the Electric library.

  • +
  • Step 6: Since multiple PTO-Sim blocks will be used, it is necessary to name each block to identify them +when its variables are defined in the wecSimInputFile.m. To change the name of each block, +double click the block and add the name ptoSim(i) where i +must be different for each block used in the simulation. The name of each block +will be used in the wecSimInputFile.m to define its variables.

  • +
+
+../_images/PTOSimBlock1.png + +
+
    +
  • Step 7: Connect the inputs and outputs of the blocks according to the desired physical layout.

  • +
+
+../_images/RM3withPTOSimBlocks.png + +
+
    +
  • Step 8: Define the input for Rload in the Electric Generator block. The input could be a constant +value or it could be used to control the load of the generator to achieve a desired physical behaviour. +In this example, the value of Rload is used to control the shaft speed of the generator by using a +simple PI controller. The desired shaft speed in this case is 1000 rpm. The Electric Generator +Equivalent Circuit block has two outputs: the electromagnetic torque and the shaft speed. It is +necessary to use a bus selector to choose the desired output, which in this example is the shaft speed.

  • +
+
+../_images/GeneratorSpeedControl.png + +
+

Input File

+

In this section, the WEC-Sim input file (wecSimInputFile.m) is defined and +categorized into sections such as hydraulic cylinder, rectifying check valve, high pressure +accumulator, low pressure accumulator, hydraulic motor, and generator.

+
%% Simulation Data
+simu = simulationClass();               
+simu.simMechanicsFile = 'RM3_cHydraulic_PTO.slx'; %Location of Simulink Model File with PTO-Sim                 
+simu.startTime = 0;                     
+simu.rampTime = 100;                       
+simu.endTime=400;   
+simu.dt = 0.01;                         
+simu.explorer = 'off';                     % Turn SimMechanics Explorer (on/off)
+
+%% Wave Information
+%Irregular Waves using PM Spectrum
+waves = waveClass('irregular');
+waves.height = 2.5;
+waves.period = 8;
+waves.spectrumType = 'PM';
+waves.phaseSeed=1;
+
+%% Body Data
+% Float
+body(1) = bodyClass('../../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(1).geometryFile = '../../../_Common_Input_Files/RM3/geometry/float.stl';
+body(1).mass = 'equilibrium';
+body(1).inertia = [20907301 21306090.66 37085481.11];
+
+% Spar/Plate
+body(2) = bodyClass('../../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(2).geometryFile = '../../../_Common_Input_Files/RM3/geometry/plate.stl';
+body(2).mass = 'equilibrium';
+body(2).inertia = [94419614.57 94407091.24 28542224.82];
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 0];                
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');           	% Initialize PTO Class for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [N/m]
+pto(1).damping = 0;                           % PTO Damping [N/(m/s)]
+pto(1).location = [0 0 0];                   % PTO Location [m]       
+
+%% PTO new blocks
+
+%Hydraulic Cylinder
+ptoSim(1) = ptoSimClass('hydraulicCyl');
+ptoSim(1).hydPistonCompressible.xi_piston = 35;
+ptoSim(1).hydPistonCompressible.Ap_A = 0.0378;
+ptoSim(1).hydPistonCompressible.Ap_B = 0.0378;
+ptoSim(1).hydPistonCompressible.bulkModulus = 1.86e9;
+ptoSim(1).hydPistonCompressible.pistonStroke = 70;
+ptoSim(1).hydPistonCompressible.pAi = 2.1333e7;
+ptoSim(1).hydPistonCompressible.pBi = 2.1333e7;
+
+%Rectifying Check Valve
+ptoSim(2) = ptoSimClass('rectCheckValve');
+ptoSim(2).rectifyingCheckValve.Cd = 0.61;
+ptoSim(2).rectifyingCheckValve.Amax = 0.002;
+ptoSim(2).rectifyingCheckValve.Amin = 1e-8;
+ptoSim(2).rectifyingCheckValve.pMax = 1.5e6;
+ptoSim(2).rectifyingCheckValve.pMin = 0;
+ptoSim(2).rectifyingCheckValve.rho = 850;
+ptoSim(2).rectifyingCheckValve.k1 = 200;
+ptoSim(2).rectifyingCheckValve.k2 = ...
+    atanh((ptoSim(2).rectifyingCheckValve.Amin-(ptoSim(2).rectifyingCheckValve.Amax-ptoSim(2).rectifyingCheckValve.Amin)/2)*...
+    2/(ptoSim(2).rectifyingCheckValve.Amax - ptoSim(2).rectifyingCheckValve.Amin))*...
+    1/(ptoSim(2).rectifyingCheckValve.pMin-(ptoSim(2).rectifyingCheckValve.pMax + ptoSim(2).rectifyingCheckValve.pMin)/2);
+
+%High Pressure Hydraulic Accumulator
+ptoSim(3) = ptoSimClass('hydraulicAcc');
+ptoSim(3).gasHydAccumulator.vI0 = 8.5;
+ptoSim(3).gasHydAccumulator.pIprecharge = 2784.7*6894.75;
+
+%Low Pressure Hydraulic Accumulator
+ptoSim(4) = ptoSimClass('hydraulicAcc');
+ptoSim(4).gasHydAccumulator.vI0 = 8.5;
+ptoSim(4).gasHydAccumulator.pIprecharge = 1392.4*6894.75;
+
+%Hydraulic Motor
+ptoSim(5) = ptoSimClass('hydraulicMotor');
+ptoSim(5).hydraulicMotor.effModel = 2;
+ptoSim(5).hydraulicMotor.displacement = 120;
+ptoSim(5).hydraulicMotor.effTableShaftSpeed = linspace(0,2500,20);
+ptoSim(5).hydraulicMotor.effTableDeltaP = linspace(0,200*1e5,20);
+ptoSim(5).hydraulicMotor.effTableVolEff = ones(20,20)*0.9;
+ptoSim(5).hydraulicMotor.effTableMechEff = ones(20,20)*0.85;
+
+%Electric generator
+ptoSim(6) = ptoSimClass('electricGen');
+ptoSim(6).electricGeneratorEC.Ra = 0.8;
+ptoSim(6).electricGeneratorEC.La = 0.8;
+ptoSim(6).electricGeneratorEC.Ke = 0.8;
+ptoSim(6).electricGeneratorEC.Jem = 0.8;
+ptoSim(6).electricGeneratorEC.bShaft = 0.8;
+
+
+

Simulation and Post-processing

+

Simulation and post-processing are similar process as described in Two-Body Point Absorber (RM3). +There are some specific variable definitions that must be considered when using the output +signals of the PTO-Sim blocks. For example, the hydraulic accumulator has two output signals: flow rate +and pressure, and the time vector. In the RM3 example with hydraulic PTO, the high pressure hydraulic +accumulator was defined as ptoSim(3) in the WEC-Sim input file; then, to use the output +flow rate and pressure of this block, the next line of code must be used:

+

FlowRateAccumulator = output.ptoSim(3).FlowRate +PressureAccumulator = output.ptoSim(3).Pressure

+

In general, the output signal of any PTO-Sim block can be used with this line of code: output.ptoSim(i).VariableName

+
+
+
RM3 with Direct Drive PTO
+

A mechanical PTO is used in this example and is modeled as a direct drive +linear generator. The main components of this example consist of magnets and a +coil where the magnet assembly is attached to the heaving float and the coil is +located inside the spar. As the float moves up and down, the magnet assembly +creates a change in the magnetic field surrounding the spar that contains the +coil: therefore, current is induced in the coil and electricity is generated.

+
+../_images/MECHANICALPTO.PNG + +
+

Simulink Model

+

Steps 1 through 4 are the same as in RM3 with Hydraulic PTO.

+
    +
  • Step 5: Look for the block “Direct Drive Linear Generator” and drag the block into the PTO-Sim subsystem

  • +
  • Step 6: Connect the input “respose” to the input of the PTO-Sim block and the output “Force” to the output of the subsystem.

  • +
+
+../_images/DirectDrivePorts.png + +
+

Input File, Simulation, and Post-processing

+

The same as RM3 with Hydraulic PTO.

+
+
+
+

Tutorial: OSWEC with PTO-Sim

+

This section describes how to use the OSWEC model with PTO-Sim. The same +process as described in RM3 with Hydraulic PTO; however, since the OSWEC is a +rotary device, it takes torque as an input and a rotary to linear motion +conversion block is needed. The tutorials can be found on the +WEC-Sim Applications +repository (both for a crank and for a rod).

+
+
OSWEC with Hydraulic PTO
+

A hydraulic PTO or mechanical PTO can be used with OSWEC but for simplicity a +hydraulic PTO will be used as an example. An schematic representation of the OSWEC device +is shown in the figure below:

+
+../_images/OSWECPHYMODEL.PNG + +
+

Two blocks were developed in the PTO-Sim library to model a system like the OSWEC. +The blocks can be found under the Motion Convertion library.

+
+../_images/MotionConversionLib.png + +
+

The block “Rotary to Linear Adjustable Rod” is used to model a rod with a variable length. For the OSWEC case, +this block can be use when the cylinder rod of the hydraulic PTO is connected to the adjustable rod, +like in the schematic presented in the figure below:

+
+../_images/AdjustableRodHPTO.png + +
+

On the other hand, the block “Rotary to Linear Crank” is used to model a slider-crank mechanism that is used to convert +the rotational motion of the OSWEC device into linear motion for the hydraulic cylinder in the PTO. In this case, the +cylinder rod of the hydraulic PTO is connected to the slider part of the mechanism, as shown in the figure below:

+
+../_images/SliderandCrankMechanism.png + +
+

Modeling of OSWEC with Hydraulic PTO

+

The files needed for the OSWEC case are the same as the ones described in RM3 with Hydraulic PTO.

+

Simulink Model

+

The Simulink model can be built as following:

+
    +
  • Step 1: Copy the OSWEC example folder to get started $WECSIM\examples\OSWEC.

  • +
  • Step 2: Open OSWEC.slx file and replace Rotational PTO with +Rotational PTO Actuation Torque.

  • +
+
+../_images/rotational_pto.PNG + +
+
    +
  • Step 3: Create a subsystem and rename it to PTO-Sim where input is response and +output is torque.

  • +
+
+../_images/oswec_pto_sim.PNG + +
+
    +
  • Step 4: Go to Simulink Library Browser to access the PTO-Sim Library.

  • +
  • Step 5: By looking at the physical hydraulic PTO model as shown above, the user +can simply drag and drop PTO-Sim library blocks. Hydraulic cylinder, rectifying valve, and accumulator +blocks are located under the Hydraulic block. The electric generator equivalent circuit is located under the Electric library. +The “Rotary to Linear Adjustable Rod” is under the Motion Conversion library.

  • +
  • Step 6: Since multiple PTO-Sim blocks will be used, it is necessary to name each block to identify them +when its variables are defined in the wecSimInputFile.m. To change the name of each block, +double click the block and add the name ptoSim(i) where i +must be different for each block used in the simulation. The name of each block +will be used in the wecSimInputFile.m to define its variables. For this example, +the motion conversion block will be called ptoSim(1)

  • +
+
+../_images/PTOSimBlock1OSWEC.png + +
+
    +
  • Step 7: Connect the inputs and outputs of the blocks according to the desired physical layout.

  • +
+
+../_images/OSWECPTOSimExample.png + +
+
    +
  • Step 8: Define the input for Rload in the Electric Generator block. The input could be a constant +value or it could be used to control the load of the generator to achieve a desired physical behaviour. +In this example, the value of Rload is used to control the shaft speed of the generator by using a +simple PI controller. The desired shaft speed in this case is 3000 rpm. The Electric Generator +Equivalent Circuit block has two outputs: the electromagnetic torque and the shaft speed. It is +necessary to use a bus selector to choose the desired output, which in this example is the shaft speed.

  • +
+

Input File, Simulation, and Post-processing

+

The input file for this case is similar to the input file +described in RM3 with Hydraulic PTO. The naming and numbering of the PTO blocks +change in this case, but the way the variables are defined is the same.

+
+
+
+
+
+

Controller Features

+

The power generation performance of a WEC is highly dependent on the control +algorithm used in the system. There are different control strategies that +have been studied for marine energy applications. These control algorithms +can be applied directly to the PTO components to achieve a desired output, or +they can be high-level controllers which are focused on the total PTO force +applied to the WEC. The examples presented in this section are based on high- +level controller applications. WEC-Sim’s controller features support the modeling +of both simple passive and reactive controllers as well as more complex methods +such as model predictive control.

+

The files for the controller tutorials described in this section can be found in +the Controls examples on the WEC-Sim Applications repository . The controller examples +are not comprehensive, but provide a reference for user to implement their +own controls.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +

Controller Application

Description

Passive (P)

Sphere with proportional control

Reactive (PI)

Sphere with proportional-integral control

Latching

Sphere with latching control

Declutching

Sphere with declutching control

Model Predictive Control

Sphere with model predictive control

Reactive with PTO

Sphere with reactive control and DD PTO

+
+
+

Examples: Sphere Float with Various Controllers

+

First, it is important to understand the concept of complex conjugate control. +Complex conjugate control, as applied to wave energy conversion, +can be used to understand optimal control. For a complex conjugate controller, +the impedance of the controller is designed to match the admittance of the +device (equal to the complex conjugate of device impedance). Hence, it is +also known as impedance matching and is a common practice within electrical +engineering. Complex conjugate control is not a completely realizable control +method due to its acausality, which means it requires exact knowledge of +future wave conditions. Still, a causal transfer function can be used to approximate +complex conjugate control across a limited frequency range [C1]. +Thus, complex conjugate control presents a reference for the implementation of +optimal causal controls. The WEC impedance can be modeled by the following equation +[C2] and can be used to formulate the optimal control implementation:

+
+\[Z_i(\omega) = j\omega (m + A(\omega)) + B(\omega) + \frac{K_{hs}}{j\omega}\]
+

By characterizing the impedance of the WEC, a greater understanding of the +dynamics can be reached. The figure below is a bode plot of the impedance of +the RM3 float body. The natural frequency is defined by the point at which the +phase of impedance is zero. By also plotting the frequency of the incoming +wave, it is simple to see the difference between the natural frequency of +the device and the wave frequency. Complex conjugate control (and some other +control methods) seeks to adjust the natural frequency of the device to match +the wave frequency. Matching the natural frequency to the wave frequency leads +to resonance, which allows for theoretically optimal mechanical power.

+
+../_images/impedance.png + +
+

It is important to note here that although impedance matching can lead to maximum mechanical +power, it does not always lead to maximum electrical power. Resonance due to +impedance matching often creates high peaks of torque and power, which are usually +far from the most efficient operating points of PTO systems used to extract power +and require those systems to be more robust and expensive. +Thus, the added factor of PTO dynamics and efficiency may lead to +complex conjugate control being suboptimal. Furthermore, any constraints or other +nonlinear dynamics may make complex conjugate control unachievable or suboptimal. +Theoretical optimal control using complex conjugates presented here should be +taken as a way to understand WEC controls rather than a method to achieve +optimal electrical power for a realistic system.

+
+
+

Passive Control (Proportional)

+

Passive control is the simplest of WEC controllers and acts as a damping force. +Hence, the damping value (also referred to as a proportional gain) is +multiplied by the WEC velocity to determine the power take-off force:

+
+\[F_{PTO} = K_p \dot{X}\]
+

Although unable to reach optimal power for a regular wave due to its passive +nature, a passive controller can still be tuned to reach its maximum power. +According to complex conjugate control, a passive controller can be +optimized for regular wave conditions using the following formula [C3]:

+
+\[K_{p,opt} = \sqrt{B(\omega)^2 + (\frac{K_{hs}}{\omega} - \omega (m + A(\omega)))^2}\]
+

The optimal proportional gain has been calculated for the float using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file sets +up a sweep of the proportional gains which can be used to show that the results +confirm the theoretical optimal gain in the figure below (negative power corresponding to +power extracted from the system). This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window.

+
+../_images/pGainSweep.png + +
+

This example only shows the optimal proportional gain in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains.

+
+
+

Reactive Control (Proportional-Integral)

+

Reactive control is also a very simple form of WEC control and combines the +damping force of a passive controller with a spring stiffness force. The standard PTO +block can also be used to implement PI control using the damping and stiffness +values but doesn’t allow for negative inputs which is often necessary for +optimal stiffness. This controller is also known as a proportional integral +controller with the proportional gain corresponding to the damping value and +the integral gain corresponding to a spring stiffness value:

+
+\[F_{PTO} = K_p \dot{X} + K_i X\]
+

The addition of the reactive component means the controller can achieve optimal +complex conjugate control by cancelling out the imaginary portion of the device +impedance. Thus, the proportional and integral control gains can be defined by the +following formulas [C4]:

+
+\[K_{p,opt} = B(\omega)\]
+
+\[K_{i,opt} = (m + A(\omega)) \omega^2 - K_hs\]
+

The optimal proportional and integral gains have been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file again sets +up a sweep of the gains which can be used to show that the results +confirm the theoretical optimal gains in the figure below. This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window.

+
+../_images/piGainSweep.png + +
+

This example only shows the optimal gains in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains.

+
+
+

Latching Control

+

Latching control combines a traditional passive controller with a latching mechanism which applies +a large braking force during a portion of the oscillation. By locking the device for +part of the oscillation, latching control attempts to adjust the phase of the motion to +match the phase of incoming waves. Latching control can slow the device motion to match +wave motion and is therefore most often used when the wave period is longer than the natural +period. Latching control is still considered passive as no energy input is required (assuming velocity +is zero while latched).

+

The braking/latching force is implemented as a very large damping force (\(G\)), which can be +adjusted based on the device’s properties [C5]:

+
+\[G = 80 (m + A(\omega))\]
+

Because latching achieves phase matching between the waves and device, the optimal +damping can be assumed the same as for reactive control. Lastly, the main control +variable, latching time, needs to be determined. For regular waves, it is +desired for the device to move for a time equal to its natural frequency, meaning +the optimal latching time is likely close to half the difference between the wave +period and the natural period [C5] (accounting for 2 latching periods per wave period).

+
+\[t_{latch} = \frac{1}{2} (T_{wave} - T_{nat})\]
+

The optimal latching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. The mcrBuildTimes.m file sets +up a sweep of the latching times, the results for which are shown in the figure below. +This MCR run can be recreated by running the mcrBuildGains.m file then typing wecSimMCR +in the command window. Based on the results, the optimal latching time is slightly +lower than expected which may be due to imperfect latching or complex dynamics which +aren’t taken into account in the theoretical optimal calculation. Regardless, latching results in +much larger power when compared to traditional passive control.

+
+../_images/latchTimeSweep.png + +
+

Further, the figure below shows the excitation force and velocity, which are close to +in phase when a latching time of 2.4 seconds is implemented.

+
+../_images/latching.png + +
+

Although not shown with this example, latching can also be implemented in irregular waves +but often requires different methods including excitation prediction.

+
+
+

Declutching Control

+

Declutching control is essentially the opposite of latching. Instead of locking the device, +it is allowed to move freely (no PTO force) for a portion of the oscillation. Often, +declutching is used when the wave period is smaller than the natural period, allowing the +device motion to “catch up” to the wave motion. Declutching is also considered +a passive control method.

+

The optimal declutching time and damping values are slightly harder to estimate than for +latching. The device’s motion still depends on its impedance during the declutching period, +meaning the device does not really move “freely” during this time. Hence, in opposition to +optimal latching the declutching time was assumed to be near half the difference between +the natural period and the wave period, but is further examined through tests.

+
+\[t_{declutch} = \frac{1}{2} (T_{wave} - T_{nat})\]
+

This optimal declutching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. Because energy is not harvested during the declutching +period, it is likely that a larger damping is required. Thus, the optimal passive +damping value was used for the following simulations, although a more +optimal damping value likely exists for delclutching.

+

Since declutching is most desired when the wave period is smaller than the natural period, +a wave period of 3.5 seconds was tested with a height of 1 m. For comparison to traditional +passive control, the optimal passive damping value was tested for these conditions, leading +to a power of 5.75 kW. The mcrBuildTimes.m file sets up a sweep of the declutching times, +the results for which are shown in the figure below. It is clear that delcuthing control +can offer an improvement over traditional passive control.

+
+../_images/declutchTimeSweep.png + +
+

Further, the figure below shows the excitation force and velocity with a declutch time +of 0.8 seconds. The excitation and response are not quite in phase, but the device +can be seen “catching up” to the wave motion during the declutching time.

+
+../_images/declutching.png + +
+

Although not shown with this example, declutching can also be implemented in irregular waves +but often requires different methods including excitation prediction.

+
+
+

Model Predictive Control (MPC)

+

Model predictive control is a WEC control method which uses a plant model to predict and +optimize the dynamics. MPC is a complex controller that can be applied in both regular +and irregular waves while also taking into account time-domain constraints such as position, +velocity, and PTO force. For the model predictive controller implemented here, +the plant model is a frequency dependent state-space model [C6]. +The state space model is then converted to a quadratic programming problem to be +solved by quadprog(), MATLAB’s quadratic programming function. Solving this system +leads to a set of PTO forces to optimize the future dynamics for maximum harvested +power, the first of which is applied at the current timestep. The relevant files for +the MPC example in the Controls folder of WEC-Sim Applications are detailed in the +table below (excluding wecSimInputFile.m and userDefinedFunctions.m which are not +unique to MPC). Note: This controller is similar to the NMPC example within the +WECCCOMP Application, but this example includes a method for calculating frequency +dependence and setting up the state space matrices based on boundary element method +data, allows for position, velocity, and force constraints, and is applied to a +single body heaving system.

+
+
+ + + + + + + + + + + + + + + + + + + + +

File

Description

coeff.mat

Coefficients for frequency dependence

fexcPrediction.m

Predicts future excitation forces

sphereMPC.slx

Simulink model including model predictive controller

mpcFcn.m

Creates and solves quadratic programming problem

plotFreqDep.m

Solves for and plots frequency dependence coeffs

+
+

The Simulink diagram is shown in the figure below. The figure shows an overview of +the controller, which primarily consists of the plant model and the optimizer. The plant +model uses the excitation force, applied PTO force, and current states to calculate the +states at the next timestep. Then, the optimizer predicts the future excitation, which +is input into the mpcFcn.m file along with the states to solve for the optimal change in +PTO force (integrated to solve for instantaneous PTO force).

+
+../_images/mpcSimulink.png + +
+

The results of the model predictive controller simulation in irregular waves are shown +below with the dashed lines indicating the applied +constraints. MPC successfully restricts the system to within the constraints (except for +a few, isolated timesteps where the solver couldn’t converge) while also optimizing for maximum +average mechanical power (300 kW). The constraints can be changed to account for +specific WEC and PTO physical limitations, but will limit the average power. +There are also other parameters which can be defined or changed by the user in the +wecSimInputFile.m such as the MPC timestep, prediction horizon, r-scale, etc. to +customize and tune the controller as desired.

+
+../_images/mpcPos.png + +
+
+../_images/mpcVel.png + +
+
+../_images/mpcForce.png + +
+
+../_images/mpcForceChange.png + +
+

The model predictive controller is particularly beneficial because of its ability to +predict future waves and maximize power accordingly as well as the ability to handle constraints. A +comparison to a reactive controller is shown in the table below. The reactive controller +can be tuned to stay within constraint bounds only when future wave conditions are known +and, in doing so, would sacrifice significant power. On the other hand, without knowledge +of future wave, the results from the untuned reactive controller are shown below using +optimal theoretical gains from the complex conjugate method at the peak wave period. +With no ability to recognize constraints, the reactive controller leads to much larger +amplitude and velocity and exhibits large peaks in PTO force and power, both of which +would likely lead to very expensive components and inefficient operation. +It is clear that the model predictive controller significantly outperforms the reactive +controller in terms of mechanical power harvested, constraint inclusions, and peak conditions. +Because of the increased complexity of model predictive control, limitations include longer +computation time and complex setup.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Constraint

MPC

Reactive

Max Heave Position (m)

4

4.02

8.06

Max Heave Velocity (m/s)

3

2.95

5.63

Max PTO Force (kN)

2,000

2,180

4,630

Max PTO Force Change (kN/s)

1,500

1,500

3,230

Peak Mechanical Power (kW)

N/A

4,870

13,700

Avg Mechanical Power (kW)

N/A

300

241

+
+
+
+

Reactive Control with Direct Drive Power Take-Off

+

The previous controllers only considered the mechanical power output. Although maximization +of mechanical power allows for the maximum energy transfer from waves to body, it often does +not lead to maximum electrical power. The previous controller examples demonstrate the +controller types and energy transfer from waves to body, but the important consideration of +electrical power requires a PTO model. This example applies a reactive controller to the +sphere body with a simplified direct drive PTO model to maximize electrical power. Within +the Simulink subsystem for determining the PTO force, the controller prescribes the ideal or +desired force which is fed into the direct drive PTO. The current in the generator is then +used to control the applied force.

+
+../_images/piPTOSimulink.png + +
+

The PTO parameters used for this example are defined in the wecSimInputFile.m and correspond to +the Allied Motion Megaflux Frameless Brushless Torque Motors–MF0310 [C7]. The +results in terms of capture width (ratio of absorbed power (W) to wave power (W/m)) and resultant power for the +applied gains from Section Reactive Control (Proportional-Integral) are shown in the figures +below for a regular wave with a period of 9.6664 s and a height of 2.5 m. The “Controller (Ideal)” +power is the ideal power absorbed according to the applied controller gains. +The “Mechanical (Drivetrain)” power is the actual mechanical power absorbed by +the PTO system including the inertial, damping, and shaft torque power. Lastly, the +“Electrical (Generator)” power is the electrical power absorbed by the +generator including the product of induced current and voltage (based on shaft torque and velocity, +respectively) and the resultant generator losses (product of current squared and winding resistance). +Mechanical power maximization requires significant net input electrical power +(signified by red bar) which leads to an extremely negative capture width. Thus, +instead of harvesting electrical power, power would need to be taken from the grid or energy +storage component to achieve mechanical power maximization.

+
+../_images/reactiveWithPTOCCPower.png + +
+
+../_images/reactiveWithPTOCC.png + +
+

On the other hand, by testing different controller gains in the same wave conditions +(regular wave: period = 9.6664 s, height = 2.5 m), the gains which optimize for +maximum electrical power can be found as shown below. Increasing the proportional gain +and decreasing the integral gain magnitude leads to a maximum power of about 84 kW and capture width of about +1.5 m. The resultant motion is almost ten times smaller than for the mechanical power +maximization which leads to a lower current and much lower generator power losses +(product of current squared and winding resistance).

+
+../_images/reactiveWithPTOSweep.png + +
+
+../_images/reactiveWithPTOOptPower.png + +
+
+../_images/reactiveWithPTOOpt.png + +
+
+
+
+

Cable Features

+

Cables or tethers between two bodies apply a force only in tension (when taut or stretched), but not in compression, +can be modeled using the cableClass implementation. A cable block must be added to the +model between the two PTOs or constraints that are to be connected by a cable. Users must initialize the cable +class in the wecSimInputFile.m along with the base and follower connections in that order, by including the following lines:

+
cable(i) = cableClass('cableName','baseConnection','followerConnection');
+
+
+

where baseConnection is a PTO or constraint block that defines the cable connection on the base side, and followerConnection +is a PTO or constraint block that defineds the connection on the follower side.

+

It is necessary to define, at a minimum:

+
cable(i).stiffness = <cableStiffness>;
+cable(i).damping = <cableDamping>;
+
+
+

where cable(i).stiffness is the cable stiffness (N/m), and cable(i).damping is the cable damping (N/(m*s)). Force from the cable stiffness or +damping is applied between the connection points if the current length of the cable exceeds the equilibrium length of the cable. +By default, the cable equilibrium length is defined to be the distance between the locations of the baseConnection and followerConnection, so that initially there is no tension on the cable.

+

If a distinct initial condition is desired, one can define either cable(i).length or cable(i).preTension, where cable(i).length is the equilibrium (i.e., unstretched) length of the cable (m), and cable(i).preTension is the pre-tension applied to the cable at simulation start (N). The unspecified parameter is then calculated from the location of the baseConnection and +followerConnection.

+

To include dynamics applied at the cable-to-body coupling (e.g., a stiffness and damping), a PTO block +can be used instead, and the parameters pto(i).damping and pto(i).stiffness can be used to describe these dynamics.

+

By default, the cable is presumed neutrally buoyant and it is not subjected to fluid drag. To include fluid drag, the user can additionally define these parameters in a style similar to the bodyClass

+
cable(i).quadDrag.cd
+cable(i).quadDrag.area
+cable(i).quadDrag.drag
+cable(i).linearDamping
+
+
+

The cable mass and fluid drag is modeled with a low-order lumped-capacitance method with 2 nodes. +The mass and fluid drag forces are exerted at nodes defined by the 2 drag bodies. +By default, one is co-located with the baseConnection and the other with the followerConnection. +The position of these bodies can be manipulated by changing the locations of the base or follower connections points.

+
+

Note

+

This is not appropriate to resolve the actual kinematics of cable motions, but it is sufficient to model the aggregate forces among the connected bodies.

+
+
+
+

Mooring Features

+

This section provides an overview of WEC-Sim’s mooring class features; for more +information about the mooring class code structure, refer to +Mooring Class.

+

Floating WEC systems are often connected to mooring lines to keep the device in +position. WEC-Sim allows the user to model the mooring dynamics in the +simulation by specifying the mooring matrix, a mooring lookup table, or coupling with MoorDyn. To +include mooring connections, the user can use the mooring block (i.e., Mooring +Matrix block, Mooring Lookup Table block, or MoorDyn Connection block) +given in the WEC-Sim library under Moorings lib +and connect it between the body and the Global reference frame. The Moordyn Connection +block can also be placed between two dynamic bodies or frames. Refer to the +RM3 with MoorDyn, and the Series 8 - Using MoorDyn with WEC-Sim for more information.

+

MoorDyn is hosted on a separate MoorDyn repository. +It must be download separately, and all files and folders should be placed in +the $WECSIM/functions/moorDyn directory.

+
+

Mooring Matrix

+

When the mooring matrix block is used, the user first needs to initiate the +mooring class by setting mooring(i) = mooringClass('mooring name') in +the WEC-Sim input file (wecSimInputFile.m). Typically, the mooring +connection location also needs to be specified, mooring(i).location = [1x3] +(the default connection location is [0 0 0]). The user can also define the +mooring matrix properties in the WEC-Sim input file using:

+
    +
  • Mooring stiffness matrix - mooring(i).matrix.stiffness = [6x6] in [N/m]

  • +
  • Mooring damping matrix - mooring(i).matrix.damping = [6x6] in [Ns/m]

  • +
  • Mooring pretension - mooring(i).matrix.preTension = [1x6] in [N]

  • +
+
+

Note

+

“i” indicates the mooring number. More than one mooring can be specified in +the WEC-Sim model when the mooring matrix block is used.

+
+
+
+

Mooring Lookup Table

+

When the mooring lookup table block is used, the user first needs to initiate the +mooring class by setting mooring(i) = mooringClass('mooring name') in +the WEC-Sim input file (wecSimInputFile.m). Typically, the mooring +connection location also needs to be specified, mooring(i).location = [1x3] +(the default connection location is [0 0 0]). The user must also define the +lookup table file in the WEC-Sim input file with mooring(i).lookupTableFile = 'FILENAME';

+

The lookup table dataset should contain one structure that contains fields for each index and each force table:

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Index Name

Description

Dimensions

X

Surge position [m]

1 x nX

Y

Sway position [m]

1 x nY

Z

Heave position [m]

1 x nZ

RX

Roll position [deg]

1 x nRX

RY

Pitch position [deg]

1 x nRY

RZ

Yaw position [deg]

1 x nRZ

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Force Name

Description

Dimensions

FX

Surge force [N]

nX x nY x nZ x nRX x nRY x nRZ

FY

Sway force [N]

nX x nY x nZ x nRX x nRY x nRZ

FZ

Heave force [N]

nX x nY x nZ x nRX x nRY x nRZ

MX

Roll force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

MY

Pitch force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

MZ

Yaw force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

+
+
+
+

MoorDyn

+

When a MoorDyn block is used, the user first needs to initiate the mooring class by +setting mooring = mooringClass('mooring name') in the WEC-Sim input +file (wecSimInputFile.m), followed by setting mooring(i).moorDyn = 1 to +initialize a MoorDyn connection. Each MoorDyn connection can consist of multiple +lines and each line may have multiple nodes. The number of MoorDyn lines and nodes in +each line should be defined as (mooring(i).moorDynLines = <Number of mooring lines>) +and (mooring(i).moorDynNodes(iLine) = <Number of mooring nodes in line> - only used +for ParaView visualization), respectively and should match the number of lines and nodes +specified in the MoorDyn input file.

+

A mooring folder that includes a MoorDyn input file (lines.txt) is required +in the simulation folder. The body and corresponding mooring attachment points are +defined in the MoorDyn input file. The body location in the MoorDyn input file +should match that of the initial location of the body’s center of gravity (usually +derived from BEM results). MoorDyn handles the kinematic transform to +convert the mooring forces from the attachment points to the 6 degree of freedom +force acting on the current location of the body’s center of gravity. The initial +displacement of the mooring line in WEC-Sim (mooring(i).initial.displacement) +should match the location of the connected body in the MoorDyn input file or the +difference in location between two connected bodies. In the MoorDyn input file, +the location of points/nodes are specified relative to the body location if of +attachment type ‘body#’ and relative to the global frame for any other +attachement type.

+
+

Note

+

WEC-Sim/MoorDyn coupling now allows more than one mooring connnection (i.e., +multiple MoorDyn Connection blocks) in the simulation, but there can only be +one call to MoorDyn (i.e., one MoorDyn Caller block).

+
+
+

RM3 with MoorDyn

+

This section describes how to simulate a mooring connected WEC system in +WEC-Sim using MoorDyn. The RM3 two-body floating point absorber is connected to +a three-point catenary mooring system with an angle of 120 between the lines in +this example case. The RM3 with MoorDyn folder is located under the WEC-Sim +Applications repository.

+
    +
  • WEC-Sim Simulink Model: Start out by following the instructions on how to +model the Two-Body Point Absorber (RM3). To couple WEC-Sim with MoorDyn, the +MoorDyn Connection block is added in parallel to the constraint block and the +MoorDyn Caller block is added to the model (no connecting lines).

  • +
+
+../_images/WECSimMoorDyn.png + +
+
    +
  • WEC-Sim Input File: In the wecSimInputFile.m file, the user needs to +initiate the mooring class and MoorDyn and define the number of mooring lines.

  • +
+
%% Simulation Data
+simu = simulationClass();             
+simu.simMechanicsFile = 'RM3MoorDyn.slx';       % WEC-Sim Model File
+simu.mode = 'accelerator';                
+simu.explorer = 'off';
+simu.rampTime = 40;                        
+simu.endTime = 400;                       
+simu.dt = 0.01;                          
+simu.cicDt = 0.05;
+
+%% Wave Information
+% User-Defined Time-Series
+waves = waveClass('elevationImport');           % Create the Wave Variable and Specify Type
+waves.elevationFile = 'etaData.mat';            % Name of User-Defined Time-Series File [:,2] = [time, eta]
+waves.waterDepth = 70;
+
+%% Body Data
+% Float
+body(1) = bodyClass('../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(1).geometryFile = '../../_Common_Input_Files/RM3/geometry/float.stl';
+body(1).mass = 'equilibrium';
+body(1).inertia = [20907301 21306090.66 37085481.11];
+
+% Spar/Plate
+body(2) = bodyClass('../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(2).geometryFile = '../../_Common_Input_Files/RM3/geometry/plate.stl';
+body(2).mass = 'equilibrium';
+body(2).inertia = [94419614.57 94407091.24 28542224.82];
+body(2).initial.displacement = [0 0 -0.21];     % Initial Displacement
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 0];    
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');              	
+pto(1).stiffness=0;                             	
+pto(1).damping=1200000;                       	
+pto(1).location = [0 0 0];     
+
+%% Mooring
+% Moordyn
+mooring(1) = mooringClass('mooring');           % Initialize mooringClass
+mooring(1).moorDyn = 1;                         % Initialize MoorDyn                                                                    
+mooring(1).moorDynLines = 6;                    % Specify number of lines
+mooring(1).moorDynNodes(1:3) = 16;              % Specify number of nodes per line
+mooring(1).moorDynNodes(4:6) = 6;               % Specify number of nodes per line
+mooring(1).initial.displacement = [0 0 -21.29-.21]; % Initial Displacement (body cg + body initial displacement)
+
+
+
    +
  • MoorDyn Input File: A mooring folder that includes a moorDyn input file +(lines.txt) is created. The moorDyn input file (lines.txt) is shown +in the figure below. More details on how to set up the MooDyn input file are +described in the MoorDyn Documentation. +One specific requirement when using WEC-Sim with MoorDyn is that the Body(s) in which +the mooring lines are attached to should be labeled as “Coupled” in the MoorDyn input +file, which allows for WEC-Sim to control the body dynamics. +Note: WEC-Sim now uses MoorDyn v2.

  • +
+
+../_images/moorDynInput.png + +
+
    +
  • Simulation and Post-processing: Simulation and post-processing are the +same process as described in Tutorial Section.

  • +
+
+

Note

+

You may need to install the MinGW-w64 compiler to run this simulation.

+
+
+
+
+
+

WEC-Sim Post-Processing

+

WEC-Sim contains several built in methods inside the response class and wave +class to assist users in processing WEC-Sim output: output.plotForces, +output.plotResponse, output.saveViz, waves.plotElevation, and +waves.plotSpectrum. This section will demonstrate the use of these methods. +They are fully documented in the WEC-Sim API.

+
+

Plot Forces

+

The responseClass.plotForces() method can be used to plot the time series of +each force component for a body. The first argument takes in a body number, the +second a degree of freedom of the force. For example, output.plotForces(2,3) +will plot the vertical forces that act on the 2nd body. The total force is split +into its components:

+
    +
  • total force

  • +
  • excitation force

  • +
  • radiation damping force

  • +
  • added mass force

  • +
  • restoring force (combination of buoyancy, gravity and hydrostatic stiffness),

  • +
  • Morison element and viscous drag force

  • +
  • linear damping force

  • +
+
+../_images/OSWEC_heaveForces.PNG + +
+

Demonstration of output.plotForces() method for the OSWEC example.

+
+
+
+
+

Plot Response

+

The responseClass.plotResponse() method is very similar to plotForces +except that it will plot the time series of a body’s motion in a given degree +of freedom. For example, output.plotResponse(1,5) will plot the pitch motion +of the 1st body. The position, velocity and acceleration of that body is shown.

+
+../_images/OSWEC_pitchResponse.PNG + +
+

Demonstration of output.plotResponse() method for the OSWEC example.

+
+
+
+
+

Plot Elevation

+

The waveClass.plotElevation() method can be used to plot the wave elevation time +series at the domain origin. The ramp time is also marked. The only required input +is simu.rampTime. Users must manually plot or overlay the wave elevation at a +wave gauge location.

+
+../_images/OSWEC_plotEta.PNG + +
+

Demonstration of waves.plotElevation() method for the OSWEC example.

+
+
+
+
+

Plot Spectrum

+

The waveClass.plotSpectrum() method can be used to plot the frequency spectrum +of an irregular or spectrum import wave. No input parameters are required.

+
+../_images/OSWEC_plotSpectrum.PNG + +
+

Demonstration of waves.plotSpectrum() method for the OSWEC example.

+
+
+
+
+
+

WEC-Sim Visualization

+

WEC-Sim provides visualization in SimScape Mechanics Explorer by default. This section describes some additional options for WEC-Sim visualization

+
+

Wave Markers

+

This section describes how to visualize the wave elevations at various locations using +markers in SimScape Mechanics Explorer. +Users must define an array of [X,Y] coordinates, the marker style (sphere, cube, frames), the marker size in pixels, marker color in RGB format. +The Global Reference Frame block programmatically initiates and adds/deletes the visualization blocks based on the number of markers (0 to N) defined by the user. +Here are the steps to define wave markers representing a wave-spectra, waves(1). Similar steps can be followed for subsequent waves(#) objects.

+
    +
  • Define an array of marker locations: waves(1).marker.location = [X,Y], where the first column defines the X coordinates, and the second column defines the corresponding Y coordinates, Default = []

  • +
  • Define marker style : waves(1).marker.style = 1, where 1: Sphere, 2: Cube, 3: Frame, Default = 1: Sphere

  • +
  • Define marker size : waves(1).marker.size = 10, to specify marker size in Pixels, Default = 10

  • +
  • Define marker color: waves(1).marker.graphicColor = [1,0,0], to specifie marker color in RBG format.

  • +
+

For more information about using ParaView for visualization, refer to the Wave_Markers examples on the WEC-Sim Applications repository.

+
+

Note

+

This feature is not compatible with user-defined waves waves = waveClass('elevationImport')

+
+
+../_images/RM3_vizMarker.jpg + +
+

Demonstration of visualization markers in SimScape Mechanics Explorer.

+
+
+
+
+

Save Visualization

+

The responseClass.saveViz() method can be used to create a complete +animation of the simulation. The animation shows the 3D response of all bodies +over time on top of a surface plot of the entire directional wave field. The +default wave domain is defined by simu.domainSize, waves.waterDepth, and +the maximum height that the STL mesh of any body reaches. Users may optionally +input the axis limits to restrict or widen the field of view, the time steps per +animation frame, and the output file format. Users can choose to save the animation +as either a .gif or .avi file. This function can take significant time to +run depending on simulation time and time step, however it may be faster and easier +than Paraview. Users are still recommended to use the provided Paraview macros for +more complex animations and analysis.

+

For example, in the OSWEC case the command +output.saveViz(simu,body,waves,'timesPerFrame',5,'axisLimits',[-50 50 -50 50 -12 20]) +results in the following figure:

+
+../_images/OSWEC_plotWaves.PNG + +
+

Demonstration of output.saveViz() method for the OSWEC example.

+
+
+
+
+
+

Paraview Visualization

+

This section describes how to use ParaView for visualizing data from a WEC-Sim simulation. +Using ParaView visualization improves on the SimMechanics explorer by:

+
    +
  • Visualizing the wave field

  • +
  • Visualizing the cell-by-cell nonlinear hydrodynamic forces (when using nonlinear buoyancy and Froude-Krylov wave excitation)

  • +
  • Allowing data manipulation and additional visualization options

  • +
+

However, the SimMechanics explorer shows the following information not included in the ParaView visualization:

+
    +
  • Location of center of gravity

  • +
  • Location of different frames (e.g. PTO and Constraint frames)

  • +
+

Visualization with ParaView requires additional output files to be written to a vtk directory. +This makes the WEC-Sim simulation take more time and the case directory larger, so it should only be used when additional visualization is desired. +Users will also need to have some familiarity with using ParaView. +For more information about using ParaView for visualization, refer to the Series 4 - Body-to-Body Interactions, and the Paraview_Visualization examples on the WEC-Sim Applications repository.

+
+

Install ParaView and WEC-Sim Macros

+

First, install ParaView 5.11.1. +Then, add the WEC-Sim specific macros:

+
    +
  • Open ParaView

  • +
  • Click on Macros => Add new macro

  • +
  • Navigate to the WEC-Sim source/functions/paraview directory

  • +
  • Select the first file and click OK

  • +
  • Repeat this for all .py files in the source/functions/paraview directory

  • +
+
+
+

WEC-Sim Visualization in ParaView

+

When simu.paraview.option = 1, a vtk directory is created inside the WEC-Sim $CASE directory. +All files necessary for ParaView visualization are located there. +To view in ParaView:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Select the WEC-Sim model in the pipeline, and run the WEC-Sim macro

  • +
  • Move the camera to desired view

  • +
  • Click the green arrow (play) button

  • +
+

The WEC-Sim macro:

+
    +
  • Extracts each body, sets the color and opacity, and renames them

  • +
  • Extracts the waves, sets color and opacity, and renames

  • +
  • Creates the ground plane

  • +
  • Sets the camera to top view

  • +
+

After opening the .pvd file and running the WEC-Sim macro you can do a number of things to visualize the simulation in different ways. +You can color waves and bodies by any of the available properties and apply any of the ParaView filters. The figures below show some of the visualization possibilities afforded by using ParaView with WEC-Sim.

+
+../_images/rm3_iso_side.png + +
+

Reference Model 3

+
+
+
+../_images/oswec_iso_side.png + +
+

Bottom-fixed Oscillating Surge WEC (OSWEC)

+
+
+
+../_images/sphere_freedecay_iso_side.png + +
+

Sphere

+
+
+
+../_images/ellipsoid_iso_side.png + +
+

Ellipsoid

+
+
+
+../_images/gbm_iso_side.png + +
+

Barge with Four Flexible Body Modes

+
+
+
+../_images/wigley_iso_side.png + +
+

Wigley Ship Hull

+
+
+
+../_images/wecccomp_iso_side.png + +
+

Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device

+
+
+
+../_images/oc6_iso_side.png + +
+

OC6 Phase I DeepCwind Floating Semisubmersible

+
+
+

Two examples using Paraview for visualization of WEC-Sim data are provided in the Paraview_Visualization directory of the WEC-Sim Applications repository. +The RM3_MoorDyn_Viz example uses ParaView for WEC-Sim data visualization of a WEC-Sim model coupled with MoorDyn to simulate a mooring system for the RM3 geometry. +The OSWEC_NonLinear_Viz example uses ParaView for WEC-Sim data visualization of a WEC-Sim model with nonlinear Hydro to simulate nonlinear wave excitation on the flap of the OSWEC geometry.

+
+

MoorDyn Visualization in ParaView

+

The video below shows three different views of the RM3 model with MoorDyn. +The left view uses the WEC-Sim macro. +The top right view uses the slice filter. +The bottom right view shows the free surface colored by wave elevation.

+
+
+

Nonlinear Hydro Visualization in ParaView

+

When using nonlinear buoyancy and Froude-Krylov wave excitation the paraview files also contain cell data for the bodies. +The cell data are:

+
    +
  • Cell areas

  • +
  • Hydrostatic pressures

  • +
  • Linear Froude-Krylov pressures

  • +
  • Nonlinear Froude-Krylov pressures

  • +
+

The pressureGlyphs macro calculates cell normals, and cell centers. It then creates the following glyphs:

+
    +
  • Hydrostatic pressure

  • +
  • Linear Froude-Krylov pressure

  • +
  • Nonlinear Froude-Krylov pressure

  • +
  • Total pressure (hydrostatic plus nonlinear Froude-Krylov)

  • +
  • Froude-Krylov delta (nonlinear minus linear)

  • +
+

To view WEC-Sim nonlinear hydro data in ParaView:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Select the WEC-Sim model in the pipeline, and run the WEC-Sim macro

  • +
  • Move the camera to desired view

  • +
  • Select the WEC-Sim model again in the pipeline, and run the pressureGlyphs macro

  • +
  • Select which features to visualize in the pipeline

  • +
  • Click the green arrow (play) button

  • +
+

The video below shows three different views of the OSWEC model with non-linear hydrodynamics. +The top right shows glyphs of the nonlinear Froude-Krylov pressure acting on the float. +The bottom right shows the device colored by hydrostatic pressure.

+
+
+
+
+
+

Loading a ParaView State File

+

If a previous *.pvsm ParaView state file was saved, the state can be applied to a *.pvd ParaView file. To load a state file:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Click on File => Load State

  • +
  • Select the desired $CASE/<filename>.pvsm Paraview state file to apply

  • +
  • Select the “Search files under specified directory” option, specify the desired WECS-Sim $CASE/vtk/ directory, and click OK

  • +
+

Paraview state files are provided for both Paraview_Visualization examples provided onthe WEC-Sim Applications repository, one for the RM3 using MoorDyn, and another for the OSWEC with nonlinear hydro.

+
+
+

ParaView Visualization Parameters

+

The following table lists the WEC-Sim simulation parameters that can be specified in the wecSimInputFile to control the ParaView visualization. Note, the body.viz properties are also used for the SimMechanics explorer visualization.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

WEC-Sim Visualization using ParaView

Variable

Description

+
simu.paraview.option
+
+
+
0 to not output ParaView files [default]
+
1 to output ParaView files
+
+

simu.paraview.startTime

time (s) to start ParaView visualization

simu.paraview.endTime

time (s) to end ParaView visualization

simu.paraview.dt

time step between adjacent ParaView frames [default 1]

simu.paraview.path

directory to create ParaView visualization files

+
simu.nonlinearHydro
+
+
+
0 for no nonlinear hydro [default]
+
1 for nonlinear hydro with mean free surface
+
2 for nonlinear hydro with instantaneous free surface
+
+

simu.domainSize

size of ground and water planes in meters [default 200]

simu.dtOut

simulation output sampling time step [default dt]

body(i).viz.color

[RGB] body color [default [1 1 0]]

body(i).viz.opacity

body opacity [default 1]

+
body(i).paraview
+
+
+
0 to exclude body from ParaView visualization
+
1 to include body in ParaView visualization [default]
+
+

waves.viz.numPointsX

wave plane discretization: number of X points [default 50]

waves.viz.numPointsY | wave plane discretization: number of Y points [default 50]

+
+
+
+

Decay Tests

+

When performing simulations of decay tests, you must use one of the no-wave +cases and setup the initial (time = 0) location of each body, constraint, PTO, +and mooring block. The initial location of a body or mooring block is set by +specifying the centerGravity or location at the stability position (as with any WEC-Sim +simulation) and then specifying an initial displacement. To specify an initial +displacement, the body and mooring blocks have a .initial property +with which you can specify a translation and angular rotation about an +arbitrary axis. For the constraint and PTO blocks, the .location property +must be set to the location at time = 0.

+

There are methods available to help setup this initial displacement for all +bodies, constraints, PTOs, and moorings. To do this, you would use the:

+
    +
  • body(i).setInitDisp()

  • +
  • constraint(i).setInitDisp()

  • +
  • pto(i).setInitDisp()

  • +
  • mooring(i).setInitDisp()

  • +
+

methods in the WEC-Sim input file. A description of the required input can be +found in the method’s header comments. The following properties must be +defined prior to using the object’s setInitDisp() method:

+
    +
  • body(i).centerGravity

  • +
  • constraint(i).location

  • +
  • pto(i).location

  • +
  • mooring.location

  • +
+

For more information, refer to the Free Decay example on the WEC-Sim +Applications repository.

+
+
+

Other Features

+

The WEC-Sim Applications repository also includes examples of using WEC-Sim to +model a Desalination plant and a numerical model of the WaveStar device for +control implementation. The WaveStar device was used in the WECCCOMP wave +energy control competition.

+
+
+

References

+
+
+
+[C1] +

Giorgio Bacelli and Ryan G Coe. Comments on control of wave energy converters. IEEE Transactions on Control Systems Technology, 29(1):478–481, 2020.

+
+
+[C2] +

Giorgio Bacelli, Victor Nevarez, Ryan G Coe, and David G Wilson. Feedback resonating control for a wave energy converter. IEEE Transactions on Industry Applications, 56(2):1862–1868, 2019.

+
+
+[C3] +

RPF Gomes, MFP Lopes, JCC Henriques, LMC Gato, and AFO Falcão. The dynamics and power extraction of bottom-hinged plate wave energy converters in regular and irregular waves. Ocean Engineering, 96:86–99, 2015.

+
+
+[C4] +

Ryan G Coe, Giorgio Bacelli, and Dominic Forbush. A practical approach to wave energy modeling and control. Renewable and Sustainable Energy Reviews, 142:110791, 2021.

+
+
+[C5] +(1,2) +

Aurélien Babarit and Alain H Clément. Optimal latching control of a wave energy device in regular and irregular waves. Applied Ocean Research, 28(2):77–91, 2006.

+
+
+[C6] +

Ratanak So, Mike Starrett, Kelley Ruehl, and Ted KA Brekken. Development of control-sim: control strategies for power take-off integrated wave energy converter. In 2017 IEEE Power & Energy Society General Meeting, 1–5. IEEE, 2017.

+
+ +
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/api.html b/dev/user/api.html new file mode 100644 index 000000000..e2810223e --- /dev/null +++ b/dev/user/api.html @@ -0,0 +1,1690 @@ + + + + + + + + + API — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

API

+
+

Simulation Class

+
+
+class objects.simulationClass
+
+

The simulationClass creates a simu object saved to the MATLAB +workspace. The simulationClass includes properties and methods used +to define WEC-Sim’s simulation parameters and settings.

+
+
+
+simulationClass
+

This method initializes the simulationClass.

+
+ +
+
+
Constructor Summary
+
Property Summary
+
+b2b
+

WEC-Sim input

+
+ +
+
+cicDt
+

(float) Time step to calculate Convolution Integral. Default = dt

+
+ +
+
+cicEndTime
+

(float) Convolution integral time. Default = 60 s

+
+ +
+
+domainSize
+

(float) Size of free surface and seabed. This variable is only used for visualization. Default = 200 m

+
+ +
+
+dt
+

(float) Simulation time step. Default = 0.1 s

+
+ +
+
+dtOut
+

(float) Output sampling time. Default = dt

+
+ +
+
+endTime
+

(float) Simulation end time. Default = []

+
+ +
+
+explorer
+

(string) SimMechanics Explorer ‘on’ or ‘off’. Default = 'on'

+
+ +
+
+gravity
+

(float) Acceleration due to gravity. Default = 9.81 m/s

+
+ +
+
+mcrMatFile
+

(string) mat file that contain a list of the multiple conditions runs with given conditions. Default = []

+
+ +
+
+mcrExcelFile
+

(string) File name from which to load wave statistics data. Default = []

+
+ +
+
+mode
+

(string) Simulation execution mode, ‘normal’, ‘accelerator’, ‘rapid-accelerator’. Default = 'normal'

+
+ +
+
+morisonDt
+

(float) Sample time to calculate Morison Element forces. Default = dt

+
+ +
+
+nonlinearDt
+

(float) Sample time to calculate nonlinear forces. Default = dt

+
+ +
+
+paraview
+

0 (off) , 1 (on). Default = 0. startTime (float) Start time for the vtk file of Paraview. Default = 0. endTime (float) End time for the vtk file of Paraview. Default = 100. dt (float) Timestep for Paraview. Default = 0.1. path (string) Path of the folder for Paraview vtk files. Default = 'vtk'.

+
+
Type:
+

(structure) Defines the Paraview visualization. option (integer) Flag for paraview visualization, and writing vtp files, Options

+
+
+
+ +
+
+pressure
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save pressure distribution, Options

+
+
+
+ +
+
+rampTime
+

(float) Ramp time for wave forcing. Default = 100 s

+
+ +
+
+rateTransition
+

‘on’, ‘off’. Default = 'on'

+
+
Type:
+

(string) Flag for automatically handling rate transition for data transfer, Opyions

+
+
+
+ +
+
+reloadH5Data
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to re-load hydro data from h5 file between runs, Options

+
+
+
+ +
+
+rho
+

(float) Density of water. Default = 1000 kg/m^3

+
+ +
+
+saveStructure
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save results as a MATLAB structure, Options

+
+
+
+ +
+
+saveText
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save results as ASCII files, Options

+
+
+
+ +
+
+saveWorkspace
+

0 (off), 1 (on). Default = 1

+
+
Type:
+

(integer) Flag to save .mat file for each run, Options

+
+
+
+ +
+
+simMechanicsFile
+

(string) Simulink/SimMechanics model file. Default = 'NOT DEFINED'

+
+ +
+
+solver
+

(string) PDE solver used by the Simulink/SimMechanics simulation. Any continuous solver in Simulink possible. Recommended to use ‘ode4, ‘ode45’ for WEC-Sim. Default = 'ode4'

+
+ +
+
+stateSpace
+

0 (convolution integral), 1 (state-space). Default = 0

+
+
Type:
+

(integer) Flag for convolution integral or state-space calculation, Options

+
+
+
+ +
+
+FIR
+

0 (convolution integral), 1 (FIR). Default = 0

+
+
Type:
+

(integer) Flag for FIR calculation, Options

+
+
+
+ +
+
+startTime
+

(float) Simulation start time. Default = 0 s

+
+ +
+
+zeroCross
+

(string) Disable zero cross control. Default = 'DisableAll'

+
+ +
+
+numMoorDyn
+

(integer) Number of moordyn blocks systems in the wec model. Default = 0

+
+ +
+
Method Summary
+
+
+
+ +
+
+

Wave Class

+
+
+class objects.waveClass
+

The waveClass creates a waves object saved to the MATLAB +workspace. The waveClass includes properties and methods used +to define WEC-Sim’s wave input.

+
+
+
Constructor Summary
+
Property Summary
+
+bem
+

input file

+
+ +
+
+current
+

0 for depth-independent model, 1 for 1/7 power law variation with depth, 2 for linear variation with depth, or 3 for no current. Default = 3, depth (float) Current depth [m]. Define the depth over which the sub-surface current is modeled. Must be defined for options 1 and 2. The current is not calculated for any depths greater than the specified current depth. Default = 0, direction (float) Current direction [deg]. Surface current direction defined using WEC-Sim global coordinate system. Default = 0, speed (float) Current seed [m/s]. Surface current speed that is uniform along the water column. Default = 0

+
+
Type:
+

(structure) Defines the current implementation. option (integer) Define the sub-surface current model to be used in WEC-Sim, options include

+
+
+
+ +
+
+direction
+

(float) Incident wave direction(s) [deg]. Incident wave direction defined using WEC-Sim global coordinate system. Should be defined as a row vector for more than one wave direction. Default = 0

+
+ +
+
+elevationFile
+

(string) Data file that contains the times-series data file. Default = 'NOT DEFINED'

+
+ +
+
+gamma
+

(float) Defines gamma, only used for JS wave spectrum type. Default = []

+
+ +
+
+height
+

(float) Wave height [m]. Defined as wave height for regular, or significant wave height for irregular. Default = 'NOT DEFINED'

+
+ +
+
+marker
+

Sphere, 2: Cube, 3: Frame. Default = 1: Sphere

+
+
Type:
+

(structure) Defines the wave marker. loc (nx2 vector) Marker [X,Y] locations [m]. Default = []. size (float) Marker size in Pixels. Default = 10. style Marker style, options include

+
+
Type:
+

1

+
+
+
+ +
+
+period
+

(float) Wave period [s] . Defined as wave period for regular, peak period for irregular, or period of BEM data used for hydrodynamic coefficients for noWave. Default = 'NOT DEFINED'

+
+ +
+
+phaseSeed
+

(integer) Defines the random phase seed, only used for irregular and spectrumImport waves. Default = 0

+
+ +
+
+spectrumFile
+

(string) Data file that contains the spectrum data file. Default = 'NOT DEFINED'

+
+ +
+
+spectrumType
+

PM or JS. Default = 'NOT DEFINED'

+
+
Type:
+

(string) Specifies the wave spectrum type, options include

+
+
+
+ +
+
+viz
+

(structure) Defines visualization options, structure contains the fields numPointsX for the number of visualization points in x direction, and numPointsY for the number of visualization points in y direction.

+
+ +
+
+waterDepth
+

(float) Water depth [m]. Default to BEM water depth if not set.

+
+ +
+
+spread
+

(float) Wave Spread probability associated with wave direction(s). Should be defined as a row vector for more than one wave direction. Default = 1

+
+ +
+
Method Summary
+
+plotElevation(rampTime)
+

This method plots wave elevation time-history.

+
+
Parameters:
+

rampTime (float, optional) – Specify wave ramp time to include in plot

+
+
Returns:
+

figure – Plot of wave elevation versus time

+
+
Return type:
+

fig

+
+
+
+ +
+
+plotSpectrum()
+

This method plots the wave spectrum.

+
+
Returns:
+

figure – Plot of wave spectrum versus wave frequency

+
+
Return type:
+

fig

+
+
+
+ +
+
+
+
+ +
+
+

Body Class

+
+
+class objects.bodyClass
+
+

The bodyClass creates a body object saved to the MATLAB +workspace. The bodyClass includes properties and methods used +to define WEC-Sim’s hydrodynamic and non-hydrodynamic bodies.

+
+
+
+bodyClass
+

This method initializes the bodyClass and creates a +body object.

+
+
Parameters:
+

h5File (string) – String specifying the location of the body h5 file

+
+
Returns:
+

body – bodyClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+adjMassFactor
+

WEC-Sim input

+
+ +
+
+centerBuoyancy
+

(3x1 float vector) Body center of buoyancy [m]. Defined in the following format [x y z]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+centerGravity
+

(3x1 float vector) Body center of gravity [m]. Defined in the following format [x y z]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+dof
+

(integer) Number of degree of freedoms (DOFs). For hydrodynamic bodies this is given in the h5 file. If not defined in the h5 file, Default = 6.

+
+ +
+
+excitationIRF
+

(vector) Defines excitation Impulse Response Function, only used with the waveClass elevationImport type. Default = [].

+
+ +
+
+flex
+

0 (off) or 1 (on). Default = 0.

+
+
Type:
+

(integer) Flag for flexible body, Options

+
+
+
+ +
+
+gbmDOF
+

(integer) Number of degree of freedoms (DOFs) for generalized body mode (GBM). Default = [].

+
+ +
+
+geometryFile
+

(string) Path to the body geometry .stl file.

+
+ +
+
+h5File
+

(char array, string, cell array of char arrays, or cell array or strings) hdf5 file containing the hydrodynamic data

+
+ +
+
+hydroStiffness
+

(6x6 float matrix) Linear hydrostatic stiffness matrix. If the variable is nonzero, the matrix will override the h5 file values. Create a 3D matrix (6x6xn) for variable hydrodynamics. Default = zeros(6).

+
+ +
+
+inertia
+

(1x3 float vector) Rotational inertia or mass moment of inertia [kg*m^{2}]. Defined by the user in the following format [Ixx Iyy Izz]. Default = [].

+
+ +
+
+inertiaProducts
+

(1x3 float vector) Rotational inertia or mass products of inertia [kg*m^{2}]. Defined by the user in the following format [Ixy Ixz Iyz]. Default = [].

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the body. displacement (1x3 float vector) is defined as the initial displacement of the body center of gravity (COG) [m] in the following format [x y z], Default = [0 0 0]. axis (1x3 float vector) is defined as the axis of rotation in the following format [x y z], Default = [0 1 0]. angle (float) is defined as the initial angular displacement of the body COG [rad], Default = 0.

+
+ +
+
+linearDamping
+

(6x6 float matrix) Defines linear damping coefficient matrix. Create a 3D matrix (6x6xn) for variable hydrodynamics. Default = zeros(6).

+
+ +
+
+mass
+

(float) Translational inertia or mass [kg]. Defined by the user or specify ‘equilibrium’ to set the mass equal to the fluid density times displaced volume. Default = [].

+
+ +
+
+meanDrift
+

0 (no), 1 (yes, from control surface) or 2 (yes, from momentum conservation). Default = 0.

+
+
Type:
+

(integer) Flag for mean drift force, Options

+
+
+
+ +
+
+morisonElement
+

0 (off), 1 (on) or 2 (on), Default = 0, Option 1 uses an approach that allows the user to define drag and inertial coefficients along the x-, y-, and z-axes and Option 2 uses an approach that defines the Morison Element with normal and tangential tangential drag and interial coefficients. cd (1x3 float vector) is defined as the viscous normal and tangential drag coefficients in the following format, Option 1 [cd_x cd_y cd_z], Option 2 [cd_N cd_T NaN], Default = [0 0 0]. ca is defined as the added mass coefficent for the Morison Element in the following format, Option 1 [ca_x ca_y ca_z], Option 2 [ca_N ca_T NaN], Default = [0 0 0], area is defined as the characteristic area for the Morison Element [m^2] in the following format, Option 1 [Area_x Area_y Area_z], Option 2 [Area_N Area_T NaN], Default = [0 0 0]. VME is the characteristic volume of the Morison Element [m^3], Default = 0. rgME is defined as the vector from the body COG to point of application for the Morison Element [m] in the following format [x y z], Default = [0 0 0]. z is defined as the unit normal vector center axis of the Morison Element in the following format, Option 1 not used, Option 2 [n_{x} n_{y} n_{z}], Default = [0 0 1].

+
+
Type:
+

(structure) Defines the Morison Element properties connected to the body. option (integer) for Morison Element calculation, Options

+
+
+
+ +
+
+name
+

(string) Specifies the body name. For hydrodynamic bodies this is defined in h5 file. For nonhydrodynamic bodies this is defined by the user, Default = [].

+
+ +
+
+nonHydro
+

0 (hydro body), 1 (non-hydro body), 2 (drag body). Default = 0.

+
+
Type:
+

(integer) Flag for non-hydro body, Options

+
+
+
+ +
+
+nonlinearHydro
+

0 (linear), 1 (nonlinear), 2 (nonlinear). Default = 0

+
+
Type:
+

(integer) Flag for nonlinear hydrohanamics calculation, Options

+
+
+
+ +
+
+quadDrag
+

(structure) Defines the viscous quadratic drag forces. Create an array of structures for variable hydrodynamics. First option define drag, (6x6 float matrix), Default = zeros(6). Second option define cd, (1x6 float vector), Default = [0 0 0 0 0 0], and area, (1x6 float vector), Default = [0 0 0 0 0 0].

+
+ +
+
+QTFs
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag for QTFs calculation, Options

+
+
+
+ +
+
+paraview
+

0 (no) or 1 (yes). Default = 1, only called in paraview.

+
+
Type:
+

(integer) Flag for visualisation in Paraview either, Options

+
+
+
+ +
+
+variableHydro
+

(structure) Defines the variable hydro implementation. option (float) Flag to turn variable hydrodynamics on or off. hydroForceIndexInitial (float) Defines the initial value of the hydroForceIndex, which should correspond to the hydroForce data (cg, cb, volume, water depth, valid cicEndTime, added mass integrated with the body during runtime) and h5File of the body at equilibrium.

+
+ +
+
+viz
+

(structure) Defines visualization properties in either SimScape or Paraview. color (1x3 float vector) is defined as the body visualization color, Default = [1 1 0]. opacity (integer) is defined as the body opacity, Default = 1.

+
+ +
+
+volume
+

(float) Displaced volume at equilibrium position [m^{3}]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+yaw
+

0 (off), 1 (on). Default = 0. threshold (float) Yaw position threshold (in degrees) above which excitation coefficients will be interpolated in passive yaw. Default = 1 [deg].

+
+
Type:
+

(structure) Defines the passive yaw implementation. option (integer) Flag for passive yaw calculation, Options

+
+
+
+ +
+
Method Summary
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a body’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the +centerGravity or location correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = centerGravity - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+plotStl()
+

Method to plot the body .stl mesh and normal vectors.

+
+ +
+
+calculateForceAddedMass(acc)
+

This method calculates and outputs the real added mass force +time history. This encompasses both the contributions of the +added mass coefficients and applied during simulation, and +the component from added mass that is lumped with the body +mass during simulation.

+

This function must be called after body.restoreMassMatrix() +and body.storeForceAddedMass()

+
+
Parameters:
+
    +
  • obj (bodyClass) – Body whose added mass force is being updated

  • +
  • acc (float array) – Timeseries of the acceleration at each simulation +time step

  • +
+
+
Returns:
+

actualAddedMassForce – Time series of the actual added mass force

+
+
Return type:
+

float array

+
+
+
+ +
+
+
+
+ +
+
+

Constraint Class

+
+
+class objects.constraintClass
+
+

The constraintClass creates a constraint object saved to the MATLAB +workspace. The constraintClass includes properties and methods used +to define constraints between the body motion relative to the global reference +frame or relative to other bodies.

+
+
+
+constraintClass
+

This method initilizes the constraintClass and creates a +constraint object.

+
+
Parameters:
+

filename (string) – String specifying the name of the constraint

+
+
Returns:
+

constraint – contraintClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+hardStops
+

input file

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the constraint. displacement (3x1 float vector) is defined as the initial displacement of the constraint [m] in the following format [x y z], Default = [0 0 0].

+
+ +
+
+extension
+

(string) Specify priority level for extension. `` ‘High’ or ‘Low’ `` Default = High.

+
+ +
+
+location
+

(1x3 float vector) Constraint location [m]. Defined in the following format [x y z]. Default = [999 999 999].

+
+ +
+
+name
+

(string) Specifies the constraint name. For constraints this is defined by the user, Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the constraint. z (1x3 float vector) defines the direciton of the Z-coordinate of the constraint, Default = [0 0 1]. y (1x3 float vector) defines the direciton of the Y-coordinate of the constraint, Default = [0 1 0]. x (3x1 float vector) internally calculated vector defining the direction of the X-coordinate for the constraint, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the constraint coordinate orientation, Default = [].

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a constraints’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+
+
+ +
+
+

PTO Class

+
+
+class objects.ptoClass
+
+

The ptoClass creates a pto object saved to the MATLAB +workspace. The ptoClass includes properties and methods used +to define PTO connections between the body motion relative to the global reference +frame or relative to other bodies.

+
+
+
+ptoClass
+

This method initilizes the ptoClass and creates a +pto object.

+
+
Parameters:
+

filename (string) – String specifying the name of the pto

+
+
Returns:
+

pto – ptoClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+damping
+

input file

+
+ +
+
+equilibriumPosition
+

(float) Linear PTO equilibrium position, m or deg. Default = 0.

+
+ +
+
+hardStops
+

(float) Define lower limit transition region, over which spring and damping values ramp up to full values. Increase for stability. m or deg. Default = 1e-4

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the pto. displacement (3x1 float vector) is defined as the initial displacement of the pto [m] in the following format [x y z], Default = [0 0 0].

+
+ +
+
+extension
+

(string) Specify priority level for extension. `` ‘High’ or ‘Low’ `` Default = High.

+
+ +
+
+location
+

(3x1 float vector) PTO location [m]. Defined in the following format [x y z]. Default = [999 999 999].

+
+ +
+
+name
+

(string) Specifies the pto name. For ptos this is defined by the user, Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the pto. z (1x3 float vector) defines the direction of the Z-coordinate of the pto, Default = [0 0 1]. y (1x3 float vector) defines the direction of the Y-coordinate of the pto, Default = [0 1 0]. x (1x3 float vector) internally calculated vector defining the direction of the X-coordinate for the pto, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the pto coordinate orientation, Default = [].

+
+ +
+
+pretension
+

(float) Linear PTO pretension, N or N-m. Default = 0.

+
+ +
+
+stiffness
+

(float) Linear PTO stiffness coefficient. Default = 0.

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a pto’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+
+
+ +
+
+

Mooring Class

+
+
+class objects.mooringClass
+

The mooringClass creates a mooring object saved to the MATLAB +workspace. The mooringClass includes properties and methods used +to define cable connections relative to other bodies. +It is suggested that the mooringClass be used for connections between +bodies and the global reference frame.

+

This class contains mooring parameters and settings

+
+
+
Constructor Summary
+
Property Summary
+
+initial
+

input file

+
+ +
+
+location
+

(1x3 float vector) Mooring Reference location. Default = [0 0 0]

+
+ +
+
+matrix
+

(structure) Defines the mooring parameters. damping (6x6 float matrix) Matrix of damping coefficients, Default = zeros(6). stiffness (6x6 float matrix) Matrix of stiffness coefficients, Default = zeros(6). preTension (1x6 float vector) Array of pretension force in each dof, Default = [0 0 0 0 0 0].

+
+ +
+
+moorDyn
+

(integer) Flag to indicate and initialize a MoorDyn connection, 0 or 1. Default = 0

+
+ +
+
+moorDynLines
+

(integer) Number of lines in MoorDyn. Default = 0

+
+ +
+
+moorDynNodes
+

(integer) number of nodes for each line. Default = 'NOT DEFINED'

+
+ +
+
+name
+

(string) Name of the mooring. Default = 'NOT DEFINED'

+
+ +
+
+moorDynInputFile
+

(string) Name of the MoorDyn input file path. Outputs will be written to this path. Default = Mooring/lines.txt

+
+ +
+
+lookupTableFlag
+

(integer) Flag to indicate a mooring look-up table, 0 or 1. Default = 0

+
+ +
+
+lookupTableFile
+

(string) Mooring look-up table file name. Default = '';

+
+ +
+
+lookupTable
+

(array) Lookup table data. Force data in 6 DOFs indexed by displacement in 6 DOF

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a mooring’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or orientation +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+loadLookupTable()
+

Method to load the lookup table and assign to the mooringClass

+
+ +
+
+callMoorDynLib()
+

Initialize MoorDyn Lib (Windows:dll or OSX:dylib)

+
+ +
+
+closeMoorDynLib()
+

Close MoorDyn Lib

+
+ +
+
+
+
+ +
+
+

Cable Class

+
+
+class objects.cableClass
+
+

The cableClass creates a cable object saved to the MATLAB +workspace. The cableClass includes properties and methods used +to define cable connections relative to other bodies. +It is suggested that the cableClass be used for connections between +joints or ptos.

+
+
+
+cableClass
+

This method initilizes the cableClass and creates a +cable object.

+
+
Parameters:
+
    +
  • name (string) – String specifying the name of the cable

  • +
  • baseConnection (string) – Variable for the base constraint/pto as a string

  • +
  • followerConnection (string) – Variable for the follower constraint/pto as a string

  • +
+
+
Returns:
+

cable – cableClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+damping
+

input file

+
+ +
+
+inertia
+

(1x3 float vector) body moments of inertia kg-m^2, default [1 1 1]

+
+ +
+
+inertiaProducts
+

(1x3 float vector) body products of inertia kg-m^2, default [0 0 0]

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the body. displacement (3x1 float vector) is defined as the initial displacement of the body center of gravity (COG) [m] in the following format [x y z], Default = [0 0 0]. axis (3x1 float vector) is defined as the axis of rotation in the following format [x y z], Default = [0 1 0]. angle (float) is defined as the initial angular displacement of the body COG [rad], Default = 0.

+
+ +
+
+cableLength
+

(float) Cable equilibrium length (m), calculated from rotloc and preTension. Default =`0`.

+
+ +
+
+linearDamping
+

(1x6 float vector) linear damping aplied to body motions

+
+ +
+
+mass
+

(float) mass in kg, default 1

+
+ +
+
+name
+

(string) Defines the Cable name. Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the pto. z (1x3 float vector) defines the direciton of the Z-coordinate of the pto, Default = [0 0 1]. y (1x3 float vector) defines the direciton of the Y-coordinate of the pto, Default = [0 1 0]. x (1x3 float vector) internally calculated vector defining the direction of the X-coordinate for the pto, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the pto coordinate orientation, Default = [].

+
+ +
+
+paraview
+

(integer) Flag for visualisation in Paraview either 0 (no) or 1 (yes). Default = 1 since only called in paraview.

+
+ +
+
+preTension
+

(float) Cable pretension (N).

+
+ +
+
+quadDrag
+

(structure) Defines the viscous quadratic drag forces. First option define drag, (6x6 float matrix), Default = zeros(6). Second option define cd, (6x1 float vector), Default = zeros(6,1), and area, (6x1 float vector), Default = zeros(6,1).

+
+ +
+
+stiffness
+

(float) Cable stiffness (N/m). Default = 0.

+
+ +
+
+viz
+

(structure) Defines visualization properties in either SimScape or Paraview. color (3x1 float vector) is defined as the body visualization color, Default = [1 1 0]. opacity (integer) is defined as the body opacity, Default = 1.

+
+ +
+
+base
+

internal

+
+ +
+
+follower
+

(structure) Defines the follower connection. centerBuoyancy (1 x 3 float vector) center of buoyancy location of the base drag body, Default = [0 0 0]. centerGravity (1 x 3 float vector) center of gravity location of the base drag body, Default = [0 0 0]. location (3x1 float vector) base location [m], Defined in the following format [x y z], Default = []. name (string) name of the base constraint or PTO, Default = ‘NOT DEFINED’;

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a body’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+setCg()
+

This method specifies the Cg of the drag bodies as coincident +with the fixed ends of the cable, if not otherwise specied.

+
+ +
+
+
+
+ +
+
+

Response Class

+
+
+class objects.responseClass
+
+

The responseClass creates an output object saved to the MATLAB workspace +that contains structures for each instance of a WEC-Sim class (e.g. +waveClass, bodyClass, constraintClass, ptoClass, +cableClass, mooringClass, etc).

+
+
+
+responseClass
+

This method initializes the responseClass, reads +output from each instance of a WEC-Sim class (e.g. +waveClass, bodyClass, ptoClass, mooringClass, etc) +and saves the response to an output object.

+
+
Returns:
+

output – responseClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+wave
+

This property contains a structure for each instance of the waveClass

+
    +
  • type (string) = ‘waveType’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • elevation (array) = [# of time-steps x 1]

  • +
  • waveGauge1Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 1

  • +
  • waveGauge2Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 2

  • +
  • waveGauge3Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 3

  • +
+
+ +
+
+bodies
+

This property contains a structure for each instance of the bodyClass (i.e. for each Body block)

+
    +
  • name (string) = ‘bodyName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • acceleration (array) = [# of time-steps x 6]

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of all hydrodynamic forces applied to the body

  • +
  • forceExcitation (array) = [# of time-steps x 6] The sum of the Froude-Krylov excitation force and the mean drift force exerted by the incoming wave on the body

  • +
  • forceRadiationDamping (array) = [# of time-steps x 6] The negative radiation damping force due to body velocity

  • +
  • forceAddedMass (array) = [# of time-steps x 6] The negative added mass force due to body acceleration

  • +
  • forceRestoring (array) = [# of time-steps x 6] The negative sum of the gravity force, buoyant force, the hydrostatic stiffness force, and any moment due to separation between the center of gravity and the center of buoyancy

  • +
  • forceMorisonAndViscous (array) = [# of time-steps x 6] The negative sum of the Morison element force and the viscous drag force

  • +
  • forceLinearDamping (array) = [# of time-steps x 6] The negative force due to linear damping and the body velocity

  • +
+

There are 4 additional output.bodies arrays when using nonlinear hydro and Paraview output:

+
    +
  • cellPressures_time (array) = [# of Paraview time-steps x 1] Nonlinear calculation timeseries

  • +
  • cellPressures_hydrostatic (array) = [# of Paraview time-steps x # of mesh faces] Hydrostatic pressure on each stl facet

  • +
  • cellPressures_waveLinear (array) = [# of Paraview time-steps x # of mesh faces] Excitation pressure on each stl facet given zero displacement and the mean free surface

  • +
  • cellPressures_waveNonLinear (array) = [# of Paraview time-steps x # of mesh faces] Excitation pressure on each stl facet given the instantaneous displacement and instantaneous free surface

  • +
+
+ +
+
+constraints
+

This property contains a structure for each instance of the constraintClass (i.e. for each Constraint block). Constraint motion is relative from frame F to frame B. Constraint forces act on frame F.

+
    +
  • name (string) = ‘constraintName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6] The constraint position relative to the initial condition

  • +
  • velocity (array) = [# of time-steps x 6] The constraint velocity relative to the initial condition

  • +
  • acceleration (array) = [# of time-steps x 6] The constraint acceleration relative to the initial condition

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
+
+ +
+
+ptos
+

This property contains a structure for each instance of the ptoClass (i.e. for each PTO block). PTO motion is relative from frame F to frame B. PTO forces act on frame F.

+
    +
  • name (string) = ‘ptoName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6] The constraint position relative to the initial condition

  • +
  • velocity (array) = [# of time-steps x 6] The constraint velocity relative to the initial condition

  • +
  • acceleration (array) = [# of time-steps x 6] The constraint acceleration relative to the initial condition

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of the actuation, constraint and internal mechanics forces

  • +
  • forceActuation (array) = [# of time-steps x 6] The prescribed force input to the PTO to control its motion

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
  • forceInternalMechanics (array) = [# of time-steps x 6] The net force in the joint DOF due to stiffness and damping

  • +
  • powerInternalMechanics (array) = [# of time-steps x 6] The net power lost in the joint DOF due to stiffness and damping

  • +
+
+ +
+
+cables
+

This property contains a structure for each instance of the cableClass (i.e. for each Cable block)

+
    +
  • name (string) = ‘cableName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • acceleration (array) = [# of time-steps x 6]

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of the actuation and constraint forces

  • +
  • forceActuation (array) = [# of time-steps x 6] The cable tension

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
+
+ +
+
+mooring
+

This property contains a structure for each instance of the mooringClass using the mooring matrix (i.e. for each MooringMatrix block)

+
    +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • forceMooring (array) = [# of time-steps x 6] The sum of the stiffness, damping and pretension forces applied on the body by the mooring

  • +
+
+ +
+
+moorDyn
+

This property contains a structure for each instance of the mooringClass using MoorDyn (i.e. for each MoorDyn block)

+
    +
  • Lines (struct) = [1 x 1] Contains the time and fairlead tensions

  • +
  • Line# (struct) = [1 x 1] One structure for each mooring line: Line1, Line2, etc. Each line structure contains node positions in x, y, z and segment tensions

  • +
+
+ +
+
+ptoSim
+

This property contains a structure for each instance of the ptoSimClass (i.e. for each PTO-Sim block).

+
+
    +
  • time (struct) = [# of time-steps x 1] Simulation timeseries

  • +
+

There are additional output.ptoSim structs corresponding to the Simulink blocks used:

+
    +
  • pistonCF (struct) = [1 x # of pistons] Structure containing timeseries of compressible fluid piston properties including absolute power, force, position, velocity

  • +
  • pistonNCF (array) = [1 x # of pistons] Structure containing timeseries of non-compressible fluid piston properties including absolute power, force, top pressure and bottom pressure

  • +
  • checkValve (struct) = [1 x # of valves] Structure containing timeseries of check valve properies including volume flow rate

  • +
  • valve (struct) = [1 x # of valves] Structure containing timeseries of valve properties including volume flow rate

  • +
  • accumulator (struct) = [1 x # of accumulators] Structure containing timeseries of accumulator properties including pressure and volume

  • +
  • hydraulicMotor (struct) = [1 x # of motors] Structure containing timeseries of hydraulic motor properties including angular velocity and volume flow rate

  • +
  • rotaryGenerator (struct) = [1 x # of generators] Structure containing timeseries of rotary generator properties including electrical power and generated power

  • +
  • simpleDD (struct) = [1 x # of generators] Structure containing timeseries of direct drive PTO properties including forces and electrical power

  • +
  • pmLinearGenerator (struct) = [1 x # of generators] Structure containing timeseries of permanent magnet linear generator properties including absolute power, force, friction force, current, voltage, velocity and electrical power

  • +
  • pmRotaryGenerator (struct) = [1 x # of generators] Structure containing timeseries of permanent magnet rotary generator properties including absolute power, force, friction force, current, voltage, velocity and electrical power

  • +
  • motionMechanism (struct) = [1 x # of mechanisms] Structure containing timeseries of motion mechanism properties including PTO torque, angular position and angular velocity

  • +
+
+
+
+windTurbine
+

This property contains a structure for each instance of the windTurbineClass

+
    +
  • name (string) = ‘windTurbineName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • windSpeed (array) = [# of time-steps x 1]

  • +
  • turbinePower (array) = [# of time-steps x 1]

  • +
  • rotorSpeed (array) = [# of time-steps x 1]

  • +
  • bladePitch (array) = [# of time-steps x 1] Pitch position of blade 1

  • +
  • nacelleAcceleration (array) = [# of time-steps x 1]

  • +
  • towerBaseLoad (array) = [# of time-steps x 6] 6DOF force at the constraint between the floating body and tower base

  • +
  • towerTopLoad (array) = [# of time-steps x 6] 6DOF force at the constraint between the tower base and tower nacelle

  • +
  • bladeRootLoad (array) = [# of time-steps x 1] 6DOF force at the constraint between blade 1 and the hub

  • +
  • genTorque (array) = [# of time-steps x 1] Torque on the generator

  • +
  • azimuth (array) = [# of time-steps x 1] azimuthal angle of the generator

  • +
+
+ +
+ +
+
+
Constructor Summary
+
Property Summary
+
+ptoSim
+

This property contains a structure for each instance of the ptoSimClass (i.e. for each PTO-Sim block).

+
+ +
+
+windTurbine
+

This property contains a structure for each instance of the windTurbineClass

+
+ +
+
Method Summary
+
+plotResponse(bodyNum, comp)
+

This method plots the response of a body for a given DOF.

+
+
Parameters:
+
    +
  • bodyNum (integer) – the body number to plot

  • +
  • comp (integer) – the response component (i.e. dof) to be plotted (e.g. 1-6)

  • +
+
+
+
+ +
+
+plotForces(bodyNum, comp)
+

This method plots the forces on a body for a given DOF.

+
+
Parameters:
+
    +
  • bodyNum (integer) – the body number to plot

  • +
  • comp (integer) – the force component (i.e. dof) to be plotted (e.g. 1-6)

  • +
+
+
+
+ +
+
+saveViz(simu, body, waves, options)
+

This method plots and saves the wave elevation and body +geometry over time to visualize the waves and response

+
+
Parameters:
+
    +
  • simu – simulationClass object

  • +
  • body – bodyClass object

  • +
  • waves – waveClass object

  • +
  • options

    +
    axisLimits1x6 float matrix

    x, y, and z-bounds of figure axes in the format: +[min x, max x, min y, max y, min z, max z] +Default = [-simu.domainSize/2 simu.domainSize/2 +-simu.domainSize/2 simu.domainSize/2 -waves.waterDepth maximumHeight]

    +
    +
    timesPerFramefloat

    number of simulation time steps per video frame +(higher number decreases computation time) +Default = 1

    +
    +
    startEndTime1x2 float matrix

    Array defining the start and end times of the +visualization +Default = [min(t) max(t)]

    +
    +
    saveSettinginteger

    0 = video, 1 = gif. Default = 0

    +
    +
    +

  • +
+
+
+
+ +
+
+writeText()
+

This method writes WEC-Sim outputs to a (ASCII) text file. +This method is executed by specifying simu.outputtxt=1 +in the wecSimInputFile.m.

+
+ +
+
+
+
+ +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/applications.html b/dev/user/applications.html new file mode 100644 index 000000000..4c68c3c66 --- /dev/null +++ b/dev/user/applications.html @@ -0,0 +1,317 @@ + + + + + + + + + WEC-Sim Applications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

WEC-Sim Applications

+

The WEC-Sim Applications +repository contains many more applications of the WEC-Sim code that demonstrate +WEC-Sim Advanced Features. This includes +tutorials by the WEC-Sim team as well as user-shared examples and covers topics +such as body interactions, numerical set-up, batch runs, visualization, control +examples, mooring and more. These applications highlight the +versatility of WEC-Sim and can be used as a starting point for users interested +in a given application. +It is highly recommended that users go through an application case along with the +relevant advanced feature section when learning to implement a new WEC-Sim feature. +The WEC-Sim Applications repository is included as a +submodule of the +WEC-Sim repository. The applications are summarized below.

+
+

Body-to-Body Interactions

+

Example using Body-to-Body (B2B) to run WEC-Sim for the RM3 +geometry. The scripts run and plot the RM3 model with B2B on/off and with +Regular/RegularCIC. Execute the runB2B.m script to run this case.

+
+
+

Controls

+

Examples using Controllers. +Examples of WEC-Sim models using various control methods are included for the RM3 +float geometry. These examples include passive, reactive, latching, declutching, and model predictive control methods.

+
+
+

Desalination

+

Example using WEC-Sim for desalination based on the OSWEC +geometry. Note the dependency on SimScape Fluids to run this desalination case.

+
+
+

Free Decay

+

Example using WEC-Sim to simulate free decay +of a sphere in heave, using Multiple Condition Runs. +Execute the runFreeDecay.m script to run this case.

+
+
+

Generalized Body Modes

+

Example using Generalized Body Modes +in WEC-Sim. In this application a barge is allowed four additional flexible +degrees of freedom. Note that this requires the BEM solver also account for +these general degrees of freedom and output the appropriate quantities required +by BEMIO.

+
+
+

Mooring

+

One example using the RM3 +geometry coupled with MoorDyn +to simulate a more realistic mooring system. And another example modeling the +RM3 with a Mooring Matrix. The MoorDyn application consists of 3 catenary +mooring lines attached to floating buoys and then to different points on the +spar and anchored at the sea floor.

+
+
+

Multiple Condition Run

+

Example using Multiple Condition Runs +to run the RM3. +These examples demonstrate each of the 3 different ways to run WEC-Sim with MCR +and generates a power matrix for each PTO damping value. The last example +demonstrates how to use MCR to vary the imported sea state test file and +specify corresponding phase. Execute wecSimMCR.m from the case directory to +run an example.

+
    +
  • MCROPT1: Cases defined using arrays of values for period and height.

  • +
  • MCROPT2: Cases defined with wave statistics in an Excel spreadsheet

  • +
  • MCROPT3: Cases defined in a MATLAB data file (.mat)

  • +
  • MCROPT4: Cases defined using several MATLAB data files (*.mat) of the +wave spectrum

  • +
+
+
+

Nonhydrodynamic Body

+

Example using Non-Hydro Body +to run WEC-Sim for the OSWEC. +This example models the base as a nonhydro body, and the flap as a hydrodynamic +body.

+
+
+

Nonlinear Hydrodynamic Body

+

Example using Nonlinear Hydro +to run WEC-Sim for a heaving ellipsoid. +Includes examples of running nonlinear hydrodynamics with different fixed and +variable time-step solvers +(ode4/ode45), and different regular wave formulations (with/without CIC). +Execute the runNL.m script to run this case.

+
+
+

Paraview Visualization

+

Example using ParaView data visualization for WEC-Sim coupled with MoorDyn +to simulate a more realistic mooring system for the RM3 +geometry. Example consists of 3 catenary mooring lines attached to different +points on the spar and anchored at the sea floor.

+

Example using ParaView data visualization for WEC-Sim with Nonlinear Hydro +for the Flap and a Non-Hydro Body +for the Base to run WEC-Sim for the OSWEC +geometry.

+
+
+

Passive Yaw

+

Example on using Passive Yaw +to run WEC-Sim for the OSWEC geometry. +Execute the runYawCases.m script to run this case.

+
+
+

PTO-Sim

+

Examples using PTO-Sim. +Examples of WEC-Sim models using PTO-Sim are included for the RM3 +geometry and OSWEC +geometry.

+
+
+

RM3 PTO Extension

+

Examples on using the PTO Extension advanced feature to set-up an initial displacement of the RM3 easily. +This geometry is a special case with a large DOF in which different WEC bodies can be identified as the PTO mechanism with a cooresponding position change when setting the PTO Initial Displacement.

+
+
+

Visualization Markers

+

Examples of WEC-Sim with Wave Elevation visualization at User-Defined Locations. +The setup for the visualization can be found at Advanced Features <https://github.com/WEC-Sim/advanced_features>

+
+
+

WECCCOMP

+

Numerical model for the WEC Control Competition (WECCCOMP) using WEC-Sim to +model the WaveStar with various fault implementations can be found in the WECCCOMP repository. +See the project report written by Erica Lindbeck in the “report” folder.

+
+
+

Write HDF5

+

This is an example of how to write your own h5 file using MATLAB. Can be useful +if you want to modify your coefficients, use experimental coefficients, or +coefficients from another BEM code other than WAMIT, NEMOH, AQWA, or CAPYTAINE. For more +details see BEMIO +documentation.

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/code_structure.html b/dev/user/code_structure.html new file mode 100644 index 000000000..5dc3c9fd7 --- /dev/null +++ b/dev/user/code_structure.html @@ -0,0 +1,1098 @@ + + + + + + + + + Code Structure — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Code Structure

+

This section provides a description of the WEC-Sim source code and its +structure. For more information about WEC-Sim’s code structure, refer to the +Code Structure webinar.

+
+

WEC-Sim Source Code

+

The directory where the WEC-Sim code is contained is referred to as $WECSIM +(e.g. C:/User/Documents/GitHub/WEC-Sim). The WEC-Sim source code files are +contained within a source directory referred to as $WECSIM/source. The +WEC-Sim source code consists primarily of three components as described in the table:

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File name

Directory

WEC-Sim Executable

wecSim.m

$WECSIM/source

WEC-Sim MATLAB Functions

<functionName>.m

$WECSIM/source/functions

WEC-Sim MATLAB Classes

<objectClass>.m

$WECSIM/source/objects

WEC-Sim Simulink Library

WECSim_Lib.slx

$WECSIM/source/lib

+

The WEC-Sim executable is the wecSim.m file. +Executing wecSim from a case directory parses the user input data, +performs pre-processing calculations in each of the classes, selects and +initializes variant subsystems in the Simulink model, runs the time-domain +simulations in WEC-Sim, and calls post-processing scripts. +When a WEC-Sim case is properly set-up, the user only needs to use the single command wecSim +in the command line to run the simulation.

+

Users can run WEC-Sim from the command line with the command wecSim or from directly from Simulink, +refer to Running from Simulink.

+
+
+

WEC-Sim Classes

+

All information required to run WEC-Sim simulations is contained within the +simu, waves, body(i), constraint(i), pto(i), cable(i), and +mooring(i) objects (instances of the simulationClass, waveClass, bodyClass, +constraintClass, ptoClass, cableClass, and mooringClass). +Users can instantiate and interact with these classes within the WEC-Sim input +file (wecSimInputFile.m). The following Source Details +section describes the role of the WEC-Sim objects, and how to and interact with the +WEC-Sim objects to define input properties.

+

There are two ways to look at the available properties and methods within a +class. The first is to type doc <className> in Matlab Command Window, and +the second is to open the class definitions located in the +$WECSIM/source/objects directory by typing open <className> in MATLAB +Command Window. The latter provides more information since it also defines the +different fields in a structure.

+
+
+

WEC-Sim Library

+

In addition to the wecSimInputFile.m that instantiates classes, a WEC-Sim +simulation requires a simulink model (*.slx) that represents the WEC +system components and their connectivity. Similar to how the input file uses the +WEC-Sim classes, the Simulink model uses WEC-Sim library blocks. There should +be a one-to-one relationship between the objects defined in the input file and +the blocks used in the Simulink model.

+

The WEC-Sim library is divided different types of library blocks. +Users should be able to model their WEC device using the available WEC-Sim +blocks (and possibly other Simulink/Simscape blocks). The image below shows the +WEC-Sim block grouping by type.

+
+../_images/WEC-Sim_Lib.PNG + +
+

The following sections describe the different library types, the related class, and their general +purpose.

+
+
+

Source Details

+

The WEC-Sim Classes and Library Blocks interact with one another during a simulation. +The classes contain functions for initialization, reading input data, pre-processing and post-processing. +The library blocks use these pre-processed parameters during the time-domain simulation in Simulink. +The relationship between WEC-Sim Classes and their corresponding Library Blocks are described in the following sections, and summarized in the table below.

+ + + + + + + + + + + + + + + + + + + + + + + + +

WEC-Sim Classes

Corresponding Library Blocks

Simulation Class and Wave Class

Frames

Body Class

Body Elements

Constraint Class

Constraints

PTO Class

PTOs

Cable Class

Cables

Mooring Class

Moorings

+
+

Simulation Class

+

The simulation class contains the simulation parameters, flags and solver +settings necessary to execute the WEC-Sim code. These simulation parameters +include numerical settings such as the time step, start time, differential +equation solver method, and flags for various output options and nonlinear +hydrodynamics options. At a high level, the simulation class interacts with the +rest of WEC-Sim as shown in the diagram below. The most common flags and +attributes that are passed to other objects are the start, end, and ramp times, +time steps, global variables (gravity, density, etc).

+
+../_images/simulation_diagram.png + +
+
+

Simulation Class Initialization

+

Within the wecSimInputFile.m, users +must initialize the simulation class (simulationClass) and specify the name +of the WEC-Sim (*.slx) model file by including the following lines:

+
simu=simulationClass();
+simu.simMechanicsFile='<modelFile>.slx'
+
+
+

All simulation class properties are specified as variables within the simu +object as members of the simulationClass. +The WEC-Sim code has default values defined for the simulation class +properties. These default values can be overwritten by the user in the input file, +for example, the end time of a simulation can be set by entering the following command: +simu.endTime = <user specified end time>.

+

Users may specify other simulation class properties using the simu object +in the wecSimInputFile.m, such as:

+ + + + + + + + + + + + + + + +

Simulation start time

simu.startTime

End time

simu.endTime

Ramp time

simu.rampTime

Time step

simu.dt

+

Available simulation properties, default values, and functions can be found by +typing doc simulationClass in the MATLAB command window, or by opening the +simulationClass.m file in $WECSIM/source/objects directory by typing open +simulationClass in MATLAB Command Window. +For more information about application of WEC-Sim’s simulation class, refer to +Simulation Features.

+
+
+

Frame Block

+

The simulation class is tied to the Frames library. +The Frames library contains one block that is necessary in every model. The +Global Reference Frame block defines the global coordinates, solver +configuration, seabed and free surface description, simulation time, and other +global settings. It can be useful to think of the Global Reference Frame as +being the seabed when creating a model. Every model requires one instance of +the Global Reference Frame block. The Global Reference Frame block uses the +simulation class variable simu and the wave class variable waves, which +must be defined in the input file.

+
+../_images/WEC-Sim_Lib_frames.PNG + +
+
+
+
+

Wave Class

+

The wave class contains all wave information necessary to define the incident +wave condition for the WEC-Sim time-domain simulation. The wave class contains +the incoming wave information that determines the excitation +force, added mass, radiation damping and other frequency based parameters that +influence a body’s motion.

+

At a high level, the wave class interacts with the rest of WEC-Sim as shown in +the diagram below. The wave primarily interacts with the body class +through the pre-processing of wave forces and in Simulink.

+
+../_images/wave_diagram.PNG + +
+
+

Wave Class Initialization

+

Within the wecSimInputFile.m, users +must initialize the wave class (waveClass) and specify the waveType by +including the following line:

+
waves = waveClass('<waveType>');
+
+
+

Users must specify additional wave class properties using the waves object +depending on which wave type is selected, as shown in the table below. A more +detailed description of the available wave types is given in the following +sections.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Wave Type

Required Properties

noWave

waves.period

noWaveCIC

regular

waves.height, waves.period

regularCIC

waves.height, waves.period

irregular

waves.height, waves.period, waves.spectrumType

spectrumImport

waves.spectrumFile

elevationImport

waves.elevationFile

+

Available wave class properties, default values, and functions can be found by +typing doc waveClass in the MATLAB command window, or by opening the +waveClass.m file in $WECSIM/source/objects directory by typing open +waveClass in the Matlab Command Window. +For more information about application of WEC-Sim’s wave class, refer to +Wave Features.

+
+
+

noWave

+

The noWave case is for running WEC-Sim simulations with no waves and +constant radiation added mass and wave damping coefficients. The noWave +case is typically used to run decay tests. Users must still provide hydro +coefficients from a BEM solver before executing WEC-Sim and specify the period +(wave.T) from which the hydrodynamic coefficients are selected.

+

The noWave case is defined by including the following in the input file:

+
waves = waveClass('noWave');
+waves.period = <wavePeriod>; %[s]
+
+
+
+
+

noWaveCIC

+

The noWaveCIC case is the same as the noWave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass.

+

The noWaveCIC case is defined by including the following in the input file:

+
waves = waveClass('noWaveCIC');
+
+
+
+
+

regular

+

The regular wave case is used for running simulations in regular waves with +constant radiation added mass and wave damping coefficients. Using this option, +WEC-Sim assumes that the system dynamic response is in sinusoidal steady-state +form, where constant added mass and damping coefficients are used (instead of +the convolution integral) to calculate wave radiation forces. Wave period +(wave.T) and wave height (wave.H) must be specified in the input file.

+

The regular case is defined by including the following in the input file:

+
waves = waveClass('regular');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+
+
+
+
+

regularCIC

+

The regularCIC is the same as regular wave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. Wave period (wave.T) and wave height +(wave.H) must be specified in the input file.

+

The regularCIC case is defined by including the following in the input file:

+
waves = waveClass('regularCIC');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+
+
+
+
+

irregular

+

The irregular wave case is the wave type for irregular wave simulations +using a Pierson Moskowitz (PM) or JONSWAP (JS) wave spectrum as defined by the +IEC TS 62600-2:2019 standards. Significant wave height (wave.H), peak +period (wave.T), and wave spectrum type (waves.spectrumtype) must be +specified in the input file. The available wave spectra and their corresponding +waves.spectrumType are listed below:

+ + + + + + + + + + + + +

Wave Spectrum

spectrumType

Pierson Moskowitz

PM

JONSWAP

JS

+

The irregular case is defined by including the following in the input file:

+
waves = waveClass('irregular');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+waves.spectrumType = '<waveSpectrum>';
+
+
+

When using the JONSWAP spectrum, users have the option of defining gamma by +specifying waves.gamma = <waveGamma>;. If gamma is not defined, +then gamma is calculated based on a relationship between significant wave +height and peak period defined by IEC TS 62600-2:2019.

+
+
+

spectrumImport

+

The spectrumImport case is the wave type for irregular wave simulations +using an imported wave spectrum (ex: from buoy data). The user-defined spectrum +must be defined with the wave frequency (Hz) in the first column, and the +spectral energy density (m^2/Hz) in the second column. Users have the option to +specify a third column with phase (rad); if phase is not specified by the user +it will be randomly defined. An example file is provided in the +$WECSIM/examples/*/spectrumData.mat directory. The spectrumImport case is defined by including the following +in the input file:

+
waves = waveClass('spectrumImport');
+waves.spectrumFile ='<spectrumFile >.mat';
+
+
+
+

Note

+

When using the spectrumImport option, users must specify a sufficient +number of wave frequencies (typically ~1000) to adequately describe the +wave spectra. These wave frequencies are the same that will be used to +define the wave forces on the WEC, for more information refer to the +Irregular Wave Binning section.

+
+
+
+

elevationImport

+

The elevationImport case is the wave type for wave simulations using user-defined +time-series (ex: from experiments). The user-defined wave surface elevation +must be defined with the time (s) in the first column, and the wave surface +elevation (m) in the second column. An example of this is given in the +elevationData.mat file in the tutorials directory folder of the WEC-Sim source +code. The elevationImport case is defined by including the following in the input +file:

+
waves = waveClass('elevationImport');
+waves.elevationFile ='<elevationFile>.mat';
+
+
+

When using the elevationImport option, excitation forces are calculated via +convolution with the excitation impulse response function. This solution method +is not particularly robust and the quality of the results can depend heavily on +the discretization and range of the BEM data. This is especially true for elevation +data that contains a small number of frequencies (e.g., an approximation of regular +wave). Further, a number of advanced features are not available for this solution +method. Direct multiplication of the frequency components, as performed in the +spectrumImport and irregular methods is a more robust and capable approach, +but requires developing a ‘<spectrumFile>.mat’ that is time-domain equivalent to ‘<elevationFile>.mat’. +For this workflow, the elevationToSpectrum function has been provided in +$WEC-Sim/source/functions/BEMIO.

+
+
+
+

Body Class

+

The body class represents each rigid or flexible body that comprises the WEC +being simulated. It contains the mass and hydrodynamic properties of each body, +defined by hydrodynamic data from the *.h5 file. The corresponding body block +uses the hydrodynamic data and wave class to calculate all relevant forces on +the body and solve for its resultant motion. At a high level, the body class +interacts with the rest of WEC-Sim as shown in the diagram below. +Bodies hold hydrodynamic BEM input data, calculate body forces and pass forces +and motions to other Simulink blocks.

+
+../_images/body_diagram.PNG + +
+
+

Body Class Initialization

+

Within the wecSimInputFile.m, +users must initialize each iteration of the body class (bodyClass), and +specify the location of the hydrodynamic data file (<bemData>.h5) and geometry +file (<geomFile>.stl) for each body. The body class is defined by including the +following lines in the WEC-Sim input file, where i is the body number and +‘<bem_data>.h5’ is the name of the h5 file containing the BEM results:

+
body(i)=bodyClass('<bemData>.h5')
+body(i).geometryFile = '<geomFile>.stl';
+
+
+

WEC-Sim bodies may be one of four types: hydrodynamic, flexible, +drag, or nonhydrodynamic. These types represent varying degrees of complexity +and require various input parameters and BEM data, detailed in the table below. +The Body Features section contains more details on these +important distinctions.

+ + + + + + + + + + + + + + + + + + + + +

Body Type

Description

Hydrodynamic Body

body(i)=bodyClass('<bemData>.h5') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia

Drag Body

body(i)=bodyClass('') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia +body(i).centerGravity +body(i).centerBuoyancy +body(i).volume +body(i).nonHydro=1

Nonhydrodynamic Body

body(i)=bodyClass('') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia +body(i).centerGravity +body(i).centerBuoyancy +body(i).volume +body(i).nonHydro=2

Flexible Body

body(i)=bodyClass('<bemData>.h5') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia

+

Users may specify other body class properties using the body object for +each body in the wecSimInputFile.m. +Important body class properties include quantities such as +the mass, moment of inertia, center of gravity and center of buoyancy. +Other parameters are specified as needed. +For example, viscous drag can be specified by entering the viscous drag +coefficient and the characteristic area in vector format the WEC-Sim +input file as follows:

+
body(i).quadDrag.cd = [0 0 1.3 0 0 0]
+body(i).quadDrag.area = [0 0 100 0 0 0]
+
+
+

Available body properties, default values, and functions can be found by typing +doc bodyClass in the MATLAB command window, or opening the bodyClass.m +file in $WECSIM/source/objects directory by typing open bodyClass in +Matlab Command Window. +For more information about application of WEC-Sim’s body class, refer to +Body Features.

+
+

Note

+

The *.h5 file defines the hydrodynamic data for all relevant bodies. It is +required that any drag body or nonhydrodyamic body be numbered after all +hydrodynamic bodies The body index must correspond with the index in the +*.h5 file and the number in the Simulink diagram.

+
+
+
+

Body Blocks

+

The Body Class is most closely associated with the Body Elements library. +The Body Elements library shown below contains four body types in two blocks: +the Rigid Body block and the Flex Body block. The rigid body block is +used to represent hydrodynamic, nonhydrodynamic, and drag bodies. Each type of +rigid body is a Variant Sub-system. +Before simulation, one variant is activated by a flag in the body object +(body.nonHydro=0,1,2). The flex body block is used to represent hydrodynamic +bodies that contain additional flexible degrees of freedom (‘generalized body +modes’). The flex body is determined automatically by the degrees of freedom +contained in the BEM input data. At least one instance of a body +block (rigid or flex) is required in each model. The +Body Features section describes the various types of +WEC-Sim bodies in detail.

+

Both in Simulink and the input file, the user has to name the blocks +body(i) (where i=1,2,…). The mass properties, hydrodynamic data, geometry +file, mooring, and other properties are then specified in the input file. +Within the body block, the wave radiation, wave excitation, hydrostatic +restoring, viscous damping, and mooring forces are calculated.

+
+../_images/WEC-Sim_Lib_bodies.PNG + +
+
+
+
+

Constraint Class

+

The WEC-Sim constraint class and blocks connect WEC bodies to one another (and +possibly to the seabed) by constraining DOFs. Constraint objects do not apply +any force or resistance to body motion outside of the reactive force required +to prevent motion in a given DOF. At a high level, the constraint class +interacts with the rest of WEC-Sim as shown in the diagram below. Constraint +objects largely interact with other blocks through Simscape connections that +pass resistive forces to other bodies, constraints, ptos, etc.

+
+../_images/constraint_diagram.PNG + +
+
+

Constraint Class Initialization

+

The properties of the constraint class (constraintClass) are defined in the +constraint object. Within the wecSimInputFile.m, users must initialize +each iteration the constraint class (constraintClass) and specify the +constraintName, by including the following lines:

+
constraint(i)=constraintClass('<constraintName>');
+
+
+

For rotational constraint (ex: pitch), users may also specify the +location and orientation of the rotational joint with respect to the global +reference frame:

+
constraint(i).location = [<x> <y> <z>];
+constraint(i).orientation.z = [<x> <y> <z>];
+constraint(i).orientation.y = [<x> <y> <z>];
+
+
+

Available constraint properties, default values, and functions can be found by +typing doc constraintClass in the MATLAB command window, or opening the +constraintClass.m file in $WECSIM/source/objects directory by typing +open constraintClass in MATLAB Command Window. +For more information about application of WEC-Sim’s constraint class, refer to +Constraint and PTO Features.

+
+
+

Constraint Blocks

+

The Constraint Class is tied to the blocks within the Constraints library. +These are used to define the DOF of a +specific body. Constraint blocks define only the DOF, but do not otherwise +apply any forcing or resistance to the body motion. Each Constraint block has +two connections: a base (B) and a follower (F). The Constraints block restricts +the motion of the block that is connected to the follower relative to the block +that is connected to the base. For a single body system, the base would be the +Global Reference Frame and the follower is a Rigid Body.

+
+../_images/WEC-Sim_Lib_constraints.PNG + +
+

A brief description of each constraint block is given below. More information +can also be found by double clicking on the library block and viewing the Block +Parameters box.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Constraint Library

Block

DOFs

Description

Fixed

0

Rigid connection. Constrains all motion +between the base and follower

Translational

1

Constrains the motion of the follower +relative to the base to be translation +along the constraint’s Z-axis

Rotational

1

Constrains the motion of the follower +relative to the base to be rotation +about the constraint’s Y-axis

Spherical

3

Contrains the motion of the follower +relative to the base to be rotation about +the X-, Y-, and Z- axis.

Floating (3DOF)

3

Constrains the motion of the follower +relative to the base to planar motion +with translation along the constraint’s +X- and Z- and rotation about the Y- axis

Floating (6DOF)

6

Allows for unconstrained motion of the +follower relative to the base

+
+
+
+

PTO Class

+

WEC-Sim Power Take-Off (PTO) blocks connect WEC bodies to one other (and +possibly to the seabed) by constraining DOFs and applying linear damping and +stiffness. The ability to apply damping, stiffness, or other external forcing +differentiates a ‘PTO’ from a ‘Constraint’. The damping and stiffness allow a +pto to extract power from relative body motion with respect to a fixed reference +frame or another body.

+

At a high level, the PTO class interacts with the rest of WEC-Sim as shown in +the diagram below. PTO objects largely interact with other blocks through +Simscape connections that pass resistive forces to other bodies, constraints, +ptos, etc.

+
+../_images/pto_diagram.PNG + +
+
+

PTO Class Initialization

+

The properties of the PTO class (ptoClass) are +defined in the pto object. Within the wecSimInputFile.m, users must +initialize each iteration the pto class (ptoClass) and specify the +ptoName, by including the following lines:

+
pto(i) = ptoClass('<ptoName>');
+
+
+

For rotational ptos, the user also needs to specify the location of the +rotational joint with respect to the global reference frame in the +pto(i).location variable. In the PTO class, users can also specify +linear damping (pto(i).damping) and stiffness (pto(i).stiffness) values to +represent the PTO system (both have a default value of 0). Users can overwrite +the default values in the input file. For example, users can specify a damping +value by entering the following in the WEC-Sim input file:

+
pto(i).damping = <ptoDamping>;
+pto(i).stiffness = <ptoStiffness>;
+
+
+

Available pto properties, default values, and functions can be found by typing +doc ptoClass in the MATLAB command window, or opening the ptoClass.m file +in $WECSIM/source/objects directory by typing open ptoClass in MATLAB +Command Window. +For more information about application of WEC-Sim’s pto class, refer to +Constraint and PTO Features.

+
+
+

PTO Blocks

+

The PTO Class is tied to the PTOs library. +Similar to the Constraint blocks, the PTO blocks have a base (B) and +a follower (F). Users must name each PTO block pto(i) +(where i=1,2,…) and then define their properties in the input file.

+

The Translational PTO, Spherical PTO, and Rotational PTO are identical to the +Translational, Spherical, and Rotational constraints, but they allow for the +application of linear damping and stiffness forces. Additionally, there are two +other variations of the Translational and Rotational PTOs. The Actuation +Force/Torque PTOs allow the user to define the PTO force/torque at each +time-step and provide the position, velocity and acceleration of the PTO at +each time-step. The user can use the response information to calculate the PTO +force/torque. The Actuation Motion PTOs allow the user to define the motion of +the PTO. These can be useful to simulate forced-oscillation tests.

+
+../_images/WEC-Sim_Lib_pto.PNG + +
+
+

Note

+

When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, +the loads and displacements are specified in the local (not global) +coordinate system. This is true for both the sensed (measured) and actuated +(commanded) loads and displacements.

+
+
+
+
+

Cable Class

+

WEC-Sim Cable blocks connect WEC bodies to one other by a cable. +They allows users to apply damping and/or stiffness when the cable is in tension, +but allow no forcing in compression. +At a high level, the cable class interacts with the rest of WEC-Sim as shown in the diagram below.

+
+../_images/cable_diagram.PNG + +
+
+

Cable Class Initialization

+

The properties of the cable class (cableClass) are defined in the cable object. +Within the wecSimInputFile.m, users must initialize the cable class and specify the +cableName, in addition to the baseConnection and followerConnection (in that order), by including the following lines:

+
cable(i) = cableClass('cableName','baseConnection','followerConnection');
+cable(i).damping = <cableDamping>;
+cable(i).stiffness = <cableStiffness>;
+
+
+

Available cable properties, default values, and functions +can be found by typing doc cableClass in the MATLAB command window, or +opening the cableClass.m file in $WECSIM/source/objects directory by +typing open cableClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Cable Features.

+
+
+

Cable Block

+

The Cable Class is tied to the Cables library. +The Cable block applies linear damping and stiffness based on +the motion between the base and follower. +Cables can be used between two bodies to apply a coupling force only when taut or stretched. +A cable block must be added to the model between two PTOs or constraints that are to be connected by the cable.

+
+../_images/WEC-Sim_Lib_cable.PNG + +
+
+
+
+

Mooring Class

+

The mooring class (mooringClass) allows for different fidelity simulations +of mooring systems. Three possibilities are available, a lumped mooring matrix, +a mooring lookup table, or MoorDyn. These differences are determined by the Simulink block(s) chosen, and are +described below. At a high level, the Mooring class interacts with the rest of +WEC-Sim as shown in the diagram below. The interaction is similar to a +constraint or PTO, where some resistive forcing is calculated and passed to a +body block through a Simscape connection.

+
+../_images/mooring_diagram.PNG + +
+
+

Mooring Class Initialization

+

The properties of the mooring class (mooringClass) are defined in the +mooring object. Within the wecSimInputFile.m, users must initialize +the mooring class and specify the mooringName, by including the following lines:

+
mooring(i)= mooringClass('<mooringName>');
+
+
+

Available mooring properties, default values, and functions +can be found by typing doc mooringClass in the MATLAB command window, or +opening the mooringClass.m file in $WECSIM/source/objects directory by +typing open mooringClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Mooring Features.

+
+
+

Mooring Blocks

+

The Mooring Class is tied to the Moorings library. +Four types of blocks may be used: a ‘Mooring Matrix’, a ‘Mooring Lookup Table’, +a ‘MoorDyn Connection’ block, or a ‘MoorDyn Caller’ block. +The MooringMatrix block applies linear damping and stiffness based on +the motion of the follower relative to the base. +Damping and stiffness can be specified between all DOFs in a 6x6 matrix. +The MooringLookupTable block searches a user-supplied 6DOF force lookup table. +The lookup table should contain six parameters: the resultant mooring force in each degree of freedom. +Each force is indexed by position in all six degrees of freedom. +The mooring force is interpolated between indexed positions based on the instantaneous position of the mooring system. +There are no restrictions on the number of MooringMatrix or MooringLookupTable blocks.

+

The MoorDynConnection block is used to detect the relative motion between +two connection points (i.e., a body and the global reference frame or between +two bodies). The block uses Simulink’s ‘Goto’ and ‘From’ blocks to feed the +relative response to the MoorDynCaller block, which then calls MoorDyn to +calculate the 6 degree of freedom mooring forces based on the instantaneous displacement, +velocity, a MoorDyn input file, and the compiled MoorDyn libraries to simulate a realistic +mooring system. The mooring forces are then sent back to the MoorDyn Connection +block to be applied at the body’s center of gravity. Multiple MoorDyn Connection +blocks can be used to specify mooring lines between different bodies/frames, +but there can only be one MoorDyn Caller block per Simulink model. Each +MoorDyn Connection block should be initialized as a mooring object in +the wecSimInputFile.m with mooring(i).moorDyn set equal to 1. The +MoorDynCaller block should not have an accompanying mooring object. +If set up correctly in the wecSimInputFile.m, the signals will be +automatically sent between the MoorDyn Connection and MoorDyn Caller blocks.

+
+../_images/WEC-Sim_Lib_mooring.PNG + +
+
+
+
+

PTO-Sim Class

+

The PTO-Sim class contains all the information for the PTO-Sim blocks, which can be used to simulate PTO systems. +The difference beetween the PTO-Sim class and the PTO class is that the PTO-Sim class have detailed models of different components +that are used in PTO systems such as hydraulic cylinders, hydraulic accumulators, hydraulic motors, electric generators, etc., +while the PTO class have a linear parametric model that summarizes the PTO dynamics with a stiffness and a damping term. +At a high level, the PTO-Sim class interacts with the rest of +WEC-Sim as shown in the diagram below:

+
+../_images/PTOSimClass_diagram.png + +
+

The PTO-Sim blocks receive the linear or angular response from the PTO blocks and give either the torque or the force depending on the PTO dynamics.

+
+

PTO-Sim Class Initialization

+

The properties of the PTO-Sim class (ptoSimClass) are defined in the ptoSim object. The PTO-Sim class must be +initialized in the wecSimInputFile.m script. There are three properties that must be initialized for all the PTO-Sim blocks, +those are the name, the block number, and the type:

+
ptoSim(i) = ptoSimClass('ptoSimName');
+ptoSim(i).ptoSimNum = i;
+ptoSim(i).ptoSimType = <TypeNumber>;
+
+
+

The type value must be defined depending on the type of block used in the simulation as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PTO-Sim Library

Block

Type

Electric Generator

1

Hydraulic cylinder

2

Hydraulic accumulator

3

Rectifying check +valve

4

Hydraulic motor

5

Linear crank

6

Adjustable rod

7

Check valve

8

Direct drive +linear generator

9

Direct drive +rotary generator

10

+

Available PTO-Sim blocks properties, default values, and functions +can be found by typing doc ptoSimClass in the MATLAB command window, or +opening the ptoSimClass.m file in $WECSIM/source/objects directory by +typing open ptoSimClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Constraint and PTO Features.

+
+
+

PTO-Sim Blocks

+

There are eight different types of blocks in the PTO-Sim class divided +in three sub-categories: Hydraulic, Electric, and Motion Conversion. In the hydraulic sub-category +there are five blocks: Check Valve, Compressible Fluid Piston, +Gas-Charged Hydraulic Accumulator, Hydraulic Motor, and Rectifying Check Valve. +In the Electric sub-category there is a block call Electric Generator Equivalent Circuit which models an electric generator +with an equivalent circuit. The motion conversion blocks (Rotary to Linear Adjustable Rod, and +Rotary to Linear Crank) can be used to to convert rotational motion into linear motion to add a hydraulic cylinder +to the PTO model. There are no restrictions on the number of PTO-Sim blocks.

+
+../_images/WEC-Sim_Lib_PTOSim.png + +
+
+
+
+

Response Class

+

The response class contains all the output time-series and methods to plot and +interact with the results. It is not initialized by the user, and there is no +related Simulink block. Instead, it is +created automatically at the end of a WEC-Sim simulation. The response class +does not input any parameter back to WEC-Sim, only taking output data from the +various objects and blocks.

+

After WEC-Sim is done running, there will be a new variable called output +saved to the MATLAB workspace. The output object is an instance of the +responseClass. It contains all the relevant time-series results of the +simulation. Time-series are given as [# of time-steps x 6] arrays, where 6 is the degrees of freedom. +Refer to the WEC-Sim API documentation for the Response Class for +information about the structure of the output object, .

+
+
+
+

Functions & External Codes

+

While the bulk of the WEC-Sim code consists of the WEC-Sim classes and the +WEC-Sim library, the source code also includes supporting functions and +external codes. These include third party Matlab functions to read *.h5 and +*.stl files, WEC-Sim Matlab functions to write *.h5 files and run +WEC-Sim in batch mode, MoorDyn compiled libraries, python macros for ParaView +visualization, and the PTO-Sim class and library. Additionally, BEMIO can be +used to create the hydrodynamic *.h5 file required by WEC-Sim. MoorDyn is +an open source code that must be downloaded separately. Users may also obtain, +modify, and recompile the code as desired.

+
+ +
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/getting_started.html b/dev/user/getting_started.html new file mode 100644 index 000000000..1b7880f3d --- /dev/null +++ b/dev/user/getting_started.html @@ -0,0 +1,321 @@ + + + + + + + + + Getting Started — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Getting Started

+

This section provides instructions on how to download and install WEC-Sim.

+
+

MATLAB Requirements

+

WEC-Sim is developed in MATLAB/Simulink, and requires the following toolboxes:

+ + + + + + + + + + + + + + + + + + +

Required Toolbox

Oldest Compatible Version

MATLAB

Version 9.9 (R2020b)

Simulink

Version 10.2 (R2020b)

Simscape

Version 5.0 (R2020b)

Simscape Multibody

Version 7.2 (R2020b)

+

WEC-Sim’s Simulink Library is saved in MATLAB R2020b, and WEC-Sim tests are run on the last four releases of MATLAB. +Any version of MATLAB newer than R2020b should be compatible with WEC-Sim, however we do not test all MATLAB releases. +The stability of each MATLAB release is available via WEC-Sim’s GitHub Actions. +Certain advanced features rely on external functions (such as MoorDyn), and additional MATLAB Toolboxes (such as Parallel Computing Toolbox (PCT)).

+

Verify that the MATLAB required toolboxes are installed by typing ver in the MATLAB Command Window:

+
>> ver
+-----------------------------------------------------------------------------------------------------
+MATLAB Version: 9.9.0.1592791 (R2020b)
+-----------------------------------------------------------------------------------------------------
+MATLAB                                                Version 9.9         (R2020b)
+Simulink                                              Version 10.2        (R2020b)
+Simscape                                              Version 5.0         (R2020b)
+Simscape Multibody                                    Version 7.2         (R2020b)
+
+
+
+
+

Download WEC-Sim

+

The WEC-Sim source code is hosted on WEC-Sim’s GitHub repository. +WEC-Sim users should clone WEC-Sim’s Github repository. +Cloning the repository allows users to easily pull the latest updates to the WEC-Sim source code. +The WEC-Sim source code can be cloned by installing Git Large File Storage (git lfs) to access large files (e.g. *.h5 files), and cloning the WEC-Sim GitHub repository.

+

To install WEC-Sim using git:

+
>> git lfs install
+>> git clone https://github.com/WEC-Sim/WEC-Sim
+
+
+

The local copy of WEC-Sim can easily be updated to include updates from the main version of the WEC-Sim source code hosted on the GitHub by using the git pull command:

+
>> git pull origin main
+
+
+

For users who are new to git, it is recommended to go through examples on GitHub or other sources while getting started. +If you have problems downloading or installing please see the Troubleshooting page.

+

For developers who wish to contribute to WEC-Sim, refer to the Developer Getting Started section.

+
+

Note

+

Users may also download a static version of WEC-Sim from the latest tagged +WEC-Sim Release. This is +the easiest way to obtain the WEC-Sim code, however users must manually +download new releases for updates.

+
+
+
+

Install WEC-Sim

+

Once you have downloaded the WEC-Sim source code, take the following steps to install WEC-Sim. +The directory where the WEC-Sim source code is saved is referred to as $WECSIM (e.g. C:/User/Documents/GitHub/WEC-Sim).

+
+

Step 1. Add WEC-Sim to the MATLAB Path

+

To run WEC-Sim, the source directory must be on the MATLAB path. +Users have two options to do this:

+

Option 1. Automatically add the WEC-Sim source on MATLAB startup.

+

Open $WECSIM/source/addWecSimSource.m and copy contents to a new file called startup.m. +Set the WEC-Sim path to the local $WECSIM/source directory, e.g. wecSimSource = 'C:/User/Documents/GitHub/WEC-Sim/source. +Save startup.m to the MATLAB Startup Folder. +Restart MATLAB, and the $WECSIM/source directory will automatically be added to the MATLAB path.

+
% This script adds the WEC-Sim source to the MATLAB path. 
+
+% Define WEC-Sim source and add to MATLAB path
+wecSimSource = fullfile(pwd,'source');
+addpath(genpath(wecSimSource));
+
+% Allow opening of Simulink models saved in a newer version
+set_param(0, 'ErrorIfLoadNewModel', 'off')
+
+clear wecSimSource
+
+
+

Option 2. Manually add and remove the WEC-Sim source from the MATLAB path.

+

This option requires users to run a script each time MATLAB is opened to add the WEC-Sim source directory to the path. +Navigate to the $WECSIM directory and run addWecSimSource. +The $WECSIM/source directory will then be added to the MATLAB path for this instance of MATLAB. +To remove WEC-Sim from the path, run removeWecSimSource.

+
+
+

Step 2. Verify the Path

+

Verify the path was set up correctly by checking that the WEC-Sim source directory is listed in the MATLAB search path. +The WEC-Sim source directory, $WECSIM/source, and its subfolders should be listed. +To view the MATLAB path, type path in the MATLAB Command Window:

+
>> path
+
+        MATLABPATH
+
+C:/User/Documents/GitHub/WEC-Sim/source
+
+
+
+ +
+

Step 4. Test the Installation

+

Both users and contributors can test the installation using the following steps. +In the MATLAB Command Window type:

+
>> cd $WECSIM/examples/RM3
+>> wecSim
+
+
+

This should run an example case using the Reference Model 3 (RM3) point absorber. +A Mechanics Explorer window will open within the MATLAB window, and figures will be generated displaying simulation outputs. +Both the RM3 and the OSWEC examples ($WECSIM/examples/OSWEC) come ready-to-run and can be used once WEC-Sim is installed.

+
+

Note

+

If a git lfs error is produced, there was a problem with git-lfs +installation. You may need to manually install Git Large File +Storage , or run +$WECSIM/examples/RM3/hydroData/bemio.m to generate the correct +rm3.h5 file.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/index.html b/dev/user/index.html new file mode 100644 index 000000000..849e272b7 --- /dev/null +++ b/dev/user/index.html @@ -0,0 +1,255 @@ + + + + + + + + + User Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/troubleshooting.html b/dev/user/troubleshooting.html new file mode 100644 index 000000000..9748938be --- /dev/null +++ b/dev/user/troubleshooting.html @@ -0,0 +1,407 @@ + + + + + + + + + Troubleshooting — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Troubleshooting

+
+

WEC-Sim Issues

+

The WEC-Sim development team actively maintains the WEC-Sim Issues page on GitHub. +This issue page is maintained to assist users and past issues. +In this way, it serves as a significant resource for users in solving WEC-Sim problems or clarifying its implementation.

+

If you have problems downloading, installing, or using WEC-Sim please follow the debugging steps on this page. +Completing these steps will help users address their own questions and aid the development team in maintaining the issue board effectively. +Please take the time to follow these steps before opening an issue on GitHub.

+
+

Note on the Issue Board

+

Unfortunately, the WEC-Sim development team does not have the time and funding to address issues outside of WEC-Sim. +The following topics cannot be addressed when there is not a direct relation to WEC-Sim code, theory, or implementation:

+
    +
  • MATLAB/Simulink/Simscape-based issues

  • +
  • general hydrodynamics questions

  • +
  • performing tasks for a user’s case, i.e. supplying nonlinear meshes, *.h5 files, BEM results

  • +
  • running BEM software

  • +
  • use or development of BEM software

  • +
+

The issue board is provided as a convenience to users and the development team makes every effort to respond to issues in a timely manner. +However, users should not expect nor request an immediate response from the developers.

+
+
+
+

Debugging

+

Before opening an issue on GitHub, it is expected that users do a fair share of debugging. +WEC-Sim is intentionally easy to use and utilizes convenient MATLAB/Simulink interfaces. +However, this ease of use does not detract from the difficulty and time required to create an accurate and robust simulation. +Users should spend time carefully setting up and debugging their WEC-Sim cases. For example:

+
    +
  • Follow all error codes to the root cause of the error

  • +
  • Confirm that all user-defined inputs are set correctly

  • +
  • Confirm that WEC-Sim is called in the intended way (wecSim, wecSimMCR, wecSimPCT, from Simulink, etc)

  • +
  • When running a WEC-Sim example (e.g. OSWEC, RM3) carefully compare to the working examples before opening an issue

  • +
  • Check BEM input data for expected results, referring to the notes in the BEMIO figures

  • +
  • If creating your own WEC-Sim case, go through the wave test cases below. Check the common issues and solutions for each test.

  • +
+
+

Identify Root Cause

+

Identify if MATLAB and Simulink, or WEC-Sim is the root cause of the problem. +Does the problem occur in a WEC-Sim class, function, or Simulink model? If so, it may be a WEC-Sim error. +Carefully check input file paths, especially when copying previously working WEC-Sim examples. +Please do not submit issues for errors related to using MATLAB. +The development team cannot provide support for MATLAB errors outside of WEC-Sim.

+
+
+

Review Relevant Documentation

+

Read the appropriate documentation section for solutions or clarification on use of a particular feature. +The documentation is thorough but requires careful reading of relevant sections. +If documentation in an area is lacking, please identify this in a GitHub issue so that we may improve WEC-Sim.

+
+
+

Search WEC-Sim Issues

+

In many cases, another user has had a similar issue before. +Search the issues page (both open and closed) and the below FAQ for topics that relate to your current problem. +If these are related but insufficient, tag them in your GitHub issue for as references for the development team and future users.

+
+
+

Open an Issue

+

If the above steps do not solve your problem, please open an issue using one of the provided templates: bug report, feature request, theory or implementation, or WEC-Sim application. +Issue templates serve to layout the information required to solve an issue in a consistent, up front manner. +Templates are new to the WEC-Sim workflow, and input on their use is welcome. +The development team hopes this will help address questions as quickly and thoroughly as possible for users.

+

Users may remove all italic descriptive text in a template, but must keep the bold headers that organize the issue. +Users who do not use a template will be asked to reopen their issue with the appropriate layout. +If the provided templates do not fit an issue, users may open a blank issue with an initial statement explaining why there is no template and providing sufficient information.

+

When opening an issue, please provide all relevant information. +Link to the relevant documentation section and past issues, and upload a case file whenever possible.

+
+
+
+

Numerical Test Cases

+

This section describe a series of numerical test cases that should be performed when creating a novel WEC-Sim case. +These various wave cases are necessary to ensure a robust, accurate solution and speed the debugging process for users. +When opening a support question for case development, users will be asked to supply information on which test cases are functioning or not. +Note that this workflow is not foolproof, but can be used as a guide to create a more robust WEC-Sim case.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Number

Purpose

Input parameters utilized

1A

Hydrostatic stability

noWave

1B

Hydrostatic stability

noWaveCIC

2A

Free Decay, hydrostatic stiffness

noWave, initial

2B

Free Decay, hydrostatic stiffness

noWaveCIC, initial

3A

Viscous drag

regular

3B

Viscous drag

regularCIC

4A

Full functionality

irregular, initial

+

Various problems may occur while progressing through these test cases. +Users should not advance to the next test unless the previous tests run without error and result in a physical response.

+
+

Hydrostatic Stability

+

Issues with Test 1A-B indicate there is an imbalance between the gravity and buoyant forces. +This may cause the “solution singularity” as described in the FAQ, or result in a body rising or falling indefinitely. +To solve this problem, recalculate the mass that will balance the displaced volume from the BEM data. +Alternatively utilize the body(#).mass = equilibrium option.

+
+
+

Free Decay

+

Failure in Test 2 but not Test 1 indicates an inaccurate hydrostatic stiffness. +The hydrostatic stiffness returns a device to equilibrium after some displacement. +If the stiffness is too large, the simulation may require a very small time step. +If too small, an initial displacement may cause infinite motion. +Reevaluate the BEM input or tune the stiffness with body(#).hydroStiffness in the input file.

+
+
+

Viscous Drag

+

A hydrostatically stable device that has an unphysical response to a regular wave requires improved drag and damping. +BEM codes inherently assume inviscid flow. Recreating the effects of viscous drag in WEC-Sim is essential to obtaining a physical response. +Tune the parameters body(#).quadDrag or body(#).linearDamping to create a realistic response to a regular wave.

+
+
+

Irregular Waves

+

If Test 4 fails, users should check that the IRF decays to zero in BEMIO as done for the other CIC waves. Users may also investigate +different body drag, or change the mooring and PTO stiffness or damping. The state space or other numerical options may be helpful to stabilize the irregular wave case. +Once a simulation is stable and realistic in Test 4 and all previous test cases, it can likely be used in additional cases as desired. +Passing these test cases does not necessarily indicate accuracy, but it should result in a simulation without numerical errors. +It is up to each user to tune body, PTO and mooring parameters appropriately to model a device accurately.

+
+
+

Other Tests

+

Tests A vs B: +CIC waves are one way to evaluate if “good” BEM data is being used. +If a non-CIC wave has unphysical behavior at a specific frequency but not others, there are likely irregular frequency (IRR) spikes in the BEM data. +The CIC wave decreases the impact of these spikes in radiation damping.

+

If a CIC wave continues to oscillate without decaying to a steady state, the convolution integral time is not long enough. +Increase simu.cicEndTime to a greater value or use the state space option (simu.stateSpace=1). +In BEMIO, check that the convolution integral time is long enough for all oscillations to decay.

+

Nonlinear Hydrodynamics: +If a user wishes to use the nonlinear hydro options, they should first follow this same workflow with simu.nonlinearHydro=0 and again with simu.nonlinearHydro=1,2 +The nonlinear hydro options are difficult to set-up and must be used with care. +A highly refined mesh is required to get an accurate displaced volume and wetted surface area at each time step.

+
+
+
+

FAQs

+

This section highlights some of the Frequently Asked Questions from WEC-Sim issues. +All FAQ information is available in closed GitHub issues, but is repeated here for convenience.

+
+

Solution Singularity

+

Problem: +The simulation is numerically unstable. Bodies may rise or fall indefinitely and have unphysical responses. +This occurs because there is an imbalance between the gravity and hydrostatic forces. +If the gravity force is much larger than the hydrostatic force, bodies may fall indefinitely. +The opposite may occur when gravity is small compared to the hydrostatic force. +An extremely large or small stiffness can also cause this problem. +A small stiffness may not restore a body to an equilibrium position. +A large stiffness may require a very small time step to be effective.

+

Possible error messages:

+
Derivative of state ... in block ... at time ... is not finite.
+The simulation will be stopped. There may be a singularity in the solution
+
+
+

Solution: +Re-evaluate the hydrostatic stability of the device. +Compare the mass and displaced volume of the device to evaluate if it will float properly. +Calculate an approximate stiffness that will restore the body to equilibrium in still water. +Compare the mass, volume, and stiffness to those results in the BEM data.

+
+
+

Degenerate Mass Distribution

+

Problem: +When two PTOs or Constraints are connected in series with no mass between them, Simulink attempts to connect two joint blocks directly together. +Simulink cannot reconcile the forcing and motion between these series joints without a mass between them.

+

Possible error messages:

+
... Joint has a degenerate mass distribution on its base/follower side.
+
+
+

Solution: +Add an insignificantly small mass between the two joints (e.g. Simulink Library/Simscape/Multibody/Body Elements/Inertia) . +Alternatively, create a new PTO or constraint with one of the many joints available in the +Simscape Multibody Joints library if special degrees of freedom are required.

+
+
+

Hydrodynamic Data File

+

Problem: +The path to the *.h5 file does not exist or it is incomplete (size < 1kB).

+

Possible error messages:

+
The hdf5 file hydroData/*.h5 does not exist
+
+
+
This is not the correct *.h5 file. Please install git-lfs to access the correct *.h5 file,
+or run \hydroData\bemio.m to generate a new *.h5 file
+
+
+

Solution: +Check the path to the *.h5 file in the wecSimInputFile.m or run BEMIO to generate a new *.h5 file.

+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/tutorials.html b/dev/user/tutorials.html new file mode 100644 index 000000000..01919d715 --- /dev/null +++ b/dev/user/tutorials.html @@ -0,0 +1,722 @@ + + + + + + + + + Tutorials — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Tutorials

+

This section provides step-by-step instructions on how to set-up and run the WEC-Sim code +using the provided Tutorials (located in the WEC-Sim $WECSIM/tutorials +directory). Two WEC-Sim tutorials are provided: the Two-Body Point Absorber +(RM3), and the Oscillating Surge WEC (OSWEC). +For cases that are already set-up and ready to run, see Step 3 of Install WEC-Sim.

+

For information about the implementation of the WEC-Sim code refer to the +Code Structure section. +For information about additional WEC-Sim +features, refer to Advanced Features.

+
+

Two-Body Point Absorber (RM3)

+

This section describes the application of the WEC-Sim code to model the +Reference Model 3 (RM3) two-body point absorber WEC. This tutorial is provided +in the WEC-Sim code release in the $WECSIM/tutorials directory.

+
+

Device Geometry

+

The RM3 two-body point absorber WEC has been characterized both numerically and +experimentally as a result of the DOE-funded Reference Model Project. The RM3 is a two-body point absorber +consisting of a float and a reaction plate. Full-scale dimensions and mass +properties of the RM3 are shown below.

+
+../_images/RM3_Geom.png + +
+ + + + + + + + + + + + + + +

Body

Mass (tonne)

Float

727.01

Plate

878.30

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Body

Direction

Center of Gravity* (m)

Inertia Tensor (kg m^2)

Float

x

0

20,907,301

0

0

y

0

0

21,306,091

0

z

-0.72

0

0

37,085,481

Plate

x

0

94,419,615

0

0

y

0

0

94,407,091

0

z

-21.29

0

0

28,542,225

+

* The origin lies at the undisturbed free surface (SWL)

+
+
+

Model Files

+

Below is an overview of the files required to run the RM3 simulation in +WEC-Sim. For the RM3 WEC, there are two corresponding geometry files: +float.stl and plate.stl. In addition to the required files listed +below, users may supply a userDefinedFunctions.m file for post-processing +results once the WEC-Sim run is complete.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Input File

wecSimInputFile.m

$WECSIM/tutorials/rm3/

Simulink Model

rm3.slx

$WECSIM/tutorials/rm3/

Hydrodynamic Data

rm3.h5

$WECSIM/tutorials/rm3/hydroData/

Geometry Files

float.stl & plate.stl

$WECSIM/tutorials/rm3/geometry/

+
+
+

RM3 Tutorial

+
+

Step 1: Run BEMIO

+

Hydrodynamic data for each RM3 body must be parsed into a HDF5 file using +BEMIO. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, *.h5 that is then read by WEC-Sim. +The RM3 tutorial includes data from a WAMIT run, rm3.out, of the RM3 +geometry in the $WECSIM/tutorials/rm3/hydroData/ directory. The RM3 WAMIT +rm3.out file and the BEMIO bemio.m script are then used to generate the +rm3.h5 file.

+

This is done by navigating to the $WECSIM/tutorials/rm3/hydroData/ +directory, and typing``bemio`` in the MATLAB Command Window:

+
>> bemio
+
+
+
+ +
+

Step 3: Write wecSimInputFile.m

+

The WEC-Sim input file defines simulation parameters, body properties, joints, +and mooring for the RM3 model. The wecSimInputFile.m for the RM3 is +provided in the RM3 case directory, and shown below.

+

New users should manually write the wecSimInputFile.m to become familiar with +the set-up parameters and the files being called in a basic WEC-Sim run. First, +define the simulation parameters. Initialize an instance of the +simulationClass. Define the simulink file to use, the start, ramp and end +times, and the time step required. The simulation class also controls all +relevant numerical options and simulation-wide parameters in a single +convenient class.

+

Next set-up the type of incoming wave by instantiating the waveClass. ‘Regular’ +is a sinusoidal wave and the easiest to start with. Define an appropriate wave +height and period. Waves can also be an irregular spectrum, imported by +elevation or spectrum, or multidirectional.

+

Third, define all bodies, PTOs and constraints present in the simulink file. +There are distinct classes for bodies, PTOs and constraints that contain +different properties and function differently. Bodies are hydrodynamic and +contain mass and geometry properties. Initialize bodies by calling the +bodyClass and the path to the relevant h5 file. Set the path to the geometry +file, and define the body’s mass properties. PTOs and constraints are more +simple and contain forces and power dissipation (in the constraint) that limit +the WEC’s motion. PTOs and constraints can be set by calling the appropriate +class with the Simulink block name. Set the location and any PTO damping or +stiffness desired.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'RM3.slx';              % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                         	% Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]
+simu.dt = 0.1;                                  % Simulation time-step [s]
+
+%% Wave Information  
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Float
+body(1) = bodyClass('hydroData/rm3.h5');        % Initialize bodyClass for Float
+body(1).geometryFile = 'geometry/float.stl';    % Geometry File
+body(1).mass = 'equilibrium';                   % Mass [kg]
+body(1).inertia = [20907301 21306090.66 37085481.11];  % Moment of Inertia [kg*m^2]     
+
+% Spar/Plate
+body(2) = bodyClass('hydroData/rm3.h5');        % Initialize bodyClass for Spar
+body(2).geometryFile = 'geometry/plate.stl';    % Geometry File
+body(2).mass = 'equilibrium';                   % Mass [kg]
+body(2).inertia = [94419614.57 94407091.24 28542224.82]; % Moment of Inertia [kg*m^2]
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 0];                    % Constraint Location [m]
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                                   % PTO Stiffness [N/m]
+pto(1).damping = 1200000;                             % PTO Damping [N/(m/s)]
+pto(1).location = [0 0 0];                           % PTO Location [m]
+
+
+
+
+

Step 4: Run WEC-Sim

+

To execute the WEC-Sim code for the RM3 tutorial, type wecSim into the +MATLAB Command Window. Below is a figure showing the final RM3 Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the RM3 device, refer to [A1].

+
+../_images/RM3_WECSim_GUI.JPG + +
+
+
+

Step 5: Post-processing

+

The RM3 tutorial includes a userDefinedFunctions.m which plots RM3 +forces and responses. This file can be modified by users for +post-processing. Additionally, once the WEC-Sim run is complete, the +WEC-Sim results are saved to the output variable in the MATLAB +workspace.

+
+
+
+
+

Oscillating Surge WEC (OSWEC)

+

This section describes the application of the WEC-Sim code to model the +Oscillating Surge WEC (OSWEC). This tutorial is provided in the WEC-Sim +code release in the $WECSIM/tutorials directory.

+
+

Device Geometry

+

The OSWEC was selected because its design is fundamentally different from the +RM3. This is critical because WECs span an extensive design space, and it is +important to model devices in WEC-Sim that operate under different principles. +The OSWEC is fixed to the ground and has a flap that is connected through a +hinge to the base that restricts the flap in order to pitch about the hinge. +The full-scale dimensions and mass properties of the OSWEC are shown below.

+
+../_images/OSWEC_Geom.png + +
+ + + + + + + + + + + +

Body

Mass (tonne)

Flap

127

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Body

Direction

Center of Gravity* (m)

Moment of Inertia Tensor (kg m^2)

Flap

x

0

0

0

0

y

0

0

1,850,000

0

z

-3.9

0

0

0

+
+

Note

+

The global frame lies at the undisturbed free surface. The body-fixed frame is at the center of gravity. Since the OSWEC is modeled as a pitch device, only the Iyy Moment of Inertia has been defined.

+
+
+
+

Model Files

+

Below is an overview of the files required to run the OSWEC simulation in +WEC-Sim. For the OSWEC, there are two corresponding geometry files: +flap.stl and base.stl. In addition to the required files listed below, +users may supply a userDefinedFunctions.m file for post-processing results +once the WEC-Sim run is complete.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Input File

wecSimInputFile.m

$WECSIM/tutorials/oswec/

Simulink Model

oswec.slx

$WECSIM/tutorials/oswec/

Hydrodynamic Data

oswec.h5

$WECSIM/tutorials/oswec/hydroData/

Geometry Files

flap.stl & base.stl

$WECSIM/tutorials/oswec/geometry/

+
+
+

OSWEC Tutorial

+
+

Step 1: Run BEMIO

+

Hydrodynamic data for each OSWEC body must be parsed into a HDF5 file using +BEMIO. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, *.h5 that is then read by WEC-Sim. +The OSWEC tutorial includes data from a WAMIT run, oswec.out, of the OSWEC +geometry in the $WECSIM/tutorials/rm3/hydroData/ directory. The OSWEC WAMIT +oswec.out file and the BEMIO bemio.m script are then used to generate +the oswec.h5 file.

+

This is done by navigating to the $WECSIM/tutorials/oswec/hydroData/ +directory, and typing``bemio`` in the MATLAB Command Window:

+
>> bemio
+
+
+
+
+

Step 2: Build Simulink Model

+

The WEC-Sim Simulink model is created by dragging and dropping blocks from the +WEC-Sim Library into the oswec.slx file.

+
    +
  • Place two Rigid Body blocks from the WEC-Sim Library in the Simulink +model file, one for each OSWEC rigid body.

  • +
  • Double click on the Rigid Body block, and rename each instance of the +body. The first body must be called body(1), and the second body should be +called body(2).

  • +
+
+../_images/OSWEC_WECSim_Body.jpg + +
+
    +
  • Place the Global Reference Frame from Frames in the WEC-Sim Library +in the Simulink model file. The global reference frame acts as the seabed.

  • +
+
+../_images/OSWEC_WECSim_GlobalRef.jpg + +
+
    +
  • Place the Fixed block from Constraints to connect the base to the +seabed. This constrains the base to be fixed relative to the Global Reference +Frame.

  • +
  • Place a Rotational PTO block to connect the base to the flap. This +constrains the flap to move in pitch relative to the base, and allows for the +definition of PTO damping.

  • +
+
+../_images/OSWEC_WECSim.JPG + +
+
+

Note

+

When setting up a WEC-Sim model, it is very important to note the base and +follower frames.

+
+
+
+

Step 3: Write wecSimInputFile.m

+

The WEC-Sim input file defines simulation parameters, body properties, and +joints for the OSWEC model. Writing the OSWEC input file is similar to writing +the RM3 input. Try writing it on your own. Define the simulation class, wave +class, bodies, constraints and PTOs. The wecSimInputFile.m for the OSWEC is +provided in the OSWEC case directory, and shown below.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'OSWEC.slx';            % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                            % Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]   
+simu.dt = 0.1;                                  % Simulation Time-Step [s]
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass                                 
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Flap
+body(1) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Flap 
+body(1).geometryFile = 'geometry/flap.stl';     % Geometry File
+body(1).mass = 127000;                          % Mass [kg]
+body(1).inertia = [1.85e6 1.85e6 1.85e6];  % Moment of Inertia [kg-m^2]
+
+% Base
+body(2) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Base
+body(2).geometryFile = 'geometry/base.stl';     % Geometry File
+body(2).mass = 999;                             % Fixed Body Mass
+body(2).inertia = [999 999 999];                % Fixed Body Inertia
+
+%% PTO and Constraint Parameters
+% Fixed
+constraint(1)= constraintClass('Constraint1');  % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 -10];                  % Constraint Location [m]
+
+% Rotational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [Nm/rad]
+pto(1).damping = 0;                                   % PTO Damping [Nsm/rad]
+pto(1).location = [0 0 -8.9];                        % PTO Location [m]
+
+
+
+
+

Step 4: Run WEC-Sim

+

To execute the WEC-Sim code for the OSWEC tutorial, type wecSim into the +MATLAB Command Window. Below is a figure showing the final OSWEC Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the OSWEC device, refer to [A2, A3].

+
+../_images/OSWEC_WECSim_GUI.jpg + +
+
+
+

Step 5: Post-processing

+

The OSWEC tutorial includes a userDefinedFunctions.m which plots OSWEC +forces and responses. This file can be modified by users for post-processing. +Additionally, once the WEC-Sim run is complete, the WEC-Sim results are saved +to the output variable in the MATLAB workspace.

+
+
+
+
+

WEC-Sim Examples

+

Working examples of using WEC-Sim to model the RM3, OSWEC, and RM3FromSimulink are provided in +the $WECSIM/examples/ directory. For each example the wecSimInputFile.m +provided includes examples of how to run different wave cases:

+
    +
  • noWaveCIC - no wave with convolution integral calculation

  • +
  • regularCIC - regular waves with convolution integral calculation

  • +
  • irregular - irregular waves using a Pierson-Moskowitz spectrum with convolution integral calculation

  • +
  • irregular - irregular waves using a Bretschneider Spectrum with state space calculation

  • +
  • spectrumImport - irregular waves using a user-defined spectrum

  • +
  • elevationImport - user-defined time-series

  • +
  • +
    Run from MATLAB Command Window (for RM3 and OSWEC examples)
      +
    • Type wecSim in the Command Window

    • +
    +
    +
    +
  • +
  • +
    Run from Simulink (for RM3FromSimulink example)
      +
    • Open the relevant WEC-Sim Simulink file

    • +
    • Type initializeWecSim in the Command Window

    • +
    • Hit Play in Simulink model to run

    • +
    +
    +
    +
  • +
+

To customize or develop a new WEC-Sim model that runs from Simulink (e.g. for Hardware-in-the-Loop, HIL, applications) refer to Running from Simulink for more information. +Users may also use wecSimMCR, wecSimPCT, wecSimFcn and as described in the advanced features +sections Multiple Condition Runs (MCR) and Parallel Computing Toolbox (PCT). +These options are only available through the MATLAB Command Window.

+
+
+

References

+
+
+
+[A1] +

K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y. Yu. Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool. In Proceedings of OMAE 2014. San Francisco, CA, 2014.

+
+
+[A2] +

Y. Yu, M. Lawson, K. Ruehl, and C. Michelen. Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool. In Proceedings of the 2nd Marine Energy Technology Symposium. Seattle, WA, USA, 2014.

+
+
+[A3] +

Y. Yu, Y. Li, K. Hallett, and C. Hotimsky. Design and Analysis for a Floating Oscillating Surge Wave Energy Converter. In Proceedings of OMAE 2014. San Francisco, CA, 2014.

+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/webinars.html b/dev/user/webinars.html new file mode 100644 index 000000000..f779e7da5 --- /dev/null +++ b/dev/user/webinars.html @@ -0,0 +1,430 @@ + + + + + + + + + Training Materials — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Training Materials

+

The WEC-Sim team developed an online training course, and hosted advanced features webinars. +Recordings of each course are available below, along with the presentations.

+
+

Online Training Course

+

The WEC-Sim team developed an online training course. +This course provides an overview of what that WEC-Sim software does, and how to use it. +Recordings of each course are available below, along with the presentations.

+
+

Overview

+

The section provides a big-picture overview of the WEC-Sim software. +The WEC-Sim Overview presentation is available for download here (WEC-Sim +Overview Slides), and the +recording is available below.

+
+
+
+
+

Theory & Workflow

+

This section discusses the WEC-Sim theory and workflow. +The WEC-Sim Theory & Workflow presentation is available +for download here (Theory & Workflow Slides), and the recording is available below.

+
+
+
+
+

Installation

+

This section described how to install WEC-Sim. +The WEC-Sim Installation presentation is available to download here (Theory & Workflow Slides), and the recording is available below.

+
+
+
+
+

Code Structure

+

This section provides an overview of how the WEC-Sim code is +structured by describing the WEC-Sim Source Code (e.g. +WEC-Sim Classes and WEC-Sim Library, and +how they are defined in the WEC-Sim Case Files (i.e. +wecSimInputFile.m and <Simulink_model_name>.slx). +The Code Structure Overview presentation is available to download here (WEC-Sim Code +Structure Slides), and the +recording is available below.

+
+
+
+
+

BEMIO

+

This section of the course discusses how BEMIO is used to extract the hydrodynamic coefficients generated by a BEM software, +and post-process themfor use by WEC-Sim. +The BEMIO routines also help calculate impulse response functions, and plot data. +The BEMIO presentation can be donloaded here (BEMIO Slides), and the +recording is available below.

+
+
+
+
+

Wave Class

+

This section of the course provides an overview of how waves are implemented in +the WEC-Sim code, both in the Wave Class, and in the +WEC-Sim Library. +The Wave Class presentation is +available for download here (Wave Implementation Slides), and the recording +is available below.

+
+
+
+
+

Body Class

+

This section of the course provides an overview of how bodies are implemented +in the WEC-Sim code, both in the Body Class, and in +the WEC-Sim Library. The Body Class presentation is +available for download here (Body Implementation Slides), and the recording +is available below.

+
+
+
+
+

Tutorial

+

This section shows users how to set up an run a the WEC-Sim tutorial. +The Tutorial presentation is available to download here (WEC-Sim Tutorial), and the recording +is available below.

+
+
+
+
+
+

Advanced Features Series

+

The WEC-Sim team hosted a series of Advanced Features Series. The +topics are listed below. Recordings of each are available below, along with the +presentations.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Series

Topic

1

Multiple Condition Runs (MCR)

2

Nonlinear Hydrodynamics

3

Non-hydrodynamic Bodies

4

Body-to-Body Interactions

5

PTO-Sim

6

WEC-Sim Controls

7

Modeling Cables

8

Using Moordyn with WEC-Sim

9

Modeling OWC Devices

10

Desalination

11

WEC-Sim Visualization

+
+
+

Series 1 - Multiple Condition Runs (MCR)

+

The series presents an overview of how to run multiple cases in WEC-Sim. The +presentation is available for download here ( Series 1 Slides ), and the recording is +available below.

+

Series 1 - Multiple Condition Runs (MCR)

+
+
+
+
+

Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+

This section is focused on how to implement Nonlinear Buoyancy and Froude-Krylov Wave Excitation forces in WEC-Sim. +The presentation is available +for download here ( Series 2 Slides ), +and the recordings are available below.

+

Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+
+
+
+
+

Series 3 - Non-hydrodynamic Bodies

+

This webinar presents an overview of the non-hydrodynamic body implementation in WEC-Sim. The +presentation is available for download here ( Series 3 Slides ), and the recordings are +available below.

+

Series 3 - Non-hydrodynamic Bodies

+
+
+
+
+

Series 4 - Body-to-Body Interactions

+

This is section of the Advanced Features Series presents some examples of how body-to-body interactions are modeled in WEC-Sim. +The presentation is available for download here ( Series 4 Slides ), and the recordings are +available below.

+

Series 4 - Body-to-Body Interactions

+
+
+
+
+

Series 5 - PTO-Sim

+

This section is focused on PTO-Sim. +The presentation is available for download here ( Series 5 Slides ), and the recordings are +available below.

+

Series 5 - PTO-Sim

+
+
+
+
+

Series 6 - WEC-Sim Controls

+

This section presents some examples of how to implement control algorithms for WECs using WEC-Sim. +The presentation is available for download here ( Series 6 Slides ), and the recordings are +available below.

+

Series 6 - WEC-Sim Controls

+
+
+
+
+

Series 7 - Modeling Cables

+

This section is focused on the Cable Block from WEC-Sim. +The presentation is available for download here ( Series 7 Slides ), and the recordings are +available below.

+

Series 7 - Modeling Cables

+
+
+
+
+

Series 8 - Using MoorDyn with WEC-Sim

+

This section presents an overview of how to use MoorDyn with WEC-Sim. +The presentation is available for download here ( Series 8 Slides ), and the recordings are +available below.

+

Series 8 - Using MoorDyn with WEC-Sim

+
+
+
+

Note

+

The above MoorDyn webinar is based on MoorDyn v1 and is in the process of being updated +for MoorDyn v2. Please refer to Mooring Features for instruction on +using WEC-Sim with MoorDyn v2.

+
+
+
+

Series 9 - Modeling OWC Devices

+

This section presents an overview of how to use model OWC devices using WEC-Sim. +The presentation is available for download here ( Series 9 Slides ), and the recordings are +available below.

+

Series 9 - Modeling OWC Devices

+
+
+
+
+

Series 10 - Desalination

+

This section presents an overview of how to use WEC-Sim to model a desalination application. +The presentation is available for download here ( Series 10 Slides ), and the recordings are +available below.

+

Series 10 - Desalination

+
+
+
+
+

Series 11 - WEC-Sim Visualization

+

This section presents an overview of how to post-process results in WEC-Sim. +The presentation is available for download here ( Series 11 Slides ), and the recordings are +available below.

+

Series 11 - WEC-Sim Visualization

+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/dev/user/workflow.html b/dev/user/workflow.html new file mode 100644 index 000000000..e00302113 --- /dev/null +++ b/dev/user/workflow.html @@ -0,0 +1,482 @@ + + + + + + + + + Workflow — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Workflow

+

The WEC-Sim workflow diagram below shows a high level view of WEC-Sim’s functionality. +As a precursor, a WEC design must be defined in an input file and the Simulink model file. +This input file is read by WEC-Sim which instantiates objects based on parameters defined in the input file. +The objects are used in conjunction with WEC-Sim’s Simulink library during the time-domain simulation. +User defined functions serve for easy post-processing and visualization of WEC-Sim’s output. +A detailed description of this workflow is provided in the following sections. +For information about the implementation and structure of the WEC-Sim source code, refer to the Code Structure section.

+
+../_images/WEC-Sim_flowChart.png + +
+
+

WEC-Sim Workflow Diagram

+
+
+
+
+

WEC-Sim Case Files

+

All files required for a WEC-Sim simulation must be contained within a case directory referred to as $CASE. +The case directory can be located anywhere on your computer. +It must include: geometry file(s), hydrodynamic data saved to a *.h5 data structure, a WEC-Sim input file, and a Simulink model of the device. +The table below lists the WEC-Sim case directory structure and required files.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Geometry File(s)

*.stl

$CASE/geometry

Hydrodynamic Data

*.h5

$CASE/hydroData

Input File

wecSimInputFile.m

$CASE

Simulink Model

*.slx

$CASE

+
+

Note

+

Where * denotes a user-specified file name.

+
+
+

Geometry File

+

WEC-Sim requires geometry file(s) (*.stl) that define each body. +The origin of the geometry file(s) must be at the body’s center of gravity. +When running WEC-Sim with linear hydrodynamics, the *.stl is only used for the Simscape Mechanics Explorer visualization. +However, when running WEC-Sim with nonlinear buoyancy and Froude-Krylov forces the STL mesh determines the instantaneous wetted surface at each time step. +In this nonlinear case, the quality of the STL mesh is critical, refer to the Nonlinear Buoyancy and Froude-Krylov Excitation section for more information.

+
+
+

Hydrodynamic Data

+

Hydrodynamic data for each body may be generated using a boundary element method (BEM) software. +WEC-Sim requires hydrodynamic data from a BEM solution in the form of a HDF5 file (*.h5). +This *.h5 hydrodynamic data file can be generated using the BEMIO pre-processor. +BEMIO (Boundary Element Method Input/Output) is a pre-processing software developed by the WEC-Sim team to parse BEM output files from WAMIT, NEMOH, Aqwa, and Capytaine into a data structure, saved as a *.h5 file, that can be read by WEC-Sim. +For more information about the BEMIO pre-processor, refer to the BEMIO section.

+
+
+

Input File

+

A WEC-Sim input file (wecSimInputFile.m) is required. +The input file MUST be named wecSimInputFile.m and placed within the case directory. +WEC-Sim uses object orientated programming to describe components of the WEC model; +the main structure of the input file consists of initializing the WEC-Sim objects and defining properties for each object. +The input file requires initialization and definition of the simulation and wave classes, at least one instance of the body class, and at least one instance of the constraint or PTO classes. +For details about WEC-Sim’s classes and available properties for each, refer to the WEC-Sim Classes section.

+

The WEC-Sim input file (wecSimInputFile.m) for the OSWEC example (WEC-Sim/examples/OSWEC/) is shown below. +WEC-Sim is an object oriented code and the input file reflects this by instantiating the WEC-Sim classes to create objects that are tied to the Simulink library. +The OSWEC input file initializes and defines properties for the simulation, body, constraint and pto classes.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'OSWEC.slx';            % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                            % Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]   
+simu.dt = 0.1;                                  % Simulation Time-Step [s]
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass                                 
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Flap
+body(1) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Flap 
+body(1).geometryFile = 'geometry/flap.stl';     % Geometry File
+body(1).mass = 127000;                          % Mass [kg]
+body(1).inertia = [1.85e6 1.85e6 1.85e6];  % Moment of Inertia [kg-m^2]
+
+% Base
+body(2) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Base
+body(2).geometryFile = 'geometry/base.stl';     % Geometry File
+body(2).mass = 999;                             % Fixed Body Mass
+body(2).inertia = [999 999 999];                % Fixed Body Inertia
+
+%% PTO and Constraint Parameters
+% Fixed
+constraint(1)= constraintClass('Constraint1');  % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 -10];                  % Constraint Location [m]
+
+% Rotational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [Nm/rad]
+pto(1).damping = 0;                                   % PTO Damping [Nsm/rad]
+pto(1).location = [0 0 -8.9];                        % PTO Location [m]
+
+
+

Additional examples are provided in the Tutorials section.

+
+ +
+
+

Running WEC-Sim

+

This section provides a description of the steps to run the WEC-Sim code. Refer +to the WEC-Sim Workflow Diagram while following +the steps to run WEC-Sim.

+
+

Step 1: Pre-Processing

+

In the pre-processing step, users need to create the WEC geometry, and run a +BEM code to calculate the hydrodynamic coefficients.

+
    +
  • Create WEC Geometry:

    +
    +
      +
    • Create CAD models of the WEC geometry and export it to a *.stl format.

    • +
    • The *.stl files are used to visualize the WEC response in Simscape +Explorer

    • +
    • They are also used for Nonlinear Buoyancy and Froude-Krylov Excitation forces if +the option is enabled.

    • +
    +
    +
  • +
  • Compute Hydrodynamic Coefficients: WEC-Sim requires frequency-domain +hydrodynamic coefficients (e.g. added mass, radiation damping, and wave +excitation).

    +
    +
      +
    • The coefficients for each body may be generated using a boundary element +method (BEM) code (e.g., WAMIT, NEMOH, Aqwa, or Capytaine).

    • +
    • WEC-Sim requires that all hydrodynamic coefficients must be specified at +the center of gravity for each body.

    • +
    +
    +
  • +
+
+
+

Step 2: Generate Hydrodata File

+

In this step, users run BEMIO to convert +the hydrodynamic coefficients from their BEM solution into the *.h5 format +for WEC-Sim to read:

+
    +
  • Run BEMIO: to generate *.h5 Hydrodynamic Coefficients for WEC-Sim

    +
    +
      +
    • The hydrodynamic coefficients for each body generated from the BEM code +can be parsed into a *.h5 data structure using +BEMIO, which was developed by the +WEC-Sim team.

    • +
    • BEMIO currently supports WAMIT, NEMOH, Aqwa, and Capytaine.

    • +
    +
    +
  • +
+
+

Note

+
    +
  • If WAMIT is used:

    +
    +
      +
    • The origin of the body coordinate system (XBODY, defined in *.pot) +as well as the mesh for each body must be at the center of gravity.

    • +
    • The WAMIT mesh (*.gdf) can be generated using +Rhino or +MultiSurf.

    • +
    • More details on WAMIT setup are given in the +WAMIT User Manual.

    • +
    +
    +
  • +
  • If NEMOH is used:

    +
    +
      +
    • The origin of the mesh for each body (*.dat) is located at the mean +water surface.

    • +
    • The location to output the hydrodynamic coefficients for each degree of +freedom is defined in the Nemoh.cal file.

    • +
    • Please refer to NEMOH-Mesh +webpage for more mesh generation details.

    • +
    • The NEMOH Mesh.exe code creates the Hydrostatics.dat and KH.dat +files (among other files) for one input body at a time. For the +readNEMOH function to work correctly in the case of a multiple body +system, the user must manually rename Hydrostatics.dat and +KH.dat files to Hydrostatics_0.dat, Hydrostatics_1.dat, …, +and KH_0.dat, KH_1.dat,…, corresponding to the body order +specified in the Nemoh.cal file.

    • +
    • More details on NEMOH setup are given in the +Nemoh Homepage.

    • +
    +
    +
  • +
  • If Aqwa is used:

    +
    +
      +
    • The origin of the global coordinate system is at the mean water +surface, and the origin of the body coordinate system for each body +must be at the center of gravity (defined using the Aqwa GUI or in +the *.dat input file).

    • +
    • In order to run BEMIO, Aqwa users must output both the default +*.LIS file and output the *.AH1 hydrodynamic database file. +Both of these files are reacquired to run BEMIO.

    • +
    • More details on Aqwa setup are given in the Aqwa Reference Manual.

    • +
    +
    +
  • +
  • If Capytaine is used:

    +
    +
      +
    • The origin of the mesh for each body (*.dat) is located at the mean +water surface.

    • +
    • More details on Capytaine setup are given in the Capytaine webpage.

    • +
    +
    +
  • +
+
+
+

Note

+

Users are also able to specify their own hydrodynamic coefficients by +creating their own *.h5 file with customized hydrodynamic coefficients +following the *.h5 format created by BEMIO.

+
+
+

Note

+

We recommend installing HDFview https://www.hdfgroup.org/downloads/hdfview/ +to view the *.h5 files generated by BEMIO.

+
+
+ +
+

Step 4: Write wecSimInputFile.m

+

The WEC-Sim input file must be located in the $CASE directory, and named +wecSimInputFile.m. The figure below shows an example of a WEC-Sim input +file. The input file specifies the simulation settings, body mass properties, +wave conditions, joints, and mooring. Additionally, the WEC-Sim input file must +specify the location of the WEC-Sim Simulink model (*.slx) file, the +geometry file(s) *.stl, and the hydrodynamic data file (*.h5) .

+
+
+

Step 5: Run WEC-Sim

+

Lastly, WEC-Sim can be executed from the $CASE directory by typing wecSim from the Command Window:

+
>> wecSim
+
+
+

Refer to WEC-Sim Examples for more details on how to run the examples. +Users may also run WEC-Sim from Simulink, or use the commands wecSimMCR, +wecSimPCT, and wecSimFcn as described in the advanced features +sections Running from Simulink, +Multiple Condition Runs (MCR), Parallel Computing Toolbox (PCT), +and Running as Function.

+
+

Note

+

The WEC-Sim source code is located in the $WECSIM directory, but +WEC-Sim must be executed from the $CASE directory. +The MATLAB path must include the WEC-Sim source directory.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: dev + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..3bbdcc128 --- /dev/null +++ b/index.html @@ -0,0 +1,10 @@ + + + + Redirecting to main branch + + + + + diff --git a/main/_images/AdjustableRodHPTO.png b/main/_images/AdjustableRodHPTO.png new file mode 100644 index 000000000..0eb091104 Binary files /dev/null and b/main/_images/AdjustableRodHPTO.png differ diff --git a/main/_images/DirectDrivePorts.png b/main/_images/DirectDrivePorts.png new file mode 100644 index 000000000..6f71673be Binary files /dev/null and b/main/_images/DirectDrivePorts.png differ diff --git a/main/_images/GeneratorSpeedControl.png b/main/_images/GeneratorSpeedControl.png new file mode 100644 index 000000000..82047be13 Binary files /dev/null and b/main/_images/GeneratorSpeedControl.png differ diff --git a/main/_images/HYDPHYMODEL.PNG b/main/_images/HYDPHYMODEL.PNG new file mode 100644 index 000000000..4517f4bea Binary files /dev/null and b/main/_images/HYDPHYMODEL.PNG differ diff --git a/main/_images/HorizontalVerticalOrbitalVelocity.jpg b/main/_images/HorizontalVerticalOrbitalVelocity.jpg new file mode 100644 index 000000000..a2ffc5652 Binary files /dev/null and b/main/_images/HorizontalVerticalOrbitalVelocity.jpg differ diff --git a/main/_images/IMAGE_Aeroload_Control_Submodel.png b/main/_images/IMAGE_Aeroload_Control_Submodel.png new file mode 100644 index 000000000..6a53fd442 Binary files /dev/null and b/main/_images/IMAGE_Aeroload_Control_Submodel.png differ diff --git a/main/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png b/main/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png new file mode 100644 index 000000000..38ed9e9ec Binary files /dev/null and b/main/_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png differ diff --git a/main/_images/IMAGE_Baseline_Torque_Law.png b/main/_images/IMAGE_Baseline_Torque_Law.png new file mode 100644 index 000000000..199a373ca Binary files /dev/null and b/main/_images/IMAGE_Baseline_Torque_Law.png differ diff --git a/main/_images/IMAGE_Body_Block_example.png b/main/_images/IMAGE_Body_Block_example.png new file mode 100644 index 000000000..21761b676 Binary files /dev/null and b/main/_images/IMAGE_Body_Block_example.png differ diff --git a/main/_images/IMAGE_LogoMOREnergyLab.png b/main/_images/IMAGE_LogoMOREnergyLab.png new file mode 100644 index 000000000..3d91f7af3 Binary files /dev/null and b/main/_images/IMAGE_LogoMOREnergyLab.png differ diff --git a/main/_images/IMAGE_LogoPolitecnicodiTorino.jpg b/main/_images/IMAGE_LogoPolitecnicodiTorino.jpg new file mode 100644 index 000000000..94cfe9c13 Binary files /dev/null and b/main/_images/IMAGE_LogoPolitecnicodiTorino.jpg differ diff --git a/main/_images/IMAGE_MOST_Library.png b/main/_images/IMAGE_MOST_Library.png new file mode 100644 index 000000000..a7b6b9b24 Binary files /dev/null and b/main/_images/IMAGE_MOST_Library.png differ diff --git a/main/_images/IMAGE_ROSCO_Power_Curve.png b/main/_images/IMAGE_ROSCO_Power_Curve.png new file mode 100644 index 000000000..be117c07d Binary files /dev/null and b/main/_images/IMAGE_ROSCO_Power_Curve.png differ diff --git a/main/_images/IMAGE_Results_Plots_example.png b/main/_images/IMAGE_Results_Plots_example.png new file mode 100644 index 000000000..4f390b428 Binary files /dev/null and b/main/_images/IMAGE_Results_Plots_example.png differ diff --git a/main/_images/IMAGE_Steady_States.png b/main/_images/IMAGE_Steady_States.png new file mode 100644 index 000000000..1faa8a7a1 Binary files /dev/null and b/main/_images/IMAGE_Steady_States.png differ diff --git a/main/_images/IMAGE_Volturn15MW_Simulink_example.png b/main/_images/IMAGE_Volturn15MW_Simulink_example.png new file mode 100644 index 000000000..b33207eb8 Binary files /dev/null and b/main/_images/IMAGE_Volturn15MW_Simulink_example.png differ diff --git a/main/_images/IMAGE_blade_geom.png b/main/_images/IMAGE_blade_geom.png new file mode 100644 index 000000000..5b881833d Binary files /dev/null and b/main/_images/IMAGE_blade_geom.png differ diff --git a/main/_images/IMAGE_geometry.png b/main/_images/IMAGE_geometry.png new file mode 100644 index 000000000..e31f9652c Binary files /dev/null and b/main/_images/IMAGE_geometry.png differ diff --git a/main/_images/IMAGE_wind_Choice.png b/main/_images/IMAGE_wind_Choice.png new file mode 100644 index 000000000..e719af5e0 Binary files /dev/null and b/main/_images/IMAGE_wind_Choice.png differ diff --git a/main/_images/IMAGE_workflow.png b/main/_images/IMAGE_workflow.png new file mode 100644 index 000000000..90d00a615 Binary files /dev/null and b/main/_images/IMAGE_workflow.png differ diff --git a/main/_images/MECHANICALPTO.PNG b/main/_images/MECHANICALPTO.PNG new file mode 100644 index 000000000..7a14f728f Binary files /dev/null and b/main/_images/MECHANICALPTO.PNG differ diff --git a/main/_images/MagAngleOrbitalVelocity.jpg b/main/_images/MagAngleOrbitalVelocity.jpg new file mode 100644 index 000000000..8e7814ef1 Binary files /dev/null and b/main/_images/MagAngleOrbitalVelocity.jpg differ diff --git a/main/_images/MoorDyn_Graphic.png b/main/_images/MoorDyn_Graphic.png new file mode 100644 index 000000000..7db247629 Binary files /dev/null and b/main/_images/MoorDyn_Graphic.png differ diff --git a/main/_images/MotionConversionLib.png b/main/_images/MotionConversionLib.png new file mode 100644 index 000000000..75ca70259 Binary files /dev/null and b/main/_images/MotionConversionLib.png differ diff --git a/main/_images/Nwave.png b/main/_images/Nwave.png new file mode 100644 index 000000000..52ef4f2b4 Binary files /dev/null and b/main/_images/Nwave.png differ diff --git a/main/_images/OSWECPHYMODEL.PNG b/main/_images/OSWECPHYMODEL.PNG new file mode 100644 index 000000000..101bff6bf Binary files /dev/null and b/main/_images/OSWECPHYMODEL.PNG differ diff --git a/main/_images/OSWECPTOSimExample.png b/main/_images/OSWECPTOSimExample.png new file mode 100644 index 000000000..300361cf0 Binary files /dev/null and b/main/_images/OSWECPTOSimExample.png differ diff --git a/main/_images/OSWEC_Geom.png b/main/_images/OSWEC_Geom.png new file mode 100644 index 000000000..15a94455e Binary files /dev/null and b/main/_images/OSWEC_Geom.png differ diff --git a/main/_images/OSWEC_Model.png b/main/_images/OSWEC_Model.png new file mode 100644 index 000000000..ed4b95a85 Binary files /dev/null and b/main/_images/OSWEC_Model.png differ diff --git a/main/_images/OSWEC_WECSim.JPG b/main/_images/OSWEC_WECSim.JPG new file mode 100644 index 000000000..2a8ba5797 Binary files /dev/null and b/main/_images/OSWEC_WECSim.JPG differ diff --git a/main/_images/OSWEC_WECSim_Body.jpg b/main/_images/OSWEC_WECSim_Body.jpg new file mode 100644 index 000000000..97165ee5e Binary files /dev/null and b/main/_images/OSWEC_WECSim_Body.jpg differ diff --git a/main/_images/OSWEC_WECSim_GUI.jpg b/main/_images/OSWEC_WECSim_GUI.jpg new file mode 100644 index 000000000..084edab6c Binary files /dev/null and b/main/_images/OSWEC_WECSim_GUI.jpg differ diff --git a/main/_images/OSWEC_WECSim_GlobalRef.jpg b/main/_images/OSWEC_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..5a354f2c3 Binary files /dev/null and b/main/_images/OSWEC_WECSim_GlobalRef.jpg differ diff --git a/main/_images/OSWEC_heaveForces.PNG b/main/_images/OSWEC_heaveForces.PNG new file mode 100644 index 000000000..e7a120cc9 Binary files /dev/null and b/main/_images/OSWEC_heaveForces.PNG differ diff --git a/main/_images/OSWEC_pitchResponse.PNG b/main/_images/OSWEC_pitchResponse.PNG new file mode 100644 index 000000000..0d9e8ea82 Binary files /dev/null and b/main/_images/OSWEC_pitchResponse.PNG differ diff --git a/main/_images/OSWEC_plotEta.PNG b/main/_images/OSWEC_plotEta.PNG new file mode 100644 index 000000000..88abeda03 Binary files /dev/null and b/main/_images/OSWEC_plotEta.PNG differ diff --git a/main/_images/OSWEC_plotSpectrum.PNG b/main/_images/OSWEC_plotSpectrum.PNG new file mode 100644 index 000000000..66bcf5191 Binary files /dev/null and b/main/_images/OSWEC_plotSpectrum.PNG differ diff --git a/main/_images/OSWEC_plotWaves.PNG b/main/_images/OSWEC_plotWaves.PNG new file mode 100644 index 000000000..1e7bff1b4 Binary files /dev/null and b/main/_images/OSWEC_plotWaves.PNG differ diff --git a/main/_images/OSWEC_with_ptosim.png b/main/_images/OSWEC_with_ptosim.png new file mode 100644 index 000000000..5a6c0d754 Binary files /dev/null and b/main/_images/OSWEC_with_ptosim.png differ diff --git a/main/_images/PTOSimBlock1.png b/main/_images/PTOSimBlock1.png new file mode 100644 index 000000000..1393f9459 Binary files /dev/null and b/main/_images/PTOSimBlock1.png differ diff --git a/main/_images/PTOSimBlock1OSWEC.png b/main/_images/PTOSimBlock1OSWEC.png new file mode 100644 index 000000000..5d1e82468 Binary files /dev/null and b/main/_images/PTOSimBlock1OSWEC.png differ diff --git a/main/_images/PTOSimClass_diagram.png b/main/_images/PTOSimClass_diagram.png new file mode 100644 index 000000000..ecd60f274 Binary files /dev/null and b/main/_images/PTOSimClass_diagram.png differ diff --git a/main/_images/Physics.png b/main/_images/Physics.png new file mode 100644 index 000000000..0100030f2 Binary files /dev/null and b/main/_images/Physics.png differ diff --git a/main/_images/RM3_Geom.png b/main/_images/RM3_Geom.png new file mode 100644 index 000000000..1de3a4352 Binary files /dev/null and b/main/_images/RM3_Geom.png differ diff --git a/main/_images/RM3_WECSim.JPG b/main/_images/RM3_WECSim.JPG new file mode 100644 index 000000000..ab64bcdf7 Binary files /dev/null and b/main/_images/RM3_WECSim.JPG differ diff --git a/main/_images/RM3_WECSim_Body.jpg b/main/_images/RM3_WECSim_Body.jpg new file mode 100644 index 000000000..fae29f724 Binary files /dev/null and b/main/_images/RM3_WECSim_Body.jpg differ diff --git a/main/_images/RM3_WECSim_GUI.JPG b/main/_images/RM3_WECSim_GUI.JPG new file mode 100644 index 000000000..547dfc6d5 Binary files /dev/null and b/main/_images/RM3_WECSim_GUI.JPG differ diff --git a/main/_images/RM3_WECSim_GlobalRef.jpg b/main/_images/RM3_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..6e2d92413 Binary files /dev/null and b/main/_images/RM3_WECSim_GlobalRef.jpg differ diff --git a/main/_images/RM3_vizMarker.jpg b/main/_images/RM3_vizMarker.jpg new file mode 100644 index 000000000..e5f3ef8d6 Binary files /dev/null and b/main/_images/RM3_vizMarker.jpg differ diff --git a/main/_images/RM3withPTOSimBlocks.png b/main/_images/RM3withPTOSimBlocks.png new file mode 100644 index 000000000..e614f7fc4 Binary files /dev/null and b/main/_images/RM3withPTOSimBlocks.png differ diff --git a/main/_images/SliderandCrankMechanism.png b/main/_images/SliderandCrankMechanism.png new file mode 100644 index 000000000..e40f9e69e Binary files /dev/null and b/main/_images/SliderandCrankMechanism.png differ diff --git a/main/_images/WEC-Sim_Lib.PNG b/main/_images/WEC-Sim_Lib.PNG new file mode 100644 index 000000000..350ce8ccc Binary files /dev/null and b/main/_images/WEC-Sim_Lib.PNG differ diff --git a/main/_images/WEC-Sim_Lib_PTOSim.png b/main/_images/WEC-Sim_Lib_PTOSim.png new file mode 100644 index 000000000..90b75bb6f Binary files /dev/null and b/main/_images/WEC-Sim_Lib_PTOSim.png differ diff --git a/main/_images/WEC-Sim_Lib_bodies.PNG b/main/_images/WEC-Sim_Lib_bodies.PNG new file mode 100644 index 000000000..d97c1fdc5 Binary files /dev/null and b/main/_images/WEC-Sim_Lib_bodies.PNG differ diff --git a/main/_images/WEC-Sim_Lib_cable.PNG b/main/_images/WEC-Sim_Lib_cable.PNG new file mode 100644 index 000000000..591a3aa1f Binary files /dev/null and b/main/_images/WEC-Sim_Lib_cable.PNG differ diff --git a/main/_images/WEC-Sim_Lib_constraints.PNG b/main/_images/WEC-Sim_Lib_constraints.PNG new file mode 100644 index 000000000..beea4c8a4 Binary files /dev/null and b/main/_images/WEC-Sim_Lib_constraints.PNG differ diff --git a/main/_images/WEC-Sim_Lib_frames.PNG b/main/_images/WEC-Sim_Lib_frames.PNG new file mode 100644 index 000000000..0ccd6a7bc Binary files /dev/null and b/main/_images/WEC-Sim_Lib_frames.PNG differ diff --git a/main/_images/WEC-Sim_Lib_mooring.PNG b/main/_images/WEC-Sim_Lib_mooring.PNG new file mode 100644 index 000000000..95f9a9462 Binary files /dev/null and b/main/_images/WEC-Sim_Lib_mooring.PNG differ diff --git a/main/_images/WEC-Sim_Lib_pto.PNG b/main/_images/WEC-Sim_Lib_pto.PNG new file mode 100644 index 000000000..b430fe8a5 Binary files /dev/null and b/main/_images/WEC-Sim_Lib_pto.PNG differ diff --git a/main/_images/WEC-Sim_flowChart.png b/main/_images/WEC-Sim_flowChart.png new file mode 100644 index 000000000..ed0b95b60 Binary files /dev/null and b/main/_images/WEC-Sim_flowChart.png differ diff --git a/main/_images/WECCCOMP_PTO_Extension.png b/main/_images/WECCCOMP_PTO_Extension.png new file mode 100644 index 000000000..9ed26f563 Binary files /dev/null and b/main/_images/WECCCOMP_PTO_Extension.png differ diff --git a/main/_images/WECSimMoorDyn.png b/main/_images/WECSimMoorDyn.png new file mode 100644 index 000000000..17d54eaeb Binary files /dev/null and b/main/_images/WECSimMoorDyn.png differ diff --git a/main/_images/b2b_comparison2.png b/main/_images/b2b_comparison2.png new file mode 100644 index 000000000..e7abc408a Binary files /dev/null and b/main/_images/b2b_comparison2.png differ diff --git a/main/_images/body_diagram.PNG b/main/_images/body_diagram.PNG new file mode 100644 index 000000000..4876850ac Binary files /dev/null and b/main/_images/body_diagram.PNG differ diff --git a/main/_images/cable_diagram.PNG b/main/_images/cable_diagram.PNG new file mode 100644 index 000000000..aaf9d9c0d Binary files /dev/null and b/main/_images/cable_diagram.PNG differ diff --git a/main/_images/codeFeatures.png b/main/_images/codeFeatures.png new file mode 100644 index 000000000..0624a15aa Binary files /dev/null and b/main/_images/codeFeatures.png differ diff --git a/main/_images/compPerformanceBetweenOption1Option2.png b/main/_images/compPerformanceBetweenOption1Option2.png new file mode 100644 index 000000000..b78ec6d13 Binary files /dev/null and b/main/_images/compPerformanceBetweenOption1Option2.png differ diff --git a/main/_images/constraint_diagram.PNG b/main/_images/constraint_diagram.PNG new file mode 100644 index 000000000..b5aa83cc1 Binary files /dev/null and b/main/_images/constraint_diagram.PNG differ diff --git a/main/_images/coordinateSystem.png b/main/_images/coordinateSystem.png new file mode 100644 index 000000000..e0cf3018a Binary files /dev/null and b/main/_images/coordinateSystem.png differ diff --git a/main/_images/declutchTimeSweep.png b/main/_images/declutchTimeSweep.png new file mode 100644 index 000000000..9fbd26f93 Binary files /dev/null and b/main/_images/declutchTimeSweep.png differ diff --git a/main/_images/declutching.png b/main/_images/declutching.png new file mode 100644 index 000000000..106c326f6 Binary files /dev/null and b/main/_images/declutching.png differ diff --git a/main/_images/ellipsoid_iso_side.png b/main/_images/ellipsoid_iso_side.png new file mode 100644 index 000000000..e9020ae58 Binary files /dev/null and b/main/_images/ellipsoid_iso_side.png differ diff --git a/main/_images/extractMaskVariables.PNG b/main/_images/extractMaskVariables.PNG new file mode 100644 index 000000000..e1ec9d240 Binary files /dev/null and b/main/_images/extractMaskVariables.PNG differ diff --git a/main/_images/gbm_iso_side.png b/main/_images/gbm_iso_side.png new file mode 100644 index 000000000..08615f7cf Binary files /dev/null and b/main/_images/gbm_iso_side.png differ diff --git a/main/_images/impedance.png b/main/_images/impedance.png new file mode 100644 index 000000000..b196202b2 Binary files /dev/null and b/main/_images/impedance.png differ diff --git a/main/_images/latchTimeSweep.png b/main/_images/latchTimeSweep.png new file mode 100644 index 000000000..35a97d5c9 Binary files /dev/null and b/main/_images/latchTimeSweep.png differ diff --git a/main/_images/latching.png b/main/_images/latching.png new file mode 100644 index 000000000..0a14666c4 Binary files /dev/null and b/main/_images/latching.png differ diff --git a/main/_images/library_format.png b/main/_images/library_format.png new file mode 100644 index 000000000..fc183a741 Binary files /dev/null and b/main/_images/library_format.png differ diff --git a/main/_images/mask_dev_body.png b/main/_images/mask_dev_body.png new file mode 100644 index 000000000..9a04dfc51 Binary files /dev/null and b/main/_images/mask_dev_body.png differ diff --git a/main/_images/mask_dev_grf.png b/main/_images/mask_dev_grf.png new file mode 100644 index 000000000..25ca2a742 Binary files /dev/null and b/main/_images/mask_dev_grf.png differ diff --git a/main/_images/mask_user_grf.png b/main/_images/mask_user_grf.png new file mode 100644 index 000000000..ef40295c5 Binary files /dev/null and b/main/_images/mask_user_grf.png differ diff --git a/main/_images/mask_user_grf_waveOptions.png b/main/_images/mask_user_grf_waveOptions.png new file mode 100644 index 000000000..6ab65356d Binary files /dev/null and b/main/_images/mask_user_grf_waveOptions.png differ diff --git a/main/_images/mcr_powerMatrix.png b/main/_images/mcr_powerMatrix.png new file mode 100644 index 000000000..43b1cd7fa Binary files /dev/null and b/main/_images/mcr_powerMatrix.png differ diff --git a/main/_images/mcr_waveElev-heaveResp.png b/main/_images/mcr_waveElev-heaveResp.png new file mode 100644 index 000000000..be88f3072 Binary files /dev/null and b/main/_images/mcr_waveElev-heaveResp.png differ diff --git a/main/_images/moorDynInput.png b/main/_images/moorDynInput.png new file mode 100644 index 000000000..b3baaf681 Binary files /dev/null and b/main/_images/moorDynInput.png differ diff --git a/main/_images/mooring_diagram.PNG b/main/_images/mooring_diagram.PNG new file mode 100644 index 000000000..1ba6570fc Binary files /dev/null and b/main/_images/mooring_diagram.PNG differ diff --git a/main/_images/mpcForce.png b/main/_images/mpcForce.png new file mode 100644 index 000000000..e1930456c Binary files /dev/null and b/main/_images/mpcForce.png differ diff --git a/main/_images/mpcForceChange.png b/main/_images/mpcForceChange.png new file mode 100644 index 000000000..dcad50b7b Binary files /dev/null and b/main/_images/mpcForceChange.png differ diff --git a/main/_images/mpcPos.png b/main/_images/mpcPos.png new file mode 100644 index 000000000..a80b4b5d1 Binary files /dev/null and b/main/_images/mpcPos.png differ diff --git a/main/_images/mpcSimulink.png b/main/_images/mpcSimulink.png new file mode 100644 index 000000000..8caae4a8b Binary files /dev/null and b/main/_images/mpcSimulink.png differ diff --git a/main/_images/mpcVel.png b/main/_images/mpcVel.png new file mode 100644 index 000000000..c04d46f79 Binary files /dev/null and b/main/_images/mpcVel.png differ diff --git a/main/_images/nlhydro_comparison4.png b/main/_images/nlhydro_comparison4.png new file mode 100644 index 000000000..692f5a553 Binary files /dev/null and b/main/_images/nlhydro_comparison4.png differ diff --git a/main/_images/nonlinearEllipsoid.png b/main/_images/nonlinearEllipsoid.png new file mode 100644 index 000000000..b59779910 Binary files /dev/null and b/main/_images/nonlinearEllipsoid.png differ diff --git a/main/_images/nonlinearMesh.png b/main/_images/nonlinearMesh.png new file mode 100644 index 000000000..cf32d35ac Binary files /dev/null and b/main/_images/nonlinearMesh.png differ diff --git a/main/_images/nonlinearWEC.png b/main/_images/nonlinearWEC.png new file mode 100644 index 000000000..fd4b9622d Binary files /dev/null and b/main/_images/nonlinearWEC.png differ diff --git a/main/_images/numOpt_comparison.png b/main/_images/numOpt_comparison.png new file mode 100644 index 000000000..5df3e0a9a Binary files /dev/null and b/main/_images/numOpt_comparison.png differ diff --git a/main/_images/oc6_iso_side.png b/main/_images/oc6_iso_side.png new file mode 100644 index 000000000..44d62bd21 Binary files /dev/null and b/main/_images/oc6_iso_side.png differ diff --git a/main/_images/oceanCurrentProfiles.png b/main/_images/oceanCurrentProfiles.png new file mode 100644 index 000000000..ea817b8fc Binary files /dev/null and b/main/_images/oceanCurrentProfiles.png differ diff --git a/main/_images/option2Schematic.jpg b/main/_images/option2Schematic.jpg new file mode 100644 index 000000000..6c503c518 Binary files /dev/null and b/main/_images/option2Schematic.jpg differ diff --git a/main/_images/oswec_iso_side.png b/main/_images/oswec_iso_side.png new file mode 100644 index 000000000..5d89477a8 Binary files /dev/null and b/main/_images/oswec_iso_side.png differ diff --git a/main/_images/oswec_pto_sim.PNG b/main/_images/oswec_pto_sim.PNG new file mode 100644 index 000000000..d11674c57 Binary files /dev/null and b/main/_images/oswec_pto_sim.PNG differ diff --git a/main/_images/pGainSweep.png b/main/_images/pGainSweep.png new file mode 100644 index 000000000..9b4f7e138 Binary files /dev/null and b/main/_images/pGainSweep.png differ diff --git a/main/_images/passiveYaw_comparison.png b/main/_images/passiveYaw_comparison.png new file mode 100644 index 000000000..313b6cb0d Binary files /dev/null and b/main/_images/passiveYaw_comparison.png differ diff --git a/main/_images/piGainSweep.png b/main/_images/piGainSweep.png new file mode 100644 index 000000000..5a8799328 Binary files /dev/null and b/main/_images/piGainSweep.png differ diff --git a/main/_images/piPTOSimulink.png b/main/_images/piPTOSimulink.png new file mode 100644 index 000000000..ebe0fe78a Binary files /dev/null and b/main/_images/piPTOSimulink.png differ diff --git a/main/_images/pto_diagram.PNG b/main/_images/pto_diagram.PNG new file mode 100644 index 000000000..bc6cb89f2 Binary files /dev/null and b/main/_images/pto_diagram.PNG differ diff --git a/main/_images/pto_sim_lib.png b/main/_images/pto_sim_lib.png new file mode 100644 index 000000000..356b915f5 Binary files /dev/null and b/main/_images/pto_sim_lib.png differ diff --git a/main/_images/reactiveWithPTOCC.png b/main/_images/reactiveWithPTOCC.png new file mode 100644 index 000000000..05a4fb3c2 Binary files /dev/null and b/main/_images/reactiveWithPTOCC.png differ diff --git a/main/_images/reactiveWithPTOCCPower.png b/main/_images/reactiveWithPTOCCPower.png new file mode 100644 index 000000000..7131b9681 Binary files /dev/null and b/main/_images/reactiveWithPTOCCPower.png differ diff --git a/main/_images/reactiveWithPTOOpt.png b/main/_images/reactiveWithPTOOpt.png new file mode 100644 index 000000000..8d8e6c8c8 Binary files /dev/null and b/main/_images/reactiveWithPTOOpt.png differ diff --git a/main/_images/reactiveWithPTOOptPower.png b/main/_images/reactiveWithPTOOptPower.png new file mode 100644 index 000000000..f07d4e2ff Binary files /dev/null and b/main/_images/reactiveWithPTOOptPower.png differ diff --git a/main/_images/reactiveWithPTOSweep.png b/main/_images/reactiveWithPTOSweep.png new file mode 100644 index 000000000..c53c5a229 Binary files /dev/null and b/main/_images/reactiveWithPTOSweep.png differ diff --git a/main/_images/rectangles.png b/main/_images/rectangles.png new file mode 100644 index 000000000..7607c0406 Binary files /dev/null and b/main/_images/rectangles.png differ diff --git a/main/_images/rm3_iso_side.png b/main/_images/rm3_iso_side.png new file mode 100644 index 000000000..916827c65 Binary files /dev/null and b/main/_images/rm3_iso_side.png differ diff --git a/main/_images/rm3with_pto_sim.PNG b/main/_images/rm3with_pto_sim.PNG new file mode 100644 index 000000000..155fa28ab Binary files /dev/null and b/main/_images/rm3with_pto_sim.PNG differ diff --git a/main/_images/rotational_pto.PNG b/main/_images/rotational_pto.PNG new file mode 100644 index 000000000..c72e11cc9 Binary files /dev/null and b/main/_images/rotational_pto.PNG differ diff --git a/main/_images/simulation_diagram.png b/main/_images/simulation_diagram.png new file mode 100644 index 000000000..f7e4faf2e Binary files /dev/null and b/main/_images/simulation_diagram.png differ diff --git a/main/_images/sphere_freedecay_iso_side.png b/main/_images/sphere_freedecay_iso_side.png new file mode 100644 index 000000000..ae8cdad1e Binary files /dev/null and b/main/_images/sphere_freedecay_iso_side.png differ diff --git a/main/_images/translational_pto.PNG b/main/_images/translational_pto.PNG new file mode 100644 index 000000000..8e1686a76 Binary files /dev/null and b/main/_images/translational_pto.PNG differ diff --git a/main/_images/wave_diagram.PNG b/main/_images/wave_diagram.PNG new file mode 100644 index 000000000..1b202023b Binary files /dev/null and b/main/_images/wave_diagram.PNG differ diff --git a/main/_images/wec_sim_header.png b/main/_images/wec_sim_header.png new file mode 100644 index 000000000..59911a3d5 Binary files /dev/null and b/main/_images/wec_sim_header.png differ diff --git a/main/_images/wecccomp_diagram.png b/main/_images/wecccomp_diagram.png new file mode 100644 index 000000000..6cf6f989c Binary files /dev/null and b/main/_images/wecccomp_diagram.png differ diff --git a/main/_images/wecccomp_iso_side.png b/main/_images/wecccomp_iso_side.png new file mode 100644 index 000000000..50d15a5db Binary files /dev/null and b/main/_images/wecccomp_iso_side.png differ diff --git a/main/_images/wigley_iso_side.png b/main/_images/wigley_iso_side.png new file mode 100644 index 000000000..d78be89d0 Binary files /dev/null and b/main/_images/wigley_iso_side.png differ diff --git a/main/_sources/developer/advanced_features.rst.txt b/main/_sources/developer/advanced_features.rst.txt new file mode 100644 index 000000000..9ffb9a000 --- /dev/null +++ b/main/_sources/developer/advanced_features.rst.txt @@ -0,0 +1,43 @@ +.. _dev-advanced-features: + +Advanced Features +================= + + +Added Mass +----------- + +.. include:: /_include/added_mass.rst + + +Morison Element +--------------- + +.. include:: /_include/morison_element.rst + +.. TO DO: add passive yaw +.. TO DO: add morison element +.. TO DO: add passive yaw +.. TO DO: add PTO-Sim + +Extract Mask Variables +---------------------- +The Simulink variable workspace is inaccesible in the MATLAB workspace by default. +Simulink variables can be imported to the MATLAB workspace using the block handle +of the Simulink block being probed. The block parameters can be used by developers +to programmatically set block parameters by being able to access the unique tags +that Simulink uses for a particular block parameter. This is also useful for the code +initialization of Simulink mask blocks. +The function :code:`ExtractMaskVariables()` +located in :code:`source\functions\simulink\mask`, can be used to extract the block +parameters in following steps, + +* Open the pertinent Simulink model, +* Run the function with the address of the block being probed as the argument, +* Explore the :code:`mask` data structure in the MATLAB workspace. + + +.. figure:: /_static/images/extractMaskVariables.PNG + :width: 550pt + :figwidth: 550pt + :align: center \ No newline at end of file diff --git a/main/_sources/developer/getting_started.rst.txt b/main/_sources/developer/getting_started.rst.txt new file mode 100644 index 000000000..a2b02208b --- /dev/null +++ b/main/_sources/developer/getting_started.rst.txt @@ -0,0 +1,32 @@ +.. _dev-getting-started: + +Getting Started +=============== + +The WEC-Sim source code is hosted on `WEC-Sim's GitHub repository `_. +Please fork the WEC-Sim repository if you plan to contribute to the WEC-Sim code. +Forking the repository allows developers to create a personal copy of the WEC-Sim repository that can be edited idependently. +For details on creating and using a fork, refer to `GitHub's forking documentation `_. + +Once you have forked the repository on GitHub, add the fork's remote, and pull the fork into your local directory:: + + >> git remote add https://github.com//WEC-Sim.git + >> git pull + + +Push local commits to fork on GitHub:: + + >> git push + +Pull updates from WEC-Sim origin:: + + >> git pull origin + + +.. Note:: + This example defines ``origin`` as `WEC-Sim's GitHub repository `_, and ```` as the developer's fork. Develoeprs may use whatever convention they prefer, refer to `GitHub documentation on configuring remotes `_ + + + + + diff --git a/main/_sources/developer/index.rst.txt b/main/_sources/developer/index.rst.txt new file mode 100644 index 000000000..0ada75360 --- /dev/null +++ b/main/_sources/developer/index.rst.txt @@ -0,0 +1,15 @@ +.. _dev: + +################# +Developer Manual +################# + +.. toctree:: + :maxdepth: 2 + + overview.rst + getting_started.rst + pull_requests.rst + software_tests.rst + library.rst + advanced_features.rst diff --git a/main/_sources/developer/library.rst.txt b/main/_sources/developer/library.rst.txt new file mode 100644 index 000000000..d24dce54c --- /dev/null +++ b/main/_sources/developer/library.rst.txt @@ -0,0 +1,435 @@ +.. _dev-library: + +WEC-Sim Library +=============== + +The WEC-Sim Library is in the ``$WECSIM/source/lib`` directory, and includes the following files: + +========================= ================================== +**Simulink Library** **File name** +WEC-Sim Library ``WECSim_Lib.slx`` +Frames Sublibrary ``WECSim_Lib_Frames.slx`` +Body Elements Sublibrary ``WECSim_Lib_Body_Elements.slx`` +Constraints Sublibrary ``WECSim_Lib_Constraints.slx`` +PTOs Sublibrary ``WECSim_Lib_PTOs.slx`` +Cables Sublibrary ``WECSim_Lib_Cables.slx`` +Moorings Sublibrary ``WECSim_Lib_Moorings.slx`` +========================= ================================== + +GitHub tracks when a change is made to a binary file (e.g. ``*.slx``), but not the specific revisions made. +This makes tracking revisions to the WEC-Sim Library more challenging than revisions to text files (e.g. ``*.m``). +The WEC-Sim Library is saved as a `Custom Simulink Library `_ with sublibaries. +To ensure backwards compatibility, a `Forwarding Table `_ is used. + + + +.. _dev-library-format: + +Formatting +----------- +Please format the color of library blocks according to their function: + +========================= ================================== +**Library Function** **Color** +Input Green +Output Red +From Workspace Yellow +Simulink Function Orange +Subsystem Gray +Linked Block Light Blue +========================= ================================== + +.. figure:: /_static/images/dev/library_format.png + :align: center + :width: 400pt + + WEC-Sim Library blocks with color formatting + + + +.. _dev-library-development: + +Library Development +---------------------- +When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes. + +In order to modify blocks masks the variable being modified must be accesible to Simulink's workspace. This can be acheived by running any ``wecSimInputFile.m`` script without executing WEC-Sim. Running the ``wecSimInputFile.m`` script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim's class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., ``bodyClass``, ``waveClass`` etc.). + +Simulink then executes each block mask's initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the ``wecSimInputFile.m`` script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library. + +.. Note:: + This is especially important for the Wave Markers and for B2B + +.. _dev-sim-funcs: + +Simulink Functions +------------------ +Whenever a Simulink Function is called from the WEC-Sim Library, save the function to the ``$WECSIM/source/simulink/functions`` directory. +This allows revisions to Simulink Functions to be more easily tracked by Git. +Simulink Model Functions should be saved to the ``$WECSIM/source/functions/simulink/model`` directory. +Simulink Mask Functions should be saved to the ``$WECSIM/source/functions/simulink/mask`` directory. +Refer to the :ref:`dev-library-format` section for details on block color formatting. + + +The ``$WECSIM/source/functions/simulink/model`` directory contains functions called by the Simulink model during runtime. +These functions implement physics equations such as calculation of the irregular excitation force or the radiation damping convolution integral. These functions greatly affect the accuracy of WEC-Sim. +Whereas the functions in the ``$WECSIM/source/functions/simulink/mask`` directory are only used in preprocessing when running WEC-Sim from Simulink, refer to Run from Simulink :ref:`dev-run-sim-lib`. + +.. _dev-run-sim: + +Run from Simulink +--------------------- +The :ref:`user-advanced-features-simulink` feature allows users to initialize WEC-Sim from the command window and then run the simulation directly from Simulink. +This feature allows greater compatibility with other models or hardware-in-the-loop simulations. + +Internally, the Run From Simulink functionality differs from executing the ``wecSim`` command by how the input file is run. +The ``wecSim`` command begins by running the ``wecSimInputFile`` in the current directory and continuing with the pre-processing steps. +Run From Simulink differs by either: + + * Running the input file selected in the Global Reference Frame (when the ``Input File`` option is selected) + * Writing and then running a new input file ``wecSimInputFile_customParameters.m`` (when the Global Reference when the ``Custom Parameters`` option is selected) + + +.. _dev-run-sim-custom: + +Custom Parameters +^^^^^^^^^^^^^^^^^^^ +WEC-Sim allows users to define input file parameters inside Simulink block masks. +When using the ``Custom Parameters`` setting, users can both load an input file into the block masks and write an block masks to an input file. +This feature was created so that users have a written record of case parameters utilized during a simulation run from Simulink. + +The mask of each library block allows users to define a subset of possible input parameters that would be defined in the ``wecSimInputFile``. +The values that a user inputs to a block are stored as mask parameters. +When a block mask is accessed, a prompt similar to the figure below appears: + +.. figure:: /_static/images/dev/mask_user_grf.png + :align: center + :width: 400pt + + Simulation class parameters defined in the Global Reference Frame. + +Turning on certain flags may change the visibility of other parameters. +For example, the wave type will affect which wave settings are visible to a user: + +.. figure:: /_static/images/dev/mask_user_grf_waveOptions.png + :align: center + :width: 400pt + + Wave class parameters defined in the Global Reference Frame. Visibility changes based on the selected wave type, + +The spectrum type, frequency discretization and phase seed are not used for regular waves, so they are no visible. +Similarly, a visibility-flag relation is present for each body's Morison element options, nonhydro body parameters, etc. +Having a flag change the visibility of options that cannot be used may help new users understand the interdependence of input parameters. + +.. Note:: + To decrease the burden of maintaining these masks, only the most common input file parameters can be defined in Simulink. + For example, the Global Reference Frame contains simulationClass parameters such as ``mode``, ``explorer``, ``solver``, time information, and state space flags. + However less common parameters such as ``mcrMatFile``, ``saveStructure``, ``b2b`` and others are not included. + + +.. _dev-run-sim-lib: + +Library Masks +^^^^^^^^^^^^^^^^^^^^ +In order to maintain the functionality of the :ref:`user-advanced-features-simulink` feature, the WEC-Sim Library must be updated when new features are added. +Developers may add additional options using the below instructions. + +WEC-Sim is developed as a class based software. +This results in a complex interplay between the class variables and those defined in the block masks. +The difficult and complex part of this feature comes from three aspects: + + * Changing parameter visibility based on a flags value (``callbacks``) + * Writing an input file from mask parameters (``writeInputFromBlocks``, ``writeLineFromVar``) + * Writing block parameters when loading an input file (``writeBlocksFromInput``) + +Each of these items will be addressed in this section, but first an overview of the mask set-up is given. +It is recommended that developers review Mathworks `Simulink.MaskParameter `_ documentation before preceding with edits to this advanced feature. + +When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes. +To modify blocks masks, + + * Before modifying a block mask, the variable being modified should be accesible to Simulink's workspace. This can be acheived by making sure that the ``source`` folder in the WEC-Sim directory is added to MATLAB path, and running any available ``wecSimInputFile.m`` script without running WEC-Sim. Running the ``wecSimInputFile.m`` script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim's class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., ``bodyClass``, ``waveClass`` etc.). + * Simulink executes each block mask's initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the ``wecSimInputFile.m`` script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library. + +.. Note:: + This is especially important for the Wave Markers and for B2B . + +Mask Structure +"""""""""""""" +Each block mask first contains the ``number`` as in historical WEC-Sim set-up; +``body(1)``, ``pto(2)``, ``constraint(1)``, etc. Next there is a string +that clarifying that no custom parameters on shown when the ``Global Reference +Frame`` is set to use an input file. A folder than contains all custom +parameters within tabs. + +.. figure:: /_static/images/dev/mask_dev_body.png + :align: center + :width: 400pt + +Within the custom parameters folder are various tabs. The first tab contains +parameters not within a class structure. Additional tabs are organized based +on what class structures are used. For example all parameters within the +``body(i).morisonElement`` structure are under the morisonElement tab, +``body(i).initial`` under the tab, etc. This method of placing class +structures into tabs helps organize the mask and write parameters to the input +file. + + +Parameter Specifics +""""""""""""""""""" + +Each mask parameter has certain properties (``name``, ``value``, ``prompt``, ``type``), +attributes, and dialog options (``visible``, ``callback``) that must be properly +defined: + +.. figure:: /_static/images/dev/mask_dev_grf.png + :align: center + :width: 400pt + + +**Properties** + +The properties of a mask parameter define the ``name``, ``value``, ``type`` and +user-facing ``prompt``. The mask name must be *identical* to the name of the +corresponding class property. This is essential to easily writing/reading an +input file to/from the mask. The defaults of each parameter should be the same +as the corresponding class property. + +Parameters with a distinct set of values (flags, wave types, etc) should be of +Type ``popup`` to limit users and more easily use callbacks dependent on their +values. Use ``checkbox`` not ``popup`` for flags that take values of ``on, off`` +(such as ``pto(i).lowerLimitSpecify``. Other parameters are typically of Type +``edit`` to allow flexible user input. + +**Attributes** + +In general, most parameters should not be read only or hidden, and should be +saved. One exception to this is the Global Reference Frame parameters ``waves`` +and ``simu`` which identify the block in the workspace when reading/writing +input files. + +**Dialog** + +The dialog options are primarily used to change a parameter's visibility, +tooltip and define a callback function. A tooltip defines a string that +appears when a user hovers on a parameter. This can be useful to provide +additional context that is too long for the prompt. +A parameter's callback functions run whenever the value is updated. In WEC-Sim, +mask callbacks are typically used to with flag parameters to update the +visibility of other parameters: + +====================== ====================================== ========== +Block / class Mask parameter Callback +====================== ====================================== ========== +PTO, constraint, cable upperLimitSpecify, lowerLimitSpecify ``hardStopCallback`` +Body STLButton ``stlButtonCallback`` +Body H5Button ``h5ButtonCallback`` +Body nonHydro, (morisonElement.) on ``bodyClassCallback`` +====================== ====================================== ========== + +A specific variable's callbacks are defined in: +``BLOCK/Mask Editor/Parameters & Dialog/PARAMETER/Property editor/Dialog/Callback/``. +For more information about the callback functions refer to :ref:`dev-sim-funcs` and :ref:`dev-run-sim-callback`. + + +.. _dev-run-sim-callback: + +Callback Functions +"""""""""""""""""" +All callbacks and other functions used in Simulink masks for the Run From +Simulink feature are stored as ``*.m`` files in the +``$WECSIM/source/functions/simulink/mask/`` directory, refer to :ref:`dev-sim-funcs`. + + +WEC-Sim callback functions can be split into several categories by their use: + +===================== ====================================== +Category Functions +===================== ====================================== +Button callbacks ``inFileButtonCallback.m``, ``etaButtonCallback.m``, ``spectrumButtonCallback.m``, ``h5ButtonCallback.m``, ``stlButtonCallback.m``, ``loadInputFileCallback.m``, etc +Visibility callbacks ``hardStopCallback.m``, ``waveClassCallback.m``, ``bodyClassCallback.m``, ``customVisibilityCallback.m``, ``inputOrCustomCallback.m``, etc +===================== ====================================== + +**Visibility callbacks** + +Visibility callbacks are used with flag parameters to update the visibility of +available options. For example, if ``body(i).morisonElement.on=0``, then a user +is not able to define ``body(i).morisonElement.cd, .ca,`` etc. +The visibility callbacks function by checking the value of a flag: + +.. code-block:: matlabsession + + >> mask = Simulink.Mask.get(bodyBlockHandle) + >> meParam = mask.getParameter('on') + >> nonHydroParam = mask.getParameter('nonHydro') + + +Depending on the value of a flag, the visibility of individual variables or an +entire tab can be changed: + +.. code-block:: matlabsession + + >> meTab = mask.getDialogControl('morisonElement'); + >> if nonHydroParam.value >= 1 + >> centerGravityParam.Visible = 'on'; + >> centerBuoyancyParam.Visible = 'on'; + >> else + >> centerGravityParam.Visible = 'off'; + >> centerBuoyancyParam.Visible = 'off'; + >> end + >> + >> if meParam.value >= 1 + >> meTab.Visible = 'on'; + >> else + >> meTab.Visible = 'off'; + >> end + + +This method is also how the Global Reference Frame turns off all custom +parameters when it is set to use an input file. In this case, +``inputOrCustomCallback`` is used. When a new class is created, developers must +add the class variable (``body, simu, etc``) into the list checked in +``inputOrCustomCallback``. This list is necessary to ensure that Simulink +models can contain non-WEC-Sim blocks without error. + +**Button callbacks** + +Button callback typically open a file explorer and allow users to select +a given file. These buttons allow wave spectrum, wave elevation, body h5 or +body STL files, etc to be defined in the mask. These callbacks use the MATLAB +command ``uigetfile()`` and then set the correct mask value based if a valid +file is selected. + +.. code-block:: matlabsession + + >> [filename,filepath] = uigetfile('.mat'); + >> + >> % Don't set value if no file is chosen, or prompt canceled. + >> if ~isequal(filename,0) && ~isequal(filepath,0) + >> mask = Simulink.Mask.get(bodyBlockHandle) + >> fileParam = mask.getParameter('spectrumFile ') + >> fileParam.value = [filepath,filename]; + >> end + + +.. _dev-run-sim-input-mask: + +Writing Input File from Mask +"""""""""""""""""""""""""""" + +WEC-Sim writes an input file from mask parameters using the functions ``writeInputFromBlocks`` and ``writeLineFromVar``. +WEC-Sim scans the open Simulink file for all blocks, and reorders them based on the typical input file +order: ``simu``, ``waves``, ``body``, ``constraint``, ``pto``, ``cable``, ``mooring``. +WEC-Sim also creates default copies of each class. +All mask variables are looped through and written to ``wecSimInputFile_simulinkCustomParameters`` using the function ``writeLineFromVar``. +This function takes in a default class, variable name, mask value, number and structure value. +For example, in the body class: + +.. code-block:: matlabsession + + >> writeLineFromVar(body, 'option', maskVars, maskViz, num, 'morisonElement'); + +This function allows WEC-Sim to easily compare the mask value with the default, +assign variables to a certain class number and structure. Checking a mask value +against the class default keeps the new input file clean and easy to read. It is +critical that any mask parameter written with this function is named +identically to its class counterpart. It returns a string to +``writeInputFromBlocks`` that is immediately written to the input file. As of +now, developers must manually add a line to print a new mask parameter to +the input file. + + +.. _dev-run-sim-mask-input: + +Writing Mask Parameters from Input File +""""""""""""""""""""""""""""""""""""""" + +WEC-Sim loads mask parameters from an input file using the function +``writeBlocksFromInput``. This function is called by ``loadInputFileCallback`` +in the ``Global Reference Frame``. This function loops through all blocks in +the Simulink model. Within each block, the chosen input file is run. Values of +each class variables are assigned directly to the mask value. The default is +not checked in this instance, as the mask cannot be cleaned up in the same +method as the input file. + +When creating a new class, developers must manually +add a value to the `'type'` flag in ``loadInputFileCallback``. This ensures that +the mask variables are set with the correct WEC-Sim class, i.e.: + +.. code-block:: matlabsession + + >> maskVar. ... = body(1). ...; + >> maskVar. ... = pto(2). ...; + >> maskVar. ... = cable(3). ...; + + +Developers must also edit each case of ``writeBlocksFromInput`` when creating +a new mask parameter or renaming a class property. + + +.. _dev-run-sim-summary: + +Summary +""""""" + +**To create or rename a mask parameter** + +1. Change the mask parameter name and default value in Simulink +2. If tied to a flag, update callbacks to hide/show the parameter +3. Update ``writeInputFromBlocks`` and ``writeBlocksFromInput`` with the new parameter + name + +**Creating a new class or block** + +1. Setup the mask parameter structure described above, or copy from another block + in that class: + + .. code-block:: matlabsession + + >> pSource = Simulink.Mask.get(srcBlockName) + >> pDest = Simulink.Mask.create(destBlockName) + >> pDest.copy(pSource) + +2. Ensure that ``inputOrCustomCallback`` functions correctly to hide/show all custom + parameters depending on the ``Global Reference Frame`` setting. + +3. If tied to a flag, update callbacks to hide/show parameters. + +4. Permanently hide any parameters not used in that class (e.g. + 6DOF Constraint does not have end stops, so that tab is not visible) + +5. Create new ``writeInputFromBlocks`` and ``writeBlocksFromInput`` sections + to tie the block mask to an input file. + +.. Note:: + * Mask parameters should always have the same name as the corresponding + class property + * All mask parameters should have the ability to write to an input file and + load from Simulink + + +.. _dev-merge-tool: + +MATLAB Merge Tool +------------------ +It is recommended that developers use the `MATLAB Merge Tool `_ to compare library versions when there are merge conflicts. +The MATLAB Merge Tool allows users to compare changes directly in Simulink. +The merge tool will open a special Simulink GUI that allows users to compare code versions both textually and within the block diagram. +To use the tool, merge both branches locally and resolve any conflicts using the merge tool. + +For example, take the branches ```` and ```` that each contain new WEC-Sim features. +In the Git for Windows command line, these changes can be merged using:: + + # Checkout the branch and pull the latest + git checkout + git pull / + + # Merge branch into branch + git merge + + # Resolve library conflicts using the MATLAB merge tool + git mergetool -t mlMerge source/lib/WEC-Sim/.slx + + # Save desired revisions, then add and commit changes + git add source/lib/WEC-Sim/.slx + git commit -m 'merge with ' diff --git a/main/_sources/developer/overview.rst.txt b/main/_sources/developer/overview.rst.txt new file mode 100644 index 000000000..bc1acf157 --- /dev/null +++ b/main/_sources/developer/overview.rst.txt @@ -0,0 +1,11 @@ +.. _dev-overview: + +Overview +======== + +The :ref:`WEC-Sim development team ` is currently engaged in continuous code development and support. +Efforts are made by the development team to improve the code's flexibility, accuracy, and usability. +The :ref:`dev-getting-started` section describes the development team's workflow for anyone who wishes to submit new WEC-Sim features for inclusion in future WEC-Sim releases. +The developer manual also documents specific WEC-Sim features that are especially relevant to WEC-Sim development. +It is intended as a reference for members of the (internal and external) development team when adding new features. + diff --git a/main/_sources/developer/pull_requests.rst.txt b/main/_sources/developer/pull_requests.rst.txt new file mode 100644 index 000000000..4ccff722f --- /dev/null +++ b/main/_sources/developer/pull_requests.rst.txt @@ -0,0 +1,27 @@ +.. _dev-pull-requests: + +Pull Requests +=============== + +A stable version of WEC-Sim is maintained on the `WEC-Sim main branch `_, and `WEC-Sim releases `_ are tagged on GitHub. +WEC-Sim development is performed on `WEC-Sim dev branch `_ using a `fork-based workflow `_. +New WEC-Sim features are developed on forks of the WEC-Sim repository, and `pull-requests `_ are submitted to merge new features from a development fork into the main WEC-Sim repository. +Pull-requests for new WEC-Sim features should be submitted to the WEC-Sim dev branch. +The only exception to this workflow is for bug fixes; pull-request for bug fixes should be should submitted to the WEC-Sim main branch. +When a new version of WEC-Sim is released, the dev branch is pulled into main where all changes are incorporated into the code. + + +A `pull request (PR) `_ should focus on one update at a time. +This ensures that PR revisions are easily tracked, and keeps the repository history remains clean. +If working on multiple updates, please use different branches, and submit separate pull requests. +Once a PR is merged please delete legacy branches to keep your fork clean. + +Prior to submitting a pull request, pull the latest commits from the WEC-Sim repository, resolve any merge conflicts, and commit revisions to your fork:: + + >> git pull origin + >> git commit -m 'commit message' + >> git push + +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +:ref:`dev-software-tests`. +To submit a pull request, navigate to the `WEC-Sim's pull requests `_ and submit a new pull request. \ No newline at end of file diff --git a/main/_sources/developer/software_tests.rst.txt b/main/_sources/developer/software_tests.rst.txt new file mode 100644 index 000000000..5b5601694 --- /dev/null +++ b/main/_sources/developer/software_tests.rst.txt @@ -0,0 +1,56 @@ +.. _dev-software-tests: + +Software Tests +=============== + +WEC-Sim includes `MATLAB Continuous Integration `_ tests that check the source code's stability and generate a build report. +The continuous integration tests are run each time a commit is made to the WEC-Sim GitHub repository, and the stability of each commit is available via `WEC-Sim's GitHub Actions `_. +Tests are run on both the `WEC-Sim main `_ and `WEC-Sim dev `_ branches. +To ensure stability across MATLAB distributions, WEC-Sim tests are also run on current and prior MATLAB releases. +Refer to MATLAB's `unit test framework `_ and `continuous integration `_ documentation for more information. + +When new features are added, tests should developed to verify functionality. +All tests should be run locally to ensure stability prior to submitting a pull request. +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +:ref:`dev-pull-requests`. + +.. _dev-software-tests-ws: + +WEC-Sim Tests +-------------- +The WEC-Sim tests are located in the ``$WECSIM/tests`` directory. +To execute the WEC-Sim tests locally and generates a build report, navigate to the ``$WECSIM`` directory (e.g. ``C:/User/Documents/GitHub/WEC-Sim``), and type the following command in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> results = wecSimTest() + + + Totals: + 38 Passed, 0 Failed, 0 Incomplete. + + +.. _dev-software-tests-wsa: + +WEC-Sim Applications Tests +--------------------------- +The `WEC-Sim Applications repository `_ includes tests of each applications case. +To execute the WEC-Sim Applications tests locally and generates a build report, navigate to the ``$WECSIM_Applications`` directory (e.g. ``C:/User/Documents/GitHub/WEC-Sim``), and type the following command in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> results = wecSimAppTest() + + + Totals: + 43 Passed, 0 Failed, 0 Incomplete + + +.. TO DO: add section about regression and compilation tests + +.. Regression Tests +.. WEC-Sim regression tests are used to compare the latest version of WEC-Sim with a solution from a previous (stable) release. A maximum difference is asserted in each unit test to ensure that the latest version does not deviate from a previous release. + +.. Compilation Tests +.. WEC-Sim compilation tests are used to check that new features do not break existing functionality by verifying that WEC-Sim runs for a selection of existing application cases. However, for these cases no regression comparison is performed. + diff --git a/main/_sources/index.rst.txt b/main/_sources/index.rst.txt new file mode 100644 index 000000000..424545ae0 --- /dev/null +++ b/main/_sources/index.rst.txt @@ -0,0 +1,76 @@ +.. _home: + +.. figure:: /_static/images/wec_sim_header.png + :target: https://github.com/WEC-Sim/WEC-Sim + + +.. toctree:: + :maxdepth: 5 + :hidden: + + Home + introduction/index.rst + theory/index.rst + user/index.rst + most/index.rst + developer/index.rst + + +######################################### +WEC-Sim (Wave Energy Converter SIMulator) +######################################### + +`WEC-Sim (Wave Energy Converter SIMulator) `_ +is an open-source software for simulating wave energy converters. The software is +developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape +Multibody. WEC-Sim has the ability to model devices that are comprised of +bodies, joints, power take-off systems, and mooring systems. WEC-Sim can model +both rigid bodies and flexible bodies with generalized body modes. Simulations +are performed in the time-domain by solving the governing wave energy converter +equations of motion in the 6 Cartesian degrees-of-freedom, plus any number of +user-defined modes. The `WEC-Sim Applications repository +`_ contains a wide variety of +scenarios that WEC-Sim can be used to model, including desalination, mooring +dynamics, nonlinear hydrodynamic bodies, passive yawing, batch simulations and +many others. The software is very flexible and can be adapted to many scenarios +within the wave energy industry. + +.. _developers: + +WEC-Sim Developers +===================== +WEC-Sim is a collaboration between the `National Renewable Energy Laboratory +(NREL) `_ and `Sandia National Laboratories +(Sandia) `_, +funded by the U.S. Department of Energy’s Water Power Technologies Office. +Due to the open source nature of the software, WEC-Sim has also had many external +contributions. +For more information refer to :ref:`intro-acknowledgements`. + +Current members of the development team include: + +* Dominic Forbush (Sandia) +* Jeff Grasberger (Sandia) +* Salman Husain (NREL - PI) +* Adam Keester (Sandia) +* Jorge Leon (Sandia) +* David Ogden (NREL) +* Kelley Ruehl (Sandia - PI) +* Mohamed Shabara (NREL) + +Former members of the development team include: + +* Michael Lawson (NREL) +* Carlos Michelen (Sandia) +* Nathan Tom (NREL) +* Jennifer Van Rij (NREL) +* Yi-Hsiang Yu (NREL) + + +.. Indices and tables +.. ================== + +.. * :ref:`genindex` +.. * :ref:`modindex` +.. * :ref:`search` + diff --git a/main/_sources/introduction/acknowledgements.rst.txt b/main/_sources/introduction/acknowledgements.rst.txt new file mode 100644 index 000000000..2a998dd4a --- /dev/null +++ b/main/_sources/introduction/acknowledgements.rst.txt @@ -0,0 +1,27 @@ +.. _intro-acknowledgements: + +Acknowledgements +================ + +External Contributors +------------------------- +In addition to development by :ref:`developers`, WEC-Sim has had many contributors, including: + +* Ratanak So (Oregon State University) +* Matt Hall (University of Maine) +* Brad Ling (Azura Wave) +* Adam Nelessen (Georgia Institute of Technology) +* Sam Kanner (University of California at Berkeley) +* Chris McComb (Carnegie Mellon University) +* Sam Edwards (University of Michigan) + +The association with the listed organization is credited to when a contribution to WEC-Sim was made. The contributor may no longer be associated with the listed organization at this time. + +Funding +-------- +Development and maintenance of the WEC-Sim code is funded by the U.S. Department of Energy's Water Power Technologies Office. WEC-Sim code development is a collaboration between the National Renewable Energy Laboratory and Sandia National Laboratories. + +The National Renewable Energy Laboratory is a national laboratory of the U.S. Department of Energy, Office of Energy Efficiency and Renewable Energy, operated by the Alliance for Sustainable Energy, LLC. under contract No. DE-AC36-08GO28308. + +Sandia National Laboratories is a multi-mission laboratory managed and operated by National Technology and Engineering Solutions of Sandia, LLC., a wholly owned subsidiary of Honeywell International, Inc., for the U.S. Department of Energy's National Nuclear Security Administration under contract DE-NA0003525. + diff --git a/main/_sources/introduction/index.rst.txt b/main/_sources/introduction/index.rst.txt new file mode 100644 index 000000000..b5889d419 --- /dev/null +++ b/main/_sources/introduction/index.rst.txt @@ -0,0 +1,14 @@ +.. _intro: + +############## +Introduction +############## + +.. toctree:: + :maxdepth: 2 + + overview.rst + acknowledgements.rst + release_notes.rst + publications.rst + license.rst diff --git a/main/_sources/introduction/license.rst.txt b/main/_sources/introduction/license.rst.txt new file mode 100644 index 000000000..ee43d28b2 --- /dev/null +++ b/main/_sources/introduction/license.rst.txt @@ -0,0 +1,22 @@ +.. _intro-license: + +License +======= +WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS). +The software is distributed under the Apache License 2.0. + + +Copyright +------------ + +.. literalinclude:: ../../COPYRIGHT + :language: text + + + +Apache License 2.0 +------------------------- + +.. literalinclude:: ../../LICENSE + :language: text + diff --git a/main/_sources/introduction/overview.rst.txt b/main/_sources/introduction/overview.rst.txt new file mode 100644 index 000000000..dbca7c096 --- /dev/null +++ b/main/_sources/introduction/overview.rst.txt @@ -0,0 +1,180 @@ +.. _intro-overview: + +Overview +======================= + +.. TODO + - compare to other codes? + table of advantages over similar codes + speed / accuracy comparison + Reference OC6P1 paper and how well WEC-Sim performs + + +WEC-Sim (Wave Energy Converter SIMulator) is an open-source software for simulating wave energy converters. +It is developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape Multibody. +WEC-Sim has the ability to model devices that are comprised of hydrodynamic bodies, joints and constraints, power take-of systems, and mooring systems. +Simulations are performed in the time-domain by solving the governing wave energy converter equations of motion in the 6 rigid Cartesian degrees-of-freedom. +A body may also contain any number of generalized body modes to represent hydrodynamic effects in shear, torsion, bending, and others. + +.. /_static/images/overview/overview_diagram.JPG +.. figure:: /_static/images/WEC-Sim_flowChart.png + :width: 750pt + +At a high level, the only external input WEC-Sim requires is hydrodynamic data from boundary element method (BEM) software such as WAMIT, NEMOH, Aqwa, and Capytaine. +The boundary element method data represents the hydrodynamic response of the device for a given wave frequency. +WEC-Sim uses this data to simulate devices in the time-domain where they can be coupled with controls, power take-off systems, and other external bodies and forces. +WEC-Sim outputs the motions, forces, and power for individual bodies, joints and PTOs in MATLAB for custom post-processing or coupling with external tools. + +Several interfaces with Simulink are included that allow users to couple WEC-Sim with a wide variety of other models and scripts relevant to their devices. +Complex power take-off systems and advanced control algorithms are just two examples of the advanced tools that can be coupled with WEC-Sim. + +.. figure:: /_static/images/overview/OSWEC_with_ptosim.png + :width: 750pt + + Block diagram of an OSWEC device with hydraulic PTO created with PTO-Sim. + +.. figure:: /_static/images/overview/wecccomp_diagram.png + :width: 400pt + + Block diagram of the WECCCOMP device with advanced controller. + +Together with PTO and control systems, WEC-Sim is able to model a wide variety of marine devices. +The WEC-Sim Applications repository contains a wide variety of scenarios that WEC-Sim can model. +This repository includes both demonstrations of WEC-Sim's advanced features and applications of WEC-Sim to unique devices. + +WEC-Sim's capabilities include the ability to model both nonlinear hydrodynamic effects (Froude-Krylov forces and hydrostatic stiffness) and nonhydrodynamic bodies, body-to-body interactions, mooring systems, passive yawing. +WEC-Sim contains numerous numerical options and ability to perform highly customizable batch simulations. WEC-Sim can take in data from a variety of boundary element method software using its BEMIO (BEM-in/out) functionality and can output paraview files for visualization. +Some of its advanced features are highlighted in the figures below. + + +.. |b2b| image:: /_static/images/overview/b2b_comparison2.png + :width: 400pt + :height: 175pt + :align: middle + +.. |nlh| image:: /_static/images/overview/nlhydro_comparison4.png + :width: 400pt + :height: 175pt + :align: middle + +.. |num| image:: /_static/images/overview/numOpt_comparison.png + :width: 400pt + :height: 175pt + :align: middle + +.. |yaw| image:: /_static/images/overview/passiveYaw_comparison.png + :width: 400pt + :height: 175pt + :align: middle + +.. |mcr1| image:: /_static/images/overview/mcr_waveElev-heaveResp.png + :width: 400pt + :height: 175pt + :align: middle + +.. |mcr2| image:: /_static/images/overview/mcr_powerMatrix.png + :width: 400pt + :height: 175pt + :align: middle + ++-------------------------------------------------------------------+ +| Advanced Features Demonstration | ++=================================+=================================+ +| |nlh| | |num| | +| Nonlinear hydrodynamics | Various numerical options | ++---------------------------------+---------------------------------+ +| |b2b| | |yaw| | +| Body-to-body interactions | Passive yaw | ++---------------------------------+---------------------------------+ +| |mcr1| | |mcr2| | +| Multiple case run: elevation | Multiple case run: power matrix | ++---------------------------------+---------------------------------+ + + +WEC-Sim can model a wide variety of marine renewable energy and offshore devices. +The figures below highlight a small sample of devices that WEC-Sim has successfully modeled in the past. + +.. TODO: + Paraview figures or Simscape diagrams: + RM5 + GBM -> use more flexible design where bending can be seen + COER COMP + OC6 Phase II (future) + FOSWEC + desal + ptosim + Industry/academic designs? + + +.. |rm3| image:: /_static/images/overview/rm3_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim/tree/main/examples/RM3 + + +.. |oswec| image:: /_static/images/overview/oswec_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim/tree/main/examples/OSWEC + + +.. |sphere| image:: /_static/images/overview/sphere_freedecay_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Free_Decay + + +.. |ellipsoid| image:: /_static/images/overview/ellipsoid_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Nonlinear_Hydro + + +.. |gbm| image:: /_static/images/overview/gbm_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WEC-Sim_Applications/tree/main/Generalized_Body_Modes + + +.. |wigley| image:: /_static/images/overview/wigley_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/Wigley + + +.. |wec3| image:: /_static/images/overview/wecccomp_iso_side.png + :align: middle + :width: 400pt + :target: https://github.com/WEC-Sim/WECCCOMP + + +.. |oc6p1| image:: /_static/images/overview/oc6_iso_side.png + :align: middle + :width: 400pt + + +.. rm3 Reference Model 3 + oswec Bottom-fixed Oscillating Surge WEC (OSWEC) + sphere + ellipsoid Ellipsoid + gbm Barge with Four Flexible Body Modes + wigley Wigley Ship Hull + wec3 Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device + oc6p1 OC6 Phase I DeepCwind Floating Semisubmersible + + ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| Sample of devices that have been with WEC-Sim | ++======================================================================+======================================================================+ +| |rm3| | |oswec| | +| Reference Model 3 | Bottom-fixed Oscillating Surge WEC (OSWEC) | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |sphere| | |ellipsoid| | +| Hemisphere in Free Decay | Ellipsoid | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |wigley| | |gbm| | +| Wigley Ship Hull | Barge with Four Flexible Body Modes | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ +| |wec3| | |oc6p1| | +| Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device | OC6 Phase I DeepCwind Floating Semisubmersible | ++----------------------------------------------------------------------+----------------------------------------------------------------------+ \ No newline at end of file diff --git a/main/_sources/introduction/publications.rst.txt b/main/_sources/introduction/publications.rst.txt new file mode 100644 index 000000000..a18ae1de7 --- /dev/null +++ b/main/_sources/introduction/publications.rst.txt @@ -0,0 +1,122 @@ +.. _intro-publications: + +Publications +============ + +Refer to the `WEC-Sim Signature Project page `_ for a complete list of WEC-Sim publications, including publications written by users of the WEC-Sim code outside of the WEC-Sim development team. +Here is a list of publications written by the WEC-Sim multi-lab team about the development and application of WEC-Sim: + +[1] Y.-H. Yu, M. Lawson, K. Ruehl, and C. Michelen, “`Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool `_,” in Proceedings of the 2nd Marine Energy Technology Symposium, METS 2014, Seattle, WA, 2014. + +[2] Y.-H. Yu, Y. Li, K. Hallett, and C. Hotimsky, “`Design and Analysis for a Floating Oscillating Surge Wave Energy Converter `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[3] M. Lawson, Y.-H. Yu, A. Nelessen, K. Ruehl, and C. Michelen, “`Implementing Nonlinear Buoyancy and Excitation Forces in the WEC-Sim Wave Energy Converter Modeling Tool `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[4] K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y.-H. Yu, “`Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool `_,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014. + +[5] M. Lawson, Y.-H. Yu, K. Ruehl, and C. Michelen, “`Improving and Validating the WEC-Sim Wave Energy Converter Code `_," in Proceedings of the 3rd Marine Energy Technology Symposium, METS 2015, DC, 2015. + +[6] N. Tom, M. Lawson, and Y. Yu, “`Demonstration of the Recent Additions in Modeling Capabilities for the WEC-Sim Wave Energy Converter Design Tool `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[7] R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen, “`Development of PTO-SIM: A Power Performance Module for the Open-Source Wave Energy Converter Code WEC-SIM `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[8] M. Lawson, B. Garzon, F. Wendt, Y.-H. Yu, and C. Michelen, “`COER Hydrodynamics Modeling Competition: Modeling the Dynamic Response of a Floating Body Using the WEC-SIM and FAST Simulation Tools `_,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015. + +[9] N. Tom, M. Lawson, and Y.-H. Yu, “`Recent Additions in the Modeling Capabilities for the WEC-Sim-v1.1 Wave Energy Converter Design Tool `_,” in Proceedings of the 25th International Offshore and Polar Engineering Conference, ISOPE 2015, Kona, HI, 2015. + +[10] R. So, S. Casey, S. Kanner, A. Simmons, and Brekken, T. K. A., “`PTO-Sim: Development of a Power Take Off Modeling Tool for Ocean Wave Energy Conversion `_,” in Proceedings of the IEEE Power and Energy Society General Meeting, PES 2015, Denver, CO, 2015. + +[11] A. Simmons, T. Brekken, P. Lomonaco, and C. Michelen, “`Creating a Dynamometer for Experimental Validation of Power Take-Off Forces on a Wave Energy Converter `_,” in Proceedings of the IEEE Sustainability Technology Conference, SusTech 2015, Ogden, UT, 2015. + +[12] A. Combourieu, M. Lawson, A. Babarit, K. Ruehl, A. Roy, R. Costello, P. L. Weywada, and H. Bailey, “`WEC3: Wave Energy Converters modeling Code Comparison project `_,” in Proceedings of the 11th European Wave and Tidal Conference, EWTEC 2015, Nantes, France, 2015. + +[13] K. Ruehl, C. Michelen, Y.-H. Yu, and M. Lawson, “`Update on WEC-Sim Validation Testing and Code Development `_,” in Proceedings of the 4th Marine Energy Technology Symposium, METS 2016, DC, 2016. + +[14] B. Bosma, K. Ruehl, A. Simmons, B. Gunawan, P. Lomonaco, and C. Kelley, “`WEC-Sim Phase 1 Validation Testing – Experimental Setup and Initial Results `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[15] K. Ruehl, C. Michelen, B. Bosma, and Y.-H. Yu, “`WEC-Sim Phase 1 Validation Testing – Numerical Modeling of Experiments `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[16] S. Sirnivas, Y.-H. Yu, M. Hall, and B. Bosma, 2016, “`Coupled Mooring Analyses for the WEC-Sim Wave Energy Converter Design Tool `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[17] E. Quon, A. Platt, Y.-H. Yu, and M. Lawson, 2016, “`Application of the Most Likely Extreme Response Method for Wave Energy Converters `_,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016. + +[18] R. So, C. Michelen, B. Bosma, P. Lenee-Bluhm, and T. K. A. Brekken, “`Statistical Analysis of a 1:7 Scale Field Test Wave Energy Converter Using WEC-Sim `_,” IEEE Transactions on Sustainable Energy, vol. 8, no. 3, pp. 1118–1126, Jul. 2017. + +[19] J. Van Rij, Y.-H. Yu, and Y. Guo, “`Structural loads analysis for wave energy converters `_,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017. + +[20] Y.-H. Yu and D. Jenne, “`Analysis of a wave-powered, reverse-osmosis system and its economic availability in the United States `_,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017. + +[21] J. Ringwood et al., “`A competition for WEC control systems `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[22] F. Wendt et al., “`International Energy Agency Ocean Energy Systems Task 10 Wave Energy Converter Modeling Verification and Validation `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[23] Y. Guo, Y.-H. Yu, and J. van Rij, “`Inclusion of structural flexibility in design load analysis for wave energy converters `_,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017. + +[24] N. Tom, K. Ruehl, and F. Ferri, “`Numerical model development and validation for the WECCCOMP control competition `_,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018. + +[25] Y.-H. Yu, N. Tom, and D. Jenne, “`Numerical analysis on hydraulic power take-off for wave energy converter and power smoothing methods `_,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018. + +.. TODO This list of publications only goes through 2018 + + +News Articles +^^^^^^^^^^^^^ + +* August 2013 – Sandia National Laboratories, `Sandia-NREL Wave Energy Converter (WEC)-Sim Development Meeting `_ + +* April 2014 – Sandia National Laboratories, `WEC-Sim Code Development Meeting at the National Renewable Energy Laboratory `_ + +* July 2014 – Sandia National Laboratories, `Sandia, NREL Release Wave Energy Converter Modeling and Simulation Code: WEC-Sim `_ + +* August 2014 – NASA’s Jet Propulsion Laboratory, `NASA helps harness an ocean of energy `_ + +* November 2014 – Renewable Energy World, `Marine Energy Making Waves on Both Sides of the Pond `_ + +* April 2015 – Tidal Energy Today, `NREL, SNL release update for WEC simulator `_ + +* May 2015 – US Department of Energy, `Revamped Simulation Tool to Power Up Wave Energy Development `_ + +* July 2015 - Tidal Energy Today, `US wave energy simulation team wins COER award `_ + +* September 2015 - Sandia Wind & Water Power Newsletter, `WEC-Sim Leveraged to Model Floating Offshore Wind Experiments, and PTO-Sim: A Power Performance Module for WEC-Sim `_ + +* October 2015 – Windpower Engineering, `WEC-Sim leveraged to model floating offshore wind experiments `_ + +* October 2015 – OpenORE, `WEC3: codes that work `_ + +* October 2015 – OpenORE, `WEC-Sim Version 1.2 `_ + +* December 2015 – Oregon State University, O.H. Hinsdale Wave Research Laboratory, `Wave Energy Converter Simulator: WEC-Sim `_ + +* February 2016 - Tidal Energy Today, `US National Labs organize WEC-Sim training course `_ + +* April 2016 - Tidal Energy Today, `Open-source WEC-Sim testing moves forward `_ + +* April 2016 - US Department of Energy, `EERE Success Story—Open-Source Testing Reaches New Milestone for Wave Energy `_ + +* November 2016 – Oregon State University, College of Engineering, `Ripples upon ripples `_ + +* April 2017 - Tidal Energy Today, `Sandia Labs sets up wave energy webinars `_ + +* May 2017 - Tidal Energy Today, `Video: US national labs share wave modeling know-how `_ + +* November 2017 - MATLAB Newsletter, `Modeling and Simulating Next-Generation Wave Farm Technology `_ + +* December 2017 - NUI Maynooth Centre for Ocean Energy Research, `WEC Control Competition (WECCCOMP) `_ + +.. TODO This list of publications only goes through 2017 + +* June 2020 - NREL, `Wave Energy Modeling Tool Helps Design Tomorrow's Tech `_ + +* May 2021 - Offshore Energy, `WEC-Sim to support NASA’s lunar test flight `_ + +* October 2021 - R&D World, `WEC-Sim wins 2021 R&D 100 Award for Software/Service `_ + +* November 2021 - Testing & Expertise for Marine Energy (TEAMER), `WEC-Sim established as TEAMER test facility for numerical modeling `_ + +* January 2022 - `Award-Winning Simulation Software Helps NASA and Close to 100 Wave Energy Developers Improve Sea-Faring Technology `_ + +* March 2022 - Department of Energy Water Power Technologies Office (DOE WPTO), `Open-Source Wave Energy WEC-Sim Software Receives R&D 100 Award and Contributes to Space Exploration `_ + +* July 2022 - R&D World, `R&D 100 winner of the day: WEC-Sim `_ + diff --git a/main/_sources/introduction/release_notes.rst.txt b/main/_sources/introduction/release_notes.rst.txt new file mode 100644 index 000000000..e80ddcac9 --- /dev/null +++ b/main/_sources/introduction/release_notes.rst.txt @@ -0,0 +1,735 @@ +.. _intro-release-notes: + +Release Notes +============= + +.. _intro-citation: + +Citing WEC-Sim +------------------------ + +To cite WEC-Sim, please use the citation for WEC-Sim software release and/or cite the following WEC-Sim publication. + + +`WEC-Sim v6.1 `_ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. NOTE: citation needs to be revised for each release, author order should reflect the Zenodo DOI. + +[1] Kelley Ruehl, Adam Keester, Dominic Forbush, Jeff Grasberger, Salman Husain, Jorge Leon, David Ogden, and Mohamed Shabara, "WEC-Sim v6.1". Zenodo, September 16, 2024. https://doi.org/10.5281/zenodo.13770349. + +.. NOTE: citation needs to be revised for each release, author order should reflect the Zenodo DOI. + +.. code-block:: none + + @software{wecsim, + author = {Kelley Ruehl, + Adam Keester, + Dominic Forbush, + Jeff Grasberger, + Salman Husain, + Jorge Leon, + David Ogden, + Mohamed Shabara}, + title = {WEC-Sim v6.1}, + month = September, + year = 2024, + publisher = {Zenodo}, + version = {v6.1}, + doi = {10.5281/zenodo.10023797}, + url = {https://doi.org/10.5281/zenodo.13770349} + } + + +.. NOTE: badge does NOT need to be updated, doi badge is always for the lastest release + +.. image:: https://zenodo.org/badge/20451353.svg + :target: https://zenodo.org/badge/latestdoi/20451353 + + +Publication +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +[1] D. Ogden, K. Ruehl, Y.H. Yu, A. Keester, D. Forbush, J. Leon, N. Tom, "Review of WEC-Sim Development and Applications" in Proceedings of the 14th European Wave and Tidal Energy Conference, EWTEC 2021, Plymouth, UK, 2021. + + +`WEC-Sim v6.1 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* Update docs on main by @salhus in `#1031 `_ + +* Save mooring library to R2020b by @akeeste in `#1040 `_ + +* Update readAQWA.m by @salhus in `#1096 `_ + +* Update plotRadiationIRF.m by @AlufaSam in `#1102 `_ + +* Update readNEMOH.m for compatibility with NEMOH v3.0 by @nathanmtom in `#1105 `_ + +* Remove direct github installations from docs environment by @H0R5E in `#1149 `_ + +* Exclude R2020b and R2021a from Windows test runners by @H0R5E in `#1166 `_ + +* Add BEMIO cleanup function by @dforbush2 in `#1076 `_ + +* Remove dead code from wecSim.m by @akeeste in `#1170 `_ + +* Update wecSim.m to new MoorDyn dll by @jtgrasb in `#1177 `_ + +* Merge main commits to dev by @jtgrasb in `#1183 `_ + +* Port testing PR #1186 to main by @H0R5E in `#1187 `_ + +* Add R2023b to Windows tests by @H0R5E in `#1186 `_ + +* Nemoh v3.0.2 Examples by @MShabara in `#1204 `_ + +* Update paraview docs by @jtgrasb in `#1227 `_ + +* Update default branch to main by @akeeste in `#1235 `_ + +* Apply #1235 and #1241 to dev branch by @H0R5E in `#1240 `_ + +* PTO Extension Feature by @Allison-File in `#1198 `_ + +* Updating tests on main and dev by @kmruehl in `#1250 `_ + +* Updating WEC-Sim Issue Templates by @kmruehl in `#1247 `_ + +* Enable WEC-Sim to use MoorDyn v2 capabilities by @jtgrasb in `#1212 `_ + +* Add missing mask initialization line in spherical constraint by @akeeste in `#1264 `_ + +* Update readCAPYTAINE.m to read Khs from .nc by @salhus in `#1263 `_ + +* Update readCapytaine - fix reading multiple bodies with <6 dofs by @akeeste in `#1274 `_ + +* Reposition % for readability by @Gusmano-2-OSU in `#1272 `_ + +* Update waveSpread calculation in irregular waves by @dforbush2 in `#1290 `_ + +* Add new examples for updated version of NEMOH (NEMOHv3.0.2) by @ashleynchong in `#1226 `_ + +* Pull main into dev by @kmruehl in `#1297 `_ + +* Expand regression tests by @akeeste in `#1273 `_ + +* BEMIO Unit Updates by @jniffene in `#1296 `_ + +* Speed up writeBEMIOH5 by @akeeste in `#1301 `_ + +* Update readAQWA.m by @jtgrasb in `#1253 `_ + +* Variable hydrodynamics by @akeeste in `#1248 `_ + +* Update readCapytaine - get Khs from .nc files when bodies have less than 6 DOFs by @akeeste in `#1275 `_ + +* Adds the QTFs to WEC-Sim by @MShabara in `#1242 `_ + +* QTF - Variable Hydro compatibility by @akeeste in `#1312 `_ + +* Resolve conflicts between variable hydro and GBM by @akeeste in `_ + +**Bug Fixes** + +* Update to MoorDyn to fix MoorDyn crashing MATLAB session. by @AlixHaider in `#1012 `_ + +* Fix Direct Drive PTO Output order by @jtgrasb in `#1095 `_ + +* Fix accelerator modes issue by @jtgrasb in `#1100 `_ + +* Bugfix for plotBEMIO bodies by @akeeste in `#1207 `_ + +* Fix to #1217, nonlinFK and body block changed by @dforbush2 in `#1220 `_ + +* Fix on pDis function call by @dforbush2 in `#1229 `_ + +* Bug fixes for WEC-Sim GUI and Run From Simulink features by @akeeste in `#1195 `_ + +* Fix sign bug in the Generator Equivalent Circuit Block in PTO-Sim - Rebase PR to main by @jleonqu in `#1236 `_ + +* Fix direct drive bugs by @jtgrasb in `#1256 `_ + +* Minor fix for formatting in Developer manual by @akeeste in `#1280 `_ + +* Bad BEMIO fcn fix by @dforbush2 in `#1289 `_ + +**New Contributors** + +* @AlixHaider made their first contribution in `#1012 `_ + +* @AlufaSam made their first contribution in `#1102 `_ + +* @Allison-File made their first contribution in `#1198 `_ + +* @Gusmano-2-OSU made their first contribution in `#1272 `_ + +* @ashleynchong made their first contribution in `#1226 `_ + +**Issues and Pull Requests** + +* `v6.1 Changelog `_ + +* \> 104 issues closed since v6.0 + +* \> 48 PRs merged since v6.0 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.13770349.svg + :target: https://doi.org/10.5281/zenodo.13770349 + + + +`WEC-Sim v6.0 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* initial commit largeXYDispOption by @dforbush2 in `#877 `_ + +* Update coordinate system figure by @JiaMiGit in `#931 `_ + +* Property validation for WEC-Sim objects by @jtgrasb in `#904 `_ + +* Dev: adding ampSpectraForWS function by @dforbush2 in `#907 `_ + +* Customizable DOFs for plotBEMIO by @akeeste in `#944 `_ + +* Calculation_of_Ainf_using_radiationIRF.m by @salhus in `#946 `_ + +* Update citation names by @akeeste in `#954 `_ + +* Update getDofNames() by @akeeste in `#957 `_ + +* included readCAPYTAINE() argument to explicitly define KH.dat & Hydro by @dav-og in `#962 `_ + +* Extract mask variable by @salhus in `#958 `_ + +* Add tests to check that SLX file versions do not exceed R2020b by @H0R5E in `#919 `_ + +* Products of Inertia in WEC-Sim by @akeeste in `#981 `_ + +* Pull bug fixes #954, #999, #1002 from master into dev by @akeeste in `#1011 `_ + +* updating readNEMOH based on #983 by @kmruehl in `#990 `_ + +* Remove 'fixed' mass option from OSWEC input file by @jtgrasb in `#1024 `_ + +* Save the applied added mass time series by @akeeste in `#1023 `_ + +* Update tutorials by @kmruehl in `#1030 `_ + +* Control applications docs by @jtgrasb in `#1018 `_ + +* Update read- and writeBEMIOH5 to allow for pressure integration for mean drift by @nathanmtom in `#1046 `_ + +* Add function to read h5 file to hydro data structure by @jtgrasb in `#1048 `_ + +* Update radiationIRF.m by @nathanmtom in `#1045 `_ + +* Normalize quaternion to increase simulation robustness by @akeeste in `#1049 `_ + +* Plot bemio features by @jtgrasb in `#1034 `_ + +* Updates to Morison Element Implementation by @nathanmtom in `#1052 `_ + +* Moving PTO-Sim to main WEC-Sim library by @jleonqu in `#1057 `_ + +* Add windows runner to dev branch unit test workflow by @H0R5E in `#1061 `_ + +* Update docs dependencies by @H0R5E in `#1080 `_ + +* Type property pto sim by @jleonqu in `#1064 `_ + +* Added mass updates by @akeeste in `#1058 `_ + +* Feature paraview by @agmoore4 in `#1081 `_ + +* Paraview documentation hyperlink fix by @agmoore4 in `#1093 `_ + +* use capytaine v2 to compute hydrostatics by @dav-og in `#1092 `_ + +* Update paraview doc images by @jtgrasb in `#1098 `_ + +* readNEMOH update to be compatible with v3.0.0 release (but not QTF) by @nathanmtom in `#1087 `_ + +* Add simple direct drive PTO model by @jtgrasb in `#1106 `_ + +* Control+pto docs by @jtgrasb in `#1108 `_ + +* MOST Capabilities - Continuation by @jtgrasb in `#1127 `_ + +* Implement an FIR filter to calculate radiation forces by @salhus in `#1071 `_ + +* Updating documentation to include links for the Advanced Features Web by @jleonqu in `#1126 `_ + +* Multiple Wave Spectra by @salhus in `#1130 `_ + +* Update WECSim_Lib_Body_Elements.slx for N Waves Applications by @salhus in `#1133 `_ + +* Update to MoorDyn v2 by @RyanDavies19 in `#1134 `_ + +* Updating WEC-Sim tests for dev branch by @kmruehl in `#1142 `_ + +**Bug Fixes** + +* Remove fixed mass option by @akeeste in `#856 `_ + +* Move run('stopWecSim') to wecSim.m by @jtgrasb in `#885 `_ + +* Pull bug fixes into dev by @akeeste in `#900 `_ + +* Save slx files in 2020b fixes #920 by @jtgrasb in `#923 `_ + +* Fix readCAPYTAINE by @jtgrasb in `#884 `_ + +* Fixes saveViz feature for elevation import by @jtgrasb in `#929 `_ + +* Fix wave elevation import with rampTime = 0 by @jtgrasb in `#917 `_ + +* readCapytaine_fixes_for_reading_dataformats_correctly by @salhus in `#947 `_ + +* Pull #954 into dev by @akeeste in `#955 `_ + +* Bug fix for direction in readCapytaine by @akeeste in `#999 `_ + +* Fix sign bug reported on issue #993 by @jleonqu in `#102 `_ + +* Dev: reverts PR 910, fixing error in nonLinearBuoyancy by @dforbush2 in `#1017 `_ + +* Fix the transpose of linear restoring matrix to make roll mode rows to be 0 by @salhus in `#1032 `_ + +* Bugfix resolving documentation build error by @kmruehl in `#1059 `_ + +* fix_readWAMIT_and_writeBEMIOh5 by @salhus in `#1065 `_ + +* Pulling master bugfixes into dev by @kmruehl in `#1101 `_ + +* Bug fixes for v6.0 by @akeeste in `#1136 `_ + +* Path fix for BEMIO example by @akeeste in `#1144 `_ + +**New Contributors** + +* @JiaMiGit made their first contribution in `#931 `_ + +* @agmoore4 made their first contribution in `#1081 `_ + +* @RyanDavies19 made their first contribution in `#1134 `_ + + +**Issues and Pull Requests** + +* \>130 issues closed since v5.0.1 + +* \>74 PRs merged since v5.0.1 + +* `v6.0 Changelog `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.10023797.svg + :target: https://doi.org/10.5281/zenodo.10023797 + + +`WEC-Sim v5.0.1 `_ +-------------------------------------------------------------------------------- + +**New Features** + +This is a bug fix release. New features since the previous release are not included. + +**Bug Fixes** + +* Fix saveViz by @jtgrasb in `#866 `_ + +* Fix typo in docs. by @mancellin in `#898 `_ + +* Update documentation tutorials to fix OSWEC inertia by @jtgrasb in `#894 `_ + +* CI: Split docs jobs | Add color to docs logs | Cancel runs on new push | Add 2021b to MATLAB versions by @H0R5E in `#862 `_ + +* Mac path fixes and make outputDir public by @ahmedmetin in `#874 `_ + +* wecSimPCT Fix (Master) by @yuyihsiang in `#870 `_ + +* Fix image bug in PTO-Sim in Library Browser by @jleonqu in `#896 `_ + +* update to v5.0 citation by @akeeste in `#911 `_ + +* fix non-linear hydro by @dforbush2 in `#910 `_ + +* Pull dev bugfixes into master by @akeeste @jtgrasb in `#950 `_ (includes `#929 `_ `#917 `_ `#884 `_ by @jtgrasb) + +**New Contributors** + +* @mancellin made their first contribution in `#898 `_ + +* @ahmedmetin made their first contribution in `#874 `_ + +**Issues and Pull Requests** + +* \>52 issues closed since v5.0 + +* \>23 PRs merged since v5.0 + +* `v5.0.1 Changelog `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.7121186.svg + :target: https://doi.org/10.5281/zenodo.7121186 + + +`WEC-Sim v5.0 `_ +-------------------------------------------------------------------------------- + +**New Features** + +* Refactoring classes and properties @kmruehl in `#803 `_, `#822 `_, `#828 `_, `#832 `_, @akeeste in `#838 `_ + +* Refactoring docs by @kmruehl in `#840 `_ + +* Refactor BEMIO functions, tests, and documentation @akeeste in `#790 `_, `#812 `_, @H0R5E in `#839 `_, @dav-og in `#806 `_ + +* Run from sim updates by @akeeste in `#737 `_ + +* Allow binary STL files by @akeeste in `#760 `_ + +* Update Read_AQWA and AQWA examples by @jtgrasb in `#761 `_, `#779 `_, `#797 `_, `#831 `_ + +* Rename plotWaves by @jtgrasb in `#765 `_ + +* Update to normalize to handle sorting mean drift forces by @nathanmtom in #808 #809 + +* Remove passiveYawTest.m by @jtgrasb in `#807 `_ + +* Wave class wave gauge update by @nathanmtom in `#801 `_ + +* New pto sim lib by @jleonqu in `#821 `_ + +* Warning/Error flags by @jtgrasb in `#826 `_ + +* Add Google Analytics 4 by @akeeste in `#864 `_ + +**Documentation** + +* Update WEC-Sim's Developer Documentation for the Morison Element Implementation by @nathanmtom in `#796 `_ + +* Update response class API by @akeeste in `#802 `_ + +* Doc_auto_gen_masks by @salhus in `#842 `_ + +* Move documentation compilation to GitHub Actions by @H0R5E in `#817 `_ + +* Add branch build in docs workflow for testing PRs by @H0R5E in `#834 `_ + +* Update the WEC-Sim Theory Documentation to Clarify Wave Power Calculation by @nathanmtom in `#847 `_ + +* Update documentation on mean drift and current by @akeeste in `#800 `_ + +**Bug Fixes** + +* Fix cable library links. Resolves #770 by @akeeste in #774 #775 + +* Fix rate transition error by @akeeste in `#799 `_ + +* Fix cable implementation by @dforbush2 in `#827 `_ + +* PTO-Sim bug fix by @jleonqu in `#833 `_ + +* Bug fix for the regular wave power full expression by @nathanmtom in `#841 `_ + +* Fix documentation on dev branch by @H0R5E in `#816 `_ + +* Bug fix: responseClass reading the MoorDyn Lines.out file too early, resolves `#811 `_ by @akeeste in `#814 `_ + +**Issues and Pull Requests** + + * \>52 issues closed since v4.4 + + * \>44 PRs merged since v4.4 + + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.6555137.svg + :target: https://doi.org/10.5281/zenodo.6555137 + + + +`WEC-Sim v4.4 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added WEC-Sim Library blocks for cable, spherical constraint, and spherical pto `#712 `_ `#675 `_ + + * Added feature to add/remove WEC-Sim path and create temp directory for each run `#685 `_ `#686 `_ + + * Updated WEC-Sim Library to 2020b and saved Simulink Library Functions to (`*.m`) files `#686 `_ `#654 `_ + + * Split WEC-Sim Library into sublibraries for each class `#720 `_ + + * Restructured WEC-Sim Continuous Integration tests into class-based tests `#620 `_ + + * Added wave visualization with wave markers and post-processing `#736 `_ `#678 `_ + + * Moved nonlinear hydrodynamics and morison elements to properties of the Body Class `#692 `_ + +**Documentation** + + * Added developer manual content for WEC-Sim Library, Run from Simulink, Simulink Functions, Added Mass, Software Tests `#728 `_ + + * Added user manual content for troubleshooting WEC-Sim `#641 `_ + + * Updated content for PTO-Sim, ParaView, WEC-Sim Applications and Tutorials `#668 `_ `#642 `_ `#649 `_ `#643 `_ + + * Added multi-version documentation for ``master`` and ``dev`` branches `#630 `_ + + +**Bug Fixes** + + * Resolved bug with macro for ParaView 5.9 `#459 `_ + + * Resolved bugs in BEMIO with Read_Capytaine, READ_AQWA, and Write_H5 functions `#727 `_ `#694 `_ `#636 `_ + + * Resolved bug with variable time-step solver `#656 `_ + +Issues and Pull Requests** + + * \> 57 issues closed since v4.3 + + * \> 54 PRs merged since v4.3 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.5608563.svg + :target: https://doi.org/10.5281/zenodo.5608563 + + + +`WEC-Sim v4.3 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added the ability for WEC-Sim to be run directly from Simulink `#503 `_ `#512 `_ `#548 `_ + + * Added capability to read Capytaine (.nc) output. Includes examples of running Capytaine with hydrostatics `#464 `_ + + * Created a more accurate infinite frequency added mass calculation `#517 `_ + + * Added ability for setInitDisp to intake multiple initial rotations `#516 `_ `#586 `_ + +**Documentation** + + * Restructured into four manuals: introduction, theory, user and development `#455 `_ `#557 `_ + + * Update of code structure section `#455 `_, links `#649 `_ , diagrams `#643 `_, paraview `#642 `_, + + * Added section on suggested troubleshooting `#641 `_ + +**Continuous integration tests** + + * Overhaul and speed up of tests `#508 `_ `#620 `_ + + * Extension of tests to the applications cases `#7 `_ + +**Clean up** + + * Created issue templates on GitHub `#575 `_ `#634 `_ + + * Updated Morison Element warning flags `#408 `_ + + * Clean up response class methods `#491 `_ `#514 `_ + + * Clean up paraview output functions `#490 `_ + +**Bug Fixes** + + * Paraview macros and .pvsm files `#459 `_ + + * BEMIO read mean drift force in R2021a `#636 `_ + + * PTO-Sim calling workspace `#632 `_ + + * Combine_BEM Ainf initialization `#611 `_ + +**Issues and Pull Requests** + + * \> 100 issues closed since v4.2 + + * \> 45 PRs merged since v4.2 + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.5122959.svg + :target: https://doi.org/10.5281/zenodo.5122959 + + + +`WEC-Sim v4.2 `_ +-------------------------------------------------------------------------------- + +**New Features** + + * Added normal/tangential option for Morison Force (``simu.morisonElement = 2``) `#408 `_ + + * Added Drag Body (``body(i).nhBody=2``) `#423 `_ `#384 `_ + + * WEC-Sim output saved to structure `#426 `_ + + * Added WEC-Sim parallel execution for batch runs (``wecSimPCT``) using MATLAB parallel computing toolbox `#438 `_ + + * Added end stops to PTOs `#445 `_ + +**Documentation** + + * Automatically compile docs with TravisCI `#439 `_ + + * Generate docs for master and dev branches of WEC-Sim + +**Bug Fixes** + + * Resolved convolution integral bug for body-to-body interactions `#444 `_ + + * Resolved PTO-Sim bug for linear to rotary conversion blocks `#247 `_ `#485 `_ + + * Resolved variant subsystem labeling bug `#486 `_ `#479 `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.4391330.svg + :target: https://doi.org/10.5281/zenodo.4391330 + + + +`WEC-Sim v4.1 `_ +-------------------------------------------------------------------------------- + +* Added passive yaw +* Revised spectral formulations per IEC TC114 TS 62600-2 Annex C +* Updated examples on the `WEC-Sim_Applications `_ repository +* Added unit tests with Jenkins +* Added API documentation for WEC-Sim classes + +* Merged Pull Requests + + * Updated BEMIO for AQWA version comparability `#373 `_ + + * Extended capabilities for ParaView visualization `#355 `_ + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3924765.svg + :target: https://doi.org/10.5281/zenodo.3924765 + + +`WEC-Sim v4.0 `_ +-------------------------------------------------------------------------------- + +* Added mean drift force calculation +* Added generalized body modes for simulating flexible WEC devices and for structure loading analysis +* Updated BEMIO for mean drift force and generalized body modes + +.. image:: https://zenodo.org/badge/DOI/10.5281/zenodo.3827897.svg + :target: https://doi.org/10.5281/zenodo.3827897 + + + +`WEC-Sim v3.1 `_ +-------------------------------------------------------------------------------- + +* Added wave gauges for three locations +* Added command line documentation for objects +* Added error and warning flags +* Converted Morison Elements to script instead of block +* Converted WEC-Sim and PTO-Sim library files back to slx format +* Fixed plot error in MATLAB 2018b + + +`WEC-Sim v3.0 `_ +-------------------------------------------------------------------------------- + +* Added option of :ref:`equal energy spacing ` for irregular waves (default) +* Added option to calculate the wave elevation at a location different from the origin +* Added option to define :ref:`gamma for JONSWAP spectrum ` +* Improved the WEC-Sim simulation speed when using rapid-acceleration mode +* Fixed path bug in BEMIO for LINUX/OSX users + +* Changed/Added following WEC-Sim parameters + + * waves.randPreDefined -> :ref:`waves.phaseSeed ` + + * waves.phaseRand -> waves.phase + + * simu.dtFeNonlin -> :ref:`simu.dtNL ` + + * simu.rampT -> :ref:`simu.rampTime ` + + * Added simu.dtME to allow specification of :ref:`Morison force time-step ` + + +`WEC-Sim v2.2 `_ +-------------------------------------------------------------------------------- + +* Added option to save pressure data for nonlinear hydro (`simu.pressureDis`) +* Update to moorDyn parser (doesn't require line#.out) + +* Repository cleanup + + * Implemented `Git LFS `_ for tracking ``*.h5`` files + + * Added `WEC-Sim Application repository `_ as a `submodule `_ + + * Moved `moorDyn `_ to its own repository + + * Removed publications from repository, :ref:`available on website ` + + + +`WEC-Sim v2.1 `_ +-------------------------------------------------------------------------------- + +* Added MATLAB version of BEMIO (to replace python version) +* Added variable time-step option with 'ode45' by @ratanakso +* Update to MCR, option to not re-load ``*.h5`` file by @bradling +* Update to waveClass to allow for definition of min/max wave frequency by @bradling + + +`WEC-Sim v2.0 `_ +-------------------------------------------------------------------------------- + +* Updated WEC-Sim Library (generalized joints/constraints/PTOs) +* Body-to-body interactions for radiation forces +* Morison forces +* Batch run mode (MCR) +* Mooring sub-library implemented in mooringClass (no longer in body or joint) +* More realistic PTO and mooring modeling through PTO-Sim and integration with MoorDyn +* Non-hydrodynamic body option +* Visualization using ParaView + + +`WEC-Sim v1.3 `_ +-------------------------------------------------------------------------------- +* Added Morison Elements +* Body2Body Interactions +* Multiple Case Runs (wecSimMCR) +* Moordyn +* Added Non-hydro Bodies +* Morison Forces +* Joint Updates +* Visualization with Paraview + +`WEC-Sim v1.2 `_ +-------------------------------------------------------------------------------- +* Nonlinear Froude-Krylov hydrodynamics and hydrostatics +* State space radiation +* Wave directionality +* User-defined wave elevation time-series +* Imports nondimensionalized BEMIO hydrodynamic data (instead of fully dimensional coefficients) +* Variant Subsystems implemented to improve code stability (instead of if statements) +* Bug fixes + + +`WEC-Sim v1.1 `_ +-------------------------------------------------------------------------------- +* WEC-Sim v1.1, `available on GitHub `_ +* Improvements in code stability through modifications to the added mass, radiation damping calculations, and impulse response function calculations +* Implementation of state space representation of radiation damping convolution integral calculation +* New hydrodynamic data format based on :ref:`BEMIO ` output, a python code that reads data from WAMIT, NEMOH, and AQWA and writes to the `Hierarchical Data Format 5 `_ (HDF5) format used by WEC-Sim. +* Documentation available on WEC-Sim Website + +`WEC-Sim v1.0 `_ +-------------------------------------------------------------------------------- +* Initial release of WEC-Sim (originally on OpenEI, now on GitHub) +* Available as a static download +* Documentation available in PDF + + diff --git a/main/_sources/most/acknowledgements.rst.txt b/main/_sources/most/acknowledgements.rst.txt new file mode 100644 index 000000000..364043d5a --- /dev/null +++ b/main/_sources/most/acknowledgements.rst.txt @@ -0,0 +1,14 @@ +.. _most-acknowledgements: + +Acknowledgements +================ + +MOST software has been developed by the `MOREnergy Lab `_ of Politecnico di Torino, Italy. + +.. figure:: IMAGE_LogoPolitecnicodiTorino.jpg + :width: 40% + +.. figure:: IMAGE_LogoMOREnergyLab.png + :width: 40% + +| \ No newline at end of file diff --git a/main/_sources/most/advanced_features.rst.txt b/main/_sources/most/advanced_features.rst.txt new file mode 100644 index 000000000..026b720dd --- /dev/null +++ b/main/_sources/most/advanced_features.rst.txt @@ -0,0 +1,328 @@ +.. _most-advanced_features: + +***************** +Advanced Features +***************** + +In this section, a more detailed look will be taken at some of the operational aspects of the new features introduced with MOST. Specifically, we will +focus on the pre-processing part in which all the data necessary for simulating Floating Offshore Wind Turbines (FOWT) and hybrid platforms are obtained. +For the simulation and post-processing part, please refer to the theory section of MOST (:ref:`most-theory`) and the advanced features of WEC-Sim (:ref:`user-advanced-features`). + + + +MOST-IO +======= +The pre-processing phase of MOST takes place through the use of the ``mostIO.m`` script in the ''mostData'' subfolder, through which the following scripts +are launched (in this order): + +* ``run_turbsim.m`` : creation of the data structure describing the input wind speeds; +* ``Create_Mooring_Matrix.m`` : creation of the look-up table describing the mooring forces; +* ``BladeData.m`` : creation of the data structure concerning the characteristics of the airfoils constituting the turbine blades; +* ``WTproperties.m`` : creation of the data structure concerningo the geometric and inertial characteristics of the wind turbine; +* ``Steady_States.m`` : computation of the steady-state values of certain quantities of interest when the average wind speed varies and used for the calculation of some quantities concerning the control logic; +* ``Controller.m`` : creation of the data used to simulate the control logics (Baseline :cite:`Hansen2005` or ROSCO :cite:`abbas2022reference`) +* ``AeroLoads.m`` : creation of the aerodynamic loads look-up table (acting on the blades root). + +In the next subsections, MOST features will be discussed in detail, in particular, the settings to be provided to obtain the required data and the +operations performed in the various codes will be explained. + + +Wind Features +------------- +Wind speed can be defined by choosing between the two options of the wind class: + +* **Constant** wind conditions +* **Turbulent** wind conditions + +The constant wind speed is constant in time and space while the second option includes the temporal and spatial turbulence of the wind. Below is an +image of the Variant Subsystem through which one of the two wind options can be enabled. + +.. figure:: IMAGE_wind_Choice.png + :width: 60% + :align: center + +| + +The simulation of the wind turbine for turbulent wind conditions requires the generation of a look-up table which relates the temporal and spatial +variation of wind speed on the wind turbine rotor plane (yz plane). Therefore the wind speed is discretized for 3 variables (2 spatial parameters, +y and z, and the time). The look-up table is generated using ``run_turbsim.m`` which computes turbulent wind field based on `Turbsim `_ +executable. Mean wind speed can be defined in ``run_turbsim.m`` script, while other parameters can be set-up in the ``Turbsim_inputfile.txt`` file, +the main ones are: + + +========================================= ========================================================================== +**Name** **Description** +``NumGrid_Z`` Vertical grid-point matrix dimension +``NumGrid_Y`` Horizontal grid-point matrix dimension +``TimeStep`` Time step [s] +``AnalysisTime`` Length of analysis time series [s] +``UsableTime`` Usable length of output time series [s] +``HubHt`` Hub height [m] +``GridHeight`` Grid height [m] +``GridWidth`` Grid width [m] +``VFlowAng`` Vertical mean flow (uptilt) angle [deg] +``HFlowAng`` Horizontal mean flow (skew) angle [deg] +``TurbModel`` Turbulence model ("IECKAI"=Kaimal, "IECVKM"=von Karman, "GP_LLJ", "NWTCUP", "SMOOTH", "WF_UPW", "WF_07D", "WF_14D", "TIDAL") +``IECstandard`` Number of IEC 61400-x standard (x=1,2, or 3 with optional 61400-1 edition number) +``IECturbc`` IEC turbulence characteristic ("A", "B", "C" or the turbulence intensity in percent) +``IEC_WindType`` IEC turbulence type ("NTM"=normal, "xETM"=extreme turbulence, "xEWM1"=extreme 1-year wind, "xEWM50"=extreme 50-year wind, where x=wind turbine class 1, 2, or 3) +``ETMc`` IEC Extreme Turbulence Model "c" parameter [m/s] +``WindProfileType`` Wind profile type ("JET";"LOG"=logarithmic;"PL"=power law;"H2L"=Log law for TIDAL spectral model;"IEC"=PL on rotor disk, LOG elsewhere) +``RefHt`` Height of the reference wind speed [m] +``PLExp`` Power law exponent [-] +``Z0`` Surface roughness length [m] +``PC_UW`` Hub mean u'w' Reynolds stress +``PC_UV`` Hub mean u'v' Reynolds stress +``PC_VW`` Hub mean v'w' Reynolds stress +========================================= ========================================================================== + +A detailed description of using Turbsim is given here :cite:`kelley2005overview`. + + +Aerodynamic wind loads calculation in the Simulink model requires the average wind speed for each blade. This is found by computing the average wind +speed for four discretized points along the blade length during the simulation. Relative wind speed for each blade is computed including the influence +of the horizontal hub speed and the pitch and yaw rotation of the hub. + + + +Mooring Features +---------------- + +MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. Specifically, the mooring look-up table +simulates a mooring system consisting of a certain number of lines suspended between two points (anchor and fairlead) and angularly equispaced. +This option is based on the catenary equations similarly to the open-source code MAP++ :cite:`MAP`. + + +In the simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outpus (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called "moor_matrix" and created through the ``Create_Mooring_Matrix.m`` script, in which the following +variables are specified: + +* Water density (kg/m^3): :code:`rho_water` +* Gravity acceleration (m/s^2): :code:`gravity` +* Water depth (m): :code:`depth` +* Mooring line diameter (m): :code:`d` +* Linear mass (kg/m): :code:`linear_mass` +* Number of lines: :code:`number_lines` +* Fairlead and anchor positions of the first line (m): :code:`nodes` +* Mooring lines unstretched length (m): :code:`L` +* Sectional stiffness (N): :code:`EA` +* Seabed friction coefficient: :code:`CB` + +In addition, the user can specify the domain of the look-up tables, specifically: + +* Amplitude and discretisation along surge direction (m): :code:`X` +* Amplitude and discretisation along sway direction (m): :code:`Y` +* Amplitude and discretisation along heave direction (m): :code:`Z` +* Amplitude and discretisation around roll axis (rad): :code:`RX` +* Amplitude and discretisation around pitch axis (rad): :code:`RY` +* Amplitude and discretisation around yaw axis (rad): :code:`RZ` + + +The code for generating the "moor_matrix" structure at first calculates the positions of the fairleads and anchors of the other lines, +in accordance with the specified number and in an angularly equispaced manner, after which, for each combination of the inputs (surge, +sway, heave, roll, pitch, and yaw) it calculates the new positions of the fairleads. Given these positions, for each line it performs a +numerical optimization by which the vertical force and the horizontal force (along the projection of the line in the xy plane) are +calculated. Specifically, by means of the typical catenary equations, it is possible to calculate (knowing the characteristics of a line) +the above-mentioned vertical and horizontal forces having as input the vertical and horizontal distances between the two ends of the +line, so, in this case the optimization procedure searches for forces such that the distances are as close as possible to those +specified. Once the vertical and horizontal forces are calculated for each line, the resulting force and torque in the global reference +frame are applied to the origin of the reference frame attached to the structure. + + + +Wind Turbine Features +--------------------- + +The wind turbine is modelled as a multi-body system including the tower, the nacelle, the hub, and the blades. The properties of each wind turbine component +are defined in two structures that can be generated using the provided ``BladeData.m`` and ``WTproperties.m`` MATLAB codes. In the first, the +variables concerning the blades are defined, specifically (see figure below for a better comprehension): + +* Blade radius values for which other properties are defined: ``radius`` +* Value, for each specified radius, of the pre-bending distance out of the rotor plane: ``BlCrvAC`` +* Value, for each specified radius, of the pre-bending angle out of the rotor plane: ``BlCrvAng`` +* Value, for each specified radius, of the pre-bending distance in the rotor plane: ``BlSwpAC`` +* Value, for each specified radius, of the twist angle: ``twist`` +* Value, for each specified radius, of the chord: ``chord`` +* Index of the airfoil type corresponding to each specified radius: ``airfoil_index`` +* Matrix containing, for each type of airfoil existing, the values of lift, drag and torque coefficients as a function of angle of attack: ``airfoil`` + +The following figure :cite:`BladeGeometry` shows some of the values mentioned above. + +.. figure:: IMAGE_blade_geom.png + :width: 80% + :align: center + + +| + +In the second script, the geometric and inertial properties of the turbine components are defined. For each of them the mass and inertia are defined, +in addition, the following other variables must be entered (see figure below for a better comprehension): + + +* Tower offset position relative to sea water level (m): :code:`tower.offset` +* Tower height (m): :code:`tower.height` +* Tower relative center of mass (relative to tower offset) (m): :code:`tower.cog_rel` +* Nacelle relative center of mass (relative to tower top) (m): :code:`nacelle.cog_rel` +* Twr2Shft (deg): :code:`nacelle.Twr2Shft` +* Tilt angle (deg): :code:`nacelle.tiltangle` +* Overhang (m): :code:`hub.overhang` +* Hub height (m): :code:`hub.height` +* Hub radius (m): :code:`hub.Rhub` +* Precone angle (deg): :code:`hub.precone` +* Blades relative center of mass (relative to hub center) (m): :code:`blade.cog_rel` +* Blade discretization nodes to average the wind speed: :code:`blade.bladeDiscr` +* Generator efficiency: :code:`gen_eff` +* CAD file path + + +.. figure:: IMAGE_geometry.png + :width: 80% + :align: center + +| + +Once these dimensions are known, the positions of the centre of mass of each component in the inertial reference frame are calculated (origin at sea +level and at the centre of the tower, as far as the horizontal plane is concerned), as well as the total mass and inertia. + + + +Control Features +^^^^^^^^^^^^^^^^ + +In MOST there is the possibility of using two different wind turbine control logics (Baseline :cite:`Hansen2005` and ROSCO :cite:`abbas2022reference`) +and as explained in the :ref:`theory` the steps to be taken in order to obtain the data needed for their simulation are the calculation +of the stationary values and the calculation of the controller gains. The first task is performed by the script ``Steady_States.m`` in the subfolder +"Control". Specifically, through this, the stationary values of power, rotor speed, thrust force, generator torque and collective blade pitch angle are computed +for both of the aforementioned control logics. The following variables must be specified in the script: + +* Value of power produced under nominal conditions and under conditions where the wind speed is greater than the nominal one: :code:`Prated` + +* Wind speed at which power begins to be produced (and therefore at which the generator torque becomes non-zero): :code:`v_cutin` + +* Wind speed above which no power is produced, and the blades rotate to a safe position (feather condition): :code:`v_cutout` + +* Rated first try wind speed, meaning that the actual wind speed (probably close to this) will be calculated later: :code:`v_rated_try` + +* Rated first try rotor speed, meaning that the actual one (probably close to this) will be calculated later: :code:`omega_rated_try` + +* Wind speed discretization, which indicates how many stationary values will be calculate: :code:`v_discr` + +* Minimum allowed value of the rotor speed (setting used only for the calculation of stationary values related to the ROSCO controller): :code:`omega_min` + +* Boundary wind speed value between zone 1.5 (zone with constant and equal to minimum rotor speed) and zone 2 (zone with optimal tip speed ratio), this value is used only for the ROSCO controller: :code:`vw_R2in_try` + +* Ratio of the maximum allowed thrust to what there would be if no limits were imposed: :code:`max_Thrust_factor` + + +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal one (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is also the case of some turbine types for what concerns the ROSCO controller. +The first step performed in the code is the calculation of the actual nominal conditions (rated wind speed, rotor speed and blade pitch angle): by +means of a constrained optimisation, the values of wind speed, rotor speed and blade pitch angle are sought such that the first two are as close as +possible to those set for the first attempt, with the constraint of having a thrust not exceeding the maximum and a power output equal to the rated +one. In the case of the Baseline controller, the first constraint does not apply, in the case of the ROSCO controller, on the other hand, we first +calculate the nominal conditions without the thrust constraint, then calculate the maximum thrust by multiplying the nominal one by the thrust factor +defined in the settings and then repeat the calculation to find the correct nominal values. The optimisation relies on a function that calculates the +aerodynamic forces at the hub by solving the BEM (Blade Element Momentum) theory, for more information on how this function works see (:cite:`ning2014simple` , :cite:`Ning2015`). + +The second step, performed only in the case of ROSCO, involves finding the wind speed for which transition from zone 1.5 to zone 2 (see :cite:`abbas2022reference`) occurs. +In both zones it is desired to maximize power, but in zone 1.5 is where there is the additional constraint of minimum rotor speed. Here, to maximize +power, the rotor speed would need to be less than the minimum rotor speed, and to partially compensate for the resulting power deficit, a blade pitch +angle greater than zero is used. The search for the frontier wind speed is done by an optimization that looks for the wind speed for which the +difference between the rotor speed that maximizes power without imposing constraints equals the minimum wind speed. To find the rotor speed that +maximizes power for a given wind speed, a second nested optimization is used. + +Finally, the last step involves calculating the stationary values as the wind speed changes. It is performed by a constrained optimization through which +the rotor speed and blade pitch values are sought such that the power produced is maximized while maintaining it at or below the rated power and +respecting the maximum thrust limit. Once the rotor speed and blade pitch values have been found for each wind speed analysed, the steady-state +values of the other quantities of interest (power, thrust, and generator torque) are evaluated. + + +Once the steady-state values for the two control logics have been calculated, it is possible to build the data structures needed for controller +simulation by running the ``Controller.m`` script in the "Control" subfolder. In this script a few settings have to be defined, which can refer to +both logics or just the Baseline or ROSCO controller. + + +The common settings are as follows: + +* Maximum allowable torque rate: :code:`torqueMaxRate` + +* Maximum allowable blade pitch rate: :code:`thetaMaxRate` + +* Values needed to define the state space used to filter the rotor speed before providing this as input to the controllers: :code:`omegaFilter` + + +The settings only valid for ROSCO are: + +* Natural frequency of the electric generator torque control loop: :code:`wn_C` + +* Damping ratio of the electric generator torque control loop: :code:`csi_C` + +* Natural frequency of the blade pitch control loop: :code:`wn_theta_ROSCO` + +* Damping ratio of the blade pitch control loop: :code:`csi_theta_ROSCO` + +* Constants used in the "Set Point Smoothing" module: :code:`kb` and :code:`kt` + +* Gain related to the velocity (along the surge) of the nacelle, used to control floating wind turbines: :code:`KV` + +* Values needed to define the state space used to filter the wind speed before providing this as input to the controller: :code:`windFilter` + +* Values needed to define the transfer function used to filter the nacelle speed before providing this as input to the controller: :code:`pitchFilter` + +* Values needed to define the transfer function used as a filter in the "Set Point Smoothing" module: :code:`SPSFilter` + + +The settings only valid for Baseline are: + +* Natural frequency of the blade pitch control loop: :code:`wn_theta_BL` + +* Damping ratio of the blade pitch control loop: :code:`csi_theta_BL` + + + +Regarding the Baseline controller, at the operational level, the torque law is simply computed by creating a biunivocal relationship between the +steady-state (as wind speed changes) values of rotor speed and generator torque. As for the blade pitch loop, at first the value of +:math:`K_P^\prime` and :math:`K_I^\prime` are calculated (see :ref:`Baseline`), after which the power to pitch sensitivity, as a function of blade pitch angle, +is computed for each stationary point. To do this centered finite differences are used by calculating power via a function that solves the +aerodynamics via BEM theory. Finally, we perform quadratic regression of :math:`\frac{dP}{d\theta_{bl}}` so that we have, in simulation, a simple +relationship between blade pitch and power-to-pitch sensitivity. + + + +As for the ROSCO controller, however, at the operational level, in the script the :math:`A` and :math:`B_{\theta_{bl}}` matrices are calculated for +each wind speed for which stationary values were computed through centered finite differences; regarding the :math:`B_{T_{gen}}` matrix, it is +calculated only once since it is constant (see :ref:`ROSCO`). Once the matrices are known, the values of :math:`K_P` and :math:`K_I` for the two controls (generator +torque and blade pitch) are calculated. Finally, the minimum allowable blade pitch value is calculated using an optimization procedure; specifically, +for each wind speed in region 3 (a rotor speed equal to the nominal one is assumed in this region), the blade pitch angle such that the maximum thrust +occurs is found. It represents the minimum angle value that can be imposed, below which there will be a thrust greater than the maximum allowed. + + + +Aerodynamic Loads Features +^^^^^^^^^^^^^^^^^^^^^^^^^^ +The look-up tables of aerodynamic loads are generated using the ``AeroLoads.m`` script; the aerodynamic forces and torques are calculated as a function +of three input parameters: the wind speed, the difference between the rotor speed and the stationary rotor speed for that wind speed, and the difference +between the blade pitch angle and the steady-state angle for that wind speed. In order to calculate the required look-up tables, the user will need to +define the following variables: + +* Rotor speed discretization values: :code:`o_discr` +* Blade pitch discretization values: :code:`theta_discr` +* Discretization range of rotor speed values around steady-state one (rad/s): :code:`o_A` +* Discretization range of blade pitch values around steady-state one (rad): :code:`theta_A` + +The discretisation range is used to determine the aerodynamic loads near the steady states, which include all cases that are likely to be reached during +operating conditions. + + + + + +References +---------- + +.. bibliography:: ../most/MOST.bib + :style: unsrt + :labelprefix: D \ No newline at end of file diff --git a/main/_sources/most/index.rst.txt b/main/_sources/most/index.rst.txt new file mode 100644 index 000000000..3ecc83769 --- /dev/null +++ b/main/_sources/most/index.rst.txt @@ -0,0 +1,17 @@ +.. _most: + +########### +MOST Manual +########### + +.. toctree:: + :maxdepth: 2 + + overview.rst + acknowledgements.rst + release_notes.rst + publications.rst + license.rst + introduction.rst + theory.rst + advanced_features.rst diff --git a/main/_sources/most/introduction.rst.txt b/main/_sources/most/introduction.rst.txt new file mode 100644 index 000000000..ae2946b42 --- /dev/null +++ b/main/_sources/most/introduction.rst.txt @@ -0,0 +1,41 @@ +.. _most-introduction: + +Introduction +============ + +With MOST, it is possible to simulate Floating Offshore Wind Turbines (FOWTs) and hybrid platforms thanks to the development of a wind turbine model which can be coupled with the WEC-Sim library. MOST requires several user inputs similar to WEC-Sim including hydrodynamic bodies requiring hydrodynamic coefficients from Boundary Element Method (BEM) software (e.g. Nemoh, Wamit or Ansys Aqwa), mooring, constraints, and simulation input details. Differently to WEC-Sim, MOST also includes user inputs relative to the wind turbine and wind, which will be explained in the next sections. + + +Numerical codes added to WEC-Sim are the following: + +========================== ============================================================================================================================================================ +**File Type** **File name** +Pre-processing Executables ``mostIO.m``, ``run_turbsim.m``, ``Create_Mooring_Matrix.m``, ``BladeData.m``, ``WTproperties.m``, ``Steady_States.m``, ``Controller.m`` and ``AeroLoads.m`` +Post-Processing Functions ``userDefinedFunction.m`` +New MATLAB Classes ``windClass.m`` and ``windTurbineClass.m`` +MOST Simulink Library ``MOST_Lib.slx`` +========================== ============================================================================================================================================================ + +The pre-processing executables and post-processing function can be found in the WEC-Sim Applications MOST example while the new classes and Simulink library have been added to the WEC-Sim source directly. + +Existing WEC-Sim source code has also been modified to include further option features relative to the new capabilities. The following codes have been modified: + + +========================================= ====================================================================================================================================================================================================================================================================================================================================================== +**File name** **Description** +``initializeWecSim`` Modified to add functions relative to the wind, wind turbine, and new mooring blocks. New functions are created in each relative class to read data prepared during the pre-processing by the user. Control parameters are also added to give user choice of which control logic to be used. +``mooringClass`` It is now also possible to calculate mooring loads (static loads) using non-linear look-up tables computed during pre-processing and with system displacements as input. Compared to previous versions, the mooringClass now also has a function by means of which look-up tables are loaded from a file whose name is the new property called "lookupTableFile". +``postProcessWecSim`` + ``responseClass`` Modified to add wind turbine results in the WEC-Sim output structure. Examples of new outputs are the timeseries of wind turbine power, rotor speed, blade pitch, and nacelle acceleration. +========================================= ====================================================================================================================================================================================================================================================================================================================================================== + + + +The following diagram summarizes the workflow for the simulation of wave energy converters, which has now been updated to include the simulation of floating offshore wind turbines or hybrid devices. The portions of the code introduced with MOST are highlighted in grey, the portions executed by WEC-Sim codes in green, and what is carried out by external software in yellow. + + + +.. figure:: IMAGE_workflow.png + :align: center + :width: 80% + +| \ No newline at end of file diff --git a/main/_sources/most/license.rst.txt b/main/_sources/most/license.rst.txt new file mode 100644 index 000000000..1f9edc7c8 --- /dev/null +++ b/main/_sources/most/license.rst.txt @@ -0,0 +1,23 @@ +.. _most-license: + +License +======= + +.. equivalent of this statement? "WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS)" + +The software is distributed under the Apache License 2.0. + + +Copyright +------------ + +.. literalinclude:: NOTICE_MOST + :language: text + + +Apache License 2.0 +------------------------- + +.. literalinclude:: ../../LICENSE + :language: text + diff --git a/main/_sources/most/overview.rst.txt b/main/_sources/most/overview.rst.txt new file mode 100644 index 000000000..427f3390b --- /dev/null +++ b/main/_sources/most/overview.rst.txt @@ -0,0 +1,30 @@ +.. _most-overview: + +Overview +======== + +MOST (Matlab for Offshore Simulation Tool), is a simulation tool operating in the WEC-Sim environment for simulating floating offshore wind turbines, hybrid wind-wave energy converters, platforms with multiple turbines, etc. +MOST builds on WEC-Sim in MATLAB/Simulink to add ``windClass`` and ``windTurbineClass`` objects that can define a given turbine and weather conditions. +Currently, MOST supports single-tower, three-bladed, horizontal-axis wind turbines controlled by Baseline or ROSCO controllers and providing geometric and inertial data as input. + + +.. _most-developers: + +MOST Developers +--------------- +MOST is developed and maintained by the MORE Energy Lab, Politecnico di Torino, Italy. +The WEC-Sim+MOST coupling is a collaboration between the MORE Energy Lab and the WEC-Sim developers at Sandia National Laboratories and the National Renewable Energy Lab. + +Current members of the MOST development team include: + +* Giovanni Bracco (PI) +* Emilio Faraggiana +* Alberto Ghigo +* Davide Issoglio +* Ermando Petracca +* Massimo Sirigu + +.. TODO - list former MOST developers as appropriate + + + diff --git a/main/_sources/most/publications.rst.txt b/main/_sources/most/publications.rst.txt new file mode 100644 index 000000000..346af99c1 --- /dev/null +++ b/main/_sources/most/publications.rst.txt @@ -0,0 +1,15 @@ +.. _most-publications: + +Publications +============ +.. TODO - enter any MOST theses, publications here. This is a historical list, whereas the release_notes only contains the most recent citation + +[1] M. Sirigu, E. Faraggiana, A. Ghigo, G. Bracco, “`Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody `_” Journal of Physics: Conference Series. Vol. 2257. No. 1. IOP Publishing, 2022. + +[2] E. Faraggiana, M. Sirigu, A. Ghigo, G. Bracco, G. Mattiazzo, “`An efficient optimisation tool for floating offshore wind support structures. `_” Energy Reports 8 (2022): 9104-9118.. + +[3] M. Sirigu, E. Faraggiana, A. Ghigo, E. Petracca, G. Bracco, G. Mattiazzo. “`Development of a simplified blade root fatigue analysis for floating offshore wind turbines. `_” Trends in Renewable Energies Offshore (2022): 935-941.. + +[4] Faraggiana, E., et al. “`An optimal design of the Hexafloat floating platform for offshore wind turbines. `_” Trends in Renewable Energies Offshore: Proceedings of the 5th International Conference on Renewable Energies Offshore (RENEW 2022, Lisbon, Portugal, 8–10 November 2022). CRC Press, 2022. + +[5] Petracca, Ermando, et al. “`Design and techno-economic analysis of a novel hybrid offshore wind and wave energy system. `_” Energies 15.8 (2022): 2739. diff --git a/main/_sources/most/release_notes.rst.txt b/main/_sources/most/release_notes.rst.txt new file mode 100644 index 000000000..e6d1b7eb2 --- /dev/null +++ b/main/_sources/most/release_notes.rst.txt @@ -0,0 +1,42 @@ +.. _most-release-notes: + +Release Notes +============= + +.. _most-citation: + + +`MOST v1.0.0 (within WEC-Sim v6.0) `_ +--------------------------------------------------------------------------------------------- + +**New Features** + +* Addition of the windClass object + +* Addition of the windTurbineClass object + +* Addition of the MOST library + +* Release of a WEC-Sim+MOST Application + + +Citing MOST +----------- + +When using MOST with WEC-Sim, please cite the following MOST publication in addition to the WEC-Sim software release and publication: + +.. TODO - add publication that users should cite when using MOST + +.. TODO - add latex format for easy reference +.. code-block:: none + + @inproceedings{sirigu2022development, + title={Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody}, + author={Sirigu, M and Faraggiana, E and Ghigo, A and Bracco, G}, + booktitle={Journal of Physics: Conference Series}, + volume={2257}, + number={1}, + pages={012003}, + year={2022}, + organization={IOP Publishing} + } diff --git a/main/_sources/most/theory.rst.txt b/main/_sources/most/theory.rst.txt new file mode 100644 index 000000000..02351656a --- /dev/null +++ b/main/_sources/most/theory.rst.txt @@ -0,0 +1,511 @@ +.. _most-theory: + +****** +Theory +****** + +In this section, the features introduced with MOST will be explored, offering some theoretical background to understand their use. +To do this, the workflow shown in the :ref:`most-introduction` will be followed: Pre-processing, User Inputs, Simulation, +and Post-processing. + + +Pre-processing +============== +In the pre-processing phase, it is possible to create all the data required for the simulation (except the hydrodynamic coefficients) by +launching the ``mostIO.m`` script, which will call up other codes, each dedicated to specific data (e.g. wind turbine, control, or mooring) +and described in this section. As with other WEC-Sim examples, the ``bemio.m`` script should still be used to load the hydrodynamic coefficient data. + + +Mooring look-up table +--------------------- +MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. +Specifically, the mooring look-up table simulates a mooring system consisting of a certain number of lines suspended between two points +(anchor and fairlead) and angularly equally spaced. This option is based on the catenary equations similarly to the open-source code MAP++ :cite:`MAP`. +In the Simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outputs (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called "moor_matrix" and created through the ``Create_Mooring_Matrix.m`` script. + + +Wind input +---------- +This section describes how the input wind field is generated; there are two possible methods: to have constant wind speed (in time and space) or to +have a wind speed field in which turbulence and non-uniform spatial distribution are taken into account. It is possible to specify wind method in ``wecSimInputFile.m`` by initializing the windClass with "constant" or "turbulent". +In the first case there will be a constant wind speed at all times and at every point on the rotor area, while the second case considers the spatial +and temporal turbulence of the wind. Regarding the second case, the scatter of the wind speed is obtained using an external code, `Turbsim `_, developed +by NREL, and integrated within the MOST code. The user can launch the ``run_turbsim.m`` script (in "turbsim" subfolder) to create the wind input data +structure, specifying some properties such as mean velocity and turbulence intensity. For more information, it is recommended to read the :ref:`most-advanced_features` or the +documentation of TurbSim :cite:`kelley2005overview`. The resulting data structure consists of the wind speed +(in the surge direction) at each instant and for each node of a spatial grid covering the rotor area. During the simulation, the wind speed +corresponding to the blade nodes will be obtained by interpolating between the grid points via look-up tables. + + +Wind turbine properties +----------------------- +All wind turbine components are modelled as rigid bodies; this includes the tower, the nacelle, the hub, and the blades. The inertial and geometrical +properties of the components must be defined in a MATLAB structure, the user can use the script ``WTproperties.m`` ("turbine_properties" subfolder) to write the parameters of the +desired wind turbine. In particular, mass, moment of inertia, centre of mass relative to the reference, and centre of mass in the global reference +frame (whose origin is at the sea water level) are defined for each body. In addition, other parameters such as tilt and precone angles, tower +height, electrical generator efficiency, and CAD file names are set. The CAD files to define the geometry can be imported from external software. +They must be saved in the folder "geometry". The user must set the name of the CAD files in "WTcomponents" struct to allow MOST to upload the files. + +.. image:: IMAGE_geometry.png + :width: 80% + :align: center + +| + +In addition to the general characteristics of the wind turbine, the user must set the specific properties for the blades by launching the ``BladeData.m`` +script, which defines the needed data structure by taking the information from some text files in the "BladeData" subfolder. In these, lift, drag, and +torque coefficients are specified for each type of airfoil used, as well as certain geometric characteristics of the blades such as twist angle and +chord length as a function of radius and geometric characteristics related to pre-bending. + + +Control properties +------------------ + +This section explains how the MOST controller characteristics to be used in simulations are calculated. As mentioned earlier, it is possible to choose +between two control logics (Baseline :cite:`Hansen2005` and ROSCO :cite:`abbas2022reference`), and, for the creation of the data required for the +simulation, it is necessary to know the steady-states values, i.e. the stationary values of certain quantities of interest when varying, in this case, +the wind speed, which is considered constant for this purpose. The first step in obtaining the data required for the simulation is therefore to run +the script called ``Steady_States.m`` in the subfolder "control" to perform this calculation. Specifically, through this, the stationary values +of power, rotor speed, thrust force, generator torque, and blade pitch angle are computed for both of the aforementioned control logics. +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal wind speed (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is the case for some turbine types in the ROSCO case. + +Below is a figure representing an example of steady-state values for Baseline and ROSCO controllers for the IEA 15 MW reference wind turbine :cite:`Gaertner2020`. + + +.. image:: IMAGE_Steady_States.png + :width: 80% + :align: center + +| + +In the following, the Baseline and ROSCO control logics will be briefly explained; for more information refer to :cite:`Hansen2005` (Baseline) +and :cite:`abbas2022reference` (ROSCO). + +.. _Baseline: + +Baseline +^^^^^^^^ + +Baseline is a conventional, variable-speed, variable collective pitch controller, which is made up of two independent systems: + +* A generator torque controller (consisting of a generator speed-torque law) designed to maximize power extraction below nominal wind speed +* A blades collective pitch controller designed to regulate rotor and generator speed above nominal wind speed + +Generator torque controller +""""""""""""""""""""""""""" + +The generator-torque control law is designed to have three main regions and two transition ones between them. Aerodynamic torque acts as an +accelerating load, the generator torque, converting mechanical energy to electrical energy, acts as a braking load. The generator torque is computed +as a tabulated function of the filtered generator speed, incorporating 4 operational control regions: 1, 1.5, 2, and 3. + +* **Region 1**: control region before cut-in wind speed, where the generator is detached from the rotor to allow the wind to accelerate the rotor for start-up. In this region, the generator torque is zero and no power is extracted from the wind. + + +* **Region 1.5**: transition region called start-up region and permits a smooth transition between null and optimal torque. + + +* **Region 2**: control region where extracted power is maximized. Here, to maintain the tip speed ratio constant at its optimal value, the generator torque is proportional to the square of the filtered generator speed. Aerodynamic torque can be expressed as: + + .. math:: + T_{\text {aero }}=\frac{1}{2} \rho \pi \frac{R^5}{\lambda^3} C_P\left(\lambda, \theta_{\text {bl }}\right) \cdot \Omega^2=k_{\text {opt }} \cdot \Omega^2\ \ \ \ \ \ (1) + + Where :math:`k_{opt}` is obtained with TSR (Tip Speed Ratio, :math:`λ`) and blade pitch values that lead to maximum power coefficient: :math:`λ = λ_{opt}`, :math:`\theta_{bl} = 0^{\circ}`; + +* **Region 3**: above rated condition region, where the generator torque is kept constant at its rated value. In this region pitch control is active to maintain rotor speed at its rated value. + +The figure below shows an example of control law of the Baseline generator torque controller for the IEA 15 MW reference wind turbine :cite:`Gaertner2020`. + +.. image:: IMAGE_Baseline_Torque_Law.png + :width: 60% + :align: center + +| + +Blade pitch controller +"""""""""""""""""""""" + +Regarding the blade pitch controller, it regulates the generator speed in region 3 (where wind speed exceeds its rated value) to maintain it at its nominal +value through a scheduled proportional-integral control (PI). In this region the torque is kept constant at its rated value (:math:`T_{gen} = T_{gen,r} = P_{r} / \Omega_{r}`). +Aerodynamic torque :math:`T_{\mathrm{aero\ }}` depends on wind speed, rotor speed and blade pitch, but assuming in this region rotor speed maintains +its rated value :math:`\Omega_r` (this assumption can be made since the control objective is to track that value) and neglecting power to +wind speed sensitivity, linearization around rated condition is: + +.. math:: + + T_{\text {aero }} \approx T_{\text {aero }}\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)+\left.\frac{d T_{\text {aero }}\left(U_{\text {wind }}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\substack{U_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r}}\left(\theta_{b l}-\theta_{b l, r}\right)= + + =\frac{P\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)}{\Omega_r}+\left.\frac{1}{\Omega_r} \frac{d P\left(U_{\text {wind}}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\begin{array}{c} \theta_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r \end{array}}\left(\theta_{b l}-\theta_{b l, r}\right)\ \ \ \ \ \ (2) + + +where :math:`U_{wind,r}` and :math:`\theta_{bl,r}` are rated wind speed and blade pitch. Once first is chosen, :math:`\theta_{bl,r}` is which one leads to a steady state +condition with extracted power equal to the rated one. So, aerodynamic torque expression becomes: + +.. math:: + + T_{\mathrm{aero\ }}\approx\ \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r}\frac{dP}{d\theta_{bl}}\Delta\theta_{bl}\ \ \ \ \ \ (3) + + +Where :math:`\Delta \theta _{bl}` represents a small perturbation of the blade pitch angle about its linearization point :math:`\theta_{bl,r}`. By +expressing the blade-pitch regulation starting from the speed perturbation with a proportional-integrative control law (PI), it is possible to write: + +.. math:: + + \Delta \theta_{b l}=K_P \Delta \Omega+K_I \int_0^t \Delta \Omega d t\ \ \ (4) + +Where :math:`K_P` is the proportional gain and :math:`K_I` the integrative gain; :math:`\Delta\Omega` represents a small perturbation of rotor speed about its rated value: +:math:`\Delta\Omega=\ (\Omega-\Omega_r)`. Combining last equations found with the equilibrium equation of the rotor around its rotation axis +:math:`(T_{\mathrm{aero\ }}-\ T_{\mathrm{gen\ }}= I_{\mathrm{eq\ }}\dot{\Omega})`, it is possible to obtain, once defined :math:`\Delta\Omega=\ \dot{\delta}`, +the following relation: + +.. math:: + \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r} \frac{d P}{d \theta_{b l}}\left(K_P \dot{\delta}+K_I \delta\right)-\frac{P_r}{\Omega_r}=I_{e q} \ddot{\delta}\ \ \ (5) + + +Which can be rearranged as: + +.. math:: + I_{e q} \ddot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_P}{\Omega_r}\right] \dot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_I}{\Omega_r}\right] \delta=0\ \ \ (6) + +That in the canonical form becomes: + +.. math:: + M \ddot{\delta}+C \dot{\delta}+K \delta=0 \ \ \ \ (7) + +With: :math:`\ M= I_{eq}`, :math:`\\C= \left[-\frac{dP}{d\theta_{bl}}\frac{K_P}{\Omega_r}\right]`, :math:`\\K=\left[-\frac{dP}{d\theta_{bl}}\frac{K_I}{\Omega_r}\right]` + + + +Now it is possible to choose proportional and integral gains in order to obtain desired characteristics of the blade pitch control. Its characteristics +directly depend on natural frequency and damping ratio: + +.. math:: + \omega_n=\sqrt{\frac{M}{K}}\ \ ,\ \ \ \ \ \ \zeta=\frac{C}{2M\omega_{n\ }}\ \ \ \ \ \ (8) + +Once defined :math:`\omega_{n}` and :math:`\zeta`, expressions of proportional and integral gains become: + +.. math:: + K_P=\frac{2\ I_{eq}{\ \omega}_n\ \zeta{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_P^\prime}{\frac{dP}{d\theta_{bl}}}\ ,\ \ \ \ \ \ \ K_I=\frac{I_{eq\ }\omega_n^2{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_I^\prime}{\frac{dP}{d\theta_{bl}}}\ \ \ \ \ \ \ \ \ \ (9) + +The term :math:`\frac{dP}{d\theta_{bl}}` is the power to pitch sensitivity, which depends on wind speed and blade pitch (related each other as previously +mentioned) adopted during linearization. So, to always have the same system characteristic (:math:`\omega_n` and :math:`\zeta`), proportional and integral +gains must vary with a variation of blade pitch and so of wind speed. Figure below shows power to pitch sensitivity with respect to blade pitch; as can be +seen there, it can be well approximated with a quadratic regression, through which quadratic form that minimize sum of square error is computed. Thanks to +this regression, power to pitch sensitivity expression becomes of the form: + +.. math:: + \frac{dP}{d\theta_{bl}}\ \approx\ c_1{\theta_{bl}}^2+c_2\theta_{bl}+c_3\ \ \ \ \ \ (10) + +:math:`\frac{dP}{d\theta_{bl}}` is the power to pitch sensitivity and :math:`c_1 (W/{deg}^3)`, :math:`c_2 (W/{deg}^2)` and :math:`c_3 (W/deg)` are the +coefficients of its quadratic regression. + +.. image:: IMAGE_Baseline_PowerToPitch_Sensitivity.png + :width: 60% + :align: center + +| + +This approximation will make the calculation of controller gains computationally less demanding during simulation. + + +.. _ROSCO: + +ROSCO +^^^^^ +ROSCO controller (Reference Open-Source COntroller for fixed and floating offshore wind turbines) was developed by researchers at the Delft University +of Technology :cite:`abbas2022reference` to provide a modular reference wind turbines controller that represent industry standards and performs comparably +or better than existing reference controllers, such as baseline, discussed in previous section. The primary functions of the controller are still to +maximize power in below-rated operations and to regulate rotor speed in above-rated ones, moreover, it also provides additional modules which can improve +control performances. ROSCO controller, as well as Baseline and most of other conventional ones, consists of two methods of actuation: generator torque +and collective blade pitch. Strategies of actuation are commonly separated into four main regions, with transition logic between them. Regions 1 and 4 +correspond to below cut-in and above cut-out wind speed conditions, these regions are generally out of interest for standard control purposes (performances +optimization) and so they will not be further discussed below. In region 1 generator torque is set to zero to allow the wind to accelerate the rotor for +start-up. In this region, no power is extracted. In region 4 blades are pitched to reduce thrust force to zero (feathering position). + +.. image:: IMAGE_ROSCO_Power_Curve.png + :width: 60% + :align: center + +| + +Control strategies for regions 1.5, 2 and 3 are highly like those ones adopted in Baseline control. Region 2 is when wind speed is below rated condition, +here main goal is power extraction maximization. To do so, two methods can be used, a quadratic law (as in Baseline controller) of generator torque with +respect to rotor angular speed or a tip speed ratio (TSR) tracking to maintain the latter at its optimal value (in this case a wind speed estimation is needed). +Region 3 is when wind speed is above rated condition, here blade pitch is regulated to maintain rotor speed at its rated value and to stabilize platform (for +offshore floating wind turbines, through floating feedback module), while generator torque is kept constant at its rated value. Region 1.5 is a transition +region from cut-in wind speed and region 2. Here generator torque is regulated to maintain a defined minimum rotor speed and blades are pitched to compensate +resulting high values of TSR to improve power extraction. + +ROSCO Implementation +"""""""""""""""""""" +Controller implementation starts from aerodynamic torque (:math:`T_{aero}`) expression and rotor equilibrium equation: + +.. math:: + T_{aero}=\frac{1}{2}\ \rho\ A_D\ C_P\ (\lambda,\theta_{bl})\ \frac{{U_\infty}^3\ }{\Omega}\ \ \ \ \ \ (11) + +.. math:: + \dot{\Omega}=\frac{T_{\mathrm{aero\ }}-\ T_{gen}\ }{I_{\mathrm{eq\ }}}\ \ \ \ \ \ (12) + +:math:`I_{\mathrm{eq\ }}` is the rotor inertia, :math:`\rho` is the air density, :math:`A_D` is the rotor area, :math:`C_P` is the power coefficient +and :math:`U_\infty` is the undisturbed wind speed. The first-order linearization of eq 11 at some nominal steady-state operational point is: + +.. math:: + \Delta T_{aero}=\Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.\ \Delta\Omega+\Gamma_{\theta_{bl}}\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta\theta_{bl}+\Gamma_U\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta U\ \ \ \ \ \ (13) + +With: :math:`\ \ \ \Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\Omega\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.,{\ \ \ \ \ \Gamma}_{\theta_{bl}}\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\theta_{bl}\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\mathrm{,\ \ \ \ \ \ \ }\Gamma_U\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial U\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.` + +“op” denotes the steady-state operational point at which linearization is made. Equation 12 can then be rewritten as (Δ denotes the perturbation from +steady state value “op” and :math:`\left \{ X_{op}=\lambda_{op},\\\ \theta_{bl, op} \right \}`): + +.. math:: + \Delta \dot{\Omega}=A\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \Omega+B_{T_{g e n}} \Delta T_{g e n}+B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \theta_{b l}+B_U\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta U\ \ \ \ \ \ (14) + +With: + +.. math:: + + A\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{I_{\mathrm{eq}}} \frac{\partial T_{\text {aero }}}{\partial \lambda} \frac{\partial \lambda}{\partial \Omega} \\ + +.. math:: + \frac{\partial T_{\text {aero }}}{\partial \lambda}=\frac{1}{2} \rho A_{\mathrm{D}} R U_{\mathrm{op}}^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \lambda} \lambda_{\mathrm{op}}-C_{\mathrm{p}, \mathrm{op}}\right) \\ + +.. math:: + \frac{\partial \lambda}{\partial \Omega}=\frac{R}{U_{\mathrm{op}}}, \quad\left(\lambda=\frac{\Omega R}{U}\right) \\ + +.. math:: + B_{T_{g e n}}=-\frac{1}{I_{\mathrm{eq}}} \\ + +.. math:: + B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{2 I_{\mathrm{eq}}} \rho A_{\mathrm{D}} R U_{\mathrm{op}}{ }^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \theta_{b l}} \lambda_{\mathrm{op}}\right) + + + +All derivatives are calculated at “op” conditions; :math:`\Delta U`, difference between actual wind speed and wind speed at linearization point, is considered +equal to zero during control tuning, that is computation of control gains. Both generator torque and blade pitch controllers are PI controllers, generically +defined as: + +.. math:: + y = K_P \ u + K_I \int_{0}^{T} u\ dt\ \ \ \ \ \ (15) + +Where :math:`u` represents the input and :math:`y` the output, while :math:`K_P` and :math:`K_I` are respectively the proportional and integral gains. Generator torque +controller has as input and output: + +.. math:: + u=-\delta\Omega\ ,\ \ \ y=\Delta C_{gen}\ \ \ \ \ \ (16) + +Blade pitch controller has as input and output: + +.. math:: + u=-\delta\Omega,\ \ \ y=\Delta\theta_{bl}\ \ \ \ \ \ (17) + +:math:`\delta\Omega` is defined as a perturbation from the reference speed: + +.. math:: + \Omega(t)=\Omega_{\mathrm{ref\ }}+\delta\Omega\longrightarrow-\delta\Omega=\Omega_{ref}-\Omega(t)\ \ \ \ \ \ (18) + +While :math:`\Delta C_{gen}` and :math:`\Delta\theta_{bl}` are perturbations from steady state values: + +.. math:: + \theta_{bl}(t)={\theta_{bl}}_{\mathrm{op\ }}+\Delta\theta_{bl},{\ \ \ \ C}_{gen}(t)={C_{gen}}_{op}+\Delta C_{gen}\ \ \ \ \ \ (19) + + +Now, defining :math:`\Delta \Omega_{ref} =\Omega_{ref}-\Omega_{op}` (assumed =0, since “op” point is chosen at a steady state condition with +:math:`\Omega_{op}=\Omega_{ref}`), we can combine equation 14 with above definitions to obtain a differential equation that relates +:math:`\Delta \Omega =\Omega-\Omega_{op}` and :math:`\Delta \Omega_{ref}`. Then, if the Laplace transform of this equation is considered, we arrive +to two closed-loop transfer functions (one for the generator torque module and the other for the blade pitch one) in the form: + +.. math:: + H(s)=\frac{\Delta \Omega(s)}{\Delta \Omega_{\mathrm{ref}}(s)}=\frac{B\left(K_P\left(x_{\mathrm{op}}\right) s+K_I\left(x_{\mathrm{op}}\right)\right)}{s^2+\left(B K_P\left(x_{\mathrm{op}}\right)-A\left(x_{\mathrm{op}}\right)\right) s+B K_I\left(x_{\mathrm{op}}\right)}\ \ \ \ \ \ (20) + + +Where :math:`B` is :math:`B_{T_{gen}}` or :math:`B_{\theta_{bl}}`, depending on which module is considered, since when generator torque loop is +considered, :math:`\Delta\theta_{bl}` is set to zero and, when blade pitch loop is considered, :math:`\Delta T_{gen}` can be equal to zero or +:math:`B_{T_{gen}}` can be englobed in :math:`A`. Moreover, in both cases we consider :math:`\Delta U=0`. :math:`H(s)` is a simple second order +system whose characteristics are strictly related to natural frequency and damping ratio of its canonical form. They can be defined, in order to +reach desired performance, choosing values of proportional and integral gains. If we call :math:`\omega_n` the natural frequency and :math:`\zeta` +the damping ratio, :math:`K_P` and :math:`K_I` expressions (varying with operational steady state point) are: + +.. math:: + + K_P=\frac{1}{B\left(\boldsymbol{x}_{\mathrm{op}}\right)}\left(2 \zeta \omega_n+A\left(\boldsymbol{X}_{\mathrm{op}}\right)\right)\ \ \ \ \ \ (21) + +.. math:: + + K_I=\frac{\omega_{\mathrm{n}}^2}{B\left(\boldsymbol{X}_{\mathrm{op}}\right)}\ \ \ \ \ \ (22) + + +Once transfer function of generator torque and blade pitch closed loop has been defined, and once way through which PI controllers’ gains are computed +has been explored, we can focus, specifically, on the two different modules to investigate the reference speed signals adopted and how the scheduling +of gains is performed, varying according to the conditions in which the system is. + + +Generator Torque Controller +""""""""""""""""""""""""""" +Four different generator torque controllers are available in ROSCO, they are the possible combination between two methods for below wind speed operations +and two methods for above wind speed conditions. Regarding below rated operations, to maximize extracted power at each wind condition, a quadratic low +of generator torque with respect to rotor angular speed can be adopted. In this section we omit exploitation of this method since is the same adopted +in Baseline controller. Alternatively, a tip speed ratio tracking to maintain it at its optimal value can be adopted. If the wind speed can be measured +or estimated accurately, a generator torque controller can be designed to maintain the :math:`\lambda_{opt}` and maximize power capture, so reference +rotor angular speed becomes: + +.. math:: + {\Omega_{ref}}_\tau=\frac{\lambda_{opt}\ \hat{U}}{R}\ \ \ \ \ \ (23) + +Where subscript :math:`\tau` indicates the reference speed of torque controller and :math:`\hat{U}` is the estimated wind speed. From equations 14, 21 +and 22, it can be seen that integral gain :math:`K_I` of generator torque controller is constant, whereas :math:`A`, so proportional gain :math:`K_P`, +are both dependent on :math:`U` (wind speed). However, it was found that fixing :math:`K_P = K_P (U = Urated)` does not negatively affect power production. +Regarding the two existing methods for above rated conditions, first of them considers a constant generator torque, defined as: + +.. math:: + T_{gen,ar}(t)=\ T_{rated}=\frac{P_{\mathrm{rated\ }}}{\Omega_{rated}}\ \ \ \ \ \ (24) + +Where subscript “ar” means “above rated”. On the other hand, the second strategy considers a constant extracted power equal to its rated value, so +generator torque is defined as: + +.. math:: + T_{gen,ar}(t)=\frac{P_{\mathrm{rated\ }}}{\Omega}\ \ \ \ \ \ (25) + + +Blade Pitch Controller +"""""""""""""""""""""" +Main goal of blade pitch controller is keeping rotor angular speed at its rated value, so reference speed is (both in below rated and above rated +conditions): + +.. math:: + \Omega_{\mathrm{ref\ },\theta_{bl}}=\Omega_{\mathrm{rated}}\ \ \ \ \ \ (26) + +Where subscript :math:`\theta_{bl}` means we refer to blade pitch controller. In below rated conditions, generator speed is lower than rated value, +so :math:`-\delta\Omega=\Omega_{ref}-\Omega\ >\ 0` and, since gains are normally negative, :math:`\theta_{bl}` is saturated at its minimum value, +defined by an additional module of ROSCO controller which will be discussed later. According to equations 21 and 22, to find controllers gain values, +:math:`B_{\theta_{bl}}\left({X}_{op}\right)` and :math:`A\left({X}_{op}\right)` should be computed. They change for any operation point at which +system is linearized, so they are function of :math:`{X}_{op}=\ \left\{\lambda_{op},{\theta_{bl}}_{op}\right\}`. Linearization point can be the +optimal steady state values chosen during strategy definition, for which there is a unique relationship between :math:`\lambda_{op}` and +:math:`{\theta_{bl}}_{op}`. For this reason, :math:`B_{\theta_{bl}}` and :math:`A` can be expressed with respect to :math:`{\theta_{bl}}_{op}`, +so gains’ values can be scheduled with :math:`\theta_{bl}` as parameter. + +Additional Control Modules +"""""""""""""""""""""""""" +In this section principal additional modules are briefly discussed to understand their functions and how they modify control output; for more information +it is possible to consult :cite:`abbas2022reference`. They are: + +* **Wind speed estimator** : This module estimates wind sped used for TSR tracking in the generator torque controller. Employed algorithm is based on a continuous-discrete Kalman filter, which exploits system model, a wind auto regressive model and other information, like covariance matrices based on the expected wind field and measure’s confidence of rotor speed to estimate a mean wind speed across rotor area at each time. + +* **Set Point Smoothing** : Generator torque and blade pitch controllers will normally conflict with each other in near-rated operation due to incompatible reference rotor speed. To avoid this, a set point smoother can be employed; it shifts the speed reference signal of the inactive controller while the active one works. As an example, at above rated condition torque controller is the inactive one and vice versa. If TSR tracking were to be adopted for the torque generator, then the reference speed at high wind speeds would be higher than the one actually wanted (rated one), so the smoother brings the reference towards the rated speed and the resulting torque approaches the rated one, the one actually intended by adopting a constant torque strategy under above conditions. + +* **Minimum pitch Saturation** : This module defines a minimum value of blade pitch angle which will be used as a saturation limit during control operations. It mainly modifies expected blade pitch values in region 1.5 and near rated conditions and leads to two effects: + + * **Peak shaving** : Near rated condition thrust value reaches the highest values, since below rated wind speed is lower and above rated condition blade pitching reduces that force. So, to limit loads, minimum pitch module imposes not null pitch angles also below rated wind speed, near that value. + + + * **Power maximization in low wind** : In region 1.5, as mentioned in control region section, a minimum value of rotor speed is imposed, so at low wind speeds TSR deviates far from its optimal value. To compensate this fact and to increase power coefficient value in this condition, blade pitch is led to be greater. + + +* **Floating offshore wind turbine feedback** : this module is though for FOWTs (Floating Offshore Wind Turbines) and introduces a new term in the PI blade pitch controller, which becomes: + + .. math:: + \Delta \theta_{b l}=-k_{\mathrm{P}} \delta \Omega-k_{\mathrm{I}} \int_0^T \delta \Omega \mathrm{d} t+k_{\theta_{\text {bl,float }}} \dot{x}_t\ \ \ \ \ \ (27) + + Additional term is tower-top velocity :math:`{\dot{x}}_t` multiplied by :math:`k_{{\theta_{bl,float}}_\mathrm{\ }}` gain. The latter is chosen from a + manipulation of rotor equilibrium equation and structure pitch equation, in which expression of thrust and power coefficients compare. The aim is to + find gains’ value that reduces rotor angular acceleration to tower speed sensitivity to mitigate structure pitch effect on rotor aerodynamic torque. + This expedient increases the average extracted power and stabilizes the structure. + +| + +In this case, TSR tracking was chosen for torque control at wind speeds lower than nominal one and a constant torque equal to nominal in above rated +conditions. Furthermore, the wind speed is assumed to be a priori known, so the Kalmann filter constituting the estimation module will not be +exploited. + + +Aerodynamic Loads +----------------- + +The aerodynamic loads due to the interaction between wind and blades are determined during the simulation using look-up tables previously obtained +during pre-processing. Specifically, the "AeroLoads" script in the "aeroloads" subfolder handles this by using a function, based on BEM (Blade Element +Momentum Theory), which receives as input the wind speed, rotor speed, and blade pitch angle and outputs the aerodynamic forces and torques acting on +the blade root. For more information on the resolution of BEMT see :cite:`ning2014simple` and :cite:`Ning2015`. The aerodynamic forces do not take into +account the flexibility of the blade (rigid body assumption), the deflection of the wake due to the rotor misalignment with respect to the wind and +the wake dynamics. The domain of the tables will consist of the wind speeds for which the stationary values were previously calculated and a number +of values of rotor speed and blade pitch angle evenly spaced around the stationary value corresponding to the wind speed. The look-up table of +the aerodynamic loads has only one input for the wind speed, so the average wind speed is determined by interpolating four points for each blade in +the wind grid along the blade length. The discretization points are defined by “blade.bladeDiscr” in ``WTproperties.m`` script. It is preferable to define +those points starting from the middle of the blade and not from the root because the wind speed has more influence at the final section of the blade. The horizontal hub speed, due to surge and pitch oscillation, is added to the wind speed. +Furthermore, the pitch motion and yaw motion of the hub multiplied by the distance from the hub of discretization points (blade.bladeDiscr) are also +added to wind speed. + + +User inputs +=========== + +In addition to the settings defined in pre-processing, to use MOST it is necessary to define simulation settings and decide which input files (created +in the pre-processing) to use, this is done via the WEC-Sim library script ``wecSimInputFile.m``. + + +Simulation +========== + +The simulation of floating wind turbines or hybrid systems is carried out in the Simulink environment using the WEC-Sim libraries and the MOST library +("MOST_lib.slx"), for the wind turbine part and its control. In order to launch the simulation, it is necessary to use the ``wecSim.m`` executable, +which calls up ``wecSimInputFile.m`` for defining the input data and the ``initializeWecSim.m`` function for setting up the classes and defining the active +variant subsystems according to the settings made. Below is an example of a Simulink model for the simulation of a floating wind turbine. + +.. image:: IMAGE_Volturn15MW_Simulink_example.png + :width: 60% + :align: center + +| + +The platform and mooring subsystems are libraries of WEC-Sim that solve the hydrodynamic and hydrostatic loads acting on the platform and the forces +due to moorings according to the settings and file names provided. The turbine subsystem is the MOST library, visible in the figure below. + +.. image:: IMAGE_MOST_Library.png + :width: 100% + :align: center + +| + +The MOST model is mainly composed of rigid bodies (representing the various components of the turbine) connected via fixed joints or, in the case of +the link between the hub and nacelle, with a revolute joint. An example of a component (hub) can be seen in the figure below and includes the calculation of +inertial forces (in the "Body Properties" block) and weight force (in the "External Force and Torque" block). In the case of blades, aerodynamic forces +are also applied via a similar block. + +.. image:: IMAGE_Body_Block_example.png + :width: 60% + :align: center + +| + +In the 'Aerodynamics + Control' subsystem, the aerodynamic forces and torque values of the generator and collective blade pitch are derived. In the +"Control" and "Blade wind speed" subsystems, variant subsystems are contained in which it is decided whether to use the Baseline or ROSCO controller +and whether to have constant or turbulent wind. With regard to wind block, here the relative speed with respect to the interested blade nodes is +calculated, receiving the movements of the structure and the wind field as inputs. Finally, the "AeroLoads" subsystem contains the look-up tables of +the aerodynamic loads obtained in pre-processing. + +.. image:: IMAGE_Aeroload_Control_Submodel.png + :width: 100% + :align: center + +| + + +Post-processing +=============== + +Post-processing consists of processing the simulation output data and saving it, as well as of the possible creation of an (ASCII) text file containing +the simulation report. For this we rely on the WEC-Sim executables ``stopWecSim.m`` and ``postProcessWecSim.m``, which use the ``rensponseClass`` for processing +the results, and on the ``userDefinedFunction.m`` script to plot time-domain simulation input and output by also exploiting some functions of the ``rensponseClass``. +The ``responseClass`` contains all the output time-series and methods to plot and interact with the results. It is not initialized by the user; instead, it +is created automatically at the end of a WEC-Sim simulation. The ``responseClass`` does not input any parameter back to WEC-Sim, only taking output data from +the various objects and blocks. After WEC-Sim is done running, there will be a new variable called ``output`` saved to the MATLAB workspace. +The output object is an instance of the ``responseClass``; it contains all the relevant time-series results of the simulation. +The figure below shows an example of some input-output plots from a simulation of the IEA 15 MW reference wind turbine mounted on the VolturnUS semi-submersible +platform (:cite:`Gaertner2020` and :cite:`Allen2020`). + +.. image:: IMAGE_Results_Plots_example.png + :width: 100% + :align: center + diff --git a/main/_sources/theory/index.rst.txt b/main/_sources/theory/index.rst.txt new file mode 100644 index 000000000..e13dd3166 --- /dev/null +++ b/main/_sources/theory/index.rst.txt @@ -0,0 +1,10 @@ +.. _theory: + +############# +Theory Manual +############# + +.. toctree:: + :maxdepth: 2 + + theory.rst diff --git a/main/_sources/theory/theory.rst.txt b/main/_sources/theory/theory.rst.txt new file mode 100644 index 000000000..3e5d8f4e5 --- /dev/null +++ b/main/_sources/theory/theory.rst.txt @@ -0,0 +1,928 @@ +.. _theory-theory: + +Overview +-------- + +Modeling wave energy converters (WECs) involves the interaction between the +incident waves, device motion, power-take-off (PTO mechanism), and mooring. +WEC-Sim uses a radiation and diffraction method :cite:`Li2012,Babarit2012` to +predict power performance and design optimization. The radiation and +diffraction method generally obtains the hydrodynamic forces from a +frequency-domain boundary element method (BEM) solver using linear coefficients +to solve the system dynamics in the time domain. + +.. _wec_sim_methodology: + +.. figure:: /_static/images/Physics.png + :align: center + + .. + + +Coordinate System +----------------- + +The :ref:`WEC-Sim Coordinate System ` figure illustrates a +3-D floating point absorber subject to incoming waves in water. The figure also +defines the coordinates and the 6 degree of freedom (DOF) in WEC-Sim. The +WEC-Sim coordinate system assumes that the positive X-axis defines a wave angle +heading of zero (e.g., a wave propagating with along a zero-degree direction is +moving in the +X direction). The positive Z-axis is in the vertical upwards +direction, and the positive Y-axis direction is defined by the right-hand rule. +In the vectors and matrices used in the code, Surge (x), Sway (y), and Heave +(z) correspond to the first, second and third position respectively. Roll (Rx), +Pitch (Ry), and Yaw (Rz) correspond to the fourth, fifth, and sixth position +respectively. + +.. _coordinate_system: + +.. figure:: /_static/images/coordinateSystem.png + :align: center + :width: 200pt + + .. + + *WEC-Sim Coordinate System* + + +Units +----- + +All units within WEC-Sim are in the MKS (meters-kilograms-seconds system) and +angular measurements are specified in radians (except for wave directionality +which is defined in degrees). + +Boundary Element Method (BEM) +----------------------------- + +In WEC-Sim, wave forcing components are modeled using linear coefficients +obtained from a frequency-domain potential flow Boundary Element Method (BEM) +solver (e.g., WAMIT :cite:`Lee2006`, Aqwa :cite:`AQWA`, NEMOH :cite:`NEMOH`, and Capytaine :cite:`ancellin2019,babarit2015`). +The BEM solutions are obtained by solving the Laplace equation +for the velocity potential, which assumes the flow is inviscid, incompressible, +and irrotational. More details on the theory for the frequency-domain BEM can +be found in :cite:`Lee2006`. + +WEC-Sim imports nondimensionalized hydrodynamic coefficients from an ``*.h5`` +data structure generated by :ref:`user-advanced-features-bemio` for the BEM solvers: WAMIT, +Aqwa, NEMOH or Capytaine. Alternatively, the ``*.h5`` data structure can be +manually defined by the user. The WEC-Sim code scales the hydrodynamic +coefficients according to the equations below, where :math:`\rho` is the water +density, :math:`\omega` is the wave frequency in rad/s, and :math:`g` is +gravity: + +.. math:: + :nowrap: + + \begin{gather*} + |\overline{F_{exc}(\omega)}| = \frac{|F_{exc}(\omega)|}{\rho g} \\ + \overline{A(\omega)} = \frac{A(\omega)}{\rho} \\ + \overline{B(\omega)} = \frac{B(\omega)}{\rho \omega} \\ + \overline{K_{hs}} = \frac{K_{hs}}{\rho g} + \end{gather*} + +where :math:`F_{exc}` is the wave-excitation force and torque vector, :math:`A` +is the radiation added mass coefficient, :math:`B` is the radiation wave +damping coefficient, and :math:`K_{hs}` is the linear hydrostatic restoring +coefficient. + + +.. _theory-time-domain: + +Time-Domain Formulation +----------------------- + +A common approach to determining the hydrodynamic forces is to use linear wave +theory which assumes the waves are the sum of incident, radiated, and +diffracted wave components. The dynamic response of the system is calculated by +solving WEC system equations of motion :cite:`Babarit2012,Nolte2014`. The +equation of motion for a floating body about its center of gravity can be given +as: + +.. math:: + + m\ddot{X}=F_{exc}(t)+F_{md}(t)+F_{rad}(t)+F_{pto}(t)+F_{v}(t)+F_{me}(t)+F_{B}(t)+F_{m}(t) + + +where :math:`\ddot{X}` is the (translational and rotational) acceleration +vector of the device, :math:`m` is the mass matrix, :math:`F_{exc}(t)` is the +wave excitation force and torque (6-element) vector, :math:`F_{md}(t)` is the +mean drift force and torque vector, :math:`F_{rad}(t)` is the +force and torque vector resulting from wave radiation, :math:`F_{pto}(t)` is +the PTO force and torque vector, :math:`F_{v}(t)` is the damping force and +torque vector, :math:`F_{me}(t)` is the Morison Element force and torque +vector, :math:`F_{B}(t)` is the net buoyancy restoring force and torque vector, +and :math:`F_{m}(t)` is the force and torque vector resulting from the mooring +connection. + +.. ACTION: Add QTF documentation here + +:math:`F_{exc}(t)` , :math:`F_{rad}(t)` , and :math:`F_{B}(t)` are calculated +using hydrodynamic coefficients provided by the frequency-domain BEM solver. +The radiation term includes an added-mass term, matrix :math:`A(\omega)`, and +wave damping term, matrix :math:`B(\omega)`, associated with the acceleration +and velocity of the floating body, respectively, and given as functions of +radian frequency (:math:`\omega`) by the BEM solver. The wave excitation term +:math:`F_{exc}(\omega)` includes a Froude-Krylov force component generated by +the undisturbed incident waves and a diffraction component that results from +the presence of the floating body. The buoyancy term :math:`F_{B}(t)` depends +on the hydrostatic stiffness :math:`K_{hs}` coefficient, displacement of the +body, and its mass. + +Numerical Methods +------------------ + +WEC-Sim can be used for regular and irregular wave simulations, but note that +:math:`F_{rad}(t)` is calculated differently for +sinusoidal steady-state response scenarios and random sea simulations. The +sinusoidal steady-state response is often used for simple WEC designs with +regular incoming waves. However, for random sea simulations or any simulations +where fluid memory effects of the system are essential, the convolution +integral method is recommended to represent the fluid memory retardation force +on the floating body. To speed computation of the convolution integral, the +state space representation method can be specified to approximate this +calculation as a system of linear ordinary differential equations. + +Ramp Function +^^^^^^^^^^^^^ + +A ramp function (:math:`R_{f}`), necessary to avoid strong transient flows at +the earlier time steps of the simulation, is used to calculate the wave +excitation force. The ramp function is given by + +.. math:: + + R_{f}(t)=\begin{cases} + \frac{1}{2}(1+\cos(\pi+\frac{\pi t}{t_{r}})) & \frac{t}{t_{r}}<1\\ + 1 & \frac{t}{t_{r}}\geq1 + \end{cases} + +where :math:`t` is the simulation time and :math:`t_{r}` is the ramp time. + +Sinusoidal Steady-State Response +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This approach assumes that the system response is in sinusoidal steady-state +form; therefore, it is only valid for regular wave simulations. The radiation +term can be calculated using the added mass and the wave radiation damping term +for a given wave frequency, which is obtained from + + +.. math:: + + F_{rad}(t)=-A(\omega)\ddot{X}-B(\omega)\dot{X} + +where :math:`\dot{X}` is the velocity vector of the floating body, +:math:`A(\omega)` is the added mass matrix, and :math:`B(\omega)` is the +radiation damping matrix. + +The free surface profile is based on linear wave theory for a given wave +height, wave frequency, and water depth. The regular wave excitation force is +obtained from + +.. math:: + + F_{exc}(t)=\Re\left[ R_{f}(t)\frac{H}{2}F_{exc}(\omega, \theta)e^{i\omega t} \right] + +where :math:`\Re` denotes the real part of the formula, :math:`R_{f}` is the +ramp function, :math:`H` is the wave height, :math:`F_{exc}` is the frequency +dependent complex wave-excitation amplitude vector, and :math:`\theta` is the +wave direction. + +The mean drift force has two contributions: + + * 2nd-order hydrodynamic pressure due to the first-order wave + * Interaction between the first-order motion and the first-order wave + +Currently, WEC-Sim only reads mean drift coefficients representing the first contribution. +The mean drift force can optionally be included if these coefficients are defined in the BEM data. +The mean drift force is obtained from: + +.. math:: + F_{md}(t)=\left(\frac{H}{2}\right)^2F_{md}(\omega,\theta) + +The mean drift force is combined with the excitation force in the response class output. + +.. ACTION: Add QTF documentation here + +.. Note:: + Currently, WEC-Sim only supports mean drift coefficients and QTF from WAMIT. + +Convolution Integral Formulation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the case of an irregular wave spectrum, the fluid memory has an important +impact on the WEC dynamics. This fluid memory effect is captured by the +convolution integral formulation based upon the Cummins equation +:cite:`Cummins1962` is used. The radiation term can be calculated by + +.. math:: + + F_{rad}(t)=-A_{\infty}\ddot{X}-\intop_{0}^{t}K_{r}(t-\tau)\dot{X}(\tau)d\tau + +where :math:`A_{\infty}` is the added mass matrix at infinite frequency and +:math:`K_{r}` is the radiation impulse response function. This representation +also assumes that there is no motion for :math:`t<0`. The radiation impulse +response function is defined as + +.. math:: + K_{r}(t) = \frac{2}{\pi} \intop_{0}^{\infty} B(\omega) cos(\omega t) d\omega + +For regular waves, the equation described in the last subsection is used to +calculate the wave excitation vector. For irregular waves, the free surface +elevation is constructed from a linear superposition of a number of regular +wave components. Each regular wave component is extracted from a wave spectrum, +:math:`S(\omega)`, describing the wave energy distribution over a range of wave +frequencies, generally characterized by a significant wave height and peak wave +period. The irregular excitation force can be calculated as the real part of an +integral term across all wave frequencies as follows + +.. math:: + + F_{exc}(t)=\Re\left[ R_{f}(t) \sum_{j=1}^{N} + F_{exc}(\omega_{j}, \theta) + e^{i(\omega_{j}t+\phi_{j})} + \sqrt{2S(\omega_{j})d\omega_{j}} \right] + +where :math:`\phi` is the randomized phase angle and :math:`N` is the number of +frequency bands selected to discretize the wave spectrum. For repeatable +simulation of an irregular wave field :math:`S(\omega)`, WEC-Sim allows +specification of :math:`\phi`, refer to the :ref:`user-advanced-features-seeded-phase` +section. + +Additionally, an excitation force impulse response function is defined +as + +.. math:: + + K_{e}(t) = \frac{1}{2\pi} \intop_{-\infty}^{\infty} + F_{exc}(\omega,\theta)e^{i\omega t} d\omega + +The excitation impulse response function is only used for the userDefinedElevation wave case. + +State Space +^^^^^^^^^^^ + +It is highly desirable to represent the radiation convolution integral +described in the last subsection in state space (SS) form :cite:`Yu1996`. This +has been shown to dramatically increase computational speeds +:cite:`Taghipour2008` and allow utilization of conventional control methods +that rely on linear state space models. An approximation will need to be made +as :math:`K_{r}` is solved from a set of partial differential equations where +as a `linear state space` is constructed from a set of ordinary differential +equations. In general, a linear system is desired such that: + +.. math:: + + \dot{X}_{r} \left( t \right) = + \mathbf{A_{r}} X_{r} \left( t \right) + + \mathbf{B_{r}} \mathbf{u} (t);~~X_{r}\left( 0 \right) = 0~~ \nonumber \\ + \int_{0}^{t} \mathbf{K_{r}} \left( t- \tau \right) d\tau \approx + \mathbf{C_{r}} X_{r} \left( t \right) + + \mathbf{D_{r}} \mathbf{u} \left( t \right)~~ + +with :math:`\mathbf{A_{r}},~\mathbf{B_{r}},~\mathbf{C_{r}},~\mathbf{D_{r}}` +being the time-invariant state, input, output, and feed through matrices, while +:math:`u` is the input to the system and :math:`X_{r}` is the state vector +describing the convolution kernel as time progresses. + +Calculation of :math:`K_{r}` from State Space Matrices +"""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The impulse response of a single-input zero-state state-space model is +represented by + +.. math:: + + \dot{x} &= \mathbf{A_{r}} x + \mathbf{B_{r}} u \\ + y &= \mathbf{C_{r}} x + +where :math:`u` is an impulse. If the initial state is set to :math:`x(0)= +\mathbf{B_{r}} u` the response of the unforced (:math:`u=0`) system + + +.. math:: + + \dot{x} &= \mathbf{A_{r}} x \\ + y &= \mathbf{C_{r}} x + +is clearly equivalent to the zero-state impulse response. The impulse response +of a continuous system with a nonzero :math:`\mathbf{D_r}` matrix is infinite +at :math:`t=0`; therefore, the lower continuity value +:math:`\mathbf{C_{r}}\mathbf{B_{r}}` is reported at :math:`t=0`. The general +solution to a linear time invariant (LTI) system is given by: + +.. math:: + + x(t) = e^{\mathbf{A_{r}}t} x(0) + + \int_{0}^{t} e^{\mathbf{A_{r}}(t-\tau)} \mathbf{B_{r}} u (\tau) d\tau~~ + +where :math:`e^{\mathbf{A_{r}}}` is the matrix exponential and the calculation +of :math:`K_{r}` follows: + +.. math:: + + K_{r}(t) = \mathbf{C_{r}}e^{\mathbf{A_{r}}t}\mathbf{B_{r}}~~ + +Realization Theory +"""""""""""""""""" + +The state space realization of the hydrodynamic radiation coefficients can be +pursued in the time domain (TD). This consists of finding the minimal order of +the system and the discrete time state matrices +(:math:`\mathbf{A_{d}},~\mathbf{B_{d}},~\mathbf{C_{d}},~\mathbf{D_{d}}`) from +samples of the impulse response function. This problem is easier to handle for +a discrete-time system than for continuous-time. The reason being is that the +impulse response function of a discrete-time system is given by the Markov +parameters of the system: + +.. math:: + + \mathbf{\tilde{K}_{r}} \left( t_{k} \right) = + \mathbf{C_{d}}\mathbf{A_{d}}^{k}\mathbf{B_{d}}~~ + +where :math:`t_{k}=k\Delta t` for :math:`k=0,~1,~2,~\ldots` with :math:`\Delta +t` being the sampling period. The feedthrough matrix :math:`\mathbf{D_d}` is +assumed to be zero in order to maintain causality of the system, as a non-zero +:math:`\mathbf{D_d}` results in an infinite value at :math:`t=0`. + +The most common algorithm to obtain the realization is to perform a Singular +Value Decomposition (SVD) on the Hankel matrix of the impulse response +function, as proposed by Kung :cite:`Kung1978`. The order of the system and +state-space parameters are determined from the number of significant singular +values and the factors of the SVD. The Hankel matrix (:math:`H`) of the impulse +response function + +.. math:: + + H = \begin{bmatrix} + \mathbf{K_{r}}(2) & \mathbf{K_{r}}(3) & \ldots & \mathbf{K_{r}}(n) \\ + \mathbf{K_{r}}(3) & \mathbf{K_{r}}(4) & \ldots & 0 \\ + \vdots & \vdots & \ddots & \vdots \\ + \mathbf{K_{r}}(n) & 0 & \cdots & 0 + \end{bmatrix} &\\ + +can be reproduced exactly by the SVD as + +.. math:: + + H = \mathbf{U} \Sigma \mathbf{V^{*}} + +where :math:`\Sigma` is a diagonal matrix containing the Hankel singular values +in descending order. Examination of the Hankel singular values reveals there +are only a small number of significant states and that the rank of :math:`H` +can be greatly reduced without a significant loss in accuracy +:cite:`Taghipour2008,Kristiansen2005`. Further detail into the SVD method and +calculation of the state space parameters will not be discussed here and the +reader is referred to :cite:`Taghipour2008,Kristiansen2005`. + +Regular Waves +------------- + +Regular waves are defined as planar sinusoidal waves, where the incident wave is defined as :math:`\eta(x,y,t)` : + +.. math:: + + \eta(x,y,t)= \frac{H}{2} \cos( \omega t - k (x\cos \theta + y\sin \theta) + \phi) + +where :math:`H` is the wave height, :math:`\omega` is the wave frequency +(:math:`\omega = \frac{2\pi}{T}`), :math:`k` is the wave number (:math:`k = +\frac{2\pi}{\lambda}`), :math:`\theta` is the wave direction, and :math:`\phi` +is the wave phase. + +Dispersion Relation +^^^^^^^^^^^^^^^^^^^ +For ocean waves, the dispersion relation is a relation between the wave angular frequency and the wave number (i.e. wavelength). +The dispersion relation is derived using separation of variables to satisfy the free surface kinematic and dynamic boundary conditions. +For a more detailed derivation please the reader is referred `here `__ The dispersion relation that WEC-sim uses is defined as: + +.. math:: + + \omega^{2} = gk\tanh\left(kh\right) \approx \begin{cases} + gk & \text{as } kh \rightarrow \infty \\ + gk^{2}h & \text{as } kh \rightarrow 0 + \end{cases} + +where :math:`\omega` is the wave angular frequency (:math:`\omega = \frac{2\pi}{T}`), :math:`g` is gravitational acceleration, +:math:`k` is the wave number (:math:`k=\frac{2\pi}{\lambda}`), and :math:`h` is the water depth. The dispersion relation can be +simplified if the floating body is located in deep water, :math:`h \rightarrow \infty` . The simplification comes from the hyperbolic +tangent function having an asympote of 1 as its argument tends to infinity (:math:`\tanh \left( \infty \right) \rightarrow 1`). +The deep water condition can still be met if the water depth is not infinite while the following expression holds :math:`kh \geq \pi` . +The dispersion relation can then be used to derive the phase velocity which refers to the speed that an observer would need to travel for +the wave to appear stationary (unchanging). The phase velocity of a two-dimensional progressive wave is given by the following expression: + +.. math:: + + c_{p} = \frac{\omega}{k} = \sqrt{\frac{g}{k}\tanh\left(kh\right)} \approx \begin{cases} + \sqrt{\frac{g}{k}}=\frac{g}{\omega} & \text{as } kh \rightarrow \infty \\ + \sqrt{gh} & \text{as } kh \rightarrow 0 + \end{cases} + +Regular Wave Power +^^^^^^^^^^^^^^^^^^^ + +The time-averaged power, per unit wave crest with, for a propagating water wave + +.. math:: + + P_{w} = \frac{1}{2}\rho g A^{2} c_{g} + +where :math:`\rho` is the fluid density, :math:`g` is gravitational acceleration, :math:`A` is the wave amplitude, and :math:`c_{g}` is wave group velocity. +The group velocity is the speed of propagation of a packet of waves which is always slower than the wave phase velocity. For a more detailed derivation on the +group velocity the reader is referred `here `__. The group velocity of a two-dimensional progressive wave +is given by the following expression: + +.. math:: + + c_{g} = \frac{\delta \omega}{\delta k} = \frac{1}{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) + +where :math:`\sinh` is the hyperbolic sine function. The square root term is the phase velocity which can be used to simplify the group velocity expression as follows: + +.. math:: + + c_{g} = \frac{1}{2} c_{p} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) \approx \begin{cases} + \frac{1}{2} c_{p} & \text{as } kh \rightarrow \infty \\ + 1 & \text{as } kh \rightarrow 0 + \end{cases} + +Inserting the full expression for the group velocity into the wave power equation provides the following: + +.. math:: + + P_{w} = \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left[ 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right] + +Similar to the other wave property expressions, the wave power expression can be simplified for both deep and shallow water conditions as follows: + +.. math:: + + P_{w} \approx + \begin{cases} + \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}} = \frac{1}{8\pi}\rho g^{2} A^{2} T & \text{as } kh \rightarrow \infty \\ + \frac{1}{4}\rho g A^{2} \sqrt{gh} & \text{as } kh \rightarrow 0 + \end{cases} + +.. Note:: + The deep water condition is often used without proper validation of the wave environment which can have a significant effect on wave power. + WEC-Sim by default will calculate the wave power using the full expression, no simplification, unless the hydrodynamic data is imported with + the assumption of infinite water depth. + +Irregular Waves +---------------- + +Irregular waves are modeled as the linear superposition of a large number of +harmonic waves at different frequencies and angles of incidence, where the +incident wave is defined as :math:`\eta(x,y,t)` : + +.. math:: + + \eta(x,y,t) = \sum_{i} \frac{H_{i}}{2} \cos( \omega_{i} t - + k_{i} (x\cos \theta_{i} + y \sin \theta_{i}) + \phi_{i}) + +where :math:`H` is the wave height, :math:`\omega` is the wave frequency +(:math:`\omega = \frac{2\pi}{T}`), :math:`k` is the wave number (:math:`k = +\frac{2\pi}{\lambda}`), :math:`\theta` is the wave direction, and :math:`\phi` +is the wave phase (randomized for irregular waves). + +.. _theory-wave-spectra: + +Wave Spectra +^^^^^^^^^^^^ + +The linear superposition of regular waves of distinct amplitudes and periods is +characterized in the frequency domain by a wave spectrum. Through statistical +analysis, spectra are characterized by specific parameters such as significant +wave height, peak period, wind speed, fetch length, and others. Common types of +wave spectra that are used by the offshore industry are discussed in the +following sections. The general form of the wave spectra available in WEC-Sim +is given by: + +.. math:: + + S\left( f , \theta \right)= S\left( f \right)D\left( \theta \right)~~ + +where :math:`S\left( f\right)` is the wave power spectrum, :math:`f` is the +wave frequency (in Hertz), :math:`D\left( \theta \right)` is the directional +distribution, and :math:`\theta` is the wave direction (in Degrees). The +formulation of :math:`D\left( \theta \right)` requires that + +.. math:: + + \int_{0}^{\infty} \int_{-\pi}^{\pi} + S \left( f \right) D \left( \theta \right) d\theta df = + \int_{0}^{\infty} S\left( f \right) df + +so that the total energy in the directional spectrum must be the same as the +total energy in the one-dimensional spectrum. + +.. math:: + + S\left( f \right) = A_{ws} f^{-5}\exp\left[-B_{ws} f^{-4} \right]~~ + +where :math:`A_{ws}` and :math:`B_{ws}` are coefficients that vary depending on +the wave spectrum and :math:`\exp` stands for the exponential function. +Spectral moments of the wave spectrum, denoted :math:`m_{k}~,~k=0, 1, 2,...`, +are defined as + +.. math:: + m_{k} = \int_{0}^{\infty} f^{k} S \left( f \right) df ~~ + +The spectral moment, :math:`m_{0}` is the variance of the free surface which +allows one to define the mean wave height of the tallest third of waves, +significant wave height :math:`H_{m0}` (in m), as: + +.. math:: + H_{m0} = 4 \sqrt{m_{0}}~~ + +Irregular Wave Power +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The time-averaged wave power available for a given irregular sea state can be calcuated from: + +.. math:: + P_{w} = \rho g \int_{0}^{\infty} S \left( f \right) c_{g} \left( f \right) df + +where the expression for group velocity for regular waves can be inserted for each frequency used +to describe the sea spectrum. + + + +Pierson--Moskowitz (PM) Spectrum +"""""""""""""""""""""""""""""""""""""""""""""" + +The PM spectrum is applicable to a fully developed sea, when the growth of the +waves is not limited by the fetch :cite:`PM`. The two-parameter PM spectrum is +based on a significant wave height and peak wave frequency. For a given +significant wave height, the peak frequency can be varied to cover a range of +conditions including developing and decaying seas. In general, the parameters +depend strongly on wind speed, and also wind direction, fetch, and locations of +storm fronts. The spectral density of the surface elevation defined by the PM +spectrum :cite:`IEC-2` is defined by: + +.. math:: + + S_{PM}\left( f \right) = \frac{{H_{m0}}^2}{4} + \left( 1.057f_{p} \right)^{4} f^{-5} \exp + \left[-\frac{5}{4} \left( \frac{f_{p}}{f}\right)^{4} \right] + +This implies coefficients of the general form: + +.. math:: + + A_{ws} &= \frac{{H_{m0}}^2}{4}\left(1.057f_{p}\right)^{4} \approx + \frac{5}{16} {H_{m0}}^2 {f_{p}}^{4} \approx \frac{B_{ws}}{4}{H_{m0}}^2 \\ + B_{ws} &= \left(1.057f_{p}\right)^{4} \approx \frac{5}{4}{f_{p}}^{4} + +where :math:`H_{m0}` is the significant wave height, :math:`f_{p}` is the peak +wave frequency :math:`\left(=1/T_{p}\right)`, and :math:`f` is the wave +frequency. + +JONSWAP (JS) Spectrum +""""""""""""""""""""""""""""""""""" + +The JONSWAP (Joint North Sea Wave Project) spectrum is formulated as a +modification of the PM spectrum for developing sea sate in a fetch-limited +situation :cite:`HK`. The spectrum accounts for a higher peak and a narrower +spectrum in a storm situation for the same total energy as compared to the PM +spectrum. The spectral density of the surface elevation defined by the JS +spectrum :cite:`IEC-2` is defined by: + +.. math:: + + S_{JS}\left( f \right) = C_{ws} \left(\gamma\right) S_{PM} \gamma^{\alpha} + +where :math:`\gamma` is the nondimensional peak-shape parameter. + +The normalizing factor, :math:`C_{ws}\left(\gamma\right)`, is defined as: + +.. math:: + + C_{ws}\left(\gamma\right) = \frac{\int_{0}^{\infty} S_{PM}\left( f \right)df} + {\int_{0}^{\infty}S_{PM}\left(f\right)\gamma^{\alpha}df} = + 1 -0.287\ln\left(\gamma\right) + +The peak-shape parameter exponent :math:`\alpha` is defined as: + +.. math:: + + \alpha = \exp \left[ -\left( \frac{\frac{f}{f_{p}}-1}{\sqrt{2} \sigma}\right)^{2} \right],~~ + \sigma = \begin{cases} 0.07 & f \leq f_{p} \\0.09 & f > f_{p} \end{cases} ~~ + +The peak-shape parameter is defined based on the following relationship between +the significant wave height, :math:`H_{m0}`, and peak period, :math:`T_{p}`: + +.. math:: + + \gamma = \begin{cases} + 5 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} \leq 3.6 \\ + \exp\left(5.75 - 1.15\frac{T_{p}}{\sqrt{H_{m0}}} \right) & \text{for } 3.6 \leq \frac{T_{p}}{\sqrt{H_{m0}}} \leq 5 \\ + 1 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} > 5 + \end{cases} + +with general form coefficients thus defined: + +.. math:: + A_{ws} &= \frac{B_{ws}}{4}{H_{m0}}^2 C_{ws}\left(\gamma \right) \gamma^{\alpha} \\ + B_{ws} &= \frac{5}{4}{f_{p}}^{4} + + +.. _theory-current: + +Ocean Current +------------- + +An ocean current is a continuous, directed movement of sea water generated by a number of forces acting upon the water, including wind, +the Coriolis effect, breaking waves, cabbeling, temperature and salinity differences, and other ocean phenomena. Depth contours, shoreline configurations, and +interactions with other currents influence a current's direction and strength. Ocean current can vary in space and time, but are generally modeled assuming a +horizontally uniform flow field of constant velocity and direction, varying only as a function of depth. + +.. figure:: /_static/images/oceanCurrentProfiles.png + :align: center + :width: 400pt + + .. + + *Ocean Current Profiles Within WEC-Sim* + +Within WEC-Sim there are three options to model ocean currents: + +Option 1 +^^^^^^^^ + +In Option 1, the sub-surface current is depth independent and is equal to the current at the water surface: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +where :math:`\theta_{c}` is the current direction. + +Option 2 +^^^^^^^^ + +In Option 2, the sub-surface current profile varies with depth following a 1/7th power law: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right]^{1/7} \left[ \cos \left(\theta_{c}\right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +where :math:`d_{current}` is the water depth where the sub-surface current is 0. + +Option 3 +^^^^^^^^ + +In Option 3, the sub-surface current profile varies linearly with depth: + +.. math:: + \vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right] \left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right] + +.. Note:: + WEC-Sim does not adjust the linear wave hydrodynamics based on the presence + of ocean currents and assumes a linear superposition between current and + wave forces. The ocean current option is used only in the Morison Element + force calculation. + +Power Take-Off (PTO) +-------------------- + +Throughout the following sections, unless specification is made between linear +and rotary PTOs, units are not explicitly stated. + +Linear PTO +^^^^^^^^^^ + +The PTO mechanism is represented as a linear spring-damper system where the +reaction force is given by: + +.. math:: + + F_{pto}=-K{}_{pto}X_{rel}-C_{pto}\dot{X}_{rel} + +where :math:`K_{pto}` is the stiffness of the PTO, :math:`C_{pto}` is the +damping of the PTO, and :math:`X_{rel}` and :math:`\dot{X}_{rel}` are the +relative motion and velocity between two bodies. The instantaneous power +absorbed by the PTO is given by: + +.. math:: + + P_{pto} = -F_{pto}\dot{X}_{rel} = \left(K_{pto}X_{rel} \dot{X}_{rel} + + C_{pto} \dot{X}^{2}_{rel} \right) + +Hydraulic PTO +^^^^^^^^^^^^^ + +The PTO mechanism is modeled as a hydraulic system :cite:`So`, where the +reaction force is given by: + +.. math:: + + F_{pto}=\Delta{} p_{piston}A_{piston} + +where :math:`\Delta{} p_{piston}` is the differential pressure of the hydraulic +piston and :math:`A_{piston}` is the piston area. The instantaneous hydraulic +power absorbed by the PTO is given by: + +.. math:: + + P_{pto}=-F_{pto}\dot{X}_{rel} + + +Mechanical PTO +^^^^^^^^^^^^^^ + +The PTO mechanism is modeled as a direct-drive linear generator system +:cite:`So`, where the reaction force is given by: + +.. math:: + + F_{pto}=(\frac{\pi}{\tau_{pm}})\lambda_{fd}i_{sq} + +where :math:`\tau_{pm}` is the magnet pole pitch (the center-to-center distance +of adjacent magnetic poles), :math:`\lambda_{fd}` is the flux linkage of the +stator :math:`d`-axis winding due to flux produced by the rotor magnets, and +:math:`i_{sq}` is the stator :math:`q`-axis current. The instantaneous +mechanical power absorbed by the PTO is given by: + +.. math:: + + P_{pto}=-F_{pto}\dot{X}_{rel} + +For more information about application of pto systems in WEC-Sim, refer to +:ref:`user-advanced-features-pto` section. + +Mooring +------- + +The mooring load is represented using a linear quasi-static mooring stiffness +or by using the mooring forces calculated from `MoorDyn +`_, which is an +open-source lumped-mass mooring dynamics model. + +Mooring Matrix +^^^^^^^^^^^^^^ + +When linear quasi-static mooring stiffness is used, the mooring load can be +calculated by + +.. math:: + F_{m}=-K_{m}X-C_{m}\dot{X} + +where :math:`K_{m}` and :math:`C_{m}` are the stiffness and damping matrices +for the mooring system, and :math:`X` and :math:`\dot{X}` are the displacement +and velocity of the body, respectively. + +Mooring Lookup Table +^^^^^^^^^^^^^^^^^^^^ + +The Mooring Lookup Table searches a user-supplied 6DOF force lookup table. +The lookup table must contain six parameters: the resultant mooring force in each degree of freedom. +Each force must be indexed by position in all six degrees of freedom, as shown below. +The mooringClass does not assume a value for empty indices or forces. +All degrees of freemdom must be initialized and supplied by the user. +The mooring force is linearly interpolated between indexed positions based on the instantaneous position of the mooring system using a Simulink N-D Lookup Table for each force component. +The fidelity of the mooring lookup table is entirely dependent on the user-defined input. + +MoorDyn +^^^^^^^ + +MoorDyn discretizes each mooring line in a mooring system into evenly-sized +line segments connected by node points (see :ref:`MoorDyn figure +`). The line mass is lumped at these node points along with +gravitational and buoyancy forces, hydrodynamic loads, and reactions from +contact with the seabed. Hydrodynamic drag and added mass +are calculated based on Morison's equation. A mooring line's axial stiffness +is modeled by applying a linear stiffness to each line segment in tension only. +A damping term is also applied in each segment to dampen non-physical resonance +caused by the lumped-mass discretization. Bending and torsional stiffnesses are +neglected. Bottom contact is represented by vertical stiffness and damping +forces applied at the nodes when a node is located below the seabed. +:cite:`Hall2015ValidationData,hall2020moordyn`. + +.. _MoorDynFig: + +.. figure:: /_static/images/MoorDyn_Graphic.png + :scale: 70 % + :align: center + + .. + + *MoorDyn mooring model elements* + +For more information about application of mooring systems in WEC-Sim, refer to +:ref:`user-advanced-features-mooring` section. + + +Nonlinear Buoyancy and Froude-Krylov Wave Excitation +----------------------------------------------------- + +The linear model assumes that the body motion and the waves consist of small +amplitudes in comparison to the wavelengths. A weakly nonlinear approach is +applied to account for the nonlinear hydrodynamic forces induced by the +instantaneous water surface elevation and body position. Rather than using the +BEM calculated linear wave-excitation and hydrostatic coefficients, the +nonlinear buoyancy and the Froude-Krylov force components can be obtained by +integrating the static and dynamic pressures over each panel along the wetted +body surface at each time step. Linear wave theory is used to determine the +flow velocity and pressure field, so the values become unrealistically large +for wetted panels that are above the mean water level. To correct this, the +Wheeler stretching method is applied :cite:`wheeler1969methods`, which applies +a correction to the instantaneous wave elevation that forces its height to be +equal to the water depth when calculating the flow velocity and pressure, + + .. math:: + z^* = \frac{D(D+z)}{(D+\eta)} - D + +where :math:`D` is the mean water depth, and :math:`\eta` is the z-value on the +instantaneous water surface. + +.. Note:: + The nonlinear WEC-Sim method is not intended to model highly nonlinear hydrodynamic events, such as wave slamming and wave breaking. + +For more information about application of nonlinear hydrodynamics in WEC-Sim, +refer to :ref:`user-advanced-features-nonlinear` section. + +.. _theory-viscous-damping-morison: + +Viscous Damping and Morison Elements +------------------------------------ + +Additional damping and added-mass can be added to the WEC system. This +facilitates experimental validation of the WEC-Sim code, particularly in the +event that the BEM hydrodynamic outputs are not sufficiently representative of +the physical system. + +Viscous Damping +^^^^^^^^^^^^^^^ + +Linear damping and quadratic drag forces add flexibility to the definition of viscous forcing + + .. math:: + F_{v} &= -C_{v}\dot{X}-\frac{C_{d} \rho A_{d}}{2}\dot{X}|\dot{X}| \\ + &= -C_{v}\dot{X}-C_{D}\dot{X}|\dot{X}| + +where :math:`C_{v}` is the linear (viscous) damping coefficient, :math:`C_{d}` +is the quadratic drag coefficient, :math:`\rho` is the fluid density, and +:math:`A_{d}` is the characteristic area for drag calculation. Alternatively, +one can define :math:`C_{D}` directly. + +Because BEM codes are potential flow solvers and neglect the effects of +viscosity, :math:`F_{v}` generally must be included to accurately model device +performance. However, it can be difficult to select representative drag +coefficients, as they depend on device geometry, scale, and relative velocity +between the body and the flow around it. Empirical data on the drag coefficient +can be found in various literature and standards, but is generally limited to +simple geometries evaluated at a limited number of scales and flow conditions. +For realistic device geometries, the use of computational fluid dynamic +simulations or experimental data is encouraged. + +Morison Elements +^^^^^^^^^^^^^^^^ + +The Morison Equation assumes that the fluid forces in an oscillating flow on a +structure of slender cylinders or other similar geometries arise partly from +pressure effects from potential flow and partly from viscous effects. A slender +cylinder implies that the diameter, D, is small relative to the wave length, +:math:`\lambda`, which is generally met when :math:`D/\lambda < 0.1 - 0.2`. If +this condition is not met, wave diffraction effects must be taken into account. +Assuming that the geometries are slender, the resulting force can be +approximated by a modified Morison formulation :cite:`Morison1950`. The +formulation for each element on the body can be given as + + .. math:: + F_{me}=\rho\forall\dot{v} + \rho\forall C_{a}(\dot{v}-\ddot{X}) + + \frac{C_{d}\rho A_{d}}{2}(v-\dot{X})|v-\dot{X}| + +where :math:`v` is the fluid particle velocity due to the wave and current speed, +:math:`C_{a}` is the coefficient of added mass, and :math:`\forall` is the +displaced volume. + +.. Note:: + WEC-Sim does not consider buoyancy effects when calculating the forces + from Morison elements. + +For more information about application of Morison Elements in WEC-Sim, refer to +:ref:`user-advanced-features-morison` section. + + +Generalized Body Modes +---------------------- + +Additional generalized body modes (GBM) are included to account for solving a +multibody system with relative body motions, dynamics, or structural +deformation. This implementation assumes the modal properties are given, +obtainable in closed-form expressions or with finite element analysis. Once the +hydrodynamic coefficients that include these additional flexible DOF are +obtained from the BEM solver, the 6DOF rigid body motion for each body and the +additional GBM DOFs are solved together in one system of equations. See this +example and :ref:`user-advanced-features` for more details on implementing GBM. + + +Terminology +----------- + +.. include:: /_include/terminology.rst + + +References +---------- + +.. bibliography:: ../refs/WEC-Sim_Theory.bib + :style: unsrt + :labelprefix: B diff --git a/main/_sources/user/advanced_features.rst.txt b/main/_sources/user/advanced_features.rst.txt new file mode 100644 index 000000000..03ed27ab3 --- /dev/null +++ b/main/_sources/user/advanced_features.rst.txt @@ -0,0 +1,1663 @@ +.. _user-advanced-features: + +Advanced Features +================= + +The advanced features documentation provides an overview of WEC-Sim features +and applications that were not covered in the WEC-Sim :ref:`user-tutorials`. +The diagram below highlights some of WEC-Sim's advanced features, details of +which will be described in the following sections. Most advanced features have +a corresponding example case within the `WEC-Sim_Applications repository +`_ or the ``WEC-Sim/Examples`` +directory in the WEC-Sim source code. For those topics of interest, it is +recommended that users run and understand the output of an application while +reading the documentation on the feature. + +.. codeFeatures: + +.. figure:: /_static/images/codeFeatures.png + :width: 400pt + :align: center + + .. + +.. _user-advanced-features-bemio: + +BEMIO +----- + +.. include:: /_include/bemio.rst + +.. _user-advanced-features-simulation: + +Simulation Features +------------------- + +This section provides an overview of WEC-Sim's simulation class features; for +more information about the simulation class code structure, refer to +:ref:`user-code-structure-simulation-class`. + +Running WEC-Sim +^^^^^^^^^^^^^^^ + +The subsection describes the various ways to run WEC-Sim. The standard method is +to type the command ``wecSim`` in the MATLAB command window when in a ``$CASE`` +directory. This is the same method described in the :ref:`user-workflow` and +:ref:`user-tutorials` sections. + + +.. _user-advanced-features-fcn: + +Running as Function +""""""""""""""""""" + +WEC-Sim allows users to execute WEC-Sim as a function by using ``wecSimFcn``. +This option may be useful for users who wish to devise their own batch runs, +isolate the WEC-Sim workspace, create a special set-up before running WEC-Sim, +or link to another software. + + +.. _user-advanced-features-simulink: + +Running from Simulink +""""""""""""""""""""" + +WEC-Sim can also be run directly from Simulink. +The Run From Simulink advanced feature allows users to initialize WEC-Sim from the command window and then begin the simulation from Simulink. +This allows greater compatibility with other models or hardware-in-the-loop simulations that must start in Simulink. +The WEC-Sim library contains mask options that allow users to either: + + 1. Define an standard input file to use in WEC-Sim or + 2. Define custom parameters inside the block masks. + +The Global Reference Frame mask controls whether an input file or custom +parameters are used for WEC-Sim. Note that when the Custom Parameters options is +selected, WEC-Sim will only use those variable in the block masks. Certain options +become visible when the correct flag is set. For example, ``body.morisonElement.cd`` +will not be visible unless ``body.morisonElement.on > 0``. This method of running +WEC-Sim may help some users visualize the interplay between the blocks and classes. +For more information on how the blocks and classes are related, see the +:ref:`user-code-structure` section. + +To run WEC-Sim from Simulink, open the Simulink ``.slx`` file and choose whether to +use an input file or custom parameters in the Global Reference Frame. Next type +``initializeWecSim`` in the MATLAB Command Window. Then, run the model from the +Simulink interface. Lastly, after the simulation has completed, type ``stopWecSim`` +in the MATLAB Command Window to run post-processing. + +* Run from Simulink with a wecSimInputFile.m + * Open the WEC-Sim Simulink file (``.slx``). + * Set the Global Reference Frame to use an input file + * Type ``initializeWecSim`` in the Command Window + * Run the model from Simulink + * Wait for the simulation to complete, then type ``stopWecSim`` in the Command Window +* Run from Simulink with custom parameters + * Open the Simulink file (``.slx``). + * Set the Global Reference Frame to use custom parameters + * (Optional) prefill parameters by loading an input file. + * Edit custom parameters as desired + * Type ``initializeWecSim`` in the Command Window + * Run the model from Simulink + * Wait for the simulation to complete, then type ``stopWecSim`` in the Command Window + +After running WEC-Sim from Simulink with custom parameters, a +``wecSimInputFile_simulinkCustomParameters.m`` file is written to the ``$CASE`` +directory. This file specifies all non-default WEC-Sim parameters used for the +WEC-Sim simulation. This file serves as a record of how the case was run for +future reference. It may be used in the same manner as other input files when +renamed to ``wecSimInputFile.m`` + + +.. _user-advanced-features-mcr: + +Multiple Condition Runs (MCR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows users to easily perform batch runs by typing ``wecSimMCR`` into +the MATLAB Command Window. This command executes the Multiple Condition Run +(MCR) option, which can be initiated three different ways: + + + **Option 1.** Specify a range of sea states and PTO damping coefficients in + the WEC-Sim input file, example: + ``waves.height = 1:0.5:5; waves.period = 5:1:15;`` + ``pto(1).stiffness=1000:1000:10000; pto(1).damping=1200000:1200000:3600000;`` + + **Option 2.** Specify the excel filename that contains a set of wave + statistic data in the WEC-Sim input file. This option is generally useful + for power matrix generation, example: + ``simu.mcrExcelFile = ".xls"`` + + **Option 3.** Provide a MCR case *.mat* file, and specify the filename in + the WEC-Sim input file, example: + ``simu.mcrMatFile = ".mat"`` + +For Multiple Condition Runs, the ``*.h5`` hydrodynamic data is only loaded +once. To reload the ``*.h5`` data between runs, set ``simu.reloadH5Data =1`` in +the WEC-Sim input file. + +If the Simulink model relies upon ``From Workspace`` input blocks other than those utilized by the WEC-Sim library blocks (e.g. ``waves.elevationFile``), these can be iterated through using Option 3. The MCR file header MUST be a cell containing the exact string ``'LoadFile'``. The pathways of the files to be loaded to the workspace must be given in the ``cases`` field of the MCR *.mat* file. WEC-Sim MCR will then run WEC-Sim in sequence, once for each file to be loaded. The variable name of each loaded file should be consistent, and specified by the ``From Workspace`` block. + +For more information, refer to :ref:`webinar1`, and the **RM3_MCR** example on the `WEC-Sim Applications `_ repository. + +The **RM3_MCR** examples on the `WEC-Sim Applications +`_ repository demonstrate the +use of WEC-Sim MCR for each option above (arrays, .xls, .mat). The fourth case +demonstrates how to vary the wave spectrum input file in each case run by +WEC-Sim MCR. + +The directory of an MCR case can contain a :code:`userDefinedFunctionsMCR.m` +file that will function as the standard :code:`userDefinedFunctions.m` file. +Within the MCR application, the :code:`userDefinedFunctionsMCR.m` script +creates a power matrix from the PTO damping coefficient after all cases have +been run. + +For more information, refer to :ref:`webinar1`. + +.. _user-advanced-features-pct: + +Parallel Computing Toolbox (PCT) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows users to execute batch runs by typing ``wecSimPCT`` into the +MATLAB Command Window. This command executes the MATLAB `Parallel Computing +Toolbox `_ (PCT), +which allows parallel capability for :ref:`user-advanced-features-mcr` but adds +an additional MATLAB dependency to use this feature. Similar to MCR, this +feature can be executed in three ways (Options 1~3). + +For PCT runs, the ``*.h5`` hydrodynamic data must be reload, regardless the +setting for ``simu.reloadH5Data`` in the WEC-Sim input file. + + +.. Note:: + The ``userDefinedFunctionsMCR.m`` is not compatible with ``wecSimPCT``. + Please use ``userDefinedFunctions.m`` instead. + + +Radiation Force calculation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The radiation forces are calculated at each time-step by the convolution of the body velocity and the +radiation Impulse Response Function -- which is calculated using the cosine transform of the radiation-damping. +Speed-gains to the simulation can be made by using alternatives to the convolution operation, namely, + +1. The State-Space Representation, +2. The Finite Impulse Response (FIR) Filters. + +Simulation run-times were benchmarked using the RM3 example simulated for 1000 s. Here is a summary of normalized +run-times when the radiation forces are calculated using different routes. The run-times are normalized by the +run-time for a simulation where the radiation forces are calculated using "Constant Coefficients" ( :math:`T_0` ): + + +------------------------------------------------+-------------------------------------------+ + | *Radiation Force Calculation Approach* | *Normalized Run Time* | + +------------------------------------------------+-------------------------------------------+ + | Constant Coefficients | :math:`T_0` | + +------------------------------------------------+-------------------------------------------+ + | Convolution | :math:`1.57 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + | State-Space | :math:`1.14 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + | FIR Filter | :math:`1.35 \times T_0` | + +------------------------------------------------+-------------------------------------------+ + +State-Space Representation +"""""""""""""""""""""""""" + +The convolution integral term in the equation of motion can be linearized using +the state-space representation as described in the :ref:`theory` section. To +use a state-space representation, the ``simu.stateSpace`` simulationClass variable +must be defined in the WEC-Sim input file, for example: + + :code:`simu.stateSpace = 1` + +.. _user-advanced-features-time-step: + + +Finite Impulse Response (FIR) Filters +""""""""""""""""""""""""""""""""""""" +By default, WEC-Sim uses numerical integration to calculate the convolution integral, while +FIR filters implement the same using a `discretized convolution`, by using FIR filters -- digital filters +that are inherently stable. Convolution of Impulse Response Functions of `Finite` length, i.e., those +that dissipate and converge to `zero` can be accomplished using FIR filters. +The convolution integral can also be calculated using FIR filters by setting: + + :code:`simu.FIR=1`. + +.. Note:: + By default :code:`simu.FIR=0`, unless specified otherwise. + +Time-Step Features +^^^^^^^^^^^^^^^^^^ + +The default WEC-Sim solver is 'ode4'. Refer to the **NonlinearHydro** example +on the `WEC-Sim Applications `_ +repository for a comparisons between 'ode4' to +`'ode45' `_. The following +variables may be changed in the simulationClass (where N is number of increment +steps, default: N=1): + +* Fixed time-step: :code:`simu.dt` +* Output time-step: :code:`simu.dtOut=N*simu.dt` +* Nonlinear Buoyancy and Froude-Krylov Excitation time-step: :code:`simu.nonlinearDt=N*simu.dt` +* Convolution integral time-step: :code:`simu.cicDt=N*simu.dt` +* Morison force time-step: :code:`simu.morisonDt = N*simu.dt` + +Fixed Time-Step (ode4) +"""""""""""""""""""""" + +When running WEC-Sim with a fixed time-step, 100-200 time-steps per wave period +is recommended to provide accurate hydrodynamic force calculations (ex: simu.dt += T/100, where T is wave period). However, a smaller time-step may be required +(such as when coupling WEC-Sim with MoorDyn or PTO-Sim). To reduce the required +WEC-Sim simulation time, a different time-step may be specified for nonlinear +buoyancy and Froude-Krylov excitation and for convolution integral +calculations. For all simulations, the time-step should be chosen based on +numerical stability and a convergence study should be performed. + +Variable Time-Step (ode45) +"""""""""""""""""""""""""" + +To run WEC-Sim with a variable time-step, the following variables must be +defined in the simulationClass: + +* Numerical solver: :code:`simu.solver='ode45'` +* Max time-step: :code:`simu.dt` + +This option sets the maximum time step of the simulation (:code:`simu.dt`) and +automatically adjusts the instantaneous time step to that required by MATLAB's +differential equation solver. + +.. _user-advanced-features-wave: + +Wave Features +-------------- + +This section provides an overview of WEC-Sim's wave class features. For more +information about the wave class code structure, refer to +:ref:`user-code-structure-wave-class`. The various wave features can be +compared by running the cases within ``the WEC-Sim/Examples/RM3`` and ``the +WEC-Sim/Examples/OSWEC`` directories. + +.. _user-advanced-features-irregular-wave-binning: + +Irregular Wave Binning +^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim's default spectral binning method divides the wave spectrum into 499 +bins with equal energy content, defined by 500 wave frequencies. As a result, +the wave forces on the WEC using the equal energy method are only computed at +each of the 500 wave frequencies. The equal energy formulation speeds up the +irregular wave simulation time by reducing the number of frequencies the wave +train is defined by, and thus the number of frequencies for which the wave +forces are calculated. It prevents bins with very little energy from being +created and unnecessarily adding to the computational cost. The equal energy +method is specified by defining the following wave class variable in the +WEC-Sim input file: + + :code:`waves.bem.option = 'EqualEnergy';` + +By comparison, the traditional method divides the wave spectrum into a +sufficiently large number of equally spaced bins to define the wave spectrum. +WEC-Sim's traditional formulation uses 999 bins, defined by 1000 wave +frequencies of equal frequency distribution. To override WEC-Sim's default +equal energy method, and instead use the traditional binning method, the +following wave class variable must be defined in the WEC-Sim input file: + + :code:`waves.bem.option = 'Traditional';` + +Users may override the default number of wave frequencies by defining +``waves.bem.count``. However, it is on the user to ensure that the wave spectrum +is adequately defined by the number of wave frequencies, and that the wave +forces are not impacted by this change. + +Wave Directionality +^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the ability to model waves with various angles of incidence, +:math:`\theta`. To define wave directionality in WEC-Sim, the following wave +class variable must be defined in the WEC-Sim input file: + + :code:`waves.direction = ; %[deg]` + +The incident wave direction has a default heading of 0 Degrees (Default = 0), +and should be defined as a column vector for more than one wave direction. For +more information about the wave formulation, refer to +:ref:`theory-wave-spectra`. + +Wave Directional Spreading +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the ability to model waves with directional spreading, +:math:`D\left( \theta \right)`. To define wave directional spreading in +WEC-Sim, the following wave class variable must be defined in the WEC-Sim input +file: + + :code:`waves.spread = ;` + +The wave directional spreading has a default value of 1 (Default = 1), and +should be defined as a column vector of directional spreading for each one wave +direction. For more information about the spectral formulation, refer to +:ref:`theory-wave-spectra`. + +.. Note:: + + Users must define appropriate spreading parameters to ensure energy is + conserved. Recommended directional spreading functions include + Cosine-Squared and Cosine-2s. + +.. _user-advanced-features-seeded-phase: + +Multiple Wave-Spectra +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Wave Directional Spreading feature only allows splitting the same wave-front. +However, quite often mixed-seas are composed of disparate Wave-Spectra with unique +periods, heights, and directions. An example would be a sea-state composed of +swell-waves and chop-waves. + +Assuming that the linear potential flow theory holds, the wave inputs to the system can be +super-imposed. This implies, the effects of multiple Wave-Spectra can be simulated, if the +excitation-forces for each Wave-Spectra is calculated, and added to the pertinent +Degree-of-Freedom. + +WEC-Sim can simulate the dynamics of a body experiencing multiple Wave-Spectra each with +their unique directions, periods, and heights. In order to calculate the excitation-forces +for multiple Wave-Spectra, WEC-Sim automatically generates multiple instances of +excitation-force sub-systems. The user only needs to create multiple instances of +the ``waves`` class. + + +Here is an example for setting up multiple Wave-Spectra in the WEC-Sim input file:: + + waves(1) = waveClass('regularCIC'); % Initialize Wave Class and Specify Type + waves(1).height = 2.5; % Wave Height [m] + waves(1).period = 8; % Wave Period [s] + waves(1).direction = 0; % Wave Direction (deg.) + waves(2) = waveClass('regularCIC'); % Initialize Wave Class and Specify Type + waves(2).height = 2.5; % Wave Height [m] + waves(2).period = 8; % Wave Period [s] + waves(2).direction = 90; % Wave Direction (deg.) + + + +.. Note:: + + 1. If using a wave-spectra with different wave-heading directions, ensure that the BEM data has + the hydrodynamic coefficients corresponding to the desired wave-heading direction, + + 2. All wave-spectra should be of the same type, i.e., if :code:`waves(1)` is initialized + as :code:`waves(1) = waveClass('regularCIC')`, the following :code:`waves(#)` object should + initialized the same way. + +Addtionally, the multiple Wave-Spectra can be visualized as elaborated in :ref:`user-advanced-features-wave-markers`. +The user needs to define the marker parameters for each Wave-Spectra, as one would for a single Wave-Spectra. + +Here is an example of 2 Wave-Spectra being visualized using the wave wave-markers feature: + +.. figure:: /_static/images/Nwave.png + :width: 600pt + :align: center + +Here is a visualization of two Wave-Spectra, represented by red markers and blue markers respectively. + +Irregular Waves with Seeded Phase +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the phase for all irregular wave cases are generated randomly. In +order to reproduce the same time-series every time an irregular wave simulation +is run, the following wave class variable may be defined in the WEC-Sim input +file: + + :code:`waves.phaseSeed = ;` + +By setting ``waves.phaseSeed`` equal to 1,2,3,...,etc, the random wave phase +generated by WEC-Sim is seeded, thus producing the same random phase for each +simulation. + +Wave Gauge Placement +^^^^^^^^^^^^^^^^^^^^ +Wave gauges can be included through the wave class parameters:: + + waves.marker.location + waves.marker.size + waves.marker.style + +By default, the wave surface elevation at the origin is calculated by WEC-Sim. +In past releases, there was the option to define up to three numerical wave gauge +locations where WEC-Sim would also calculate the undisturbed linear incident wave +elevation. WEC-Sim now has the feature to define wave markers that oscillate +vertically with the undistrubed linear wave elevation (see :ref:`user-advanced-features-wave-markers`). +This feature does not limit the number of point measurements of the undisturbed +free surface elevation and the time history calculation at the marker location +is identical to the previous wave gauge implementation. Users who desire to +continuing using the previous wave gauge feature will only need to update the +variable called within WEC-Sim and an example can be found in the +`WECCCOMP Repository `_. + +.. Note:: + The numerical wave markers (wave gauges) do not handle the incident wave interaction with the radiated or diffracted + waves that are generated because of the presence and motion of any hydrodynamic bodies. + + +.. _user-advanced-features-current: + +Ocean Current +^^^^^^^^^^^^^ +The speed of an ocean current can be included through the wave class parameters:: + + waves.current.option + waves.current.speed + waves.current.direction + waves.current.depth + +The current option determines the method used to propagate the surface current across the +specified depth. Option 0 is depth independent, option 1 uses a 1/7 power law, option 2 +uses linear variation with depth and option 3 specifies no ocean current. +The ``current.speed`` parameter represents the surface current speed, and ``current.depth`` +the depth at which the current speed decays to zero (given as a positive number). +See :ref:`theory-current` for more details on each method. +These parameters are used to calculate the fluid velocity in the Morison Element calculation. + +.. _user-advanced-features-body: + +Body Features +------------- + +This section provides an overview of WEC-Sim's body class features; for more +information about the body class code structure, refer to +:ref:`user-code-structure-body-class`. + +Body Mass and Geometry Features +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The mass of each body must be specified in the WEC-Sim input file. The +following features are available: + +* **Floating Body** - the user may set :code:`body(i).mass = 'equilibrium'` + which will calculate the body mass based on displaced volume and water + density. If :code:`simu.nonlinearHydro = 0`, then the mass is calculated using the + displaced volume contained in the ``*.h5`` file. If :code:`simu.nonlinearHydro = 1` + or :code:`simu.nonlinearHydro = 2`, then the mass is calculated using the displaced + volume of the provided STL geometry file. + +* **Fixed Body** - if a body is fixed to the seabed using a fixed constraint, the mass + and moment of inertia may be set to arbitrary values such as 999 kg and [999 999 999] + kg-m^2. If the constraint forces on the fixed body are important, the mass and inertia + should be set to their real values. + +* **Import STL** - to read in the geometry (``*.stl``) into Matlab use the + :code:`body(i).importBodyGeometry()` method in the bodyClass. This method will import the + mesh details (vertices, faces, normals, areas, centroids) into the + :code:`body(i).geometry` property. This method is also used for nonlinear + buoyancy and Froude-Krylov excitation and ParaView visualization files. Users + can then visualize the geometry using the :code:`body(i).plotStl` method. + +.. _user-advanced-features-nonlinear: + +Nonlinear Buoyancy and Froude-Krylov Excitation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim has the option to include the nonlinear hydrostatic restoring and +Froude-Krylov forces when solving the system dynamics of WECs, accounting for +the weakly nonlinear effect on the body hydrodynamics. To use nonlinear +buoyancy and Froude-Krylov excitation, the **body(ii).nonlinearHydro** bodyClass +variable must be defined in the WEC-Sim input file, for example: + + :code:`body(ii).nonlinearHydro = 2` + +For more information, refer to the :ref:`webinar2`, and the **NonlinearHydro** +example on the `WEC-Sim Applications `_ +repository. + +Nonlinear Settings +"""""""""""""""""" + +**body(ii).nonlinearHydro** - +The nonlinear hydrodynamics option can be used with the parameter: +:code:`body(ii).nonlinearHydro` in your WEC-Sim input file. When any of the three +nonlinear options (below) are used, WEC-Sim integrates the wave pressure over +the surface of the body, resulting in more accurate buoyancy and Froude-Krylov +force calculations. + + **Option 1.** :code:`body(ii).nonlinearHydro = 1` This option integrates the pressure + due to the mean wave elevation and the instantaneous body position. + + **Option 2.** :code:`body(ii).nonlinearHydro = 2` This option integrates the pressure + due to the instantaneous wave elevation and the instantaneous body position. + This option is recommended if nonlinear effects need to be considered. + +**simu.nonlinearDt** - +An option available to reduce the nonlinear simulation time is to specify a +nonlinear time step, :code:`simu.nonlinearDt=N*simu.dt`, where N is number of +increment steps. The nonlinear time step specifies the interval at which the +nonlinear hydrodynamic forces are calculated. As the ratio of the nonlinear to +system time step increases, the computation time is reduced, again, at the +expense of the simulation accuracy. + +.. Note:: + WEC-Sim's nonlinear buoyancy and Froude-Krylov wave excitation option may + be used for regular or irregular waves but not with user-defined irregular + waves. + +STL File Generation +""""""""""""""""""" + +When the nonlinear option is turned on, the geometry file (``*.stl``) +(previously only used for visualization purposes in linear simulations) is used +as the discretized body surface on which the nonlinear pressure forces are +integrated. As in the linear case, the STL mesh origin must be at a body's center of gravity. + +A good STL mesh resolution is required when using the nonlinear buoyancy and Froude-Krylov wave excitation in +WEC-Sim. The simulation accuracy will increase with increased surface +resolution (i.e. the number of discretized surface panels specified in the +``*.stl`` file), but the computation time will also increase. +There are many ways to generate an STL file; however, it is important to verify +the quality of the mesh before running WEC-Sim simulations with the nonlinear +hydro flag turned on. An STL file can be exported from most CAD programs, but +few allow adequate mesh refinement. By default, most CAD programs write an STL +file similar to the left figure, with the minimum panels possible. +To accurately model nonlinear hydrodynamics in WEC-Sim, STL files should be refined to +have an aspect ratio close to one, and contain a high resolution in the vertical direction +so that an accurate instantaneous displaced volume can be calculated. + +.. figure:: /_static/images/rectangles.png + :width: 300pt + :align: center + +Many commercial and free software exist to convert between mesh formats and +refine STL files, including: + +* `Free CAD `_ +* `BEM Rosetta `_ +* `Meshmagick `_ +* `Coreform CUBIT `_ (commercial) +* `Rhino `_ (commercial) + + +.. _user-advanced-features-nonlinear-tutorial-heaving-ellipsoid: + +Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid +""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + +The body tested in the study is an ellipsoid with a cross- section +characterized by semi-major and -minor axes of 5.0 m and 2.5 m in the wave +propagation and normal directions, respectively . The ellipsoid is at its +equilibrium position with its origin located at the mean water surface. The +mass of the body is then set to 1.342×105 kg, and the center of gravity is +located 2 m below the origin. + +.. _user-advanced-features-nonlinearEllipsoid: + +.. figure:: /_static/images/nonlinearEllipsoid.png + :width: 350pt + :align: center + +STL file with the discretized body surface is shown below (``ellipsoid.stl``) + +.. _user-advanced-features-nonlinearMesh: + +.. figure:: /_static/images/nonlinearMesh.png + :width: 250pt + :align: center + +The single-body heave only WEC model is shown below (``nonLinearHydro.slx``) + +.. _user-advanced-features-nonlinearWEC: + +.. figure:: /_static/images/nonlinearWEC.png + :width: 450pt + :align: center + +The WEC-Sim input file used to run the nonlinear hydro WEC-Sim simulation: + +.. _user-advanced-features-nonLinearwecSimInputFile: + +.. rli:: https://raw.githubusercontent.com/WEC-Sim/WEC-Sim_Applications/main/Nonlinear_Hydro/ode4/Regular/wecSimInputFile.m + :language: matlab + +Simulation and post-processing is the same process as described in the +:ref:`user-tutorials` section. + +Viscous Damping and Morison Elements +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows for the definition of additional damping and added-mass terms +to allow users to tune their models precisely. Viscous damping and Morison Element +may be defined for hydrodynamic, drag, or flexible bodies. It is highly recommended +that users add viscous or Morison drag to create a realistic model. + +When the Morison Element +option is used in combination with a hydrodynamic or flexible body, it serves as a +tuning method. The equation of motion for hydrodynamic and flexible bodies with a +Morison Element is more complex than the traditional Morison Element formulation. +A traditional Morison Element may be created by using a drag body +(``body(#).nonHydro=2``) with ``body(#).morisonElement.option = 1 or 2``. +For more information about the numerical formulation of viscous damping and +Morison Elements, refer to the theory section :ref:`theory-viscous-damping-morison`. + +Viscous Damping +""""""""""""""" + +A viscous damping force in the form of a linear damping coefficient +:math:`C_{v}` can be applied to each body by defining the following body class +parameter in the WEC-Sim input file (which has a default value of zero):: + + body(i).linearDamping + +A quadratic drag force, proportional to the square of the body's velocity, can +be applied to each body by defining the quadratic drag coefficient +:math:`C_{d}`, and the characteristic area :math:`A_{d}` for drag calculation. +This is achieved by defining the following body class parameters in the WEC-Sim +input file (each of which have a default value of zero):: + + body(i).quadDrag.cd + body(i).quadDrag.area + +Alternatively, one can define :math:`C_{D}` directly:: + + body(i).quadDrag.drag + +.. _user-advanced-features-morison: + +Morison Elements +"""""""""""""""" + +To use Morison Elements, the following body class variable must be +defined in the WEC-Sim input file with :code:`body(ii).morisonElement.option`. + +Implementation Option 0 Morison Elements are not included in the body force and moment calculations. + +Implementation Option 1 allows for the Morison Element properties to be defined +independently for the x-, y-, and z-axis while Implementation Option 2 uses a +normal and tangential representation of the Morison Element properties. Note +that the two options allow the user flexibility to implement hydrodynamic +forcing that best suits their modeling needs; however, the two options have +slightly different calculation methods and therefore the outputs will not +necessarily provide the same forcing values. The user is directed to look at +the Simulink Morison Element block within the WEC-Sim library to better +determine which approach better suits their modeling requirements. + +Morison Elements must be defined for each body using the +:code:`body(i).morisonElement` property of the body class. This property +requires definition of the following body class parameters in the WEC-Sim input +file (each of which have a default value of zero(s)). + +For :code:`body(ii).morisonElement.option = 1` :: + + body(i).morisonElement.cd = [c_{dx} c_{dy} c_{dz}] + body(i).morisonElement.ca = [c_{ax} c_{ay} c_{az}] + body(i).morisonElement.area = [A_{x} A_{y} A_{z}] + body(i).morisonElement.VME = [V_{me}] + body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}] + body(i).morisonElement.z = [0 0 0] + +.. Note:: + + For Option 1, the unit normal :code:`body(#).morisonElement.z` must be + initialized as a [:code:`n` x3] vector, where :code:`n` is the number of Morison Elements, although it will not be used in the + hydrodynamic calculation. + +For :code:`body(ii).morisonElement.option = 2` :: + + body(i).morisonElement.cd = [c_{dn} c_{dt} 0] + body(i).morisonElement.ca = [c_{an} c_{at} 0] + body(i).morisonElement.area = [A_{n} A_{t} 0] + body(i).morisonElement.VME = [V_{me}] + body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}] + body(i).morisonElement.z = [z_{x} z_{y} z_{z}] + +.. Note:: + + For Option 2, the :code:`body(i).morisonElement.cd`, + :code:`body(i).morisonElement.ca`, and + :code:`body(i).morisonElement.area` variables need to be + initialized as [:code:`n` x3] vector, where :code:`n` is the number of Morison Elements, with the third column index set to zero. While + :code:`body(i).morisonElement.z` is a unit normal vector that defines the + orientation of the Morison Element. + +To better represent certain scenarios, an ocean current speed can be defined to +calculate a more accurate fluid velocity and acceleration on the Morison +Element. These can be defined through the wave class parameters +``waves.current.option``, ``waves.current.speed``, ``waves.current.direction``, +and ``waves.current.depth``. See :ref:`user-advanced-features-current` for more +detail on using these options. + +The Morison Element time-step may also be defined as +:code:`simu.morisonDt = N*simu.dt`, where N is number of increment steps. For an +example application of using Morison Elements in WEC-Sim, refer to the `WEC-Sim +Applications `_ repository +**Free_Decay/1m-ME** example. + +.. Note:: + + Morison Elements cannot be used with :code:`elevationImport`. + +.. _user-advanced-features-non-hydro-body: + +Non-Hydrodynamic Bodies +^^^^^^^^^^^^^^^^^^^^^^^ + +For some simulations, it might be important to model bodies that do not have +hydrodynamic forces acting on them. This could be bodies that are completely +outside of the water but are still connected through a joint to the WEC bodies, +or it could be bodies deeply submerged to the point where the hydrodynamics may +be neglected. WEC-Sim allows for bodies which have no hydrodynamic forces +acting on them and for which no BEM data is provided. + +To do this, use a Body Block from the WEC-Sim Library and initialize it in the +WEC-Sim input file as any other body but leave the name of the ``h5`` file as +an empty string. Specify :code:`body(i).nonHydro = 1;` and specify body name, +mass, moments of inertia, center of gravity, center of buoyancy, geometry file, +location, and displaced volume. You can also specify visualization options and +initial displacement. + +To use non-hydrodynamic bodies, the following body class variable must be +defined in the WEC-Sim input file, for example:: + + body(i).nonHydro = 1 + +Non-hydrodynamic bodies require the following properties to be defined:: + + body(i).mass + body(i).inertia + body(i).centerGravity + body(i).volume + +In the case where only non-hydrodynamic and drag bodies are used, WEC-Sim does +not read an ``*.h5`` file. Users must define these additional parameters to +account for certain wave settings as there is no hydrodynamic body present in +the simulation to define them:: + + waves.bem.range + waves.waterDepth + + +For more information, refer to :ref:`webinar2`, and the **Nonhydro_Body** +example on the `WEC-Sim Applications +`_ repository. + +Drag Bodies +^^^^^^^^^^^ + +A body may be subjected to viscous drag or Morison forces, but does not +experience significant wave excitation or radiation. And example may be a +deeply-submerged heave plate of large surface area tethered to a float. In +these instances, the drag body implementation can be utilized by defining the +following body class variable:: + + body(i).nonHydro = 2 + + +Drag bodies have zero wave excitation or radiation forces, but viscous forces +can be applied in the same manner as a hydrodynamic body via the parameters:: + + body(i).quadDrag.drag + body(i).quadDrag.cd + body(i).quadDrag.area + body(i).linearDamping + +or if using Morison Elements:: + + body(i).morisonElement.cd + body(i).morisonElement.ca + body(i).morisonElement.area + body(i).morisonElement.VME + body(i).morisonElement.rgME + +which are described in more detail in the forthcoming section. At a minimum, it +is necessary to define:: + + body(i).mass + body(i).inertia + body(i).centerGravity + body(i).volume + +to resolve drag body dynamics. One can additionally describe initial body +displacement in the manner of a hydrodynamic body. + +.. _user-advanced-features-b2b: + +Body-To-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +WEC-Sim allows for body-to-body interactions in the radiation force +calculation, thus allowing the motion of one body to impart a force on all +other bodies. The radiation matrices for each body (radiation wave damping and +added mass) required by WEC-Sim and contained in the ``*.h5`` file. **For +body-to-body interactions with N total hydrodynamic bodies, the** ``*h5`` +**data structure is [(6\*N), 6]**. + +When body-to-body interactions are used, the augmented [(6\*N), 6] matrices are +multiplied by concatenated velocity and acceleration vectors of all +hydrodynamic bodies. For example, the radiation damping force for body(2) in a +3-body system with body-to-body interactions would be calculated as the product +of a [1,18] velocity vector and a [18,6] radiation damping coefficients matrix. + +To use body-to-body interactions, the following simulation class variable must +be defined in the WEC-Sim input file:: + + simu.b2b = 1 + +For more information, refer to :ref:`webinar2`, and the **RM3_B2B** example in +the `WEC-Sim Applications `_ +repository. + +.. Note:: + + By default, body-to-body interactions are off (:code:`simu.b2b = 0`), and + only the :math:`[1+6(i-1):6i, 1+6(i-1):6i]` sub-matrices are used for each + body (where :math:`i` is the body number). + +.. _user-advanced-features-generalized-body-modes: + +Generalized Body Modes +^^^^^^^^^^^^^^^^^^^^^^ + +To use this, select a Flex Body Block from the WEC-Sim Library (under Body +Elements) and initialize it in the WEC-Sim input file as any other body. +Calculating dynamic response of WECs considering structural flexibility using +WEC-Sim should consist of multiple steps, including: + +* Modal analysis of the studied WEC to identify a set of system natural + frequencies and corresponding mode shapes +* Construct discretized mass and impedance matrices using these structural + modes +* Include these additional flexible degrees of freedom in the BEM code to + calculate hydrodynamic coefficients for the WEC device +* Import the hydrodynamic coefficients to WEC-Sim and conduct dynamic analysis + of the hybrid rigid and flexible body system + +The `WEC-Sim Applications repository `_ +contains a working sample of a barge with four additional degrees of freedom to +account for bending and shearing of the body. See this example for details on +how to implement and use generalized body modes in WEC-Sim. + +.. Note:: + + Generalized body modes module has only been tested with WAMIT, where BEMIO + may need to be modified for NEMOH, Aqwa and Capytaine. + +.. _user-advanced-features-passive-yaw: + +Passive Yaw Implementation +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For non-axisymmetric bodies with yaw orientation that changes substantially +with time, WEC-Sim allows a correction to excitation forces for large yaw +displacements. To enable this correction, add the following to your +``wecSimInputFile``:: + + body(ii).yaw.option = 1 + +Under the default implementation (:code:`body(ii).yaw.option = 0`), WEC-Sim uses the +initial yaw orientation of the device relative to the incident waves to +calculate the wave excitation coefficients that will be used for the duration +of the simulation. When the correction is enabled, excitation coefficients are +interpolated from BEM data based upon the instantaneous relative yaw position. +For this to enhance simulation accuracy, BEM data must be available over the +range of observed yaw positions at a sufficiently dense discretization to +capture the significant variations of excitation coefficients with yaw +position. For robust simulation, BEM data should be available from -180 to 170 +degrees of yaw (or equivalent). + +This can increase simulation time, especially for irregular waves, due to the +large number of interpolations that must occur. To prevent interpolation at +every time-step, ``body(ii).yaw.threshold`` (default 1 degree) can be specified in the +``wecSimInputFile`` to specify the minimum yaw displacement (in degrees) that +must occur before another interpolation of excitation coefficients will be +calculated. The minimum threshold for good simulation accuracy will be device +specific: if it is too large, no interpolation will occur and the simulation +will behave as :code:`body(ii).yaw.option = 0`, but overly small values may not +significantly enhance simulation accuracy while increasing simulation time. + +When :code:`body(ii).yaw.option = 1`, hydrostatic and radiation forces are +determined from the local body-fixed coordinate system based upon the +instantaneous relative yaw position of the body, as this may differ +substantially from the global coordinate system for large relative yaw values. + +A demonstration case of this feature is included in the **PassiveYaw** example +on the `WEC-Sim Applications `_ +repository. + +.. Note:: + + Caution must be exercised when simultaneously using passive yaw and + body-to-body interactions. Passive yaw relies on interpolated BEM solutions + to determine the cross-coupling coefficients used in body-to-body + calculations. Because these BEM solutions are based upon the assumption of + small displacements, they are unlikely to be accurate if a large relative + yaw displacement occurs between the bodies. + +.. _user-advanced-features-large-XY-disp: + +Large X-Y Displacements +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +By default, the excitation force applied to the modeled body is calculated at the body's CG position as defined in BEM. +If large lateral displacements (i.e., in the x or y direction by the default WEC-Sim coordinate system) are expected for the modeled device, it may be desirable to adjust the excitation force to account for this displacment. + +When :code:`body(i).largeXYDisplacement.option = 1`, the phase of the excitation force exerted on the body is adjusted based upon its displacement as + +:math:`\phi_{displacement} = k \omega x(1)*cos(\frac{\theta \pi}{180}) + x(2).*sin(\frac{\theta \pi}{180})` + +where k is waves.wavenumber, x(1,2) is displacement in the (x,y) direction, :math:`\omega` is waves.omega, and :math:`\theta` is waves.direction (in degrees). +This phase is thus the same size as waves.phase, and is then summed with waves.phase to determine excitation force. + +Note that this adjustment only affects the incident exciting waves, not the total wave field that is the superposition of exciting and radiating waves. +This implies that this adjustment is only valid for cases where the lateral velocity of the body is significantly less than the celerity of its radiated waves, and is thus not appropriate for sudden, rapid displacements. + +.. Note:: + + This feature has not been implemented for a user-defined wave elevation. + + +.. _user-advanced-features-pto: + +Constraint and PTO Features +---------------------------- + +.. include:: /_include/pto.rst + + + +.. _user-advanced-features-control: + +Controller Features +------------------- + +The power generation performance of a WEC is highly dependent on the control +algorithm used in the system. There are different control strategies that +have been studied for marine energy applications. These control algorithms +can be applied directly to the PTO components to achieve a desired output, or +they can be high-level controllers which are focused on the total PTO force +applied to the WEC. The examples presented in this section are based on high- +level controller applications. WEC-Sim’s controller features support the modeling +of both simple passive and reactive controllers as well as more complex methods +such as model predictive control. + +The files for the controller tutorials described in this section can be found in +the **Controls** examples on the `WEC-Sim Applications repository +`_ . The controller examples +are not comprehensive, but provide a reference for user to implement their +own controls. + + +--------------------------------+-------------------------------------------+ + | **Controller Application** | **Description** | + +--------------------------------+-------------------------------------------+ + | Passive (P) | Sphere with proportional control | + +--------------------------------+-------------------------------------------+ + | Reactive (PI) | Sphere with proportional-integral control | + +--------------------------------+-------------------------------------------+ + | Latching | Sphere with latching control | + +--------------------------------+-------------------------------------------+ + | Declutching | Sphere with declutching control | + +--------------------------------+-------------------------------------------+ + | Model Predictive Control | Sphere with model predictive control | + +--------------------------------+-------------------------------------------+ + | Reactive with PTO | Sphere with reactive control and DD PTO | + +--------------------------------+-------------------------------------------+ + + +Examples: Sphere Float with Various Controllers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +First, it is important to understand the concept of complex conjugate control. +Complex conjugate control, as applied to wave energy conversion, +can be used to understand optimal control. For a complex conjugate controller, +the impedance of the controller is designed to match the admittance of the +device (equal to the complex conjugate of device impedance). Hence, it is +also known as impedance matching and is a common practice within electrical +engineering. Complex conjugate control is not a completely realizable control +method due to its acausality, which means it requires exact knowledge of +future wave conditions. Still, a causal transfer function can be used to approximate +complex conjugate control across a limited frequency range :cite:`bacelli2020comments`. +Thus, complex conjugate control presents a reference for the implementation of +optimal causal controls. The WEC impedance can be modeled by the following equation +:cite:`bacelli2019feedback` and can be used to formulate the optimal control implementation: + +.. math:: + + Z_i(\omega) = j\omega (m + A(\omega)) + B(\omega) + \frac{K_{hs}}{j\omega} + +By characterizing the impedance of the WEC, a greater understanding of the +dynamics can be reached. The figure below is a bode plot of the impedance of +the RM3 float body. The natural frequency is defined by the point at which the +phase of impedance is zero. By also plotting the frequency of the incoming +wave, it is simple to see the difference between the natural frequency of +the device and the wave frequency. Complex conjugate control (and some other +control methods) seeks to adjust the natural frequency of the device to match +the wave frequency. Matching the natural frequency to the wave frequency leads +to resonance, which allows for theoretically optimal mechanical power. + +.. figure:: /_static/images/impedance.png + :width: 300pt + :align: center + +It is important to note here that although impedance matching can lead to maximum mechanical +power, it does not always lead to maximum electrical power. Resonance due to +impedance matching often creates high peaks of torque and power, which are usually +far from the most efficient operating points of PTO systems used to extract power +and require those systems to be more robust and expensive. +Thus, the added factor of PTO dynamics and efficiency may lead to +complex conjugate control being suboptimal. Furthermore, any constraints or other +nonlinear dynamics may make complex conjugate control unachievable or suboptimal. +Theoretical optimal control using complex conjugates presented here should be +taken as a way to understand WEC controls rather than a method to achieve +optimal electrical power for a realistic system. + +.. _control-passive: + +Passive Control (Proportional) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Passive control is the simplest of WEC controllers and acts as a damping force. +Hence, the damping value (also referred to as a proportional gain) is +multiplied by the WEC velocity to determine the power take-off force: + +.. math:: + + F_{PTO} = K_p \dot{X} + +Although unable to reach optimal power for a regular wave due to its passive +nature, a passive controller can still be tuned to reach its maximum power. +According to complex conjugate control, a passive controller can be +optimized for regular wave conditions using the following formula :cite:`gomes2015dynamics`: + +.. math:: + + K_{p,opt} = \sqrt{B(\omega)^2 + (\frac{K_{hs}}{\omega} - \omega (m + A(\omega)))^2} + +The optimal proportional gain has been calculated for the float using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file sets +up a sweep of the proportional gains which can be used to show that the results +confirm the theoretical optimal gain in the figure below (negative power corresponding to +power extracted from the system). This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window. + +.. figure:: /_static/images/pGainSweep.png + :width: 300pt + :align: center + +This example only shows the optimal proportional gain in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains. + +.. _control-reactive: + +Reactive Control (Proportional-Integral) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Reactive control is also a very simple form of WEC control and combines the +damping force of a passive controller with a spring stiffness force. The standard PTO +block can also be used to implement PI control using the damping and stiffness +values but doesn't allow for negative inputs which is often necessary for +optimal stiffness. This controller is also known as a proportional integral +controller with the proportional gain corresponding to the damping value and +the integral gain corresponding to a spring stiffness value: + +.. math:: + + F_{PTO} = K_p \dot{X} + K_i X + +The addition of the reactive component means the controller can achieve optimal +complex conjugate control by cancelling out the imaginary portion of the device +impedance. Thus, the proportional and integral control gains can be defined by the +following formulas :cite:`coe2021practical`: + +.. math:: + + K_{p,opt} = B(\omega) + +.. math:: + + K_{i,opt} = (m + A(\omega)) \omega^2 - K_hs + +The optimal proportional and integral gains have been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file again sets +up a sweep of the gains which can be used to show that the results +confirm the theoretical optimal gains in the figure below. This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window. + +.. figure:: /_static/images/piGainSweep.png + :width: 300pt + :align: center + +This example only shows the optimal gains in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains. + +.. _control-latching: + +Latching Control +^^^^^^^^^^^^^^^^ + +Latching control combines a traditional passive controller with a latching mechanism which applies +a large braking force during a portion of the oscillation. By locking the device for +part of the oscillation, latching control attempts to adjust the phase of the motion to +match the phase of incoming waves. Latching control can slow the device motion to match +wave motion and is therefore most often used when the wave period is longer than the natural +period. Latching control is still considered passive as no energy input is required (assuming velocity +is zero while latched). + +The braking/latching force is implemented as a very large damping force (:math:`G`), which can be +adjusted based on the device's properties :cite:`babarit2006optimal`: + +.. math:: + + G = 80 (m + A(\omega)) + +Because latching achieves phase matching between the waves and device, the optimal +damping can be assumed the same as for reactive control. Lastly, the main control +variable, latching time, needs to be determined. For regular waves, it is +desired for the device to move for a time equal to its natural frequency, meaning +the optimal latching time is likely close to half the difference between the wave +period and the natural period :cite:`babarit2006optimal` (accounting for 2 latching periods per wave period). + +.. math:: + + t_{latch} = \frac{1}{2} (T_{wave} - T_{nat}) + +The optimal latching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. The mcrBuildTimes.m file sets +up a sweep of the latching times, the results for which are shown in the figure below. +This MCR run can be recreated by running the mcrBuildGains.m file then typing wecSimMCR +in the command window. Based on the results, the optimal latching time is slightly +lower than expected which may be due to imperfect latching or complex dynamics which +aren't taken into account in the theoretical optimal calculation. Regardless, latching results in +much larger power when compared to traditional passive control. + +.. figure:: /_static/images/latchTimeSweep.png + :width: 300pt + :align: center + +Further, the figure below shows the excitation force and velocity, which are close to +in phase when a latching time of 2.4 seconds is implemented. + +.. figure:: /_static/images/latching.png + :width: 300pt + :align: center + +Although not shown with this example, latching can also be implemented in irregular waves +but often requires different methods including excitation prediction. + +.. _control-declutching: + +Declutching Control +^^^^^^^^^^^^^^^^^^^ + +Declutching control is essentially the opposite of latching. Instead of locking the device, +it is allowed to move freely (no PTO force) for a portion of the oscillation. Often, +declutching is used when the wave period is smaller than the natural period, allowing the +device motion to "catch up" to the wave motion. Declutching is also considered +a passive control method. + +The optimal declutching time and damping values are slightly harder to estimate than for +latching. The device's motion still depends on its impedance during the declutching period, +meaning the device does not really move "freely" during this time. Hence, in opposition to +optimal latching the declutching time was assumed to be near half the difference between +the natural period and the wave period, but is further examined through tests. + +.. math:: + + t_{declutch} = \frac{1}{2} (T_{wave} - T_{nat}) + +This optimal declutching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. Because energy is not harvested during the declutching +period, it is likely that a larger damping is required. Thus, the optimal passive +damping value was used for the following simulations, although a more +optimal damping value likely exists for delclutching. + +Since declutching is most desired when the wave period is smaller than the natural period, +a wave period of 3.5 seconds was tested with a height of 1 m. For comparison to traditional +passive control, the optimal passive damping value was tested for these conditions, leading +to a power of 5.75 kW. The mcrBuildTimes.m file sets up a sweep of the declutching times, +the results for which are shown in the figure below. It is clear that delcuthing control +can offer an improvement over traditional passive control. + +.. figure:: /_static/images/declutchTimeSweep.png + :width: 300pt + :align: center + +Further, the figure below shows the excitation force and velocity with a declutch time +of 0.8 seconds. The excitation and response are not quite in phase, but the device +can be seen "catching up" to the wave motion during the declutching time. + +.. figure:: /_static/images/declutching.png + :width: 300pt + :align: center + +Although not shown with this example, declutching can also be implemented in irregular waves +but often requires different methods including excitation prediction. + +.. _control-MPC: + +Model Predictive Control (MPC) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Model predictive control is a WEC control method which uses a plant model to predict and +optimize the dynamics. MPC is a complex controller that can be applied in both regular +and irregular waves while also taking into account time-domain constraints such as position, +velocity, and PTO force. For the model predictive controller implemented here, +the plant model is a frequency dependent state-space model :cite:`so2017development`. +The state space model is then converted to a quadratic programming problem to be +solved by quadprog(), MATLAB's quadratic programming function. Solving this system +leads to a set of PTO forces to optimize the future dynamics for maximum harvested +power, the first of which is applied at the current timestep. The relevant files for +the MPC example in the Controls folder of WEC-Sim Applications are detailed in the +table below (excluding wecSimInputFile.m and userDefinedFunctions.m which are not +unique to MPC). Note: This controller is similar to the NMPC example within the +WECCCOMP Application, but this example includes a method for calculating frequency +dependence and setting up the state space matrices based on boundary element method +data, allows for position, velocity, and force constraints, and is applied to a +single body heaving system. + + +--------------------------------+------------------------------------------------------+ + | *File* | *Description* | + +--------------------------------+------------------------------------------------------+ + | coeff.mat | Coefficients for frequency dependence | + +--------------------------------+------------------------------------------------------+ + | fexcPrediction.m | Predicts future excitation forces | + +--------------------------------+------------------------------------------------------+ + | sphereMPC.slx | Simulink model including model predictive controller | + +--------------------------------+------------------------------------------------------+ + | mpcFcn.m | Creates and solves quadratic programming problem | + +--------------------------------+------------------------------------------------------+ + | plotFreqDep.m | Solves for and plots frequency dependence coeffs | + +--------------------------------+------------------------------------------------------+ + +The Simulink diagram is shown in the figure below. The figure shows an overview of +the controller, which primarily consists of the plant model and the optimizer. The plant +model uses the excitation force, applied PTO force, and current states to calculate the +states at the next timestep. Then, the optimizer predicts the future excitation, which +is input into the mpcFcn.m file along with the states to solve for the optimal change in +PTO force (integrated to solve for instantaneous PTO force). + +.. figure:: /_static/images/mpcSimulink.png + :width: 500pt + :align: center + +The results of the model predictive controller simulation in irregular waves are shown +below with the dashed lines indicating the applied +constraints. MPC successfully restricts the system to within the constraints (except for +a few, isolated timesteps where the solver couldn't converge) while also optimizing for maximum +average mechanical power (300 kW). The constraints can be changed to account for +specific WEC and PTO physical limitations, but will limit the average power. +There are also other parameters which can be defined or changed by the user in the +wecSimInputFile.m such as the MPC timestep, prediction horizon, r-scale, etc. to +customize and tune the controller as desired. + +.. figure:: /_static/images/mpcPos.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcVel.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcForce.png + :width: 300pt + :align: center + +.. figure:: /_static/images/mpcForceChange.png + :width: 300pt + :align: center + +The model predictive controller is particularly beneficial because of its ability to +predict future waves and maximize power accordingly as well as the ability to handle constraints. A +comparison to a reactive controller is shown in the table below. The reactive controller +can be tuned to stay within constraint bounds only when future wave conditions are known +and, in doing so, would sacrifice significant power. On the other hand, without knowledge +of future wave, the results from the untuned reactive controller are shown below using +optimal theoretical gains from the complex conjugate method at the peak wave period. +With no ability to recognize constraints, the reactive controller leads to much larger +amplitude and velocity and exhibits large peaks in PTO force and power, both of which +would likely lead to very expensive components and inefficient operation. +It is clear that the model predictive controller significantly outperforms the reactive +controller in terms of mechanical power harvested, constraint inclusions, and peak conditions. +Because of the increased complexity of model predictive control, limitations include longer +computation time and complex setup. + + +----------------------------+--------------+-------------+------------+ + | *Parameter* | *Constraint* | *MPC* | *Reactive* | + +----------------------------+--------------+-------------+------------+ + | Max Heave Position (m) | 4 | 4.02 | 8.06 | + +----------------------------+--------------+-------------+------------+ + | Max Heave Velocity (m/s) | 3 | 2.95 | 5.63 | + +----------------------------+--------------+-------------+------------+ + | Max PTO Force (kN) | 2,000 | 2,180 | 4,630 | + +----------------------------+--------------+-------------+------------+ + | Max PTO Force Change (kN/s)| 1,500 | 1,500 | 3,230 | + +----------------------------+--------------+-------------+------------+ + | Peak Mechanical Power (kW) | N/A | 4,870 | 13,700 | + +----------------------------+--------------+-------------+------------+ + | Avg Mechanical Power (kW) | N/A | 300 | 241 | + +----------------------------+--------------+-------------+------------+ + +.. _control-reactive-with-PTO: + +Reactive Control with Direct Drive Power Take-Off +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The previous controllers only considered the mechanical power output. Although maximization +of mechanical power allows for the maximum energy transfer from waves to body, it often does +not lead to maximum electrical power. The previous controller examples demonstrate the +controller types and energy transfer from waves to body, but the important consideration of +electrical power requires a PTO model. This example applies a reactive controller to the +sphere body with a simplified direct drive PTO model to maximize electrical power. Within +the Simulink subsystem for determining the PTO force, the controller prescribes the ideal or +desired force which is fed into the direct drive PTO. The current in the generator is then +used to control the applied force. + +.. figure:: /_static/images/piPTOSimulink.png + :width: 500pt + :align: center + +The PTO parameters used for this example are defined in the ``wecSimInputFile.m`` and correspond to +the Allied Motion Megaflux Frameless Brushless Torque Motors–MF0310 :cite:`allied`. The +results in terms of capture width (ratio of absorbed power (W) to wave power (W/m)) and resultant power for the +applied gains from Section :ref:`control-reactive` are shown in the figures +below for a regular wave with a period of 9.6664 s and a height of 2.5 m. The "Controller (Ideal)" +power is the ideal power absorbed according to the applied controller gains. +The "Mechanical (Drivetrain)" power is the actual mechanical power absorbed by +the PTO system including the inertial, damping, and shaft torque power. Lastly, the +"Electrical (Generator)" power is the electrical power absorbed by the +generator including the product of induced current and voltage (based on shaft torque and velocity, +respectively) and the resultant generator losses (product of current squared and winding resistance). +Mechanical power maximization requires significant net input electrical power +(signified by red bar) which leads to an extremely negative capture width. Thus, +instead of harvesting electrical power, power would need to be taken from the grid or energy +storage component to achieve mechanical power maximization. + +.. figure:: /_static/images/reactiveWithPTOCCPower.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOCC.png + :width: 300pt + :align: center + +On the other hand, by testing different controller gains in the same wave conditions +(regular wave: period = 9.6664 s, height = 2.5 m), the gains which optimize for +maximum electrical power can be found as shown below. Increasing the proportional gain +and decreasing the integral gain magnitude leads to a maximum power of about 84 kW and capture width of about +1.5 m. The resultant motion is almost ten times smaller than for the mechanical power +maximization which leads to a lower current and much lower generator power losses +(product of current squared and winding resistance). + +.. figure:: /_static/images/reactiveWithPTOSweep.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOOptPower.png + :width: 300pt + :align: center + +.. figure:: /_static/images/reactiveWithPTOOpt.png + :width: 300pt + :align: center + + +.. _user-advanced-features-cable: + +Cable Features +---------------------------- + +Cables or tethers between two bodies apply a force only in tension (when taut or stretched), but not in compression, +can be modeled using the :code:`cableClass` implementation. A cable block must be added to the +model between the two PTOs or constraints that are to be connected by a cable. Users must initialize the cable +class in the ``wecSimInputFile.m`` along with the base and follower connections in that order, by including the following lines:: + + cable(i) = cableClass('cableName','baseConnection','followerConnection'); + +where ``baseConnection`` is a PTO or constraint block that defines the cable connection on the base side, and ``followerConnection`` +is a PTO or constraint block that defineds the connection on the follower side. + + +It is necessary to define, at a minimum: :: + + cable(i).stiffness = ; + cable(i).damping = ; + +where :code:`cable(i).stiffness` is the cable stiffness (N/m), and :code:`cable(i).damping` is the cable damping (N/(m*s)). Force from the cable stiffness or +damping is applied between the connection points if the current length of the cable exceeds the equilibrium length of the cable. +By default, the cable equilibrium length is defined to be the distance between the locations of the ``baseConnection`` and ``followerConnection``, so that initially there is no tension on the cable. + +If a distinct initial condition is desired, one can define either ``cable(i).length`` or ``cable(i).preTension``, where :code:`cable(i).length` is the equilibrium (i.e., unstretched) length of the cable (m), and :code:`cable(i).preTension` is the pre-tension applied to the cable at simulation start (N). The unspecified parameter is then calculated from the location of the ``baseConnection`` and +``followerConnection``. + +To include dynamics applied at the cable-to-body coupling (e.g., a stiffness and damping), a PTO block +can be used instead, and the parameters :code:`pto(i).damping` and :code:`pto(i).stiffness` can be used to describe these dynamics. + +By default, the cable is presumed neutrally buoyant and it is not subjected to fluid drag. To include fluid drag, the user can additionally define these parameters in a style similar to the :code:`bodyClass` :: + + cable(i).quadDrag.cd + cable(i).quadDrag.area + cable(i).quadDrag.drag + cable(i).linearDamping + +The cable mass and fluid drag is modeled with a low-order lumped-capacitance method with 2 nodes. +The mass and fluid drag forces are exerted at nodes defined by the 2 drag bodies. +By default, one is co-located with the ``baseConnection`` and the other with the ``followerConnection``. +The position of these bodies can be manipulated by changing the locations of the base or follower connections points. + +.. Note:: + + This is not appropriate to resolve the actual kinematics of cable motions, but it is sufficient to model the aggregate forces among the connected bodies. + +.. _user-advanced-features-mooring: + +Mooring Features +---------------- + +.. include:: /_include/mooring.rst + + +WEC-Sim Post-Processing +------------------------ + +WEC-Sim contains several built in methods inside the response class and wave +class to assist users in processing WEC-Sim output: ``output.plotForces``, +``output.plotResponse``, ``output.saveViz``, ``waves.plotElevation``, and +``waves.plotSpectrum``. This section will demonstrate the use of these methods. +They are fully documented in the WEC-Sim :ref:`user-api`. + +Plot Forces +^^^^^^^^^^^ + +The ``responseClass.plotForces()`` method can be used to plot the time series of +each force component for a body. The first argument takes in a body number, the +second a degree of freedom of the force. For example, ``output.plotForces(2,3)`` +will plot the vertical forces that act on the 2nd body. The total force is split +into its :ref:`components `: + +- total force +- excitation force +- radiation damping force +- added mass force +- restoring force (combination of buoyancy, gravity and hydrostatic stiffness), +- Morison element and viscous drag force +- linear damping force + +.. figure:: /_static/images/OSWEC_heaveForces.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.plotForces() method for the OSWEC example. + + +Plot Response +^^^^^^^^^^^^^ + +The ``responseClass.plotResponse()`` method is very similar to ``plotForces`` +except that it will plot the time series of a body's motion in a given degree +of freedom. For example, ``output.plotResponse(1,5)`` will plot the pitch motion +of the 1st body. The position, velocity and acceleration of that body is shown. + +.. figure:: /_static/images/OSWEC_pitchResponse.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.plotResponse() method for the OSWEC example. + + + +Plot Elevation +^^^^^^^^^^^^^^^ + +The ``waveClass.plotElevation()`` method can be used to plot the wave elevation time +series at the domain origin. The ramp time is also marked. The only required input +is ``simu.rampTime``. Users must manually plot or overlay the wave elevation at a +wave gauge location. + +.. figure:: /_static/images/OSWEC_plotEta.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of waves.plotElevation() method for the OSWEC example. + + +Plot Spectrum +^^^^^^^^^^^^^ + +The ``waveClass.plotSpectrum()`` method can be used to plot the frequency spectrum +of an irregular or spectrum import wave. No input parameters are required. + +.. figure:: /_static/images/OSWEC_plotSpectrum.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of waves.plotSpectrum() method for the OSWEC example. + + +WEC-Sim Visualization +--------------------- +WEC-Sim provides visualization in SimScape Mechanics Explorer by default. This section describes some additional options for WEC-Sim visualization + + +.. _user-advanced-features-wave-markers: + +Wave Markers +^^^^^^^^^^^^^^^^^^^ + +This section describes how to visualize the wave elevations at various locations using +markers in SimScape Mechanics Explorer. +Users must define an array of [X,Y] coordinates, the marker style (sphere, cube, frames), the marker size in pixels, marker color in RGB format. +The ``Global Reference Frame`` block programmatically initiates and adds/deletes the visualization blocks based on the number of markers *(0 to N)* defined by the user. +Here are the steps to define wave markers representing a wave-spectra, ``waves(1)``. Similar steps can be followed for subsequent ``waves(#)`` objects. + + +* Define an array of marker locations: ``waves(1).marker.location = [X,Y]``, where the first column defines the X coordinates, and the second column defines the corresponding Y coordinates, Default = ``[]`` +* Define marker style : ``waves(1).marker.style = 1``, where 1: Sphere, 2: Cube, 3: Frame, Default = ``1``: Sphere +* Define marker size : ``waves(1).marker.size = 10``, to specify marker size in Pixels, Default = ``10`` +* Define marker color: ``waves(1).marker.graphicColor = [1,0,0]``, to specifie marker color in RBG format. + +.. Here is an example. In this example a mesh of points is described using the meshgrid command and then making it an array of X and Y coordinates using reshape(). + +For more information about using ParaView for visualization, refer to the **Wave_Markers** examples on the `WEC-Sim Applications `_ repository. + + +.. Note:: + + This feature is not compatible with user-defined waves ``waves = waveClass('elevationImport')`` + +.. figure:: /_static/images/RM3_vizMarker.jpg + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of visualization markers in SimScape Mechanics Explorer. + + +Save Visualization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The ``responseClass.saveViz()`` method can be used to create a complete +animation of the simulation. The animation shows the 3D response of all bodies +over time on top of a surface plot of the entire directional wave field. The +default wave domain is defined by ``simu.domainSize``, ``waves.waterDepth``, and +the maximum height that the STL mesh of any body reaches. Users may optionally +input the axis limits to restrict or widen the field of view, the time steps per +animation frame, and the output file format. Users can choose to save the animation +as either a ``.gif`` or ``.avi`` file. This function can take significant time to +run depending on simulation time and time step, however it may be faster and easier +than Paraview. Users are still recommended to use the provided Paraview macros for +more complex animations and analysis. + +For example, in the OSWEC case the command +``output.saveViz(simu,body,waves,'timesPerFrame',5,'axisLimits',[-50 50 -50 50 -12 20])`` +results in the following figure: + +.. figure:: /_static/images/OSWEC_plotWaves.PNG + :width: 250pt + :figwidth: 250pt + :align: center + + Demonstration of output.saveViz() method for the OSWEC example. + + +.. _user-advanced-features-paraview: + +Paraview Visualization +---------------------- + +.. include:: /_include/viz.rst + + +.. _user-advanced-features-WSviz: + + + +.. _user-advanced-features-decay: + +Decay Tests +----------- + +When performing simulations of decay tests, you must use one of the no-wave +cases and setup the initial (time = 0) location of each body, constraint, PTO, +and mooring block. The initial location of a body or mooring block is set by +specifying the centerGravity or location at the stability position (as with any WEC-Sim +simulation) and then specifying an initial displacement. To specify an initial +displacement, the body and mooring blocks have a :code:`.initial` property +with which you can specify a translation and angular rotation about an +arbitrary axis. For the constraint and PTO blocks, the :code:`.location` property +must be set to the location at time = 0. + +There are methods available to help setup this initial displacement for all +bodies, constraints, PTOs, and moorings. To do this, you would use the: + +* :code:`body(i).setInitDisp()` +* :code:`constraint(i).setInitDisp()` +* :code:`pto(i).setInitDisp()` +* :code:`mooring(i).setInitDisp()` + +methods in the WEC-Sim input file. A description of the required input can be +found in the method's header comments. The following properties must be +defined prior to using the object's :code:`setInitDisp()` method: + +* :code:`body(i).centerGravity` +* :code:`constraint(i).location` +* :code:`pto(i).location` +* :code:`mooring.location` + +For more information, refer to the **Free Decay** example on the `WEC-Sim +Applications `_ repository. + +Other Features +------------------ + +The WEC-Sim Applications repository also includes examples of using WEC-Sim to +model a Desalination plant and a numerical model of the WaveStar device for +control implementation. The WaveStar device was used in the WECCCOMP wave +energy control competition. + +References +------------------------ +.. bibliography:: ../refs/WEC-Sim_Adv_Features.bib + :style: unsrt + :labelprefix: C diff --git a/main/_sources/user/api.rst.txt b/main/_sources/user/api.rst.txt new file mode 100644 index 000000000..afd37704d --- /dev/null +++ b/main/_sources/user/api.rst.txt @@ -0,0 +1,86 @@ +.. _user-api: + +API +=== + +.. _simulation: + +Simulation Class +------------------ + +.. autoclass:: objects.simulationClass + :members: + :exclude-members: simulationClass, caseDir, numCables, numConstraints, numDragBodies, numHydroBodies, numMoorings, numPtos, numPtoSim, time, caseFile, cicLength, cicTime, date, gitCommit, maxIt, outputDir, wsVersion, checkInputs, setup, listInfo, loadSimMechModel, rhoDensitySetup, getGitCommit + :no-undoc-members: + + +.. _wave: + +Wave Class +------------------ + +.. autoclass:: objects.waveClass + :members: + :exclude-members: waveClass, amplitude, deepWater, dOmega, omega, phase, power, spectrum, type, typeNum, waveAmpTime, waveAmpTimeViz, wavenumber, checkInputs, setup, listInfo, calculateElevation, waveElevationGrid + :no-undoc-members: + + +.. _body: + +Body Class +------------------ + +.. autoclass:: objects.bodyClass + :members: + :exclude-members: bodyClass, dofEnd, dofStart, hydroData, b2bDOF, hydroForce, massCalcMethod, number, total, geometry, checkInputs, listInfo, loadHydroData, nonHydroForcePre, dragForcePre, hydroForcePre, adjustMassMatrix, restoreMassMatrix, storeForceAddedMass, forceAddedMass, importBodyGeometry, triArea, checkStl, triCenter, setNumber, setDOF + :no-undoc-members: + +.. _constraint: + +Constraint Class +------------------ + +.. autoclass:: objects.constraintClass + :members: + :exclude-members: constraintClass,number, checkLoc, setOrientation, listInfo, setNumber + :no-undoc-members: + +.. _ptoAPI: + +PTO Class +------------------ + +.. autoclass:: objects.ptoClass + :members: + :exclude-members: ptoClass, number, checkLoc, setOrientation, listInfo, setPretension, setNumber + :no-undoc-members: + +.. _mooringAPI: + +Mooring Class +------------- + +.. autoclass:: objects.mooringClass + :members: + :exclude-members: mooringClass, orientation, number, listInfo, setLoc, setNumber + :no-undoc-members: + +.. _cableAPI: + +Cable Class +------------- + +.. autoclass:: objects.cableClass + :members: + :exclude-members: cableClass, number, location, volume, setTransPTOLoc, checkLoc, setOrientation, setVolume, dragForcePre, linearDampingMatrix, setCb, setLength, listInfo, setNumber + +.. _response: + +Response Class +------------------ + +.. autoclass:: objects.responseClass + :members: + :exclude-members: responseClass, bodies, cables, constraints, moorDyn, mooring, ptos, ptosim, wave, loadMoorDyn, saveText + :no-undoc-members: + diff --git a/main/_sources/user/applications.rst.txt b/main/_sources/user/applications.rst.txt new file mode 100644 index 000000000..e35fb8504 --- /dev/null +++ b/main/_sources/user/applications.rst.txt @@ -0,0 +1,159 @@ +.. _user-applications: + +WEC-Sim Applications +======================== + +The `WEC-Sim Applications `_ +repository contains many more applications of the WEC-Sim code that demonstrate +WEC-Sim :ref:`Advanced Features `. This includes +tutorials by the WEC-Sim team as well as user-shared examples and covers topics +such as body interactions, numerical set-up, batch runs, visualization, control +examples, mooring and more. These applications highlight the +versatility of WEC-Sim and can be used as a starting point for users interested +in a given application. +It is highly recommended that users go through an application case along with the +relevant advanced feature section when learning to implement a new WEC-Sim feature. +The WEC-Sim Applications repository is included as a +`submodule `_ of the +WEC-Sim repository. The applications are summarized below. + +.. TODO currently these descriptions are copy/pasted from the application READMEs. + Expand on descriptions and link directly to the READMEs later on. + + +Body-to-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Body-to-Body (B2B) ` to run WEC-Sim for the :ref:`RM3 ` +geometry. The scripts run and plot the RM3 model with B2B on/off and with +Regular/RegularCIC. Execute the `runB2B.m` script to run this case. + +Controls +^^^^^^^^ + +Examples using :ref:`Controllers `. +Examples of WEC-Sim models using various control methods are included for the :ref:`RM3 ` +float geometry. These examples include passive, reactive, latching, declutching, and model predictive control methods. + +Desalination +^^^^^^^^^^^^ + +Example using WEC-Sim for desalination based on the :ref:`OSWEC ` +geometry. Note the dependency on SimScape Fluids to run this desalination case. + +Free Decay +^^^^^^^^^^ + +Example using WEC-Sim to simulate :ref:`free decay ` +of a sphere in heave, using :ref:`Multiple Condition Runs `. +Execute the `runFreeDecay.m` script to run this case. + +Generalized Body Modes +^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Generalized Body Modes ` +in WEC-Sim. In this application a barge is allowed four additional flexible +degrees of freedom. Note that this requires the BEM solver also account for +these general degrees of freedom and output the appropriate quantities required +by BEMIO. + +Mooring +^^^^^^^ + +One example using the :ref:`RM3 ` +geometry coupled with :ref:`MoorDyn ` +to simulate a more realistic mooring system. And another example modeling the +RM3 with a Mooring Matrix. The MoorDyn application consists of 3 catenary +mooring lines attached to floating buoys and then to different points on the +spar and anchored at the sea floor. + +Multiple Condition Run +^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Multiple Condition Runs ` +to run the :ref:`RM3 `. +These examples demonstrate each of the 3 different ways to run WEC-Sim with MCR +and generates a power matrix for each PTO damping value. The last example +demonstrates how to use MCR to vary the imported sea state test file and +specify corresponding phase. Execute `wecSimMCR.m` from the case directory to +run an example. + +* MCROPT1: Cases defined using arrays of values for period and height. +* MCROPT2: Cases defined with wave statistics in an Excel spreadsheet +* MCROPT3: Cases defined in a MATLAB data file (``.mat``) +* MCROPT4: Cases defined using several MATLAB data files (``*.mat``) of the + wave spectrum + +Nonhydrodynamic Body +^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Non-Hydro Body ` +to run WEC-Sim for the :ref:`OSWEC `. +This example models the base as a nonhydro body, and the flap as a hydrodynamic +body. + +Nonlinear Hydrodynamic Body +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Example using :ref:`Nonlinear Hydro ` +to run WEC-Sim for a :ref:`heaving ellipsoid `. +Includes examples of running nonlinear hydrodynamics with different :ref:`fixed and +variable time-step solvers ` +(ode4/ode45), and different regular wave formulations (with/without CIC). +Execute the `runNL.m` script to run this case. + +Paraview Visualization +^^^^^^^^^^^^^^^^^^^^^^ + +Example using ParaView data visualization for WEC-Sim coupled with :ref:`MoorDyn ` +to simulate a more realistic mooring system for the :ref:`RM3 ` +geometry. Example consists of 3 catenary mooring lines attached to different +points on the spar and anchored at the sea floor. + +Example using ParaView data visualization for WEC-Sim with :ref:`Nonlinear Hydro ` +for the Flap and a :ref:`Non-Hydro Body ` +for the Base to run WEC-Sim for the :ref:`OSWEC ` +geometry. + +Passive Yaw +^^^^^^^^^^^ + +Example on using :ref:`Passive Yaw ` +to run WEC-Sim for the :ref:`OSWEC ` geometry. +Execute the `runYawCases.m` script to run this case. + +PTO-Sim +^^^^^^^ + +Examples using :ref:`PTO-Sim `. +Examples of WEC-Sim models using PTO-Sim are included for the :ref:`RM3 ` +geometry and :ref:`OSWEC ` +geometry. + +RM3 PTO Extension +^^^^^^^^^^^^^^^^^ + +Examples on using the :ref:`PTO Extension ` advanced feature to set-up an initial displacement of the :ref:`RM3 ` easily. +This geometry is a special case with a large DOF in which different WEC bodies can be identified as the PTO mechanism with a cooresponding position change when setting the PTO Initial Displacement. + +Visualization Markers +^^^^^^^^^^^^^^^^^^^^^^ + +Examples of WEC-Sim with Wave Elevation visualization at User-Defined Locations. +The setup for the visualization can be found at `Advanced Features ` + +WECCCOMP +^^^^^^^^ + +Numerical model for the WEC Control Competition (WECCCOMP) using WEC-Sim to +model the WaveStar with various fault implementations can be found in the `WECCCOMP `_ repository. +See the project report written by Erica Lindbeck in the "report" folder. + +Write HDF5 +^^^^^^^^^^ + +This is an example of how to write your own h5 file using MATLAB. Can be useful +if you want to modify your coefficients, use experimental coefficients, or +coefficients from another BEM code other than WAMIT, NEMOH, AQWA, or CAPYTAINE. For more +details see :ref:`BEMIO ` +documentation. \ No newline at end of file diff --git a/main/_sources/user/code_structure.rst.txt b/main/_sources/user/code_structure.rst.txt new file mode 100644 index 000000000..4649fb49e --- /dev/null +++ b/main/_sources/user/code_structure.rst.txt @@ -0,0 +1,904 @@ +.. TODO: + tie to theory section and add basic equations in the wave and body sections + + +.. _user-code-structure: + +Code Structure +============== + +This section provides a description of the WEC-Sim source code and its +structure. For more information about WEC-Sim's code structure, refer to the +:ref:`user-webinars-code-structure` webinar. + +.. _user-code-structure-src: + +WEC-Sim Source Code +------------------- + +The directory where the WEC-Sim code is contained is referred to as ``$WECSIM`` +(e.g. ``C:/User/Documents/GitHub/WEC-Sim``). The WEC-Sim source code files are +contained within a source directory referred to as ``$WECSIM/source``. The +WEC-Sim source code consists primarily of three components as described in the table: + +========================= ==================== ============================ +**File Type** **File name** **Directory** +WEC-Sim Executable ``wecSim.m`` ``$WECSIM/source`` +WEC-Sim MATLAB Functions ``.m`` ``$WECSIM/source/functions`` +WEC-Sim MATLAB Classes ``.m`` ``$WECSIM/source/objects`` +WEC-Sim Simulink Library ``WECSim_Lib.slx`` ``$WECSIM/source/lib`` +========================= ==================== ============================ + +The WEC-Sim executable is the ``wecSim.m`` file. +Executing ``wecSim`` from a case directory parses the user input data, +performs pre-processing calculations in each of the classes, selects and +initializes variant subsystems in the Simulink model, runs the time-domain +simulations in WEC-Sim, and calls post-processing scripts. +When a WEC-Sim case is properly set-up, the user only needs to use the single command ``wecSim`` +in the command line to run the simulation. + +Users can run WEC-Sim from the command line with the command ``wecSim`` or from directly from Simulink, +refer to :ref:`user-advanced-features-simulink`. + + +.. _user-code-structure-classes: + +WEC-Sim Classes +--------------- + +All information required to run WEC-Sim simulations is contained within the +``simu``, ``waves``, ``body(i)``, ``constraint(i)``, ``pto(i)``, ``cable(i)``, and +``mooring(i)`` objects (instances of the simulationClass, waveClass, bodyClass, +constraintClass, ptoClass, cableClass, and mooringClass). +Users can instantiate and interact with these classes within the WEC-Sim input +file (``wecSimInputFile.m``). The following :ref:`user-code-structure-source-details` +section describes the role of the WEC-Sim objects, and how to and interact with the +WEC-Sim objects to define input properties. + +There are two ways to look at the available properties and methods within a +class. The first is to type ``doc `` in Matlab Command Window, and +the second is to open the class definitions located in the +``$WECSIM/source/objects`` directory by typing ``open `` in MATLAB +Command Window. The latter provides more information since it also defines the +different fields in a structure. + + +.. _user-code-structure-library: + +WEC-Sim Library +--------------- + +In addition to the ``wecSimInputFile.m`` that instantiates classes, a WEC-Sim +simulation requires a simulink model (``*.slx``) that represents the WEC +system components and their connectivity. Similar to how the input file uses the +WEC-Sim classes, the Simulink model uses WEC-Sim library blocks. There should +be a one-to-one relationship between the objects defined in the input file and +the blocks used in the Simulink model. + +The WEC-Sim library is divided different types of library blocks. +Users should be able to model their WEC device using the available WEC-Sim +blocks (and possibly other Simulink/Simscape blocks). The image below shows the +WEC-Sim block grouping by type. + +.. figure:: /_static/images/WEC-Sim_Lib.PNG + :width: 400pt + :align: center + +The following sections describe the different library types, the related class, and their general +purpose. + +.. _user-code-structure-source-details: + +Source Details +-------------- +The WEC-Sim Classes and Library Blocks interact with one another during a simulation. +The classes contain functions for initialization, reading input data, pre-processing and post-processing. +The library blocks use these pre-processed parameters during the time-domain simulation in Simulink. +The relationship between WEC-Sim Classes and their corresponding Library Blocks are described in the following sections, and summarized in the table below. + +======================================= ===================================== +**WEC-Sim Classes** **Corresponding Library Blocks** +Simulation Class and Wave Class Frames +Body Class Body Elements +Constraint Class Constraints +PTO Class PTOs +Cable Class Cables +Mooring Class Moorings +======================================= ===================================== + +.. _user-code-structure-simulation-class: + +Simulation Class +^^^^^^^^^^^^^^^^ + +The simulation class contains the simulation parameters, flags and solver +settings necessary to execute the WEC-Sim code. These simulation parameters +include numerical settings such as the time step, start time, differential +equation solver method, and flags for various output options and nonlinear +hydrodynamics options. At a high level, the simulation class interacts with the +rest of WEC-Sim as shown in the diagram below. The most common flags and +attributes that are passed to other objects are the start, end, and ramp times, +time steps, global variables (gravity, density, etc). + +.. figure:: /_static/images/code_structure/simulation_diagram.png + :width: 100% + +Simulation Class Initialization +"""""""""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, users +must initialize the simulation class (``simulationClass``) and specify the name +of the WEC-Sim (``*.slx``) model file by including the following lines:: + + simu=simulationClass(); + simu.simMechanicsFile='.slx' + +All simulation class properties are specified as variables within the ``simu`` +object as members of the ``simulationClass``. +The WEC-Sim code has default values defined for the simulation class +properties. These default values can be overwritten by the user in the input file, +for example, the end time of a simulation can be set by entering the following command: +``simu.endTime = ``. + +Users may specify other simulation class properties using the ``simu`` object +in the ``wecSimInputFile.m``, such as: + +===================== ================== +Simulation start time ``simu.startTime`` +End time ``simu.endTime`` +Ramp time ``simu.rampTime`` +Time step ``simu.dt`` +===================== ================== + +Available simulation properties, default values, and functions can be found by +typing ``doc simulationClass`` in the MATLAB command window, or by opening the +``simulationClass.m`` file in ``$WECSIM/source/objects`` directory by typing ``open +simulationClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's simulation class, refer to +:ref:`user-advanced-features-simulation`. + +Frame Block +"""""""""""""" + +The simulation class is tied to the Frames library. +The Frames library contains one block that is necessary in every model. The +``Global Reference Frame`` block defines the global coordinates, solver +configuration, seabed and free surface description, simulation time, and other +global settings. It can be useful to think of the Global Reference Frame as +being the seabed when creating a model. Every model requires one instance of +the Global Reference Frame block. The ``Global Reference Frame`` block uses the +simulation class variable `simu` and the wave class variable `waves`, which +must be defined in the input file. + +.. figure:: /_static/images/WEC-Sim_Lib_frames.PNG + :width: 400pt + :align: center + + +.. _user-code-structure-wave-class: + +Wave Class +^^^^^^^^^^ + +The wave class contains all wave information necessary to define the incident +wave condition for the WEC-Sim time-domain simulation. The wave class contains +the incoming wave information that determines the excitation +force, added mass, radiation damping and other frequency based parameters that +influence a body's motion. + +At a high level, the wave class interacts with the rest of WEC-Sim as shown in +the diagram below. The wave primarily interacts with the body class +through the pre-processing of wave forces and in Simulink. + +.. figure:: /_static/images/code_structure/wave_diagram.PNG + :width: 100% + +Wave Class Initialization +"""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, users +must initialize the wave class (``waveClass``) and specify the ``waveType`` by +including the following line:: + + waves = waveClass(''); + +Users must specify additional wave class properties using the ``waves`` object +depending on which wave type is selected, as shown in the table below. A more +detailed description of the available wave types is given in the following +sections. + +=================== ================================================================== +**Wave Type** **Required Properties** +``noWave`` ``waves.period`` +``noWaveCIC`` +``regular`` ``waves.height``, ``waves.period`` +``regularCIC`` ``waves.height``, ``waves.period`` +``irregular`` ``waves.height``, ``waves.period``, ``waves.spectrumType`` +``spectrumImport`` ``waves.spectrumFile`` +``elevationImport`` ``waves.elevationFile`` +=================== ================================================================== + +Available wave class properties, default values, and functions can be found by +typing ``doc waveClass`` in the MATLAB command window, or by opening the +``waveClass.m`` file in ``$WECSIM/source/objects`` directory by typing ``open +waveClass`` in the Matlab Command Window. +For more information about application of WEC-Sim's wave class, refer to +:ref:`user-advanced-features-wave`. + + +noWave +"""""" + +The ``noWave`` case is for running WEC-Sim simulations with no waves and +constant radiation added mass and wave damping coefficients. The ``noWave`` +case is typically used to run decay tests. Users must still provide hydro +coefficients from a BEM solver before executing WEC-Sim and specify the period +(``wave.T``) from which the hydrodynamic coefficients are selected. + +The ``noWave`` case is defined by including the following in the input file:: + + waves = waveClass('noWave'); + waves.period = ; %[s] + +noWaveCIC +""""""""" + +The ``noWaveCIC`` case is the same as the noWave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. + +The ``noWaveCIC`` case is defined by including the following in the input file:: + + waves = waveClass('noWaveCIC'); + +regular +""""""" + +The ``regular`` wave case is used for running simulations in regular waves with +constant radiation added mass and wave damping coefficients. Using this option, +WEC-Sim assumes that the system dynamic response is in sinusoidal steady-state +form, where constant added mass and damping coefficients are used (instead of +the convolution integral) to calculate wave radiation forces. Wave period +(``wave.T``) and wave height (``wave.H``) must be specified in the input file. + +The ``regular`` case is defined by including the following in the input file:: + + waves = waveClass('regular'); + waves.period = ; %[s] + waves.height = ; %[m] + +regularCIC +"""""""""" + +The ``regularCIC`` is the same as regular wave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. Wave period (``wave.T``) and wave height +(``wave.H``) must be specified in the input file. + +The ``regularCIC`` case is defined by including the following in the input file:: + + waves = waveClass('regularCIC'); + waves.period = ; %[s] + waves.height = ; %[m] + +.. _user-code-structure-irregular: + +irregular +""""""""" + +The ``irregular`` wave case is the wave type for irregular wave simulations +using a Pierson Moskowitz (PM) or JONSWAP (JS) wave spectrum as defined by the +IEC TS 62600-2:2019 standards. Significant wave height (``wave.H``), peak +period (``wave.T``), and wave spectrum type (``waves.spectrumtype``) must be +specified in the input file. The available wave spectra and their corresponding +``waves.spectrumType`` are listed below: + +====================== ================== +**Wave Spectrum** **spectrumType** +Pierson Moskowitz ``PM`` +JONSWAP ``JS`` +====================== ================== + +The ``irregular`` case is defined by including the following in the input file:: + + waves = waveClass('irregular'); + waves.period = ; %[s] + waves.height = ; %[m] + waves.spectrumType = ''; + +When using the JONSWAP spectrum, users have the option of defining gamma by +specifying ``waves.gamma = ;``. If gamma is not defined, +then gamma is calculated based on a relationship between significant wave +height and peak period defined by IEC TS 62600-2:2019. + +spectrumImport +"""""""""""""" + +The ``spectrumImport`` case is the wave type for irregular wave simulations +using an imported wave spectrum (ex: from buoy data). The user-defined spectrum +must be defined with the wave frequency (Hz) in the first column, and the +spectral energy density (m^2/Hz) in the second column. Users have the option to +specify a third column with phase (rad); if phase is not specified by the user +it will be randomly defined. An example file is provided in the +``$WECSIM/examples/*/spectrumData.mat`` directory. The ``spectrumImport`` case is defined by including the following +in the input file:: + + waves = waveClass('spectrumImport'); + waves.spectrumFile ='.mat'; + +.. Note:: + When using the ``spectrumImport`` option, users must specify a sufficient + number of wave frequencies (typically ~1000) to adequately describe the + wave spectra. These wave frequencies are the same that will be used to + define the wave forces on the WEC, for more information refer to the + :ref:`user-advanced-features-irregular-wave-binning` section. + +elevationImport +""""""""""""""" + +The ``elevationImport`` case is the wave type for wave simulations using user-defined +time-series (ex: from experiments). The user-defined wave surface elevation +must be defined with the time (s) in the first column, and the wave surface +elevation (m) in the second column. An example of this is given in the +``elevationData.mat`` file in the tutorials directory folder of the WEC-Sim source +code. The ``elevationImport`` case is defined by including the following in the input +file:: + + waves = waveClass('elevationImport'); + waves.elevationFile ='.mat'; + +When using the ``elevationImport`` option, excitation forces are calculated via +convolution with the excitation impulse response function. This solution method +is not particularly robust and the quality of the results can depend heavily on +the discretization and range of the BEM data. This is especially true for elevation +data that contains a small number of frequencies (e.g., an approximation of regular +wave). Further, a number of advanced features are not available for this solution +method. Direct multiplication of the frequency components, as performed in the +``spectrumImport`` and ``irregular`` methods is a more robust and capable approach, +but requires developing a '.mat' that is time-domain equivalent to '.mat'. +For this workflow, the ``elevationToSpectrum`` function has been provided in +``$WEC-Sim/source/functions/BEMIO``. + +.. _user-code-structure-body-class: + +Body Class +^^^^^^^^^^ + +The body class represents each rigid or flexible body that comprises the WEC +being simulated. It contains the mass and hydrodynamic properties of each body, +defined by hydrodynamic data from the ``*.h5`` file. The corresponding body block +uses the hydrodynamic data and wave class to calculate all relevant forces on +the body and solve for its resultant motion. At a high level, the body class +interacts with the rest of WEC-Sim as shown in the diagram below. +Bodies hold hydrodynamic BEM input data, calculate body forces and pass forces +and motions to other Simulink blocks. + +.. figure:: /_static/images/code_structure/body_diagram.PNG + :width: 750pt + +Body Class Initialization +"""""""""""""""""""""""""" + +Within the ``wecSimInputFile.m``, +users must initialize each iteration of the body class (``bodyClass``), and +specify the location of the hydrodynamic data file (``.h5``) and geometry +file (``.stl``) for each body. The body class is defined by including the +following lines in the WEC-Sim input file, where ``i`` is the body number and +'.h5' is the name of the h5 file containing the BEM results:: + + body(i)=bodyClass('.h5') + body(i).geometryFile = '.stl'; + +WEC-Sim bodies may be one of four types\: hydrodynamic, flexible, +drag, or nonhydrodynamic. These types represent varying degrees of complexity +and require various input parameters and BEM data, detailed in the table below. +The :ref:`user-advanced-features-body` section contains more details on these +important distinctions. + +.. TO DO: This table is not rendering properly + ++-------------------------+---------------------------------------------+ +|**Body Type** |**Description** | ++=========================+=============================================+ +|Hydrodynamic Body |``body(i)=bodyClass('.h5')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | ++-------------------------+---------------------------------------------+ +|Drag Body |``body(i)=bodyClass('')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | +| |``body(i).centerGravity`` | +| |``body(i).centerBuoyancy`` | +| |``body(i).volume`` | +| |``body(i).nonHydro=1`` | ++-------------------------+---------------------------------------------+ +|Nonhydrodynamic Body |``body(i)=bodyClass('')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | +| |``body(i).centerGravity`` | +| |``body(i).centerBuoyancy`` | +| |``body(i).volume`` | +| |``body(i).nonHydro=2`` | ++-------------------------+---------------------------------------------+ +|Flexible Body |``body(i)=bodyClass('.h5')`` | +| |``body(i).geometryFile = '.stl'`` | +| |``body(i).mass`` | +| |``body(i).intertia`` | ++-------------------------+---------------------------------------------+ + +Users may specify other body class properties using the ``body`` object for +each body in the ``wecSimInputFile.m``. +Important body class properties include quantities such as +the mass, moment of inertia, center of gravity and center of buoyancy. +Other parameters are specified as needed. +For example, viscous drag can be specified by entering the viscous drag +coefficient and the characteristic area in vector format the WEC-Sim +input file as follows:: + + body(i).quadDrag.cd = [0 0 1.3 0 0 0] + body(i).quadDrag.area = [0 0 100 0 0 0] + +Available body properties, default values, and functions can be found by typing +``doc bodyClass`` in the MATLAB command window, or opening the ``bodyClass.m`` +file in ``$WECSIM/source/objects`` directory by typing ``open bodyClass`` in +Matlab Command Window. +For more information about application of WEC-Sim's body class, refer to +:ref:`user-advanced-features-body`. + +.. Note:: + The ``*.h5`` file defines the hydrodynamic data for all relevant bodies. It is + required that any drag body or nonhydrodyamic body be numbered after all + hydrodynamic bodies The body index must correspond with the index in the + ``*.h5`` file and the number in the Simulink diagram. + +Body Blocks +"""""""""""""" + +The Body Class is most closely associated with the Body Elements library. +The Body Elements library shown below contains four body types in two blocks: +the ``Rigid Body`` block and the ``Flex Body`` block. The rigid body block is +used to represent hydrodynamic, nonhydrodynamic, and drag bodies. Each type of +rigid body is a `Variant Sub-system `_. +Before simulation, one variant is activated by a flag in the body object +(body.nonHydro=0,1,2). The flex body block is used to represent hydrodynamic +bodies that contain additional flexible degrees of freedom ('generalized body +modes'). The flex body is determined automatically by the degrees of freedom +contained in the BEM input data. At least one instance of a body +block (rigid or flex) is required in each model. The +:ref:`user-advanced-features-body` section describes the various types of +WEC-Sim bodies in detail. + +Both in Simulink and the input file, the user has to name the blocks +``body(i)`` (where i=1,2,...). The mass properties, hydrodynamic data, geometry +file, mooring, and other properties are then specified in the input file. +Within the body block, the wave radiation, wave excitation, hydrostatic +restoring, viscous damping, and mooring forces are calculated. + +.. figure:: /_static/images/WEC-Sim_Lib_bodies.PNG + :width: 400pt + :align: center + + +.. _user-code-structure-constraint-class: + +Constraint Class +^^^^^^^^^^^^^^^^ + +The WEC-Sim constraint class and blocks connect WEC bodies to one another (and +possibly to the seabed) by constraining DOFs. Constraint objects do not apply +any force or resistance to body motion outside of the reactive force required +to prevent motion in a given DOF. At a high level, the constraint class +interacts with the rest of WEC-Sim as shown in the diagram below. Constraint +objects largely interact with other blocks through Simscape connections that +pass resistive forces to other bodies, constraints, ptos, etc. + +.. figure:: /_static/images/code_structure/constraint_diagram.PNG + :width: 750pt + +Constraint Class Initialization +"""""""""""""""""""""""""""""""" + +The properties of the constraint class (``constraintClass``) are defined in the +``constraint`` object. Within the ``wecSimInputFile.m``, users must initialize +each iteration the constraint class (``constraintClass``) and specify the +``constraintName``, by including the following lines:: + + constraint(i)=constraintClass(''); + +For rotational constraint (ex: pitch), users may also specify the +location and orientation of the rotational joint with respect to the global +reference frame:: + + constraint(i).location = [ ]; + constraint(i).orientation.z = [ ]; + constraint(i).orientation.y = [ ]; + +Available constraint properties, default values, and functions can be found by +typing ``doc constraintClass`` in the MATLAB command window, or opening the +`constraintClass.m` file in ``$WECSIM/source/objects`` directory by typing +``open constraintClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's constraint class, refer to +:ref:`user-advanced-features-pto`. + +Constraint Blocks +"""""""""""""""""""" + +The Constraint Class is tied to the blocks within the Constraints library. +These are used to define the DOF of a +specific body. Constraint blocks define only the DOF, but do not otherwise +apply any forcing or resistance to the body motion. Each Constraint block has +two connections: a base (B) and a follower (F). The Constraints block restricts +the motion of the block that is connected to the follower relative to the block +that is connected to the base. For a single body system, the base would be the +``Global Reference Frame`` and the follower is a ``Rigid Body``. + +.. figure:: /_static/images/WEC-Sim_Lib_constraints.PNG + :width: 400pt + :align: center + +A brief description of each constraint block is given below. More information +can also be found by double clicking on the library block and viewing the Block +Parameters box. + ++--------------------+-----+-----------------------------------------+ +| Constraint Library | ++====================+=====+=========================================+ +|Block |DOFs |Description | ++--------------------+-----+-----------------------------------------+ +|``Fixed`` |0 |Rigid connection. Constrains all motion | +| | |between the base and follower | ++--------------------+-----+-----------------------------------------+ +|``Translational`` |1 |Constrains the motion of the follower | +| | |relative to the base to be translation | +| | |along the constraint's Z-axis | ++--------------------+-----+-----------------------------------------+ +|``Rotational`` |1 |Constrains the motion of the follower | +| | |relative to the base to be rotation | +| | |about the constraint's Y-axis | ++--------------------+-----+-----------------------------------------+ +|``Spherical`` |3 |Contrains the motion of the follower | +| | |relative to the base to be rotation about| +| | |the X-, Y-, and Z- axis. | ++--------------------+-----+-----------------------------------------+ +|``Floating (3DOF)`` |3 |Constrains the motion of the follower | +| | |relative to the base to planar motion | +| | |with translation along the constraint's | +| | |X- and Z- and rotation about the Y- axis | ++--------------------+-----+-----------------------------------------+ +|``Floating (6DOF)`` |6 |Allows for unconstrained motion of the | +| | |follower relative to the base | ++--------------------+-----+-----------------------------------------+ + + +.. _user-code-structure-pto-class: + +PTO Class +^^^^^^^^^ + +WEC-Sim Power Take-Off (PTO) blocks connect WEC bodies to one other (and +possibly to the seabed) by constraining DOFs and applying linear damping and +stiffness. The ability to apply damping, stiffness, or other external forcing +differentiates a 'PTO' from a 'Constraint'. The damping and stiffness allow a +pto to extract power from relative body motion with respect to a fixed reference +frame or another body. + +At a high level, the PTO class interacts with the rest of WEC-Sim as shown in +the diagram below. PTO objects largely interact with other blocks through +Simscape connections that pass resistive forces to other bodies, constraints, +ptos, etc. + +.. figure:: /_static/images/code_structure/pto_diagram.PNG + :width: 750pt + +PTO Class Initialization +"""""""""""""""""""""""""" + +The properties of the PTO class (``ptoClass``) are +defined in the ``pto`` object. Within the ``wecSimInputFile.m``, users must +initialize each iteration the pto class (``ptoClass``) and specify the +``ptoName``, by including the following lines:: + + pto(i) = ptoClass(''); + +For rotational ptos, the user also needs to specify the location of the +rotational joint with respect to the global reference frame in the +``pto(i).location`` variable. In the PTO class, users can also specify +linear damping (``pto(i).damping``) and stiffness (``pto(i).stiffness``) values to +represent the PTO system (both have a default value of 0). Users can overwrite +the default values in the input file. For example, users can specify a damping +value by entering the following in the WEC-Sim input file:: + + pto(i).damping = ; + pto(i).stiffness = ; + +Available pto properties, default values, and functions can be found by typing +``doc ptoClass`` in the MATLAB command window, or opening the `ptoClass.m` file +in ``$WECSIM/source/objects`` directory by typing ``open ptoClass`` in MATLAB +Command Window. +For more information about application of WEC-Sim's pto class, refer to +:ref:`user-advanced-features-pto`. + +PTO Blocks +"""""""""""""" + +The PTO Class is tied to the PTOs library. +Similar to the Constraint blocks, the PTO blocks have a base (B) and +a follower (F). Users must name each PTO block ``pto(i)`` +(where i=1,2,...) and then define their properties in the input file. + +The ``Translational PTO``, ``Spherical PTO``, and ``Rotational PTO`` are identical to the +``Translational``, ``Spherical``, and ``Rotational`` constraints, but they allow for the +application of linear damping and stiffness forces. Additionally, there are two +other variations of the Translational and Rotational PTOs. The Actuation +Force/Torque PTOs allow the user to define the PTO force/torque at each +time-step and provide the position, velocity and acceleration of the PTO at +each time-step. The user can use the response information to calculate the PTO +force/torque. The Actuation Motion PTOs allow the user to define the motion of +the PTO. These can be useful to simulate forced-oscillation tests. + +.. figure:: /_static/images/WEC-Sim_Lib_pto.PNG + :width: 400 pt + :align: center + +.. Note:: + When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, + the loads and displacements are specified in the local (not global) + coordinate system. This is true for both the sensed (measured) and actuated + (commanded) loads and displacements. + + +.. _user-code-structure-cable-class: + +Cable Class +^^^^^^^^^^^^^^^^ + +WEC-Sim Cable blocks connect WEC bodies to one other by a cable. +They allows users to apply damping and/or stiffness when the cable is in tension, +but allow no forcing in compression. +At a high level, the cable class interacts with the rest of WEC-Sim as shown in the diagram below. + +.. figure:: /_static/images/code_structure/cable_diagram.PNG + :width: 750pt + +Cable Class Initialization +"""""""""""""""""""""""""""""""" +The properties of the cable class (``cableClass``) are defined in the ``cable`` object. +Within the ``wecSimInputFile.m``, users must initialize the cable class and specify the +``cableName``, in addition to the ``baseConnection`` and ``followerConnection`` (in that order), by including the following lines:: + + cable(i) = cableClass('cableName','baseConnection','followerConnection'); + cable(i).damping = ; + cable(i).stiffness = ; + +Available cable properties, default values, and functions +can be found by typing ``doc cableClass`` in the MATLAB command window, or +opening the `cableClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open cableClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-cable`. + +Cable Block +"""""""""""""""""""" + +The Cable Class is tied to the Cables library. +The ``Cable`` block applies linear damping and stiffness based on +the motion between the base and follower. +Cables can be used between two bodies to apply a coupling force only when taut or stretched. +A cable block must be added to the model between two PTOs or constraints that are to be connected by the cable. + +.. figure:: /_static/images/WEC-Sim_Lib_cable.PNG + :width: 400pt + :align: center + + + +.. _user-code-structure-mooring-class: + +Mooring Class +^^^^^^^^^^^^^ + +The mooring class (``mooringClass``) allows for different fidelity simulations +of mooring systems. Three possibilities are available, a lumped mooring matrix, +a mooring lookup table, or MoorDyn. These differences are determined by the Simulink block(s) chosen, and are +described below. At a high level, the Mooring class interacts with the rest of +WEC-Sim as shown in the diagram below. The interaction is similar to a +constraint or PTO, where some resistive forcing is calculated and passed to a +body block through a Simscape connection. + +.. figure:: /_static/images/code_structure/mooring_diagram.PNG + :width: 750pt + +Mooring Class Initialization +"""""""""""""""""""""""""""""""" + +The properties of the mooring class (``mooringClass``) are defined in the +``mooring`` object. Within the ``wecSimInputFile.m``, users must initialize +the mooring class and specify the ``mooringName``, by including the following lines:: + + mooring(i)= mooringClass(''); + +Available mooring properties, default values, and functions +can be found by typing ``doc mooringClass`` in the MATLAB command window, or +opening the `mooringClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open mooringClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-mooring`. + +Mooring Blocks +"""""""""""""""""""" + +The Mooring Class is tied to the Moorings library. +Four types of blocks may be used\: a 'Mooring Matrix', a 'Mooring Lookup Table', +a 'MoorDyn Connection' block, or a 'MoorDyn Caller' block. +The ``MooringMatrix`` block applies linear damping and stiffness based on +the motion of the follower relative to the base. +Damping and stiffness can be specified between all DOFs in a 6x6 matrix. +The ``MooringLookupTable`` block searches a user-supplied 6DOF force lookup table. +The lookup table should contain six parameters: the resultant mooring force in each degree of freedom. +Each force is indexed by position in all six degrees of freedom. +The mooring force is interpolated between indexed positions based on the instantaneous position of the mooring system. +There are no restrictions on the number of MooringMatrix or MooringLookupTable blocks. + +The ``MoorDynConnection`` block is used to detect the relative motion between +two connection points (i.e., a body and the global reference frame or between +two bodies). The block uses Simulink's 'Goto' and 'From' blocks to feed the +relative response to the ``MoorDynCaller`` block, which then calls MoorDyn to +calculate the 6 degree of freedom mooring forces based on the instantaneous displacement, +velocity, a MoorDyn input file, and the compiled MoorDyn libraries to simulate a realistic +mooring system. The mooring forces are then sent back to the MoorDyn Connection +block to be applied at the body's center of gravity. Multiple MoorDyn Connection +blocks can be used to specify mooring lines between different bodies/frames, +but there can only be one MoorDyn Caller block per Simulink model. Each +MoorDyn Connection block should be initialized as a ``mooring`` object in +the ``wecSimInputFile.m`` with ``mooring(i).moorDyn`` set equal to 1. The +``MoorDynCaller`` block should not have an accompanying ``mooring`` object. +If set up correctly in the ``wecSimInputFile.m``, the signals will be +automatically sent between the MoorDyn Connection and MoorDyn Caller blocks. + +.. figure:: /_static/images/WEC-Sim_Lib_mooring.PNG + :width: 400 pt + :align: center + +.. _user-code-structure-ptosim-class: + +PTO-Sim Class +^^^^^^^^^^^^^^^^ + +The PTO-Sim class contains all the information for the PTO-Sim blocks, which can be used to simulate PTO systems. +The difference beetween the PTO-Sim class and the PTO class is that the PTO-Sim class have detailed models of different components +that are used in PTO systems such as hydraulic cylinders, hydraulic accumulators, hydraulic motors, electric generators, etc., +while the PTO class have a linear parametric model that summarizes the PTO dynamics with a stiffness and a damping term. +At a high level, the PTO-Sim class interacts with the rest of +WEC-Sim as shown in the diagram below: + +.. figure:: /_static/images/code_structure/PTOSimClass_diagram.png + :width: 750pt + +The PTO-Sim blocks receive the linear or angular response from the PTO blocks and give either the torque or the force depending on the PTO dynamics. + +PTO-Sim Class Initialization +"""""""""""""""""""""""""""""""" +The properties of the PTO-Sim class (``ptoSimClass``) are defined in the ``ptoSim`` object. The PTO-Sim class must be +initialized in the ``wecSimInputFile.m`` script. There are three properties that must be initialized for all the PTO-Sim blocks, +those are the name, the block number, and the type:: + + ptoSim(i) = ptoSimClass('ptoSimName'); + ptoSim(i).ptoSimNum = i; + ptoSim(i).ptoSimType = ; + +The type value must be defined depending on the type of block used in the simulation as follows: + ++---------------------+-----+ +| PTO-Sim Library | ++=====================+=====+ +|Block |Type | ++---------------------+-----+ +|Electric Generator |1 | ++---------------------+-----+ +|Hydraulic cylinder |2 | ++---------------------+-----+ +|Hydraulic accumulator|3 | ++---------------------+-----+ +|Rectifying check |4 | +|valve | | ++---------------------+-----+ +|Hydraulic motor |5 | ++---------------------+-----+ +|Linear crank |6 | ++---------------------+-----+ +|Adjustable rod |7 | ++---------------------+-----+ +|Check valve |8 | ++---------------------+-----+ +|Direct drive |9 | +|linear generator | | ++---------------------+-----+ +|Direct drive |10 | +|rotary generator | | ++---------------------+-----+ + + +Available PTO-Sim blocks properties, default values, and functions +can be found by typing ``doc ptoSimClass`` in the MATLAB command window, or +opening the `ptoSimClass.m` file in ``$WECSIM/source/objects`` directory by +typing ``open ptoSimClass`` in MATLAB Command Window. +For more information about application of WEC-Sim's mooring class, refer to +:ref:`user-advanced-features-pto`. + +PTO-Sim Blocks +"""""""""""""""""""" + +There are eight different types of blocks in the PTO-Sim class divided +in three sub-categories: Hydraulic, Electric, and Motion Conversion. In the hydraulic sub-category +there are five blocks: Check Valve, Compressible Fluid Piston, +Gas-Charged Hydraulic Accumulator, Hydraulic Motor, and Rectifying Check Valve. +In the Electric sub-category there is a block call Electric Generator Equivalent Circuit which models an electric generator +with an equivalent circuit. The motion conversion blocks (Rotary to Linear Adjustable Rod, and +Rotary to Linear Crank) can be used to to convert rotational motion into linear motion to add a hydraulic cylinder +to the PTO model. There are no restrictions on the number of PTO-Sim blocks. + + +.. figure:: /_static/images/WEC-Sim_Lib_PTOSim.png + :width: 400 pt + :align: center + + +.. _user-code-structure-response-class: + +Response Class +^^^^^^^^^^^^^^ +The response class contains all the output time-series and methods to plot and +interact with the results. It is not initialized by the user, and there is no +related Simulink block. Instead, it is +created automatically at the end of a WEC-Sim simulation. The response class +does not input any parameter back to WEC-Sim, only taking output data from the +various objects and blocks. + +After WEC-Sim is done running, there will be a new variable called ``output`` +saved to the MATLAB workspace. The ``output`` object is an instance of the +``responseClass``. It contains all the relevant time-series results of the +simulation. Time-series are given as [# of time-steps x 6] arrays, where 6 is the degrees of freedom. +Refer to the WEC-Sim API documentation for the :ref:`response` for +information about the structure of the ``output`` object, . + + +.. _user-code-structure-functions: + +Functions & External Codes +-------------------------- + +While the bulk of the WEC-Sim code consists of the WEC-Sim classes and the +WEC-Sim library, the source code also includes supporting functions and +external codes. These include third party Matlab functions to read ``*.h5`` and +``*.stl`` files, WEC-Sim Matlab functions to write ``*.h5`` files and run +WEC-Sim in batch mode, MoorDyn compiled libraries, python macros for ParaView +visualization, and the PTO-Sim class and library. Additionally, BEMIO can be +used to create the hydrodynamic ``*.h5`` file required by WEC-Sim. MoorDyn is +an open source code that must be downloaded separately. Users may also obtain, +modify, and recompile the code as desired. + + +.. _user-code-structure-external-blocks: + +External Simulink/Simscape Blocks +--------------------------------- + +In some situations, users may want to use Simulink/Simscape blocks that are not +included in the WEC-Sim Library to build their WEC model. +External blocks may be linked to the standard WEC-Sim library to implement +controllers, additional bodies, complex power take-offs and other custom designs. + +.. Note:: + The Simulink Mechanism Configuration for automatic gravity calculations is + not used in WEC-Sim. Gravity is instead defined as a force that is + combined with the buoyancy force. + Users who wish to add external bodies should account for gravity by: + + 1. Create nonhydrodynamic bodies with zero displaced volume, or + 2. Manually add the gravity force into their external functionality + diff --git a/main/_sources/user/getting_started.rst.txt b/main/_sources/user/getting_started.rst.txt new file mode 100644 index 000000000..69f9d3189 --- /dev/null +++ b/main/_sources/user/getting_started.rst.txt @@ -0,0 +1,157 @@ +.. _user-getting-started: + +Getting Started +=============== + +This section provides instructions on how to download and install WEC-Sim. + +MATLAB Requirements +------------------- + +WEC-Sim is developed in MATLAB/Simulink, and requires the following toolboxes: + +========================== ============================= +**Required Toolbox** **Oldest Compatible Version** +MATLAB Version 9.9 (R2020b) +Simulink Version 10.2 (R2020b) +Simscape Version 5.0 (R2020b) +Simscape Multibody Version 7.2 (R2020b) +========================== ============================= + +WEC-Sim's Simulink Library is saved in MATLAB R2020b, and WEC-Sim tests are run on the last four releases of MATLAB. +Any version of MATLAB newer than R2020b should be compatible with WEC-Sim, however we do not test all MATLAB releases. +The stability of each MATLAB release is available via `WEC-Sim's GitHub Actions `_. +Certain advanced features rely on external functions (such as :ref:`mooring-moordyn`), and additional MATLAB Toolboxes (such as :ref:`user-advanced-features-pct`). + +Verify that the MATLAB required toolboxes are installed by typing ``ver`` in the MATLAB Command Window: + +.. code-block:: matlabsession + + >> ver + ----------------------------------------------------------------------------------------------------- + MATLAB Version: 9.9.0.1592791 (R2020b) + ----------------------------------------------------------------------------------------------------- + MATLAB Version 9.9 (R2020b) + Simulink Version 10.2 (R2020b) + Simscape Version 5.0 (R2020b) + Simscape Multibody Version 7.2 (R2020b) + + +Download WEC-Sim +---------------- + +The WEC-Sim source code is hosted on `WEC-Sim's GitHub repository `_. +WEC-Sim users should clone WEC-Sim's Github repository. +Cloning the repository allows users to easily pull the latest updates to the WEC-Sim source code. +The WEC-Sim source code can be cloned by installing `Git Large File Storage `_ (git lfs) to access large files (e.g. ``*.h5`` files), and `cloning `_ the WEC-Sim GitHub repository. + +To install WEC-Sim using `git `_:: + + >> git lfs install + >> git clone https://github.com/WEC-Sim/WEC-Sim + +The local copy of WEC-Sim can easily be updated to include updates from the main version of the WEC-Sim source code hosted on the GitHub by using the git pull command:: + + >> git pull origin main + +For users who are new to git, it is recommended to go through examples on `GitHub `_ or other sources while getting started. +If you have problems downloading or installing please see the :ref:`user-troubleshooting` page. + +For developers who wish to contribute to WEC-Sim, refer to the Developer :ref:`dev-getting-started` section. + + +.. Note:: + Users may also download a static version of WEC-Sim from the latest tagged + `WEC-Sim Release `_. This is + the easiest way to obtain the WEC-Sim code, however users must manually + download new releases for updates. + + +.. _user-install: + +Install WEC-Sim +--------------- + +Once you have downloaded the WEC-Sim source code, take the following steps to install WEC-Sim. +The directory where the WEC-Sim source code is saved is referred to as ``$WECSIM`` (e.g. ``C:/User/Documents/GitHub/WEC-Sim``). + + +Step 1. Add WEC-Sim to the MATLAB Path +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To run WEC-Sim, the source directory must be on the MATLAB path. +Users have two options to do this: + +**Option 1. Automatically add the WEC-Sim source on MATLAB startup.** + +Open ``$WECSIM/source/addWecSimSource.m`` and copy contents to a new file called ``startup.m``. +Set the WEC-Sim path to the local ``$WECSIM/source`` directory, e.g. ``wecSimSource = 'C:/User/Documents/GitHub/WEC-Sim/source``. +Save ``startup.m`` to the `MATLAB Startup Folder `_. +Restart MATLAB, and the ``$WECSIM/source`` directory will automatically be added to the MATLAB path. + + +.. literalinclude:: ../../addWecSimSource.m + :language: matlab + + +**Option 2. Manually add and remove the WEC-Sim source from the MATLAB path.** + +This option requires users to run a script each time MATLAB is opened to add the WEC-Sim source directory to the path. +Navigate to the ``$WECSIM`` directory and run ``addWecSimSource``. +The ``$WECSIM/source`` directory will then be added to the MATLAB path for this instance of MATLAB. +To remove WEC-Sim from the path, run ``removeWecSimSource``. + + +Step 2. Verify the Path +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Verify the path was set up correctly by checking that the WEC-Sim source directory is listed in the MATLAB search path. +The WEC-Sim source directory, ``$WECSIM/source``, and its subfolders should be listed. +To view the MATLAB path, type ``path`` in the MATLAB Command Window:: + + >> path + + MATLABPATH + + C:/User/Documents/GitHub/WEC-Sim/source + + + +Step 3. Add WEC-Sim Library to Simulink +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Open the Simulink Library Browser by typing ``slLibraryBrowser`` in the MATLAB +Command Window:: + + >> slLibraryBrowser + +Once the Simulink Library Browser opens, `refresh the Simulink Library `_. +The WEC-Sim Library should now be visible, as shown in the figure below. +The WEC-Sim Library will now be accessible every time Simulink is opened. +For more information on using and modifying library blocks refer to the `Simulink Documentation `_. + +.. figure:: /_static/images/WEC-Sim_Lib.PNG + :align: center + + .. + +Step 4. Test the Installation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Both users and contributors can test the installation using the following steps. +In the MATLAB Command Window type:: + + >> cd $WECSIM/examples/RM3 + >> wecSim + +This should run an example case using the Reference Model 3 (RM3) point absorber. +A Mechanics Explorer window will open within the MATLAB window, and figures will be generated displaying simulation outputs. +Both the RM3 and the OSWEC examples (``$WECSIM/examples/OSWEC``) come ready-to-run and can be used once WEC-Sim is installed. + +.. Note:: + + If a git lfs error is produced, there was a problem with git-lfs + installation. You may need to manually install `Git Large File + Storage `_ , or run + ``$WECSIM/examples/RM3/hydroData/bemio.m`` to generate the correct + ``rm3.h5`` file. + diff --git a/main/_sources/user/index.rst.txt b/main/_sources/user/index.rst.txt new file mode 100644 index 000000000..32d230c7a --- /dev/null +++ b/main/_sources/user/index.rst.txt @@ -0,0 +1,18 @@ +.. _user: + +########### +User Manual +########### + +.. toctree:: + :maxdepth: 2 + + getting_started.rst + workflow.rst + tutorials.rst + code_structure.rst + advanced_features.rst + applications.rst + webinars.rst + troubleshooting.rst + api.rst diff --git a/main/_sources/user/troubleshooting.rst.txt b/main/_sources/user/troubleshooting.rst.txt new file mode 100644 index 000000000..9fd95b6e7 --- /dev/null +++ b/main/_sources/user/troubleshooting.rst.txt @@ -0,0 +1,239 @@ +.. _user-troubleshooting: + +Troubleshooting +=============== + +WEC-Sim Issues +--------------- +The WEC-Sim development team actively maintains the `WEC-Sim Issues page `_ on GitHub. +This issue page is maintained to assist users and past issues. +In this way, it serves as a significant resource for users in solving WEC-Sim problems or clarifying its implementation. + +If you have problems downloading, installing, or using WEC-Sim please follow the debugging steps on this page. +Completing these steps will help users address their own questions and aid the development team in maintaining the issue board effectively. +Please take the time to follow these steps before opening an issue on GitHub. + + +Note on the Issue Board +^^^^^^^^^^^^^^^^^^^^^^^^ + +Unfortunately, the WEC-Sim development team does not have the time and funding to address issues outside of WEC-Sim. +The following topics cannot be addressed when there is not a direct relation to WEC-Sim code, theory, or implementation: + +- MATLAB/Simulink/Simscape-based issues +- general hydrodynamics questions +- performing tasks for a user's case, i.e. supplying nonlinear meshes, \*.h5 files, BEM results +- running BEM software +- use or development of BEM software + +The issue board is provided as a convenience to users and the development team makes every effort to respond to issues in a timely manner. +However, users should not expect nor request an immediate response from the developers. + + + +Debugging +--------------------- + +Before opening an issue on GitHub, it is expected that users do a fair share of debugging. +WEC-Sim is intentionally easy to use and utilizes convenient MATLAB/Simulink interfaces. +However, this ease of use does not detract from the difficulty and time required to create an accurate and robust simulation. +Users should spend time carefully setting up and debugging their WEC-Sim cases. For example: + +- Follow all error codes to the root cause of the error +- Confirm that all user-defined inputs are set correctly +- Confirm that WEC-Sim is called in the intended way (wecSim, wecSimMCR, wecSimPCT, from Simulink, etc) +- When running a WEC-Sim example (e.g. OSWEC, RM3) carefully compare to the working examples before opening an issue +- Check BEM input data for expected results, referring to the notes in the BEMIO figures +- If creating your own WEC-Sim case, go through the wave test cases below. Check the common issues and solutions for each test. + + +Identify Root Cause +^^^^^^^^^^^^^^^^^^^^^ +Identify if MATLAB and Simulink, or WEC-Sim is the root cause of the problem. +Does the problem occur in a WEC-Sim class, function, or Simulink model? If so, it may be a WEC-Sim error. +Carefully check input file paths, especially when copying previously working WEC-Sim examples. +Please do not submit issues for errors related to using MATLAB. +The development team cannot provide support for MATLAB errors outside of WEC-Sim. + + +Review Relevant Documentation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Read the appropriate documentation section for solutions or clarification on use of a particular feature. +The documentation is thorough but requires careful reading of relevant sections. +If documentation in an area is lacking, please identify this in a GitHub issue so that we may improve WEC-Sim. + + +Search WEC-Sim Issues +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In many cases, another user has had a similar issue before. +Search the issues page (both open and closed) and the below FAQ for topics that relate to your current problem. +If these are related but insufficient, tag them in your GitHub issue for as references for the development team and future users. + + +Open an Issue +^^^^^^^^^^^^^^^^^^^^^ + +If the above steps do not solve your problem, please open an issue using one of the provided templates: bug report, feature request, theory or implementation, or WEC-Sim application. +Issue templates serve to layout the information required to solve an issue in a consistent, up front manner. +Templates are new to the WEC-Sim workflow, and input on their use is welcome. +The development team hopes this will help address questions as quickly and thoroughly as possible for users. + +Users may remove all italic descriptive text in a template, but must keep the bold headers that organize the issue. +Users who do not use a template will be asked to reopen their issue with the appropriate layout. +If the provided templates do not fit an issue, users may open a blank issue with an initial statement explaining why there is no template and providing sufficient information. + +When opening an issue, please provide all relevant information. +Link to the relevant documentation section and past issues, and upload a case file whenever possible. + + + +Numerical Test Cases +-------------------- +This section describe a series of numerical test cases that should be performed when creating a novel WEC-Sim case. +These various wave cases are necessary to ensure a robust, accurate solution and speed the debugging process for users. +When opening a support question for case development, users will be asked to supply information on which test cases are functioning or not. +Note that this workflow is not foolproof, but can be used as a guide to create a more robust WEC-Sim case. + +====== ================================= ========================= +Number Purpose Input parameters utilized +====== ================================= ========================= +1A Hydrostatic stability noWave +1B Hydrostatic stability noWaveCIC +2A Free Decay, hydrostatic stiffness noWave, initial +2B Free Decay, hydrostatic stiffness noWaveCIC, initial +3A Viscous drag regular +3B Viscous drag regularCIC +4A Full functionality irregular, initial +====== ================================= ========================= + +Various problems may occur while progressing through these test cases. +Users should not advance to the next test unless the previous tests run without error and result in a physical response. + +Hydrostatic Stability +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Issues with Test 1A-B indicate there is an imbalance between the gravity and buoyant forces. +This may cause the "solution singularity" as described in the FAQ, or result in a body rising or falling indefinitely. +To solve this problem, recalculate the mass that will balance the displaced volume from the BEM data. +Alternatively utilize the ``body(#).mass = equilibrium`` option. + +Free Decay +^^^^^^^^^^^^^^ + +Failure in Test 2 but not Test 1 indicates an inaccurate hydrostatic stiffness. +The hydrostatic stiffness returns a device to equilibrium after some displacement. +If the stiffness is too large, the simulation may require a very small time step. +If too small, an initial displacement may cause infinite motion. +Reevaluate the BEM input or tune the stiffness with ``body(#).hydroStiffness`` in the input file. + +Viscous Drag +^^^^^^^^^^^^^^ + +A hydrostatically stable device that has an unphysical response to a regular wave requires improved drag and damping. +BEM codes inherently assume inviscid flow. Recreating the effects of viscous drag in WEC-Sim is essential to obtaining a physical response. +Tune the parameters ``body(#).quadDrag`` or ``body(#).linearDamping`` to create a realistic response to a regular wave. + +Irregular Waves +^^^^^^^^^^^^^^^^^^^^^ + +If Test 4 fails, users should check that the IRF decays to zero in BEMIO as done for the other CIC waves. Users may also investigate +different body drag, or change the mooring and PTO stiffness or damping. The state space or other numerical options may be helpful to stabilize the irregular wave case. +Once a simulation is stable and realistic in Test 4 and all previous test cases, it can likely be used in additional cases as desired. +Passing these test cases does not necessarily indicate accuracy, but it should result in a simulation without numerical errors. +It is up to each user to tune body, PTO and mooring parameters appropriately to model a device accurately. + +Other Tests +^^^^^^^^^^^ + +**Tests A vs B:** +CIC waves are one way to evaluate if "good" BEM data is being used. +If a non-CIC wave has unphysical behavior at a specific frequency but not others, there are likely irregular frequency (IRR) spikes in the BEM data. +The CIC wave decreases the impact of these spikes in radiation damping. + +If a CIC wave continues to oscillate without decaying to a steady state, the convolution integral time is not long enough. +Increase ``simu.cicEndTime`` to a greater value or use the state space option (``simu.stateSpace=1``). +In BEMIO, check that the convolution integral time is long enough for all oscillations to decay. + +**Nonlinear Hydrodynamics:** +If a user wishes to use the nonlinear hydro options, they should first follow this same workflow with ``simu.nonlinearHydro=0`` and again with ``simu.nonlinearHydro=1,2`` +The nonlinear hydro options are difficult to set-up and must be used with care. +A highly refined mesh is required to get an accurate displaced volume and wetted surface area at each time step. + + +FAQs +-------------------------- +This section highlights some of the Frequently Asked Questions from WEC-Sim issues. +All FAQ information is available in closed GitHub issues, but is repeated here for convenience. + +Solution Singularity +^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +The simulation is numerically unstable. Bodies may rise or fall indefinitely and have unphysical responses. +This occurs because there is an imbalance between the gravity and hydrostatic forces. +If the gravity force is much larger than the hydrostatic force, bodies may fall indefinitely. +The opposite may occur when gravity is small compared to the hydrostatic force. +An extremely large or small stiffness can also cause this problem. +A small stiffness may not restore a body to an equilibrium position. +A large stiffness may require a very small time step to be effective. + +**Possible error messages:** + +.. code-block:: none + + Derivative of state ... in block ... at time ... is not finite. + The simulation will be stopped. There may be a singularity in the solution + +**Solution:** +Re-evaluate the hydrostatic stability of the device. +Compare the mass and displaced volume of the device to evaluate if it will float properly. +Calculate an approximate stiffness that will restore the body to equilibrium in still water. +Compare the mass, volume, and stiffness to those results in the BEM data. + + +Degenerate Mass Distribution +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +When two PTOs or Constraints are connected in series with no mass between them, Simulink attempts to connect two joint blocks directly together. +Simulink cannot reconcile the forcing and motion between these series joints without a mass between them. + +**Possible error messages:** + +.. code-block:: none + + ... Joint has a degenerate mass distribution on its base/follower side. + +**Solution:** +Add an insignificantly small mass between the two joints (e.g. ``Simulink Library/Simscape/Multibody/Body Elements/Inertia``) . +Alternatively, create a new PTO or constraint with one of the many joints available in the +Simscape Multibody Joints library if special degrees of freedom are required. + + +Hydrodynamic Data File +^^^^^^^^^^^^^^^^^^^^^^ + +**Problem:** +The path to the ``*.h5`` file does not exist or it is incomplete (size < 1kB). + +**Possible error messages:** + + +.. code-block:: none + + The hdf5 file hydroData/*.h5 does not exist + +.. code-block:: none + + This is not the correct *.h5 file. Please install git-lfs to access the correct *.h5 file, + or run \hydroData\bemio.m to generate a new *.h5 file + +**Solution:** +Check the path to the ``*.h5`` file in the ``wecSimInputFile.m`` or run BEMIO to generate a new ``*.h5`` file. + + + + + diff --git a/main/_sources/user/tutorials.rst.txt b/main/_sources/user/tutorials.rst.txt new file mode 100644 index 000000000..4f6a430ec --- /dev/null +++ b/main/_sources/user/tutorials.rst.txt @@ -0,0 +1,413 @@ +.. _user-tutorials: + +Tutorials +========= + +This section provides step-by-step instructions on how to set-up and run the WEC-Sim code +using the provided Tutorials (located in the WEC-Sim ``$WECSIM/tutorials`` +directory). Two WEC-Sim tutorials are provided: the Two-Body Point Absorber +(RM3), and the Oscillating Surge WEC (OSWEC). +For cases that are already set-up and ready to run, see Step 3 of :ref:`user-install`. + +For information about the implementation of the WEC-Sim code refer to the +:ref:`user-code-structure` section. +For information about additional WEC-Sim +features, refer to :ref:`user-advanced-features`. + +.. _user-tutorials-rm3: + +Two-Body Point Absorber (RM3) +----------------------------- + +This section describes the application of the WEC-Sim code to model the +Reference Model 3 (RM3) two-body point absorber WEC. This tutorial is provided +in the WEC-Sim code release in the ``$WECSIM/tutorials`` directory. + +.. _user-tutorials-rm3-device-geometry: + +Device Geometry +^^^^^^^^^^^^^^^ + +The RM3 two-body point absorber WEC has been characterized both numerically and +experimentally as a result of the DOE-funded `Reference Model Project +`_. The RM3 is a two-body point absorber +consisting of a float and a reaction plate. Full-scale dimensions and mass +properties of the RM3 are shown below. + +.. figure:: /_static/images/RM3_Geom.png + :width: 300pt + :align: center + ++-------+---------------+ +| Body | Mass (tonne) | ++=======+===============+ +| Float | 727.01 | ++-------+---------------+ +| Plate | 878.30 | ++-------+---------------+ + ++-------+-----------+------------------------+--------------------------------------+ +| Body | Direction | Center of Gravity* (m) | Inertia Tensor (kg m^2) | ++=======+===========+========================+============+============+============+ +| | x | 0 | 20,907,301 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Float | y | 0 | 0 | 21,306,091 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -0.72 | 0 | 0 | 37,085,481 | ++-------+-----------+------------------------+------------+------------+------------+ +| | x | 0 | 94,419,615 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Plate | y | 0 | 0 | 94,407,091 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -21.29 | 0 | 0 | 28,542,225 | ++-------+-----------+------------------------+------------+------------+------------+ + +**\* The origin lies at the undisturbed free surface (SWL)** + +.. _user-tutorials-rm3-model-files: + +Model Files +^^^^^^^^^^^ + +Below is an overview of the files required to run the RM3 simulation in +WEC-Sim. For the RM3 WEC, there are two corresponding geometry files: +``float.stl`` and ``plate.stl``. In addition to the required files listed +below, users may supply a ``userDefinedFunctions.m`` file for post-processing +results once the WEC-Sim run is complete. + +================== ============================= ==================================== +**File Type** **File Name** **Directory** +Input File ``wecSimInputFile.m`` ``$WECSIM/tutorials/rm3/`` +Simulink Model ``rm3.slx`` ``$WECSIM/tutorials/rm3/`` +Hydrodynamic Data ``rm3.h5`` ``$WECSIM/tutorials/rm3/hydroData/`` +Geometry Files ``float.stl`` & ``plate.stl`` ``$WECSIM/tutorials/rm3/geometry/`` +================== ============================= ==================================== + +RM3 Tutorial +^^^^^^^^^^^^ + +.. _user-tutorials-rm3-step-one: + +Step 1: Run BEMIO +""""""""""""""""" + +Hydrodynamic data for each RM3 body must be parsed into a HDF5 file using +:ref:`user-advanced-features-bemio`. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, ``*.h5`` that is then read by WEC-Sim. +The RM3 tutorial includes data from a WAMIT run, ``rm3.out``, of the RM3 +geometry in the ``$WECSIM/tutorials/rm3/hydroData/`` directory. The RM3 WAMIT +``rm3.out`` file and the BEMIO ``bemio.m`` script are then used to generate the +``rm3.h5`` file. + +This is done by navigating to the ``$WECSIM/tutorials/rm3/hydroData/`` +directory, and typing``bemio`` in the MATLAB Command Window:: + + >> bemio + + +.. _user-tutorials-rm3-step-two: + +Step 2: Build Simulink Model +"""""""""""""""""""""""""""" + +The WEC-Sim Simulink model is created by dragging and dropping blocks from the +*WEC-Sim Library* into the ``rm3.slx`` file. When setting up a WEC-Sim model, +it is very important to note the base and follower frames. The base port should +always connect 'towards' the Global Reference Frame, while the follower port +connects 'away' from the reference frame. Also, a base port should always +connect to a follower port. The same port type should not be connected (i.e. no +base-base or follower-follower connections). + +* Place two **Rigid Body** blocks from *Body Elements* in *WEC-Sim Library* in + the Simulink model file, one for each RM3 rigid body. + +* Double click on the **Rigid Body** block, and rename each instance of the + body. The first body must be called ``body(1)``, and the second body should be + called ``body(2)``. + +.. figure:: /_static/images/RM3_WECSim_Body.jpg + :width: 400pt + :align: center + +* Place the **Global Reference Frame** from *Frames* in the *WEC-Sim Library* + in the Simulink model file. The global reference frame acts as the seabed. + + +.. figure:: /_static/images/RM3_WECSim_GlobalRef.jpg + :width: 400pt + :align: center + +* Place the **Floating (3DOF)** block from *Constrains* to connect the plate to + the seabed. This constrains the plate to move in 3DOF relative to the **Global + Reference Frame**. + +* Place the **Translational PTO** block from *PTOs* to connect the float to the + spar. This constrains the float to move in heave relative to the spar, and + allows definition of PTO damping. + +.. figure:: /_static/images/RM3_WECSim.JPG + :width: 400pt + :align: center + +.. _user-tutorials-rm3-step-three: + +Step 3: Write wecSimInputFile.m +""""""""""""""""""""""""""""""" + +The WEC-Sim input file defines simulation parameters, body properties, joints, +and mooring for the RM3 model. The ``wecSimInputFile.m`` for the RM3 is +provided in the RM3 case directory, and shown below. + +New users should manually write the wecSimInputFile.m to become familiar with +the set-up parameters and the files being called in a basic WEC-Sim run. First, +define the simulation parameters. Initialize an instance of the +simulationClass. Define the simulink file to use, the start, ramp and end +times, and the time step required. The simulation class also controls all +relevant numerical options and simulation-wide parameters in a single +convenient class. + +Next set-up the type of incoming wave by instantiating the waveClass. 'Regular' +is a sinusoidal wave and the easiest to start with. Define an appropriate wave +height and period. Waves can also be an irregular spectrum, imported by +elevation or spectrum, or multidirectional. + +Third, define all bodies, PTOs and constraints present in the simulink file. +There are distinct classes for bodies, PTOs and constraints that contain +different properties and function differently. Bodies are hydrodynamic and +contain mass and geometry properties. Initialize bodies by calling the +bodyClass and the path to the relevant h5 file. Set the path to the geometry +file, and define the body's mass properties. PTOs and constraints are more +simple and contain forces and power dissipation (in the constraint) that limit +the WEC's motion. PTOs and constraints can be set by calling the appropriate +class with the Simulink block name. Set the location and any PTO damping or +stiffness desired. + +.. literalinclude:: ../../tutorials/RM3/RM3_wecSimInputFile.m + :language: matlab + +.. _user-tutorials-rm3-step-four: + +Step 4: Run WEC-Sim +""""""""""""""""""" + +To execute the WEC-Sim code for the RM3 tutorial, type ``wecSim`` into the +MATLAB Command Window. Below is a figure showing the final RM3 Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the RM3 device, refer to :cite:`ruehl_preliminary_2014`. + +.. figure:: /_static/images/RM3_WECSim_GUI.JPG + :width: 400pt + :align: center + +.. _user-tutorials-rm3-step-five: + +Step 5: Post-processing +""""""""""""""""""""""" + +The RM3 tutorial includes a ``userDefinedFunctions.m`` which plots RM3 +forces and responses. This file can be modified by users for +post-processing. Additionally, once the WEC-Sim run is complete, the +WEC-Sim results are saved to the ``output`` variable in the MATLAB +workspace. + +.. _user-tutorials-oswec: + +Oscillating Surge WEC (OSWEC) +----------------------------- + +This section describes the application of the WEC-Sim code to model the +Oscillating Surge WEC (OSWEC). This tutorial is provided in the WEC-Sim +code release in the ``$WECSIM/tutorials`` directory. + +.. _user-tutorials-oswec-device-geometry: + +Device Geometry +^^^^^^^^^^^^^^^ + +The OSWEC was selected because its design is fundamentally different from the +RM3. This is critical because WECs span an extensive design space, and it is +important to model devices in WEC-Sim that operate under different principles. +The OSWEC is fixed to the ground and has a flap that is connected through a +hinge to the base that restricts the flap in order to pitch about the hinge. +The full-scale dimensions and mass properties of the OSWEC are shown below. + +.. figure:: /_static/images/OSWEC_Geom.png + :width: 600pt + :align: center + ++-------+---------------+ +| Body | Mass (tonne) | ++=======+===============+ +| Flap | 127 | ++-------+---------------+ + ++-------+-----------+------------------------+--------------------------------------+ +| Body | Direction | Center of Gravity* (m) | Moment of Inertia Tensor (kg m^2) | ++=======+===========+========================+============+============+============+ +| | x | 0 | 0 | 0 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| Flap | y | 0 | 0 | 1,850,000 | 0 | +| +-----------+------------------------+------------+------------+------------+ +| | z | -3.9 | 0 | 0 | 0 | ++-------+-----------+------------------------+------------+------------+------------+ + +.. Note:: + The global frame lies at the undisturbed free surface. The body-fixed frame is at the center of gravity. Since the OSWEC is modeled as a pitch device, only the Iyy Moment of Inertia has been defined. + +.. _user-tutorials-oswec-model-files: + +Model Files +^^^^^^^^^^^ + +Below is an overview of the files required to run the OSWEC simulation in +WEC-Sim. For the OSWEC, there are two corresponding geometry files: +``flap.stl`` and ``base.stl``. In addition to the required files listed below, +users may supply a ``userDefinedFunctions.m`` file for post-processing results +once the WEC-Sim run is complete. + +================== ============================ =============================== +**File Type** **File Name** **Directory** +Input File ``wecSimInputFile.m`` ``$WECSIM/tutorials/oswec/`` +Simulink Model ``oswec.slx`` ``$WECSIM/tutorials/oswec/`` +Hydrodynamic Data ``oswec.h5`` ``$WECSIM/tutorials/oswec/hydroData/`` +Geometry Files ``flap.stl`` & ``base.stl`` ``$WECSIM/tutorials/oswec/geometry/`` +================== ============================ =============================== + +OSWEC Tutorial +^^^^^^^^^^^^^^ + +.. _user-tutorials-oswec-step-one: + +Step 1: Run BEMIO +""""""""""""""""" + +Hydrodynamic data for each OSWEC body must be parsed into a HDF5 file using +:ref:`user-advanced-features-bemio`. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, ``*.h5`` that is then read by WEC-Sim. +The OSWEC tutorial includes data from a WAMIT run, ``oswec.out``, of the OSWEC +geometry in the ``$WECSIM/tutorials/rm3/hydroData/`` directory. The OSWEC WAMIT +``oswec.out`` file and the BEMIO ``bemio.m`` script are then used to generate +the ``oswec.h5`` file. + +This is done by navigating to the ``$WECSIM/tutorials/oswec/hydroData/`` +directory, and typing``bemio`` in the MATLAB Command Window:: + + >> bemio + +.. _user-tutorials-oswec-step-two: + +Step 2: Build Simulink Model +"""""""""""""""""""""""""""" + +The WEC-Sim Simulink model is created by dragging and dropping blocks from the +*WEC-Sim Library* into the ``oswec.slx`` file. + + +* Place two **Rigid Body** blocks from the *WEC-Sim Library* in the Simulink + model file, one for each OSWEC rigid body. + +* Double click on the **Rigid Body** block, and rename each instance of the + body. The first body must be called ``body(1)``, and the second body should be + called ``body(2)``. + +.. figure:: /_static/images/OSWEC_WECSim_Body.jpg + :width: 400pt + :align: center + +* Place the **Global Reference Frame** from *Frames* in the *WEC-Sim Library* + in the Simulink model file. The global reference frame acts as the seabed. + +.. figure:: /_static/images/OSWEC_WECSim_GlobalRef.jpg + :width: 400pt + :align: center + +* Place the **Fixed** block from *Constraints* to connect the base to the + seabed. This constrains the base to be fixed relative to the **Global Reference + Frame**. + +* Place a **Rotational PTO** block to connect the base to the flap. This + constrains the flap to move in pitch relative to the base, and allows for the + definition of PTO damping. + +.. figure:: /_static/images/OSWEC_WECSim.JPG + :width: 400pt + :align: center + +.. Note:: + + When setting up a WEC-Sim model, it is very important to note the base and + follower frames. + +.. _user-tutorials-oswec-step-three: + +Step 3: Write wecSimInputFile.m +""""""""""""""""""""""""""""""" + +The WEC-Sim input file defines simulation parameters, body properties, and +joints for the OSWEC model. Writing the OSWEC input file is similar to writing +the RM3 input. Try writing it on your own. Define the simulation class, wave +class, bodies, constraints and PTOs. The ``wecSimInputFile.m`` for the OSWEC is +provided in the OSWEC case directory, and shown below. + +.. literalinclude:: ../../tutorials/OSWEC/OSWEC_wecSimInputFile.m + :language: matlab + +.. _user-tutorials-oswec-step-four: + +Step 4: Run WEC-Sim +""""""""""""""""""" + +To execute the WEC-Sim code for the OSWEC tutorial, type ``wecSim`` into the +MATLAB Command Window. Below is a figure showing the final OSWEC Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the OSWEC device, refer to :cite:`y._yu_development_2014,y._yu_design_2014`. + +.. figure:: /_static/images/OSWEC_WECSim_GUI.jpg + :width: 400pt + :align: center + +.. _user-tutorials-oswec-step-five: + +Step 5: Post-processing +""""""""""""""""""""""" + +The OSWEC tutorial includes a ``userDefinedFunctions.m`` which plots OSWEC +forces and responses. This file can be modified by users for post-processing. +Additionally, once the WEC-Sim run is complete, the WEC-Sim results are saved +to the **output** variable in the MATLAB workspace. + + +.. _user-tutorials-examples: + +WEC-Sim Examples +---------------- + +Working examples of using WEC-Sim to model the RM3, OSWEC, and RM3FromSimulink are provided in +the ``$WECSIM/examples/`` directory. For each example the ``wecSimInputFile.m`` +provided includes examples of how to run different wave cases: + +* ``noWaveCIC`` - no wave with convolution integral calculation +* ``regularCIC`` - regular waves with convolution integral calculation +* ``irregular`` - irregular waves using a Pierson-Moskowitz spectrum with convolution integral calculation +* ``irregular`` - irregular waves using a Bretschneider Spectrum with state space calculation +* ``spectrumImport`` - irregular waves using a user-defined spectrum +* ``elevationImport`` - user-defined time-series + + +* Run from MATLAB Command Window (for RM3 and OSWEC examples) + * Type ``wecSim`` in the Command Window +* Run from Simulink (for RM3FromSimulink example) + * Open the relevant WEC-Sim Simulink file + * Type ``initializeWecSim`` in the Command Window + * Hit Play in Simulink model to run + +To customize or develop a new WEC-Sim model that runs from Simulink (e.g. for Hardware-in-the-Loop, HIL, applications) refer to :ref:`user-advanced-features-simulink` for more information. +Users may also use ``wecSimMCR``, ``wecSimPCT``, ``wecSimFcn`` and as described in the advanced features +sections :ref:`user-advanced-features-mcr` and :ref:`user-advanced-features-pct`. +These options are only available through the MATLAB Command Window. + +References +------------------------ +.. bibliography:: ../refs/WEC-Sim_Tutorials.bib + :style: unsrt + :labelprefix: A diff --git a/main/_sources/user/webinars.rst.txt b/main/_sources/user/webinars.rst.txt new file mode 100644 index 000000000..81d6f062b --- /dev/null +++ b/main/_sources/user/webinars.rst.txt @@ -0,0 +1,327 @@ +.. _intro-webinars: + +Training Materials +================== + +The WEC-Sim team developed an online training course, and hosted advanced features webinars. +Recordings of each course are available below, along with the presentations. + + +Online Training Course +---------------------- +The WEC-Sim team developed an online training course. +This course provides an overview of what that WEC-Sim software does, and how to use it. +Recordings of each course are available below, along with the presentations. + +Overview +^^^^^^^^ +The section provides a big-picture overview of the WEC-Sim software. +The WEC-Sim Overview presentation is available for download here (`WEC-Sim +Overview Slides <../_static/downloads/1_WEC-Sim_Overview.pdf>`__), and the +recording is available below. + + .. raw:: html + + + + +Theory & Workflow +^^^^^^^^^^^^^^^^^ +This section discusses the WEC-Sim theory and workflow. +The WEC-Sim Theory & Workflow presentation is available +for download here (`Theory & Workflow Slides <../_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf>`__), and the recording is available below. + + .. raw:: html + + + + +Installation +^^^^^^^^^^^^ +This section described how to install WEC-Sim. +The WEC-Sim Installation presentation is available to download here (`Theory & Workflow Slides <../_static/downloads/3_WEC-Sim_Installation.pdf>`__), and the recording is available below. + + .. raw:: html + + + + +.. _user-webinars-code-structure: + +Code Structure +^^^^^^^^^^^^^^ +This section provides an overview of how the WEC-Sim code is +structured by describing the :ref:`user-code-structure-src` (e.g. +:ref:`user-code-structure-classes` and :ref:`user-code-structure-library`, and +how they are defined in the :ref:`user-workflow-input-files` (i.e. +``wecSimInputFile.m`` and ``.slx``). +The Code Structure Overview presentation is available to download here (`WEC-Sim Code +Structure Slides <../_static/downloads/4_WEC-Sim_CodeStructure.pdf>`__), and the +recording is available below. + + .. raw:: html + + + + +BEMIO +^^^^^ +This section of the course discusses how BEMIO is used to extract the hydrodynamic coefficients generated by a BEM software, +and post-process themfor use by WEC-Sim. +The BEMIO routines also help calculate impulse response functions, and plot data. +The BEMIO presentation can be donloaded here (`BEMIO Slides +<../_static/downloads/5_WEC-Sim_BEMIO.pdf>`__), and the +recording is available below. + + .. raw:: html + + + +Wave Class +^^^^^^^^^^ +This section of the course provides an overview of how waves are implemented in +the WEC-Sim code, both in the :ref:`user-code-structure-wave-class`, and in the +:ref:`user-code-structure-library`. +The Wave Class presentation is +available for download here (`Wave Implementation Slides +<../_static/downloads/6_WEC-Sim_WaveClass.pdf>`__), and the recording +is available below. + + .. raw:: html + + + +Body Class +^^^^^^^^^^ +This section of the course provides an overview of how bodies are implemented +in the WEC-Sim code, both in the :ref:`user-code-structure-body-class`, and in +the :ref:`user-code-structure-library`. The Body Class presentation is +available for download here (`Body Implementation Slides +<../_static/downloads/7_WEC-Sim_BodyClass.pdf>`__), and the recording +is available below. + + .. raw:: html + + + +Tutorial +^^^^^^^^ +This section shows users how to set up an run a the WEC-Sim tutorial. +The Tutorial presentation is available to download here (`WEC-Sim Tutorial +<../_static/downloads/8_WEC-Sim_Tutorial.pdf>`__), and the recording +is available below. + + .. raw:: html + + + + + +Advanced Features Series +-------------------------- + +The WEC-Sim team hosted a series of Advanced Features Series. The +topics are listed below. Recordings of each are available below, along with the +presentations. + + =========== ==================================== + **Series** **Topic** + 1 Multiple Condition Runs (MCR) + 2 Nonlinear Hydrodynamics + 3 Non-hydrodynamic Bodies + 4 Body-to-Body Interactions + 5 PTO-Sim + 6 WEC-Sim Controls + 7 Modeling Cables + 8 Using Moordyn with WEC-Sim + 9 Modeling OWC Devices + 10 Desalination + 11 WEC-Sim Visualization + =========== ==================================== + +.. _webinar1: + +Series 1 - Multiple Condition Runs (MCR) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The series presents an overview of how to run multiple cases in WEC-Sim. The +presentation is available for download here ( `Series 1 Slides +<../_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf>`__ ), and the recording is +available below. + +**Series 1 - Multiple Condition Runs (MCR)** + + .. raw:: html + + + +.. _webinar2: + + +Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section is focused on how to implement Nonlinear Buoyancy and Froude-Krylov Wave Excitation forces in WEC-Sim. +The presentation is available +for download here ( `Series 2 Slides <../_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf>`__ ), +and the recordings are available below. + +**Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation** + + .. raw:: html + + + + +.. _webinar3: + +Series 3 - Non-hydrodynamic Bodies +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This webinar presents an overview of the non-hydrodynamic body implementation in WEC-Sim. The +presentation is available for download here ( `Series 3 Slides +<../_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf>`__ ), and the recordings are +available below. + +**Series 3 - Non-hydrodynamic Bodies** + + .. raw:: html + + + +.. _webinar4: + +Series 4 - Body-to-Body Interactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This is section of the Advanced Features Series presents some examples of how body-to-body interactions are modeled in WEC-Sim. +The presentation is available for download here ( `Series 4 Slides +<../_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf>`__ ), and the recordings are +available below. + +**Series 4 - Body-to-Body Interactions** + + .. raw:: html + + + +.. _webinar5: + +Series 5 - PTO-Sim +^^^^^^^^^^^^^^^^^^^ + +This section is focused on PTO-Sim. +The presentation is available for download here ( `Series 5 Slides +<../_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf>`__ ), and the recordings are +available below. + +**Series 5 - PTO-Sim** + + .. raw:: html + + + +.. _webinar6: + +Series 6 - WEC-Sim Controls +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents some examples of how to implement control algorithms for WECs using WEC-Sim. +The presentation is available for download here ( `Series 6 Slides +<../_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf>`__ ), and the recordings are +available below. + +**Series 6 - WEC-Sim Controls** + + .. raw:: html + + + +.. _webinar7: + +Series 7 - Modeling Cables +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section is focused on the Cable Block from WEC-Sim. +The presentation is available for download here ( `Series 7 Slides +<../_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf>`__ ), and the recordings are +available below. + +**Series 7 - Modeling Cables** + + .. raw:: html + + + + +.. _webinar8: + +Series 8 - Using MoorDyn with WEC-Sim +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use MoorDyn with WEC-Sim. +The presentation is available for download here ( `Series 8 Slides +<../_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf>`__ ), and the recordings are +available below. + +**Series 8 - Using MoorDyn with WEC-Sim** + + .. raw:: html + + + +.. Note:: + The above MoorDyn webinar is based on MoorDyn v1 and is in the process of being updated + for MoorDyn v2. Please refer to :ref:`user-advanced-features-mooring` for instruction on + using WEC-Sim with MoorDyn v2. + + +.. _webinar9: + +Series 9 - Modeling OWC Devices +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use model OWC devices using WEC-Sim. +The presentation is available for download here ( `Series 9 Slides +<../_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf>`__ ), and the recordings are +available below. + +**Series 9 - Modeling OWC Devices** + + .. raw:: html + + + + +.. _webinar10: + +Series 10 - Desalination +^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to use WEC-Sim to model a desalination application. +The presentation is available for download here ( `Series 10 Slides +<../_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf>`__ ), and the recordings are +available below. + +**Series 10 - Desalination** + + .. raw:: html + + + + +.. _webinar11: + +Series 11 - WEC-Sim Visualization +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This section presents an overview of how to post-process results in WEC-Sim. +The presentation is available for download here ( `Series 11 Slides +<../_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf>`__ ), and the recordings are +available below. + +**Series 11 - WEC-Sim Visualization** + + .. raw:: html + + \ No newline at end of file diff --git a/main/_sources/user/workflow.rst.txt b/main/_sources/user/workflow.rst.txt new file mode 100644 index 000000000..7dc248f1a --- /dev/null +++ b/main/_sources/user/workflow.rst.txt @@ -0,0 +1,248 @@ +.. _user-workflow: + +Workflow +======== + +The WEC-Sim workflow diagram below shows a high level view of WEC-Sim's functionality. +As a precursor, a WEC design must be defined in an input file and the Simulink model file. +This input file is read by WEC-Sim which instantiates objects based on parameters defined in the input file. +The objects are used in conjunction with WEC-Sim's Simulink library during the time-domain simulation. +User defined functions serve for easy post-processing and visualization of WEC-Sim's output. +A detailed description of this workflow is provided in the following sections. +For information about the implementation and structure of the WEC-Sim source code, refer to the :ref:`user-code-structure` section. + +.. _user-workflow-chart: + +.. figure:: /_static/images/WEC-Sim_flowChart.png + :width: 500pt + :align: center + + .. + + *WEC-Sim Workflow Diagram* + +.. _user-workflow-input-files: + +WEC-Sim Case Files +------------------- + +All files required for a WEC-Sim simulation must be contained within a case directory referred to as ``$CASE``. +The case directory can be located anywhere on your computer. +It must include: geometry file(s), hydrodynamic data saved to a ``*.h5`` data structure, a WEC-Sim input file, and a Simulink model of the device. +The table below lists the WEC-Sim case directory structure and required files. + +==================== ====================== ==================== +**File Type** **File Name** **Directory** +Geometry File(s) ``*.stl`` ``$CASE/geometry`` +Hydrodynamic Data ``*.h5`` ``$CASE/hydroData`` +Input File ``wecSimInputFile.m`` ``$CASE`` +Simulink Model ``*.slx`` ``$CASE`` +==================== ====================== ==================== + +.. Note:: + Where ``*`` denotes a user-specified file name. + +Geometry File +^^^^^^^^^^^^^ + +WEC-Sim requires geometry file(s) (``*.stl``) that define each body. +The origin of the geometry file(s) must be at the body's center of gravity. +When running WEC-Sim with linear hydrodynamics, the ``*.stl`` is only used for the Simscape Mechanics Explorer visualization. +However, when running WEC-Sim with nonlinear buoyancy and Froude-Krylov forces the STL mesh determines the instantaneous wetted surface at each time step. +In this nonlinear case, the quality of the STL mesh is critical, refer to the :ref:`user-advanced-features-nonlinear` section for more information. + +Hydrodynamic Data +^^^^^^^^^^^^^^^^^ + +Hydrodynamic data for each body may be generated using a boundary element method (BEM) software. +WEC-Sim requires hydrodynamic data from a BEM solution in the form of a HDF5 file (``*.h5``). +This ``*.h5`` hydrodynamic data file can be generated using the BEMIO pre-processor. +BEMIO (Boundary Element Method Input/Output) is a pre-processing software developed by the WEC-Sim team to parse BEM output files from WAMIT, NEMOH, Aqwa, and Capytaine into a data structure, saved as a ``*.h5`` file, that can be read by WEC-Sim. +For more information about the BEMIO pre-processor, refer to the :ref:`user-advanced-features-bemio` section. + +Input File +^^^^^^^^^^ + +A WEC-Sim input file (``wecSimInputFile.m``) is required. +The input file **MUST** be named ``wecSimInputFile.m`` and placed within the case directory. +WEC-Sim uses `object orientated programming `__ to describe components of the WEC model; +the main structure of the input file consists of initializing the WEC-Sim objects and defining properties for each object. +The input file requires initialization and definition of the simulation and wave classes, at least one instance of the body class, and at least one instance of the constraint or PTO classes. +For details about WEC-Sim's classes and available properties for each, refer to the :ref:`user-code-structure-classes` section. + +The WEC-Sim input file (``wecSimInputFile.m``) for the OSWEC example (``WEC-Sim/examples/OSWEC/``) is shown below. +WEC-Sim is an object oriented code and the input file reflects this by instantiating the WEC-Sim classes to create objects that are tied to the Simulink library. +The OSWEC input file initializes and defines properties for the simulation, body, constraint and pto classes. + + +.. literalinclude:: ../../tutorials/OSWEC/OSWEC_wecSimInputFile.m + :language: matlab + +Additional examples are provided in the :ref:`user-tutorials` section. + +Simulink Model +^^^^^^^^^^^^^^ + +In addition to an input file, WEC-Sim requires a Simulink model file (``*.slx``). +This Simulink model is defined using the WEC-Sim library blocks. +WEC-Sim's library blocks are based on Simscape Multibody, refer to `Simscape Multibody documentation `_ for more information. + +WEC-Sim library blocks contain masks that activate relevant parameters, based on the conditions specified in the ``wecSimInputFile.m``. +The top level of the Simulink model contains Simscape physical signals that pass information between blocks in order to solve the relevant equations of motion. + +An example Simulink model file for the OSWEC is shown below. +For more information about the OSWEC, and how to build WEC-Sim Simulink models, refer to the :ref:`user-tutorials` section. + +.. figure:: /_static/images/OSWEC_Model.png + :width: 200pt + :align: center + +.. _user-workflow-running-wec-sim: + +Running WEC-Sim +--------------- + +This section provides a description of the steps to run the WEC-Sim code. Refer +to the :ref:`WEC-Sim Workflow Diagram ` while following +the steps to run WEC-Sim. + +Step 1: Pre-Processing +^^^^^^^^^^^^^^^^^^^^^^ + +In the pre-processing step, users need to create the WEC geometry, and run a +BEM code to calculate the hydrodynamic coefficients. + +* **Create WEC Geometry**: + + * Create CAD models of the WEC geometry and export it to a ``*.stl`` format. + * The ``*.stl`` files are used to visualize the WEC response in Simscape + Explorer + * They are also used for :ref:`user-advanced-features-nonlinear` forces if + the option is enabled. + +* **Compute Hydrodynamic Coefficients**: WEC-Sim requires frequency-domain + hydrodynamic coefficients (e.g. added mass, radiation damping, and wave + excitation). + + * The coefficients for each body may be generated using a boundary element + method (BEM) code (e.g., **WAMIT**, **NEMOH**, **Aqwa**, or **Capytaine**). + * WEC-Sim requires that all hydrodynamic coefficients must be specified at + **the center of gravity** for each body. + +Step 2: Generate Hydrodata File +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this step, users run :ref:`BEMIO` to convert +the hydrodynamic coefficients from their BEM solution into the ``*.h5`` format +for WEC-Sim to read: + +* **Run BEMIO**: to generate ``*.h5`` Hydrodynamic Coefficients for WEC-Sim + + * The hydrodynamic coefficients for each body generated from the BEM code + can be parsed into a ``*.h5`` data structure using + :ref:`BEMIO`, which was developed by the + WEC-Sim team. + * BEMIO currently supports WAMIT, NEMOH, Aqwa, and Capytaine. + +.. Note:: + * **If WAMIT is used:** + + * The origin of the body coordinate system (XBODY, defined in ``*.pot``) + as well as the mesh for each body must be at the center of gravity. + * The WAMIT mesh (``*.gdf``) can be generated using + `Rhino `_ or + `MultiSurf `_. + * More details on WAMIT setup are given in the + `WAMIT User Manual `_. + + * **If NEMOH is used:** + + * The origin of the mesh for each body (``*.dat``) is located at the mean + water surface. + * The location to output the hydrodynamic coefficients for each degree of + freedom is defined in the ``Nemoh.cal`` file. + * Please refer to `NEMOH-Mesh `_ + webpage for more mesh generation details. + * The NEMOH Mesh.exe code creates the ``Hydrostatics.dat`` and ``KH.dat`` + files (among other files) for one input body at a time. For the + readNEMOH function to work correctly in the case of a multiple body + system, the user must manually rename ``Hydrostatics.dat`` and + ``KH.dat`` files to ``Hydrostatics_0.dat``, ``Hydrostatics_1.dat``, …, + and ``KH_0.dat``, ``KH_1.dat``,…, corresponding to the body order + specified in the ``Nemoh.cal`` file. + * More details on NEMOH setup are given in the + `Nemoh Homepage `_. + + * **If Aqwa is used:** + + * The origin of the global coordinate system is at the mean water + surface, and the origin of the body coordinate system for each body + must be at the center of gravity (defined using the Aqwa GUI or in + the ``*.dat`` input file). + * In order to run BEMIO, Aqwa users must output both the default + ``*.LIS`` file and output the ``*.AH1`` hydrodynamic database file. + Both of these files are reacquired to run BEMIO. + * More details on Aqwa setup are given in the Aqwa Reference Manual. + + * **If Capytaine is used:** + + * The origin of the mesh for each body (``*.dat``) is located at the mean + water surface. + * More details on Capytaine setup are given in the `Capytaine webpage `_. + +.. Note:: + + Users are also able to specify their own hydrodynamic coefficients by + creating their own ``*.h5`` file with customized hydrodynamic coefficients + following the ``*.h5`` format created by BEMIO. + +.. Note:: + + We recommend installing HDFview https://www.hdfgroup.org/downloads/hdfview/ + to view the ``*.h5`` files generated by BEMIO. + +Step 3: Build Simulink Model +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this step, users build their WEC-Sim Simulink model (``*.slx``) using the +:ref:`user-code-structure-library` developed in Simulink/Simscape. The +``*.slx`` Simulink model file must be located in the ``$CASE`` directory. The +figure below shows an example WEC-Sim Simulink model for the OSWEC tutorial. + +.. figure:: /_static/images/OSWEC_Model.png + :width: 200pt + :align: center + +Step 4: Write wecSimInputFile.m +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The WEC-Sim input file must be located in the ``$CASE`` directory, and named +``wecSimInputFile.m``. The figure below shows an example of a WEC-Sim input +file. The input file specifies the simulation settings, body mass properties, +wave conditions, joints, and mooring. Additionally, the WEC-Sim input file must +specify the location of the WEC-Sim Simulink model (``*.slx``) file, the +geometry file(s) ``*.stl``, and the hydrodynamic data file (``*.h5``) . + + +Step 5: Run WEC-Sim +^^^^^^^^^^^^^^^^^^^ + +Lastly, WEC-Sim can be executed from the ``$CASE`` directory by typing ``wecSim`` from the Command Window: + +.. code-block:: matlabsession + + >> wecSim + +Refer to :ref:`user-tutorials-examples` for more details on how to run the examples. +Users may also run WEC-Sim from Simulink, or use the commands ``wecSimMCR``, +``wecSimPCT``, and ``wecSimFcn`` as described in the advanced features +sections :ref:`user-advanced-features-simulink`, +:ref:`user-advanced-features-mcr`, :ref:`user-advanced-features-pct`, +and :ref:`user-advanced-features-fcn`. + +.. Note:: The WEC-Sim source code is located in the ``$WECSIM`` directory, but + WEC-Sim must be executed from the ``$CASE`` directory. + The MATLAB path must include the WEC-Sim source directory. + + + diff --git a/main/_static/_sphinx_javascript_frameworks_compat.js b/main/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 000000000..81415803e --- /dev/null +++ b/main/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/main/_static/basic.css b/main/_static/basic.css new file mode 100644 index 000000000..f316efcb4 --- /dev/null +++ b/main/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/main/_static/css/badge_only.css b/main/_static/css/badge_only.css new file mode 100644 index 000000000..88ba55b96 --- /dev/null +++ b/main/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/main/_static/css/custom.css b/main/_static/css/custom.css new file mode 100644 index 000000000..c981e54cd --- /dev/null +++ b/main/_static/css/custom.css @@ -0,0 +1,17 @@ + +.math { + text-align: center; +} +.eqno { + float: right; +} + +.wy-table-responsive table td, .wy-table-responsive table th { + white-space: normal; +} + +.wy-table-responsive { + margin-bottom: 24px; + max-width: 100%; + overflow: visible; +} diff --git a/main/_static/css/fonts/Roboto-Slab-Bold.woff b/main/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/main/_static/css/fonts/Roboto-Slab-Bold.woff2 b/main/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/main/_static/css/fonts/Roboto-Slab-Regular.woff b/main/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/main/_static/css/fonts/Roboto-Slab-Regular.woff2 b/main/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/main/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/main/_static/css/fonts/fontawesome-webfont.eot b/main/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 000000000..e9f60ca95 Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/main/_static/css/fonts/fontawesome-webfont.svg b/main/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..855c845e5 --- /dev/null +++ b/main/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/_static/css/fonts/fontawesome-webfont.ttf b/main/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 000000000..35acda2fa Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/main/_static/css/fonts/fontawesome-webfont.woff b/main/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 000000000..400014a4b Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/main/_static/css/fonts/fontawesome-webfont.woff2 b/main/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 000000000..4d13fc604 Binary files /dev/null and b/main/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/main/_static/css/fonts/lato-bold-italic.woff b/main/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/main/_static/css/fonts/lato-bold-italic.woff differ diff --git a/main/_static/css/fonts/lato-bold-italic.woff2 b/main/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/main/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/main/_static/css/fonts/lato-bold.woff b/main/_static/css/fonts/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/main/_static/css/fonts/lato-bold.woff differ diff --git a/main/_static/css/fonts/lato-bold.woff2 b/main/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/main/_static/css/fonts/lato-bold.woff2 differ diff --git a/main/_static/css/fonts/lato-normal-italic.woff b/main/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/main/_static/css/fonts/lato-normal-italic.woff differ diff --git a/main/_static/css/fonts/lato-normal-italic.woff2 b/main/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/main/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/main/_static/css/fonts/lato-normal.woff b/main/_static/css/fonts/lato-normal.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/main/_static/css/fonts/lato-normal.woff differ diff --git a/main/_static/css/fonts/lato-normal.woff2 b/main/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/main/_static/css/fonts/lato-normal.woff2 differ diff --git a/main/_static/css/theme.css b/main/_static/css/theme.css new file mode 100644 index 000000000..6843d97b7 --- /dev/null +++ b/main/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/main/_static/doctools.js b/main/_static/doctools.js new file mode 100644 index 000000000..4d67807d1 --- /dev/null +++ b/main/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/main/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/main/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf b/main/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf new file mode 100644 index 000000000..8f361c776 Binary files /dev/null and b/main/_static/downloads/0_WEC-Sim_Online_Training_Materials.pdf differ diff --git a/main/_static/downloads/1_WEC-Sim_Overview.pdf b/main/_static/downloads/1_WEC-Sim_Overview.pdf new file mode 100644 index 000000000..b38869564 Binary files /dev/null and b/main/_static/downloads/1_WEC-Sim_Overview.pdf differ diff --git a/main/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf b/main/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf new file mode 100644 index 000000000..d73ec4b70 Binary files /dev/null and b/main/_static/downloads/2_WEC-Sim_TheoryWorkFlow.pdf differ diff --git a/main/_static/downloads/3_WEC-Sim_Installation.pdf b/main/_static/downloads/3_WEC-Sim_Installation.pdf new file mode 100644 index 000000000..e27d7c7c2 Binary files /dev/null and b/main/_static/downloads/3_WEC-Sim_Installation.pdf differ diff --git a/main/_static/downloads/4_WEC-Sim_CodeStructure.pdf b/main/_static/downloads/4_WEC-Sim_CodeStructure.pdf new file mode 100644 index 000000000..fa8abcf20 Binary files /dev/null and b/main/_static/downloads/4_WEC-Sim_CodeStructure.pdf differ diff --git a/main/_static/downloads/5_WEC-Sim_BEMIO.pdf b/main/_static/downloads/5_WEC-Sim_BEMIO.pdf new file mode 100644 index 000000000..9f40bfe62 Binary files /dev/null and b/main/_static/downloads/5_WEC-Sim_BEMIO.pdf differ diff --git a/main/_static/downloads/6_WEC-Sim_WaveClass.pdf b/main/_static/downloads/6_WEC-Sim_WaveClass.pdf new file mode 100644 index 000000000..fff55d9e0 Binary files /dev/null and b/main/_static/downloads/6_WEC-Sim_WaveClass.pdf differ diff --git a/main/_static/downloads/7 WEC-Sim_BodyClass.pdf b/main/_static/downloads/7 WEC-Sim_BodyClass.pdf new file mode 100644 index 000000000..506a55fc7 Binary files /dev/null and b/main/_static/downloads/7 WEC-Sim_BodyClass.pdf differ diff --git a/main/_static/downloads/8_WEC-Sim_Tutorial.pdf b/main/_static/downloads/8_WEC-Sim_Tutorial.pdf new file mode 100644 index 000000000..25a33e14e Binary files /dev/null and b/main/_static/downloads/8_WEC-Sim_Tutorial.pdf differ diff --git a/main/_static/downloads/WEC-Sim_BodyImplementation.pdf b/main/_static/downloads/WEC-Sim_BodyImplementation.pdf new file mode 100644 index 000000000..8eb08a4e5 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_BodyImplementation.pdf differ diff --git a/main/_static/downloads/WEC-Sim_CodeStructure.pdf b/main/_static/downloads/WEC-Sim_CodeStructure.pdf new file mode 100644 index 000000000..f329301a8 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_CodeStructure.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Overview.pdf b/main/_static/downloads/WEC-Sim_Overview.pdf new file mode 100644 index 000000000..e35fac69d Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Overview.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Theory&Workflow.pdf b/main/_static/downloads/WEC-Sim_Theory&Workflow.pdf new file mode 100644 index 000000000..1c3bb1982 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Theory&Workflow.pdf differ diff --git a/main/_static/downloads/WEC-Sim_WaveImplementation.pdf b/main/_static/downloads/WEC-Sim_WaveImplementation.pdf new file mode 100644 index 000000000..a92fc1eba Binary files /dev/null and b/main/_static/downloads/WEC-Sim_WaveImplementation.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Webinar1.pdf b/main/_static/downloads/WEC-Sim_Webinar1.pdf new file mode 100644 index 000000000..ca3679010 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Webinar1.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Webinar2.pdf b/main/_static/downloads/WEC-Sim_Webinar2.pdf new file mode 100644 index 000000000..9989bc58f Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Webinar2.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Webinar3.pdf b/main/_static/downloads/WEC-Sim_Webinar3.pdf new file mode 100644 index 000000000..a9d325db0 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Webinar3.pdf differ diff --git a/main/_static/downloads/WEC-Sim_Webinar4.pdf b/main/_static/downloads/WEC-Sim_Webinar4.pdf new file mode 100644 index 000000000..ff69c70a7 Binary files /dev/null and b/main/_static/downloads/WEC-Sim_Webinar4.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf b/main/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf new file mode 100644 index 000000000..51d541891 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/10_WEC-Sim_AdvFeatures_Desal.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf b/main/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf new file mode 100644 index 000000000..e626fd079 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/11_WEC-Sim_AdvFeatures_Visualization.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf b/main/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf new file mode 100644 index 000000000..aedd873f6 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/1_WEC-Sim_AdvFeatures_MCR_Batch_Runs.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf b/main/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf new file mode 100644 index 000000000..ac700af9e Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/2_WEC-Sim_AdvFeatures_Nonlinear_hydro.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf b/main/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf new file mode 100644 index 000000000..257050de6 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/3_WEC-Sim_AdvFeatures_Non_hydro.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf b/main/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf new file mode 100644 index 000000000..777401ac7 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/4_WEC-Sim_AdvFeatures_B2B.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf b/main/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf new file mode 100644 index 000000000..d4f516fcd Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/5_WEC-Sim_AdvFeatures_PTOSim.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf b/main/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf new file mode 100644 index 000000000..810892e31 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/6_WEC-Sim_AdvFeatures_Controls.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf b/main/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf new file mode 100644 index 000000000..6a7bb4579 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/7_WEC-Sim_AdvFeatures_Cable.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf b/main/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf new file mode 100644 index 000000000..b9acfded3 Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/8_WEC-Sim_AdvFeatures_MoorDyn.pdf differ diff --git a/main/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf b/main/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf new file mode 100644 index 000000000..fde22c86b Binary files /dev/null and b/main/_static/downloads/advancedFeaturesWebinars/9_WEC-Sim_AdvFeatures_OWC_Modeling.pdf differ diff --git a/main/_static/file.png b/main/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/main/_static/file.png differ diff --git a/main/_static/fonts/Lato/lato-bold.eot b/main/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 000000000..3361183a4 Binary files /dev/null and b/main/_static/fonts/Lato/lato-bold.eot differ diff --git a/main/_static/fonts/Lato/lato-bold.ttf b/main/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 000000000..29f691d5e Binary files /dev/null and b/main/_static/fonts/Lato/lato-bold.ttf differ diff --git a/main/_static/fonts/Lato/lato-bold.woff b/main/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 000000000..c6dff51f0 Binary files /dev/null and b/main/_static/fonts/Lato/lato-bold.woff differ diff --git a/main/_static/fonts/Lato/lato-bold.woff2 b/main/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 000000000..bb195043c Binary files /dev/null and b/main/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/main/_static/fonts/Lato/lato-bolditalic.eot b/main/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 000000000..3d4154936 Binary files /dev/null and b/main/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/main/_static/fonts/Lato/lato-bolditalic.ttf b/main/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 000000000..f402040b3 Binary files /dev/null and b/main/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/main/_static/fonts/Lato/lato-bolditalic.woff b/main/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 000000000..88ad05b9f Binary files /dev/null and b/main/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/main/_static/fonts/Lato/lato-bolditalic.woff2 b/main/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 000000000..c4e3d804b Binary files /dev/null and b/main/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/main/_static/fonts/Lato/lato-italic.eot b/main/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 000000000..3f826421a Binary files /dev/null and b/main/_static/fonts/Lato/lato-italic.eot differ diff --git a/main/_static/fonts/Lato/lato-italic.ttf b/main/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 000000000..b4bfc9b24 Binary files /dev/null and b/main/_static/fonts/Lato/lato-italic.ttf differ diff --git a/main/_static/fonts/Lato/lato-italic.woff b/main/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 000000000..76114bc03 Binary files /dev/null and b/main/_static/fonts/Lato/lato-italic.woff differ diff --git a/main/_static/fonts/Lato/lato-italic.woff2 b/main/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 000000000..3404f37e2 Binary files /dev/null and b/main/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/main/_static/fonts/Lato/lato-regular.eot b/main/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 000000000..11e3f2a5f Binary files /dev/null and b/main/_static/fonts/Lato/lato-regular.eot differ diff --git a/main/_static/fonts/Lato/lato-regular.ttf b/main/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 000000000..74decd9eb Binary files /dev/null and b/main/_static/fonts/Lato/lato-regular.ttf differ diff --git a/main/_static/fonts/Lato/lato-regular.woff b/main/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 000000000..ae1307ff5 Binary files /dev/null and b/main/_static/fonts/Lato/lato-regular.woff differ diff --git a/main/_static/fonts/Lato/lato-regular.woff2 b/main/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 000000000..3bf984332 Binary files /dev/null and b/main/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 000000000..79dc8efed Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 000000000..df5d1df27 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 000000000..6cb600001 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 000000000..7059e2314 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 000000000..2f7ca78a1 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 000000000..eb52a7907 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 000000000..f815f63f9 Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 000000000..f2c76e5bd Binary files /dev/null and b/main/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/main/_static/images/AdjustableRodHPTO.png b/main/_static/images/AdjustableRodHPTO.png new file mode 100644 index 000000000..0eb091104 Binary files /dev/null and b/main/_static/images/AdjustableRodHPTO.png differ diff --git a/main/_static/images/DirectDrivePorts.png b/main/_static/images/DirectDrivePorts.png new file mode 100644 index 000000000..6f71673be Binary files /dev/null and b/main/_static/images/DirectDrivePorts.png differ diff --git a/main/_static/images/GeneratorSpeedControl.png b/main/_static/images/GeneratorSpeedControl.png new file mode 100644 index 000000000..82047be13 Binary files /dev/null and b/main/_static/images/GeneratorSpeedControl.png differ diff --git a/main/_static/images/HYDPHYMODEL.PNG b/main/_static/images/HYDPHYMODEL.PNG new file mode 100644 index 000000000..4517f4bea Binary files /dev/null and b/main/_static/images/HYDPHYMODEL.PNG differ diff --git a/main/_static/images/HorizontalVerticalOrbitalVelocity.jpg b/main/_static/images/HorizontalVerticalOrbitalVelocity.jpg new file mode 100644 index 000000000..a2ffc5652 Binary files /dev/null and b/main/_static/images/HorizontalVerticalOrbitalVelocity.jpg differ diff --git a/main/_static/images/MECHANICALPTO.PNG b/main/_static/images/MECHANICALPTO.PNG new file mode 100644 index 000000000..7a14f728f Binary files /dev/null and b/main/_static/images/MECHANICALPTO.PNG differ diff --git a/main/_static/images/MagAngleOrbitalVelocity.jpg b/main/_static/images/MagAngleOrbitalVelocity.jpg new file mode 100644 index 000000000..8e7814ef1 Binary files /dev/null and b/main/_static/images/MagAngleOrbitalVelocity.jpg differ diff --git a/main/_static/images/MoorDyn_Graphic.png b/main/_static/images/MoorDyn_Graphic.png new file mode 100644 index 000000000..7db247629 Binary files /dev/null and b/main/_static/images/MoorDyn_Graphic.png differ diff --git a/main/_static/images/MotionConversionLib.png b/main/_static/images/MotionConversionLib.png new file mode 100644 index 000000000..75ca70259 Binary files /dev/null and b/main/_static/images/MotionConversionLib.png differ diff --git a/main/_static/images/Nwave.png b/main/_static/images/Nwave.png new file mode 100644 index 000000000..52ef4f2b4 Binary files /dev/null and b/main/_static/images/Nwave.png differ diff --git a/main/_static/images/OSWECPHYMODEL.PNG b/main/_static/images/OSWECPHYMODEL.PNG new file mode 100644 index 000000000..101bff6bf Binary files /dev/null and b/main/_static/images/OSWECPHYMODEL.PNG differ diff --git a/main/_static/images/OSWECPTOSimExample.png b/main/_static/images/OSWECPTOSimExample.png new file mode 100644 index 000000000..300361cf0 Binary files /dev/null and b/main/_static/images/OSWECPTOSimExample.png differ diff --git a/main/_static/images/OSWEC_Geom.png b/main/_static/images/OSWEC_Geom.png new file mode 100644 index 000000000..15a94455e Binary files /dev/null and b/main/_static/images/OSWEC_Geom.png differ diff --git a/main/_static/images/OSWEC_Model.png b/main/_static/images/OSWEC_Model.png new file mode 100644 index 000000000..ed4b95a85 Binary files /dev/null and b/main/_static/images/OSWEC_Model.png differ diff --git a/main/_static/images/OSWEC_WECSim.JPG b/main/_static/images/OSWEC_WECSim.JPG new file mode 100644 index 000000000..2a8ba5797 Binary files /dev/null and b/main/_static/images/OSWEC_WECSim.JPG differ diff --git a/main/_static/images/OSWEC_WECSim_Body.jpg b/main/_static/images/OSWEC_WECSim_Body.jpg new file mode 100644 index 000000000..97165ee5e Binary files /dev/null and b/main/_static/images/OSWEC_WECSim_Body.jpg differ diff --git a/main/_static/images/OSWEC_WECSim_GUI.jpg b/main/_static/images/OSWEC_WECSim_GUI.jpg new file mode 100644 index 000000000..084edab6c Binary files /dev/null and b/main/_static/images/OSWEC_WECSim_GUI.jpg differ diff --git a/main/_static/images/OSWEC_WECSim_GlobalRef.jpg b/main/_static/images/OSWEC_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..5a354f2c3 Binary files /dev/null and b/main/_static/images/OSWEC_WECSim_GlobalRef.jpg differ diff --git a/main/_static/images/OSWEC_heaveForces.PNG b/main/_static/images/OSWEC_heaveForces.PNG new file mode 100644 index 000000000..e7a120cc9 Binary files /dev/null and b/main/_static/images/OSWEC_heaveForces.PNG differ diff --git a/main/_static/images/OSWEC_pitchResponse.PNG b/main/_static/images/OSWEC_pitchResponse.PNG new file mode 100644 index 000000000..0d9e8ea82 Binary files /dev/null and b/main/_static/images/OSWEC_pitchResponse.PNG differ diff --git a/main/_static/images/OSWEC_plotEta.PNG b/main/_static/images/OSWEC_plotEta.PNG new file mode 100644 index 000000000..88abeda03 Binary files /dev/null and b/main/_static/images/OSWEC_plotEta.PNG differ diff --git a/main/_static/images/OSWEC_plotSpectrum.PNG b/main/_static/images/OSWEC_plotSpectrum.PNG new file mode 100644 index 000000000..66bcf5191 Binary files /dev/null and b/main/_static/images/OSWEC_plotSpectrum.PNG differ diff --git a/main/_static/images/OSWEC_plotWaves.PNG b/main/_static/images/OSWEC_plotWaves.PNG new file mode 100644 index 000000000..1e7bff1b4 Binary files /dev/null and b/main/_static/images/OSWEC_plotWaves.PNG differ diff --git a/main/_static/images/PTOSIMINPUTFILE.PNG b/main/_static/images/PTOSIMINPUTFILE.PNG new file mode 100644 index 000000000..fa86352e1 Binary files /dev/null and b/main/_static/images/PTOSIMINPUTFILE.PNG differ diff --git a/main/_static/images/PTOSimBlock1.png b/main/_static/images/PTOSimBlock1.png new file mode 100644 index 000000000..1393f9459 Binary files /dev/null and b/main/_static/images/PTOSimBlock1.png differ diff --git a/main/_static/images/PTOSimBlock1OSWEC.png b/main/_static/images/PTOSimBlock1OSWEC.png new file mode 100644 index 000000000..5d1e82468 Binary files /dev/null and b/main/_static/images/PTOSimBlock1OSWEC.png differ diff --git a/main/_static/images/PTOSimClass_diagram.png b/main/_static/images/PTOSimClass_diagram.png new file mode 100644 index 000000000..63cd19085 Binary files /dev/null and b/main/_static/images/PTOSimClass_diagram.png differ diff --git a/main/_static/images/Physics.png b/main/_static/images/Physics.png new file mode 100644 index 000000000..0100030f2 Binary files /dev/null and b/main/_static/images/Physics.png differ diff --git a/main/_static/images/RM3_Geom.png b/main/_static/images/RM3_Geom.png new file mode 100644 index 000000000..1de3a4352 Binary files /dev/null and b/main/_static/images/RM3_Geom.png differ diff --git a/main/_static/images/RM3_WECSim.JPG b/main/_static/images/RM3_WECSim.JPG new file mode 100644 index 000000000..ab64bcdf7 Binary files /dev/null and b/main/_static/images/RM3_WECSim.JPG differ diff --git a/main/_static/images/RM3_WECSim_Body.jpg b/main/_static/images/RM3_WECSim_Body.jpg new file mode 100644 index 000000000..fae29f724 Binary files /dev/null and b/main/_static/images/RM3_WECSim_Body.jpg differ diff --git a/main/_static/images/RM3_WECSim_GUI.JPG b/main/_static/images/RM3_WECSim_GUI.JPG new file mode 100644 index 000000000..547dfc6d5 Binary files /dev/null and b/main/_static/images/RM3_WECSim_GUI.JPG differ diff --git a/main/_static/images/RM3_WECSim_GlobalRef.jpg b/main/_static/images/RM3_WECSim_GlobalRef.jpg new file mode 100644 index 000000000..6e2d92413 Binary files /dev/null and b/main/_static/images/RM3_WECSim_GlobalRef.jpg differ diff --git a/main/_static/images/RM3_vizMarker.jpg b/main/_static/images/RM3_vizMarker.jpg new file mode 100644 index 000000000..e5f3ef8d6 Binary files /dev/null and b/main/_static/images/RM3_vizMarker.jpg differ diff --git a/main/_static/images/RM3withPTOSimBlocks.png b/main/_static/images/RM3withPTOSimBlocks.png new file mode 100644 index 000000000..e614f7fc4 Binary files /dev/null and b/main/_static/images/RM3withPTOSimBlocks.png differ diff --git a/main/_static/images/SliderandCrankMechanism.png b/main/_static/images/SliderandCrankMechanism.png new file mode 100644 index 000000000..e40f9e69e Binary files /dev/null and b/main/_static/images/SliderandCrankMechanism.png differ diff --git a/main/_static/images/WEC-Sim_Lib.PNG b/main/_static/images/WEC-Sim_Lib.PNG new file mode 100644 index 000000000..350ce8ccc Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_PTOSim.png b/main/_static/images/WEC-Sim_Lib_PTOSim.png new file mode 100644 index 000000000..90b75bb6f Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_PTOSim.png differ diff --git a/main/_static/images/WEC-Sim_Lib_bodies.PNG b/main/_static/images/WEC-Sim_Lib_bodies.PNG new file mode 100644 index 000000000..d97c1fdc5 Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_bodies.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_cable.PNG b/main/_static/images/WEC-Sim_Lib_cable.PNG new file mode 100644 index 000000000..591a3aa1f Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_cable.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_constraints.PNG b/main/_static/images/WEC-Sim_Lib_constraints.PNG new file mode 100644 index 000000000..beea4c8a4 Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_constraints.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_frames.PNG b/main/_static/images/WEC-Sim_Lib_frames.PNG new file mode 100644 index 000000000..0ccd6a7bc Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_frames.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_mooring.PNG b/main/_static/images/WEC-Sim_Lib_mooring.PNG new file mode 100644 index 000000000..95f9a9462 Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_mooring.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_pto.PNG b/main/_static/images/WEC-Sim_Lib_pto.PNG new file mode 100644 index 000000000..b430fe8a5 Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_pto.PNG differ diff --git a/main/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG b/main/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG new file mode 100644 index 000000000..386a6ddb5 Binary files /dev/null and b/main/_static/images/WEC-Sim_Lib_ptosim_hyd.PNG differ diff --git a/main/_static/images/WEC-Sim_flowChart.png b/main/_static/images/WEC-Sim_flowChart.png new file mode 100644 index 000000000..ed0b95b60 Binary files /dev/null and b/main/_static/images/WEC-Sim_flowChart.png differ diff --git a/main/_static/images/WECCCOMP_PTO_Extension.png b/main/_static/images/WECCCOMP_PTO_Extension.png new file mode 100644 index 000000000..9ed26f563 Binary files /dev/null and b/main/_static/images/WECCCOMP_PTO_Extension.png differ diff --git a/main/_static/images/WECSimMoorDyn.png b/main/_static/images/WECSimMoorDyn.png new file mode 100644 index 000000000..17d54eaeb Binary files /dev/null and b/main/_static/images/WECSimMoorDyn.png differ diff --git a/main/_static/images/codeFeatures.png b/main/_static/images/codeFeatures.png new file mode 100644 index 000000000..0624a15aa Binary files /dev/null and b/main/_static/images/codeFeatures.png differ diff --git a/main/_static/images/code_structure/PTOSimClass_diagram.png b/main/_static/images/code_structure/PTOSimClass_diagram.png new file mode 100644 index 000000000..ecd60f274 Binary files /dev/null and b/main/_static/images/code_structure/PTOSimClass_diagram.png differ diff --git a/main/_static/images/code_structure/bemio_diagram.PNG b/main/_static/images/code_structure/bemio_diagram.PNG new file mode 100644 index 000000000..d15b7a3c5 Binary files /dev/null and b/main/_static/images/code_structure/bemio_diagram.PNG differ diff --git a/main/_static/images/code_structure/body_diagram.PNG b/main/_static/images/code_structure/body_diagram.PNG new file mode 100644 index 000000000..4876850ac Binary files /dev/null and b/main/_static/images/code_structure/body_diagram.PNG differ diff --git a/main/_static/images/code_structure/cable_diagram.PNG b/main/_static/images/code_structure/cable_diagram.PNG new file mode 100644 index 000000000..aaf9d9c0d Binary files /dev/null and b/main/_static/images/code_structure/cable_diagram.PNG differ diff --git a/main/_static/images/code_structure/constraint_diagram.PNG b/main/_static/images/code_structure/constraint_diagram.PNG new file mode 100644 index 000000000..b5aa83cc1 Binary files /dev/null and b/main/_static/images/code_structure/constraint_diagram.PNG differ diff --git a/main/_static/images/code_structure/mooring_diagram.PNG b/main/_static/images/code_structure/mooring_diagram.PNG new file mode 100644 index 000000000..1ba6570fc Binary files /dev/null and b/main/_static/images/code_structure/mooring_diagram.PNG differ diff --git a/main/_static/images/code_structure/pto_diagram.PNG b/main/_static/images/code_structure/pto_diagram.PNG new file mode 100644 index 000000000..bc6cb89f2 Binary files /dev/null and b/main/_static/images/code_structure/pto_diagram.PNG differ diff --git a/main/_static/images/code_structure/ptosim_diagram.PNG b/main/_static/images/code_structure/ptosim_diagram.PNG new file mode 100644 index 000000000..66803ee90 Binary files /dev/null and b/main/_static/images/code_structure/ptosim_diagram.PNG differ diff --git a/main/_static/images/code_structure/simulation_diagram.png b/main/_static/images/code_structure/simulation_diagram.png new file mode 100644 index 000000000..f7e4faf2e Binary files /dev/null and b/main/_static/images/code_structure/simulation_diagram.png differ diff --git a/main/_static/images/code_structure/wave_diagram.PNG b/main/_static/images/code_structure/wave_diagram.PNG new file mode 100644 index 000000000..1b202023b Binary files /dev/null and b/main/_static/images/code_structure/wave_diagram.PNG differ diff --git a/main/_static/images/compPerformanceBetweenOption1Option2.png b/main/_static/images/compPerformanceBetweenOption1Option2.png new file mode 100644 index 000000000..b78ec6d13 Binary files /dev/null and b/main/_static/images/compPerformanceBetweenOption1Option2.png differ diff --git a/main/_static/images/coordinateSystem.png b/main/_static/images/coordinateSystem.png new file mode 100644 index 000000000..e0cf3018a Binary files /dev/null and b/main/_static/images/coordinateSystem.png differ diff --git a/main/_static/images/declutchTimeSweep.png b/main/_static/images/declutchTimeSweep.png new file mode 100644 index 000000000..9fbd26f93 Binary files /dev/null and b/main/_static/images/declutchTimeSweep.png differ diff --git a/main/_static/images/declutching.png b/main/_static/images/declutching.png new file mode 100644 index 000000000..106c326f6 Binary files /dev/null and b/main/_static/images/declutching.png differ diff --git a/main/_static/images/dev/library_format.png b/main/_static/images/dev/library_format.png new file mode 100644 index 000000000..fc183a741 Binary files /dev/null and b/main/_static/images/dev/library_format.png differ diff --git a/main/_static/images/dev/mask_dev_body.png b/main/_static/images/dev/mask_dev_body.png new file mode 100644 index 000000000..9a04dfc51 Binary files /dev/null and b/main/_static/images/dev/mask_dev_body.png differ diff --git a/main/_static/images/dev/mask_dev_grf.png b/main/_static/images/dev/mask_dev_grf.png new file mode 100644 index 000000000..25ca2a742 Binary files /dev/null and b/main/_static/images/dev/mask_dev_grf.png differ diff --git a/main/_static/images/dev/mask_user_grf.png b/main/_static/images/dev/mask_user_grf.png new file mode 100644 index 000000000..ef40295c5 Binary files /dev/null and b/main/_static/images/dev/mask_user_grf.png differ diff --git a/main/_static/images/dev/mask_user_grf_waveOptions.png b/main/_static/images/dev/mask_user_grf_waveOptions.png new file mode 100644 index 000000000..6ab65356d Binary files /dev/null and b/main/_static/images/dev/mask_user_grf_waveOptions.png differ diff --git a/main/_static/images/extractMaskVariables.PNG b/main/_static/images/extractMaskVariables.PNG new file mode 100644 index 000000000..e1ec9d240 Binary files /dev/null and b/main/_static/images/extractMaskVariables.PNG differ diff --git a/main/_static/images/hyd_pto_sim.PNG b/main/_static/images/hyd_pto_sim.PNG new file mode 100644 index 000000000..f97da3763 Binary files /dev/null and b/main/_static/images/hyd_pto_sim.PNG differ diff --git a/main/_static/images/impedance.png b/main/_static/images/impedance.png new file mode 100644 index 000000000..b196202b2 Binary files /dev/null and b/main/_static/images/impedance.png differ diff --git a/main/_static/images/latchTimeSweep.png b/main/_static/images/latchTimeSweep.png new file mode 100644 index 000000000..35a97d5c9 Binary files /dev/null and b/main/_static/images/latchTimeSweep.png differ diff --git a/main/_static/images/latching.png b/main/_static/images/latching.png new file mode 100644 index 000000000..0a14666c4 Binary files /dev/null and b/main/_static/images/latching.png differ diff --git a/main/_static/images/moorDynInput.png b/main/_static/images/moorDynInput.png new file mode 100644 index 000000000..b3baaf681 Binary files /dev/null and b/main/_static/images/moorDynInput.png differ diff --git a/main/_static/images/mpcForce.png b/main/_static/images/mpcForce.png new file mode 100644 index 000000000..e1930456c Binary files /dev/null and b/main/_static/images/mpcForce.png differ diff --git a/main/_static/images/mpcForceChange.png b/main/_static/images/mpcForceChange.png new file mode 100644 index 000000000..dcad50b7b Binary files /dev/null and b/main/_static/images/mpcForceChange.png differ diff --git a/main/_static/images/mpcPos.png b/main/_static/images/mpcPos.png new file mode 100644 index 000000000..a80b4b5d1 Binary files /dev/null and b/main/_static/images/mpcPos.png differ diff --git a/main/_static/images/mpcPower.png b/main/_static/images/mpcPower.png new file mode 100644 index 000000000..dc5a80d48 Binary files /dev/null and b/main/_static/images/mpcPower.png differ diff --git a/main/_static/images/mpcSimulink.png b/main/_static/images/mpcSimulink.png new file mode 100644 index 000000000..8caae4a8b Binary files /dev/null and b/main/_static/images/mpcSimulink.png differ diff --git a/main/_static/images/mpcVel.png b/main/_static/images/mpcVel.png new file mode 100644 index 000000000..c04d46f79 Binary files /dev/null and b/main/_static/images/mpcVel.png differ diff --git a/main/_static/images/multiple_accumulators.PNG b/main/_static/images/multiple_accumulators.PNG new file mode 100644 index 000000000..68e7647bc Binary files /dev/null and b/main/_static/images/multiple_accumulators.PNG differ diff --git a/main/_static/images/nonlinearEllipsoid.png b/main/_static/images/nonlinearEllipsoid.png new file mode 100644 index 000000000..b59779910 Binary files /dev/null and b/main/_static/images/nonlinearEllipsoid.png differ diff --git a/main/_static/images/nonlinearMesh.png b/main/_static/images/nonlinearMesh.png new file mode 100644 index 000000000..cf32d35ac Binary files /dev/null and b/main/_static/images/nonlinearMesh.png differ diff --git a/main/_static/images/nonlinearWEC.png b/main/_static/images/nonlinearWEC.png new file mode 100644 index 000000000..fd4b9622d Binary files /dev/null and b/main/_static/images/nonlinearWEC.png differ diff --git a/main/_static/images/oceanCurrentProfiles.png b/main/_static/images/oceanCurrentProfiles.png new file mode 100644 index 000000000..ea817b8fc Binary files /dev/null and b/main/_static/images/oceanCurrentProfiles.png differ diff --git a/main/_static/images/option2Schematic.jpg b/main/_static/images/option2Schematic.jpg new file mode 100644 index 000000000..6c503c518 Binary files /dev/null and b/main/_static/images/option2Schematic.jpg differ diff --git a/main/_static/images/oswec_pto_sim.PNG b/main/_static/images/oswec_pto_sim.PNG new file mode 100644 index 000000000..d11674c57 Binary files /dev/null and b/main/_static/images/oswec_pto_sim.PNG differ diff --git a/main/_static/images/oswec_pto_sim_conn.PNG b/main/_static/images/oswec_pto_sim_conn.PNG new file mode 100644 index 000000000..0aad3a8f7 Binary files /dev/null and b/main/_static/images/oswec_pto_sim_conn.PNG differ diff --git a/main/_static/images/overview/HYDPTOSIMOSWEC.PNG b/main/_static/images/overview/HYDPTOSIMOSWEC.PNG new file mode 100644 index 000000000..6b632e7fb Binary files /dev/null and b/main/_static/images/overview/HYDPTOSIMOSWEC.PNG differ diff --git a/main/_static/images/overview/OSWEC_sim.JPG b/main/_static/images/overview/OSWEC_sim.JPG new file mode 100644 index 000000000..c486c3309 Binary files /dev/null and b/main/_static/images/overview/OSWEC_sim.JPG differ diff --git a/main/_static/images/overview/OSWEC_with_ptosim.png b/main/_static/images/overview/OSWEC_with_ptosim.png new file mode 100644 index 000000000..5a6c0d754 Binary files /dev/null and b/main/_static/images/overview/OSWEC_with_ptosim.png differ diff --git a/main/_static/images/overview/b2b_comparison.png b/main/_static/images/overview/b2b_comparison.png new file mode 100644 index 000000000..80c164e0f Binary files /dev/null and b/main/_static/images/overview/b2b_comparison.png differ diff --git a/main/_static/images/overview/b2b_comparison2.png b/main/_static/images/overview/b2b_comparison2.png new file mode 100644 index 000000000..e7abc408a Binary files /dev/null and b/main/_static/images/overview/b2b_comparison2.png differ diff --git a/main/_static/images/overview/ellipsoid_iso_side.png b/main/_static/images/overview/ellipsoid_iso_side.png new file mode 100644 index 000000000..e9020ae58 Binary files /dev/null and b/main/_static/images/overview/ellipsoid_iso_side.png differ diff --git a/main/_static/images/overview/gbm_iso_side.png b/main/_static/images/overview/gbm_iso_side.png new file mode 100644 index 000000000..08615f7cf Binary files /dev/null and b/main/_static/images/overview/gbm_iso_side.png differ diff --git a/main/_static/images/overview/mcr_powerMatrix.png b/main/_static/images/overview/mcr_powerMatrix.png new file mode 100644 index 000000000..43b1cd7fa Binary files /dev/null and b/main/_static/images/overview/mcr_powerMatrix.png differ diff --git a/main/_static/images/overview/mcr_waveElev-heaveResp.png b/main/_static/images/overview/mcr_waveElev-heaveResp.png new file mode 100644 index 000000000..be88f3072 Binary files /dev/null and b/main/_static/images/overview/mcr_waveElev-heaveResp.png differ diff --git a/main/_static/images/overview/nlhydro_comparison.png b/main/_static/images/overview/nlhydro_comparison.png new file mode 100644 index 000000000..29114d8ab Binary files /dev/null and b/main/_static/images/overview/nlhydro_comparison.png differ diff --git a/main/_static/images/overview/nlhydro_comparison4.png b/main/_static/images/overview/nlhydro_comparison4.png new file mode 100644 index 000000000..692f5a553 Binary files /dev/null and b/main/_static/images/overview/nlhydro_comparison4.png differ diff --git a/main/_static/images/overview/numOpt_comparison.png b/main/_static/images/overview/numOpt_comparison.png new file mode 100644 index 000000000..5df3e0a9a Binary files /dev/null and b/main/_static/images/overview/numOpt_comparison.png differ diff --git a/main/_static/images/overview/oc6_iso_side.png b/main/_static/images/overview/oc6_iso_side.png new file mode 100644 index 000000000..44d62bd21 Binary files /dev/null and b/main/_static/images/overview/oc6_iso_side.png differ diff --git a/main/_static/images/overview/oswec_iso_side.png b/main/_static/images/overview/oswec_iso_side.png new file mode 100644 index 000000000..5d89477a8 Binary files /dev/null and b/main/_static/images/overview/oswec_iso_side.png differ diff --git a/main/_static/images/overview/oswec_ptosim.JPG b/main/_static/images/overview/oswec_ptosim.JPG new file mode 100644 index 000000000..6fdf33c9b Binary files /dev/null and b/main/_static/images/overview/oswec_ptosim.JPG differ diff --git a/main/_static/images/overview/overview_diagram.JPG b/main/_static/images/overview/overview_diagram.JPG new file mode 100644 index 000000000..5c4a7b583 Binary files /dev/null and b/main/_static/images/overview/overview_diagram.JPG differ diff --git a/main/_static/images/overview/passiveYaw_comparison.png b/main/_static/images/overview/passiveYaw_comparison.png new file mode 100644 index 000000000..313b6cb0d Binary files /dev/null and b/main/_static/images/overview/passiveYaw_comparison.png differ diff --git a/main/_static/images/overview/rm3_iso_side.png b/main/_static/images/overview/rm3_iso_side.png new file mode 100644 index 000000000..916827c65 Binary files /dev/null and b/main/_static/images/overview/rm3_iso_side.png differ diff --git a/main/_static/images/overview/sphere_freedecay_iso_side.png b/main/_static/images/overview/sphere_freedecay_iso_side.png new file mode 100644 index 000000000..ae8cdad1e Binary files /dev/null and b/main/_static/images/overview/sphere_freedecay_iso_side.png differ diff --git a/main/_static/images/overview/wecccomp_controller.png b/main/_static/images/overview/wecccomp_controller.png new file mode 100644 index 000000000..e84a762fc Binary files /dev/null and b/main/_static/images/overview/wecccomp_controller.png differ diff --git a/main/_static/images/overview/wecccomp_diagram.png b/main/_static/images/overview/wecccomp_diagram.png new file mode 100644 index 000000000..6cf6f989c Binary files /dev/null and b/main/_static/images/overview/wecccomp_diagram.png differ diff --git a/main/_static/images/overview/wecccomp_iso_side.png b/main/_static/images/overview/wecccomp_iso_side.png new file mode 100644 index 000000000..50d15a5db Binary files /dev/null and b/main/_static/images/overview/wecccomp_iso_side.png differ diff --git a/main/_static/images/overview/wecccomp_simscape_exp.png b/main/_static/images/overview/wecccomp_simscape_exp.png new file mode 100644 index 000000000..e5a30af19 Binary files /dev/null and b/main/_static/images/overview/wecccomp_simscape_exp.png differ diff --git a/main/_static/images/overview/wigley_iso_side.png b/main/_static/images/overview/wigley_iso_side.png new file mode 100644 index 000000000..d78be89d0 Binary files /dev/null and b/main/_static/images/overview/wigley_iso_side.png differ diff --git a/main/_static/images/pGainSweep.png b/main/_static/images/pGainSweep.png new file mode 100644 index 000000000..9b4f7e138 Binary files /dev/null and b/main/_static/images/pGainSweep.png differ diff --git a/main/_static/images/piGainSweep.png b/main/_static/images/piGainSweep.png new file mode 100644 index 000000000..5a8799328 Binary files /dev/null and b/main/_static/images/piGainSweep.png differ diff --git a/main/_static/images/piPTOSimulink.png b/main/_static/images/piPTOSimulink.png new file mode 100644 index 000000000..ebe0fe78a Binary files /dev/null and b/main/_static/images/piPTOSimulink.png differ diff --git a/main/_static/images/pto_sim_lib.png b/main/_static/images/pto_sim_lib.png new file mode 100644 index 000000000..356b915f5 Binary files /dev/null and b/main/_static/images/pto_sim_lib.png differ diff --git a/main/_static/images/pto_sim_lin.PNG b/main/_static/images/pto_sim_lin.PNG new file mode 100644 index 000000000..ad65ecd67 Binary files /dev/null and b/main/_static/images/pto_sim_lin.PNG differ diff --git a/main/_static/images/pto_sim_lin_conn.PNG b/main/_static/images/pto_sim_lin_conn.PNG new file mode 100644 index 000000000..9a759e3a6 Binary files /dev/null and b/main/_static/images/pto_sim_lin_conn.PNG differ diff --git a/main/_static/images/reactiveWithPTOCC.png b/main/_static/images/reactiveWithPTOCC.png new file mode 100644 index 000000000..05a4fb3c2 Binary files /dev/null and b/main/_static/images/reactiveWithPTOCC.png differ diff --git a/main/_static/images/reactiveWithPTOCCPower.png b/main/_static/images/reactiveWithPTOCCPower.png new file mode 100644 index 000000000..7131b9681 Binary files /dev/null and b/main/_static/images/reactiveWithPTOCCPower.png differ diff --git a/main/_static/images/reactiveWithPTOOpt.png b/main/_static/images/reactiveWithPTOOpt.png new file mode 100644 index 000000000..8d8e6c8c8 Binary files /dev/null and b/main/_static/images/reactiveWithPTOOpt.png differ diff --git a/main/_static/images/reactiveWithPTOOptPower.png b/main/_static/images/reactiveWithPTOOptPower.png new file mode 100644 index 000000000..f07d4e2ff Binary files /dev/null and b/main/_static/images/reactiveWithPTOOptPower.png differ diff --git a/main/_static/images/reactiveWithPTOSweep.png b/main/_static/images/reactiveWithPTOSweep.png new file mode 100644 index 000000000..c53c5a229 Binary files /dev/null and b/main/_static/images/reactiveWithPTOSweep.png differ diff --git a/main/_static/images/rectangles.png b/main/_static/images/rectangles.png new file mode 100644 index 000000000..7607c0406 Binary files /dev/null and b/main/_static/images/rectangles.png differ diff --git a/main/_static/images/rm3with_pto_sim.PNG b/main/_static/images/rm3with_pto_sim.PNG new file mode 100644 index 000000000..155fa28ab Binary files /dev/null and b/main/_static/images/rm3with_pto_sim.PNG differ diff --git a/main/_static/images/rotary.PNG b/main/_static/images/rotary.PNG new file mode 100644 index 000000000..a7953cc94 Binary files /dev/null and b/main/_static/images/rotary.PNG differ diff --git a/main/_static/images/rotary_inside.PNG b/main/_static/images/rotary_inside.PNG new file mode 100644 index 000000000..aac420e92 Binary files /dev/null and b/main/_static/images/rotary_inside.PNG differ diff --git a/main/_static/images/rotary_lookup.PNG b/main/_static/images/rotary_lookup.PNG new file mode 100644 index 000000000..53ec6d51c Binary files /dev/null and b/main/_static/images/rotary_lookup.PNG differ diff --git a/main/_static/images/rotational_pto.PNG b/main/_static/images/rotational_pto.PNG new file mode 100644 index 000000000..c72e11cc9 Binary files /dev/null and b/main/_static/images/rotational_pto.PNG differ diff --git a/main/_static/images/translational_pto.PNG b/main/_static/images/translational_pto.PNG new file mode 100644 index 000000000..8e1686a76 Binary files /dev/null and b/main/_static/images/translational_pto.PNG differ diff --git a/main/_static/images/wec_sim_header.png b/main/_static/images/wec_sim_header.png new file mode 100644 index 000000000..59911a3d5 Binary files /dev/null and b/main/_static/images/wec_sim_header.png differ diff --git a/main/_static/jquery.js b/main/_static/jquery.js new file mode 100644 index 000000000..c4c6022f2 --- /dev/null +++ b/main/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/main/_static/language_data.js b/main/_static/language_data.js new file mode 100644 index 000000000..367b8ed81 --- /dev/null +++ b/main/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/main/_static/minus.png b/main/_static/minus.png new file mode 100644 index 000000000..d96755fda Binary files /dev/null and b/main/_static/minus.png differ diff --git a/main/_static/plus.png b/main/_static/plus.png new file mode 100644 index 000000000..7107cec93 Binary files /dev/null and b/main/_static/plus.png differ diff --git a/main/_static/pygments.css b/main/_static/pygments.css new file mode 100644 index 000000000..84ab3030a --- /dev/null +++ b/main/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/main/_static/searchtools.js b/main/_static/searchtools.js new file mode 100644 index 000000000..b08d58c9b --- /dev/null +++ b/main/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/main/_static/sphinx_highlight.js b/main/_static/sphinx_highlight.js new file mode 100644 index 000000000..8a96c69a1 --- /dev/null +++ b/main/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/main/developer/advanced_features.html b/main/developer/advanced_features.html new file mode 100644 index 000000000..cfcf47e48 --- /dev/null +++ b/main/developer/advanced_features.html @@ -0,0 +1,464 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+
+

Added Mass

+
+

Theoretical Implementation

+

Added mass is a special multi-directional fluid dynamic phenomenon that most +physics software cannot account for well. +Modeling difficulties arise because the added mass force is proportional to acceleration. +However most time-domain simulations are attempting to use the calculated forces to determine +a body’s acceleration, which then determines the velocity and position at the next time step. +Solving for acceleration when forces are dependent on acceleration creates an algebraic loop.

+

The most robust solution is to combine the added mass matrix with the rigid body’s mass and inertia, +shown in the manipulation of the governing equation below:

+
+\[\begin{split}M\ddot{X_i} &= \Sigma F(t,\omega) - A\ddot{X_i} \\ +(M+A)\ddot{X_i} &= \Sigma F(t,\omega) \\ +M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega)\end{split}\]
+

where capital \(M\) is the mass matrix, \(A\) is the added mass, and subscript \(i\) represents the timestep being solved for. +In this case, the adjusted body mass matrix is defined as the sum of the translational mass (\(m\)), inertia tensor (\(I\)), and the added mass matrix:

+
+\[\begin{split}M_{adjusted} = \begin{bmatrix} + m + A_{1,1} & A_{1,2} & A_{1,3} & A_{1,4} & A_{1,5} & A_{1,6} \\ + A_{2,1} & m + A_{2,2} & A_{2,3} & A_{2,4} & A_{2,5} & A_{2,6} \\ + A_{3,1} & A_{3,2} & m + A_{3,3} & A_{3,4} & A_{3,5} & A_{3,6} \\ + A_{4,1} & A_{4,2} & A_{4,3} & I_{1,1} + A_{4,4} & -I_{2,1} + A_{4,5} & -I_{3,1} + A_{4,6} \\ + A_{5,1} & A_{5,2} & A_{5,3} & I_{2,1} + A_{5,4} & I_{2,2} + A_{5,5} & -I_{3,2} + A_{5,6} \\ + A_{6,1} & A_{6,2} & A_{6,3} & I_{3,1} + A_{6,4} & I_{3,2} + A_{6,5} & I_{3,3} + A_{6,6} \\ + \end{bmatrix}\end{split}\]
+

This formulation is desirable because it removes the acceleration dependence from the right hand side of the governing equation. +Without this treatment, the acceleration causes an unsolvable algebraic loop. +There are alternative approximations to solve the algebraic loop, but simulation robustness and stability become increasingly difficult.

+

The core issue with this combined mass formulation is that Simscape Multibody, and most other physics software, do not allow a generic body to have a degree-of-freedom specific mass. +For example, a rigid body can’t have one mass for surge motion and another mass for heave motion. +Simscape rigid bodies only have one translational mass, a 1x3 moment of inertia matrix, and 1x3 product of inertia matrix.

+
+
+

WEC-Sim’s Implementation

+

Due to this limitation, WEC-Sim cannot combine the body mass and added mass on the left-hand side of the equation of motion (as shown above). +The algebaric loop can be solved by predicting the acceleration at the current time step, and using that to calculate the added mass force. +But this method can cause numerical instabilities. +Instead, WEC-Sim decreases the added mass force magnitude by moving some components of added mass into the body mass, while a modified added mass force is calculated with the remainder of the added mass coefficients.

+

There is a 1-1 mapping between the body’s inertia tensor and rotational added mass coefficients. +These added mass coefficients are entirely lumped with the body’s inertia. +Additionally, the surge-surge (1,1), sway-sway (2,2), heave-heave (3,3) added mass coefficients correspond to the translational mass of the body, but must be treated identically.

+

WEC-Sim implements this added mass treatment using both a modified added mass matrix and a modified body mass matrix:

+
+\[\begin{split}M\ddot{X_i} &= \Sigma F(t,\omega) - A\ddot{X_i} \\ +(M+dMass)\ddot{X_i} &= \Sigma F(t,\omega) - (A-dMass)\ddot{X_i} \\ +M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega) - A_{adjusted}\ddot{X_i} \\\end{split}\]
+

where \(dMass\) is the change in added mass and defined as:

+
+\[\begin{split}dMass &= \begin{bmatrix} + \alpha Y & 0 & 0 & 0 & 0 & 0 \\ + 0 & \alpha Y & 0 & 0 & 0 & 0 \\ + 0 & 0 & \alpha Y & 0 & 0 & 0 \\ + 0 & 0 & 0 & A_{4,4} & -A_{5,4} & -A_{6,4} \\ + 0 & 0 & 0 & A_{5,4} & A_{5,5} & -A_{6,5} \\ + 0 & 0 & 0 & A_{6,4} & A_{6,5} & A_{6,6} \\ + \end{bmatrix} \\ +Y &= (A_{1,1} + A_{2,2} + A_{3,3}) \\ +\alpha &= body(iBod).adjMassFactor\end{split}\]
+

The resultant definition of the body mass matrix and added mass matrix are then:

+
+\[\begin{split}M &= \begin{bmatrix} + m + \alpha Y & 0 & 0 & 0 & 0 & 0 \\ + 0 & m + \alpha Y & 0 & 0 & 0 & 0 \\ + 0 & 0 & m + \alpha Y & 0 & 0 & 0 \\ + 0 & 0 & 0 & I_{4,4} + A_{4,4} & -(I_{5,4} + A_{5,4}) & -(I_{6,4} + A_{6,4}) \\ + 0 & 0 & 0 & I_{5,4} + A_{5,4} & I_{5,5} + A_{5,5} & -(I_{6,5} + A_{6,5}) \\ + 0 & 0 & 0 & I_{6,4} + A_{6,4} & I_{6,5} + A_{6,5} & I_{6,6} + A_{6,6} \\ + \end{bmatrix} \\ +A_{adjusted} &= \begin{bmatrix} + A_{1,1} - \alpha Y & A_{1,2} & A_{1,3} & A_{1,4} & A_{1,5} & A_{1,6} \\ + A_{2,1} & A_{2,2} - \alpha Y & A_{2,3} & A_{2,4} & A_{2,5} & A_{2,6} \\ + A_{3,1} & A_{3,2} & A_{3,3} - \alpha Y & A_{3,4} & A_{3,5} & A_{3,6} \\ + A_{4,1} & A_{4,2} & A_{4,3} & 0 & A_{4,5} + A_{5,4} & A_{4,6} + A_{6,4} \\ + A_{5,1} & A_{5,2} & A_{5,3} & 0 & 0 & A_{5,6} + A_{6,5} \\ + A_{6,1} & A_{6,2} & A_{6,3} & 0 & 0 & 0 \\ + \end{bmatrix}\end{split}\]
+
+

Note

+

We should see that \(A_{4,5} + A_{5,4} = A_{4,6} + A_{6,4} = A_{5,6} + A_{6,5} = 0\), but there may be numerical differences in the added mass coefficients which are preserved.

+
+

Though the components of added mass and body mass are manipulated in WEC-Sim, the total system is unchanged. +This manipulation does not affect the governing equations of motion, only the implementation.

+

The fraction of translational added mass that is moved into the body mass is determined by body(iBod).adjMassFactor, whose default value is \(2.0\). +Advanced users may change this weighting factor in the wecSimInuptFile to create the most robust simulation possible. +To see its effects, set body(iB).adjMassFactor = 0 and see if simulations become unstable.

+

This manipulation does not move all added mass components. +WEC-Sim still contains an algebraic loop due to the acceleration dependence of the remaining added mass force from \(A_{adjusted}\), and components of the Morison Element force. +WEC-Sim solves the algebraic loop using a Simulink Transport Delay with a very small time delay (1e-8). +This blocks extrapolates the previous acceleration by 1e-8 seconds, which results in a known acceleration for the added mass force. +The small extraplation solves the algebraic loop but prevents large errors that arise when extrapolating the acceleration over an entire time step. +This will convert the algebraic loop equation of motion to a solvable one:

+
+\[\begin{split}M_{adjusted}\ddot{X_i} &= \Sigma F(t,\omega) - A_{adjusted}\ddot{X}_{i - (1 + 10^{-8}/dt)} \\\end{split}\]
+
+
+

Working with the Added Mass Implementation

+

WEC-Sim’s added mass implementation should not affect a user’s modeling workflow. +WEC-Sim handles the manipulation and restoration of the mass and forces in the bodyClass functions adjustMassMatrix() called by initializeWecSim and restoreMassMatrix, storeForceAddedMass called by postProcessWecSim. +However viewing body.mass, body.inertia, body,inertiaProducts, body.hydroForce.fAddedMass between calls to initializeWecSim and postProcessWecSim will not show the input file definitions. +Users can get the manipulated mass matrix, added mass coefficients, added mass force and total force from body.hydroForce.storage after the simulation. +However, in the rare case that a user wants to manipulate the added mass force during a simulation, the change in mass, \(dMass\) above, must be taken into account. Refer to how body.calculateForceAddedMass() calculates the entire added mass force in WEC-Sim post-processing.

+
+

Note

+

If applying the method in body.calculateForceAddedMass() during the simulation, the negative of dMass must be taken: \(dMass = -dMass\). This must be accounted for because the definitions of mass, inertia, etc and their stored values are flipped between simulation and post-processing.

+
+
+

Note

+

Depending on the wave formulation used, \(A\) can either be a function of wave frequency \(A(\omega)\), or equal to the added mass at infinite wave frequency \(A_{\infty}\)

+
+
+
+
+

Morison Element

+

As a reminder from the WEC-Sim Theory Manual, the Morison force equation assumes that the fluid forces in an oscillating flow on a structure of slender cylinders or other similar geometries arise partly from pressure effects from potential flow and partly from viscous effects. A slender cylinder implies that the diameter, \(D\), is small relative to the wave length, \(\lambda\), which is generally satisfied when \(D/\lambda<0.1-0.2\). If this condition is not met, wave diffraction effects must be taken into account. Assuming that the geometries are slender, the resulting force can be approximated by a modified Morison formulation for each element on the body.

+
+

Fixed Body

+

For a fixed body in an oscillating flow the force imposed by the fluid is given by:

+
+(1)\[\vec{F}_{ME} = \underbrace{\rho \forall C_{m} \dot{\vec{u}}}_{\text{Inertia}} + \underbrace{\frac{1}{2} \rho A C_{D} \vec{u} | \vec{u} |}_{Drag}\]
+

where \(\vec{F}_{ME}\) is the Morison element hydrodynamic force, \(\rho\) is the fluid density, \(\forall\) is the displaced volume, \(C_{m}\) is the inertia coefficient, \(A\) is the reference area, \(C_{D}\) is the drag coefficient, and \(u\) is the fluid velocity. The inertia coefficient is defined as:

+
+(2)\[C_{m} = 1 + C_{a}\]
+

where \(C_{a}\) is the added mass coefficient. The inertia term is the sum of the Froude- Krylov Force, \(\rho \forall \dot{u}\), and the hydrodynamic mass force, \(\rho C_{a} \forall \dot{u}\). The inertia and drag coefficients are generally obtained experimentally and have been found to be a function of the Reynolds (Re) and Kulegan Carpenter (KC) numbers

+
+(3)\[\text{Re} = \frac{U_{m}D}{\nu}~~\&~~ \text{KC} = \frac{U_{m}T}{D}~~\]
+

where \(U_{m}\) is the maximum fluid velocity, and \(\nu\) is the kinematic viscosity of the fluid, and \(T\) is the period of oscillation. Generally when KC is small then \(\vec{F}\) is dominated by the inertia term when the drag term dominates at high KC numbers. If the fluid velocity is sinusoidal then \(u\) is given by:

+
+(4)\[u(t) = U_{m} \sin \left( \sigma t \right)~~\]
+

where \(\sigma = 2\pi/T\). This can be taking further by considering the body is being is impinged upon by regular waves of the form:

+
+(5)\[\begin{split}\eta(x,t) & = A \cos \left( \sigma t - k \left[ x \cos \theta + y \sin \theta\right] \right) = \Re \left\lbrace -\frac{1}{g}\frac{\partial \phi_{I}}{\partial t} \bigg|_{z=0} \right\rbrace~~, \\ \phi_{I}(x,z,t) & = \Re \left\lbrace \frac{Ag}{\sigma} \frac{\cosh \left(k (z+h) \right)}{\cosh \left( kh \right)} i e^{i(\sigma t-k\left[ x \cos \theta + y \sin \theta\right])} \right\rbrace~~, \\ \sigma^{2} & = gk\tanh\left(kh\right)\end{split}\]
+

where \(\eta\) is the wave elevation, \(\phi_{I}\) is the incident wave potential, \(A\) is the wave amplitude, \(k\) is the wave number (defined as \(k=\frac{2\pi}{\lambda}\) where \(\lambda\) is the wave length), \(g\) is gravitational acceleration, \(h\) is the water depth, \(z\) is the vertical position in the water column, \(\theta\) is the wave heading. The fluid velocity can then be obtained by taking the graident of Eqn. (5) :

+
+(6)\[\begin{split}u (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial x} \right\rbrace = \frac{Agk}{\sigma} \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right) \cos\left(\theta\right)~~,\\ +v (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial y} \right\rbrace = \frac{Agk}{\sigma} \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right)\sin\left(\theta\right)~~,\\ +w (x,z,t) & = \Re \left\lbrace \frac{\partial \phi_{I}}{\partial z} \right\rbrace = -\frac{Agk}{\sigma} \frac{\sinh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right)~~,\end{split}\]
+

The acceleration of the fluid particles will then be obtained by taking the time derivative of Eqn. (6) :

+
+(7)\[\begin{split}\dot{u} (x,z,t) & = \frac{\partial u}{\partial t} = -Agk \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right) \cos\left(\theta\right)~~,\\ +\dot{v} (x,z,t) & = \frac{\partial v}{\partial t} = -Agk \frac{\cosh \left( k (z+h)\right)}{\cosh \left( kh \right)} \sin \left( \sigma t - k x \right) \sin\left(\theta\right)~~,\\ +\dot{w} (x,z,t) & = \frac{\partial w}{\partial t} = -Agk \frac{\sinh \left( k (z+h)\right)}{\cosh \left( kh \right)} \cos \left( \sigma t - k x \right)~~,\end{split}\]
+
+../_images/HorizontalVerticalOrbitalVelocity.jpg + +
+

Horizontal and vertical orbital velocity magnitude for a wave period of 10 s and water depth of 50 m with a wave heading of 0 rads.

+
+
+
+../_images/MagAngleOrbitalVelocity.jpg + +
+

Orbital velocity magnitude vectors for a wave period of 10 s and water depth of 50 m with a wave heading of 0 rads.

+
+
+
+
+

Moving Body

+

If the body is allowed to move in an oscillating flow then Eqn. (1) must be adjusted as follows:

+
+(8)\[\vec{F}_{ME} = \rho \forall \dot{\vec{u}} + \rho \forall C_{a} \left( \dot{\vec{u}} - \dot{\vec{U}} \right) + \frac{1}{2}\rho C_{D} A \left( \vec{u} - \vec{U} \right) \left| \vec{u} - \vec{U} \right|~~\]
+

where \(U\) is the body velocity. In the calculations performed by WEC-Sim, it is assumed that the body does not alter the wave field and the fluid velocity and acceleration can be calculated from the incident wave potential as from Eqn. (6) and (7).

+
+

Review of Rigid Body Dynamics

+

A rigid body is an idealization of a solid body in which deformation is neglected. In other words, the distance between any two given points of a rigid body remains constant in time regardless of external forces exerted on it. The position of the whole body is represented by its linear position together with its angular position with a global fixed reference frame. WEC-Sim calculates the position, velocity, and acceleration of the rigid body about its center of gravity; however, the placement of each morrison element will have a different local velocity that affects the fluid force. The relative velocity between point A and point B on a rigid body is given by:

+
+(9)\[\vec{U}_{A} = \vec{U}_{B} + \omega \times r_{BA}~~\]
+

where \(\omega\) is the angular velocity of the body and \(\times\) denotes the cross product. Taking the time derivative of Eqn. (9) provides the relative acceleration:

+
+(10)\[\vec{\dot{U}}_{A} = \vec{\dot{U}}_{B} + \omega \times \omega \times r_{BA} + \dot{\omega} \times r_{BA}~~\]
+
+
+
+

WEC-Sim Implementations

+

As discussed in the WEC-Sim user manual, there are two options to model a Morison element(s) and will be described here in greater detail so potential developers can modify the code to suit their modeling needs.

+
+

Option 1

+

In the first Morison element implementation option, the acceleration and velocity of the fluid flow are estimated at the Morison point of application, which can include both wave and current contributions, and then subtracts the body acceleration and velocity for the individual translational degrees of freedom (x-, y-, and z-components). The fluid flow properties are then used to calculate the Morison element force, indepenently for each degree of freedom, as shown by the following expressions:

+
+(11)\[\begin{split}F_{ME,x} & = \rho \forall \dot{u}_{x} + \rho \forall C_{a,x} \left( \dot{u}_{x} - \dot{U}_{x} \right) + \frac{1}{2}\rho C_{D,x} A_{x} \left( u_{x} - U_{x} \right) \left| u_{x} - U_{x} \right|~~, \\ +F_{ME,y} & = \rho \forall \dot{u}_{y} + \rho \forall C_{a,y} \left( \dot{u}_{y} - \dot{U}_{y} \right) + \frac{1}{2}\rho C_{D,y} A_{y} \left( u_{y} - U_{y} \right) \left| u_{y} - U_{y} \right|~~, \\ +F_{ME,z} & = \rho \forall \dot{u}_{z} + \rho \forall C_{a,z} \left( \dot{u}_{z} - \dot{U}_{z} \right) + \frac{1}{2}\rho C_{D,z} A_{z} \left( u_{z} - U_{z} \right) \left| u_{z} - U_{z} \right|~~, \\ +\vec{M} & = \vec{r} \times \vec{F} = \left[ r_{g,x}, r_{g,y}, r_{g,z} \right] \times \left[ F_{x}, F_{y}, F_{z} \right]\end{split}\]
+

where \(r_{g}\) is the lever arm from the center of gravity of the body to the Morison element point of application. Option 1 provides the most flexibility in setting independent Morison element properties for the x-, y-, and z-directions; however, a limitation arises that the fluid flow magnitude does not consider the other fluid flow components. Depending on the simulation enviroment this approach can provide the same theoretical results as taking the magnitude of the x-, y-, and z-components of the fluid flow, but is case dependent. A comparison between the outputs of Option 1 and Option 2 can be found later in the Developer Manual Morison Element documentation.

+
+
+

Option 2

+

The WEC-Sim Option 1 implementation solves for the of the Morison element force from the individual x-, y-, and z-components of the relative flow velocity and acceleration; however, this results in incorrect outputs at certain orientations of the flow and Morison Element. As opposed to solving for the x-, y-, and z-components of the Morison element force, the force can be calculated relative to the magnitude of the flow and distributed among its unit vector direction. Therefore the approach used in Option 2 is to decompose the fluid and body velocity and acceleration into tangential and normal components of the Morison element, as depicted in Figure Schematic of the water flow vector decomposition reletive to the Morison Element orientation.

+
+../_images/option2Schematic.jpg + +
+

Schematic of the water flow vector decomposition reletive to the Morison Element orientation.

+
+
+

In mathematics, for a given vector at a point on a surface, the vector can be uniquely decomposed into the sum of its tangential and normal components. The tangential component of the vector, \(v_{\parallel}\), is parallel to the surface while the normal component of the vectors, \(v_{\perp}\), is perpendicular to the surface which is used in relation to the central axis to the Morison element. The WEC-Sim input file was altered to consider a tangential and normal component for the drag coefficient [\(C_{d\perp}\) , \(C_{d\parallel}\)] , added mass coefficient [\(C_{a\perp}\) , \(C_{a\parallel}\)], characteristic area [\(A_{\perp}\) , \(A_{\parallel}\)], and the central axis vector of the ME = [ \(\vec{z} = `:math:`z_{x}\) , \(z_{y}\) , \(z_{z}\) ].

+

A general vector, \(\vec{k}\), can be decomposed into the normal component as a projection of vector k on to the central axis z as follows:

+
+(12)\[\vec{k}_{\parallel} = \frac{\vec{z} \cdot \vec{k}}{ || \vec{z} || } \frac{ \vec{z} }{ || \vec{z} || }\]
+

As the vector \(\vec{k}\) is uniquely decomposed into the sum of its tangential and normal components, the normal component can be defined as the difference between the vector \(\vec{k}\) and its tangential component as follows:

+
+(13)\[\vec{k}_{\perp} = \vec{k} - \vec{k}_{\parallel}\]
+

Using this vector multiplication, the tangential and normal components of the fluid flow can be obtained as follows:

+
+(14)\[\begin{split}\vec{u}_{\parallel} = \frac{\vec{z} \cdot \vec{u}}{ || \vec{z} || } \frac{ \vec{z} }{ || \vec{z} || } \\ +\vec{u}_{\perp} = \vec{u}-\vec{u}_{\perp}\end{split}\]
+

The Morison element force equation for a moving body relative to the fluid flow is modified to include the following decomposition of force components and consider the magnitude of the flow:

+
+(15)\[\begin{split}\vec{F}_{ME} = \rho C_{M,\parallel} \forall \left( \dot{\vec{u}}_{\parallel} - \dot{\vec{U}}_{\parallel} \right) + \frac{1}{2}\rho C_{d,\parallel} \left( \vec{v}_{\parallel} - \vec{U}_{\parallel} \right) \lvert \vec{v}_{\parallel} - \vec{U}_{\parallel} \rvert + \\ +\rho C_{M,\perp} \forall \left( \dot{\vec{u}}_{\perp} - \dot{\vec{U}}_{\perp} \right) + \frac{1}{2}\rho C_{d,\perp} \left( \vec{v}_{\perp} - \vec{U}_{\perp} \right) \lvert \vec{v}_{\perp} - \vec{U}_{\perp} \rvert\end{split}\]
+
+
+

Comparison of Performance Between Option 1 and Option 2

+

A simple test case, which defines a Morison element as vertical and stationary relative to horizontal fluid flow, was built to compare the Morison element force calculation between Option 1 and Option 2 within WEC-Sim. Theoretically, the magnitude of the Morison element force should remain constant as the orientation of the flow direction is rotated in the X-Y plane. The MF was calculated as the orientation of the flow was rotated about the z-axis from 1 to 360 degrees where the central axis of the ME is parallel wtih the z-axis. The remaining WEC-Sim input values for the simulation can be found in the following table.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variable Type

Variable Symbol

WEC-Sim Input Values

ME Central Axis

\(\vec{z}\)

[0, 0 , 1]

Fluid flow velocity

\(\vec{U}\)

[-1, 0, 0] \(m/s\)

Fluid flow acceleration

\(\vec{\dot{U}}\)

[-1, 0, 0] \(m/s^{2}\)

Drag Coefficient

\(C_{D}\)

[1, 1, 0]

Mass Coefficient

\(C_{a}\)

[1, 1, 0]

Area

\(A\)

[1, 1, 0]

Density

\(\rho\)

1000 \(kg/m^{3}\)

Displaced Volume

\(\forall\)

0.10 \(m^{3}\)

+
+../_images/compPerformanceBetweenOption1Option2.png + +
+

Graphical representation of the comparison between ME Option 1 and Option 2 within WEC-Sim.

+
+
+

\(F_{ME,1}\) and \(F_{ME,2}\) is the Morison element force output from Option 1 and Option 2 within WEC-Sim, respectively. Shown in the above figure, in Option 1 there is an oscillation in Morison element magnitude with flow direction while Option 2 demonstrates a constant force magnitude at any flow direction. The reason behind this performance is that Option 1 solves for the MF individually using the individual the x-, y-, and z- components of the flow while Option 2 calculates the force relative to the flow magnitude and distributed among the normal and tangential unit vectors of the flow.

+
+
+
+
+

Extract Mask Variables

+

The Simulink variable workspace is inaccesible in the MATLAB workspace by default. +Simulink variables can be imported to the MATLAB workspace using the block handle +of the Simulink block being probed. The block parameters can be used by developers +to programmatically set block parameters by being able to access the unique tags +that Simulink uses for a particular block parameter. This is also useful for the code +initialization of Simulink mask blocks. +The function ExtractMaskVariables() +located in sourcefunctionssimulinkmask, can be used to extract the block +parameters in following steps,

+
    +
  • Open the pertinent Simulink model,

  • +
  • Run the function with the address of the block being probed as the argument,

  • +
  • Explore the mask data structure in the MATLAB workspace.

  • +
+
+../_images/extractMaskVariables.PNG + +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/getting_started.html b/main/developer/getting_started.html new file mode 100644 index 000000000..80878aa93 --- /dev/null +++ b/main/developer/getting_started.html @@ -0,0 +1,183 @@ + + + + + + + + + Getting Started — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Getting Started

+

The WEC-Sim source code is hosted on WEC-Sim’s GitHub repository. +Please fork the WEC-Sim repository if you plan to contribute to the WEC-Sim code. +Forking the repository allows developers to create a personal copy of the WEC-Sim repository that can be edited idependently. +For details on creating and using a fork, refer to GitHub’s forking documentation.

+

Once you have forked the repository on GitHub, add the fork’s remote, and pull the fork into your local directory:

+
>> git remote add <USERNAME> https://github.com/<USERNAME>/WEC-Sim.git
+>> git pull <USERNAME> <branch>
+
+
+

Push local commits to fork on GitHub:

+
>> git push <USERNAME> <branch>
+
+
+

Pull updates from WEC-Sim origin:

+
>> git pull origin <branch>
+
+
+
+

Note

+

This example defines origin as WEC-Sim’s GitHub repository, and <USERNAME> as the developer’s fork. Develoeprs may use whatever convention they prefer, refer to GitHub documentation on configuring remotes

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/index.html b/main/developer/index.html new file mode 100644 index 000000000..46c74b300 --- /dev/null +++ b/main/developer/index.html @@ -0,0 +1,188 @@ + + + + + + + + + Developer Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/library.html b/main/developer/library.html new file mode 100644 index 000000000..21530f4b2 --- /dev/null +++ b/main/developer/library.html @@ -0,0 +1,596 @@ + + + + + + + + + WEC-Sim Library — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

WEC-Sim Library

+

The WEC-Sim Library is in the $WECSIM/source/lib directory, and includes the following files:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Simulink Library

File name

WEC-Sim Library

WECSim_Lib.slx

Frames Sublibrary

WECSim_Lib_Frames.slx

Body Elements Sublibrary

WECSim_Lib_Body_Elements.slx

Constraints Sublibrary

WECSim_Lib_Constraints.slx

PTOs Sublibrary

WECSim_Lib_PTOs.slx

Cables Sublibrary

WECSim_Lib_Cables.slx

Moorings Sublibrary

WECSim_Lib_Moorings.slx

+

GitHub tracks when a change is made to a binary file (e.g. *.slx), but not the specific revisions made. +This makes tracking revisions to the WEC-Sim Library more challenging than revisions to text files (e.g. *.m). +The WEC-Sim Library is saved as a Custom Simulink Library with sublibaries. +To ensure backwards compatibility, a Forwarding Table is used.

+
+

Formatting

+

Please format the color of library blocks according to their function:

+ + + + + + + + + + + + + + + + + + + + + + + + +

Library Function

Color

Input

Green

Output

Red

From Workspace

Yellow

Simulink Function

Orange

Subsystem

Gray

Linked Block

Light Blue

+
+../_images/library_format.png + +
+

WEC-Sim Library blocks with color formatting

+
+
+
+
+

Library Development

+

When masks are modified, Simulink executes the mask initialization code. If Simulink does not have access to the WEC-Sim objects in the Simulink workspace, Simulink will throw an error message and would not allow any changes.

+

In order to modify blocks masks the variable being modified must be accesible to Simulink’s workspace. This can be acheived by running any wecSimInputFile.m script without executing WEC-Sim. Running the wecSimInputFile.m script populates the MATLAB worskpace with the pertinent data objects using WEC-Sim’s class definitions. This enables the block masks to have access to the properties and methods for the pertinent class (e.g., bodyClass, waveClass etc.).

+

Simulink then executes each block mask’s initialization code before accepting any changes. Some of the WEC-Sim library blocks auto-generate additional blocks based on the wecSimInputFile.m script. To ensure that the library block auto-generates such blocks only when WEC-Sim is run, make sure to delete the auto-generated blocks before saving the modified block to the WEC-Sim library.

+
+

Note

+

This is especially important for the Wave Markers and for B2B

+
+
+ + +
+

MATLAB Merge Tool

+

It is recommended that developers use the MATLAB Merge Tool to compare library versions when there are merge conflicts. +The MATLAB Merge Tool allows users to compare changes directly in Simulink. +The merge tool will open a special Simulink GUI that allows users to compare code versions both textually and within the block diagram. +To use the tool, merge both branches locally and resolve any conflicts using the merge tool.

+

For example, take the branches <dev> and <new_feature> that each contain new WEC-Sim features. +In the Git for Windows command line, these changes can be merged using:

+
# Checkout the <dev> branch and pull the latest
+git checkout <dev>
+git pull <remote>/<dev>
+
+# Merge <new_feature> branch into <dev> branch
+git merge <new_feature>
+
+# Resolve library conflicts using the MATLAB merge tool
+git mergetool -t mlMerge source/lib/WEC-Sim/<library_file>.slx
+
+# Save desired revisions, then add and commit changes
+git add source/lib/WEC-Sim/<library_file>.slx
+git commit -m 'merge <dev> with <new_feature>'
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/overview.html b/main/developer/overview.html new file mode 100644 index 000000000..9a845046c --- /dev/null +++ b/main/developer/overview.html @@ -0,0 +1,167 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

The WEC-Sim development team is currently engaged in continuous code development and support. +Efforts are made by the development team to improve the code’s flexibility, accuracy, and usability. +The Getting Started section describes the development team’s workflow for anyone who wishes to submit new WEC-Sim features for inclusion in future WEC-Sim releases. +The developer manual also documents specific WEC-Sim features that are especially relevant to WEC-Sim development. +It is intended as a reference for members of the (internal and external) development team when adding new features.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/pull_requests.html b/main/developer/pull_requests.html new file mode 100644 index 000000000..269e8295d --- /dev/null +++ b/main/developer/pull_requests.html @@ -0,0 +1,181 @@ + + + + + + + + + Pull Requests — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Pull Requests

+

A stable version of WEC-Sim is maintained on the WEC-Sim main branch, and WEC-Sim releases are tagged on GitHub. +WEC-Sim development is performed on WEC-Sim dev branch using a fork-based workflow. +New WEC-Sim features are developed on forks of the WEC-Sim repository, and pull-requests are submitted to merge new features from a development fork into the main WEC-Sim repository. +Pull-requests for new WEC-Sim features should be submitted to the WEC-Sim dev branch. +The only exception to this workflow is for bug fixes; pull-request for bug fixes should be should submitted to the WEC-Sim main branch. +When a new version of WEC-Sim is released, the dev branch is pulled into main where all changes are incorporated into the code.

+

A pull request (PR) should focus on one update at a time. +This ensures that PR revisions are easily tracked, and keeps the repository history remains clean. +If working on multiple updates, please use different branches, and submit separate pull requests. +Once a PR is merged please delete legacy branches to keep your fork clean.

+

Prior to submitting a pull request, pull the latest commits from the WEC-Sim repository, resolve any merge conflicts, and commit revisions to your fork:

+
>> git pull origin <branch>
+>> git commit -m 'commit message'
+>> git push <USERNAME> <branch>
+
+
+

In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +Software Tests. +To submit a pull request, navigate to the WEC-Sim’s pull requests and submit a new pull request.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/developer/software_tests.html b/main/developer/software_tests.html new file mode 100644 index 000000000..be092183d --- /dev/null +++ b/main/developer/software_tests.html @@ -0,0 +1,199 @@ + + + + + + + + + Software Tests — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Software Tests

+

WEC-Sim includes MATLAB Continuous Integration tests that check the source code’s stability and generate a build report. +The continuous integration tests are run each time a commit is made to the WEC-Sim GitHub repository, and the stability of each commit is available via WEC-Sim’s GitHub Actions. +Tests are run on both the WEC-Sim main and WEC-Sim dev branches. +To ensure stability across MATLAB distributions, WEC-Sim tests are also run on current and prior MATLAB releases. +Refer to MATLAB’s unit test framework and continuous integration documentation for more information.

+

When new features are added, tests should developed to verify functionality. +All tests should be run locally to ensure stability prior to submitting a pull request. +In order for a pull request to be merged into the WEC-Sim repository it must pass all software tests, refer to +Pull Requests.

+
+

WEC-Sim Tests

+

The WEC-Sim tests are located in the $WECSIM/tests directory. +To execute the WEC-Sim tests locally and generates a build report, navigate to the $WECSIM directory (e.g. C:/User/Documents/GitHub/WEC-Sim), and type the following command in the MATLAB Command Window:

+
>> results = wecSimTest()
+
+
+Totals:
+   38 Passed, 0 Failed, 0 Incomplete.
+
+
+
+
+

WEC-Sim Applications Tests

+

The WEC-Sim Applications repository includes tests of each applications case. +To execute the WEC-Sim Applications tests locally and generates a build report, navigate to the $WECSIM_Applications directory (e.g. C:/User/Documents/GitHub/WEC-Sim), and type the following command in the MATLAB Command Window:

+
>> results = wecSimAppTest()
+
+
+Totals:
+   43 Passed, 0 Failed, 0 Incomplete
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/genindex.html b/main/genindex.html new file mode 100644 index 000000000..ea28a01d2 --- /dev/null +++ b/main/genindex.html @@ -0,0 +1,733 @@ + + + + + + + + Index — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | V + | W + | Y + | Z + +
+

A

+ + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

Q

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

Y

+ + +
+ +

Z

+ + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/index.html b/main/index.html new file mode 100644 index 000000000..674974476 --- /dev/null +++ b/main/index.html @@ -0,0 +1,200 @@ + + + + + + + + + WEC-Sim (Wave Energy Converter SIMulator) — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+_images/wec_sim_header.png + +
+
+
+
+

WEC-Sim (Wave Energy Converter SIMulator)

+

WEC-Sim (Wave Energy Converter SIMulator) +is an open-source software for simulating wave energy converters. The software is +developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape +Multibody. WEC-Sim has the ability to model devices that are comprised of +bodies, joints, power take-off systems, and mooring systems. WEC-Sim can model +both rigid bodies and flexible bodies with generalized body modes. Simulations +are performed in the time-domain by solving the governing wave energy converter +equations of motion in the 6 Cartesian degrees-of-freedom, plus any number of +user-defined modes. The WEC-Sim Applications repository contains a wide variety of +scenarios that WEC-Sim can be used to model, including desalination, mooring +dynamics, nonlinear hydrodynamic bodies, passive yawing, batch simulations and +many others. The software is very flexible and can be adapted to many scenarios +within the wave energy industry.

+
+

WEC-Sim Developers

+

WEC-Sim is a collaboration between the National Renewable Energy Laboratory +(NREL) and Sandia National Laboratories +(Sandia), +funded by the U.S. Department of Energy’s Water Power Technologies Office. +Due to the open source nature of the software, WEC-Sim has also had many external +contributions. +For more information refer to Acknowledgements.

+

Current members of the development team include:

+
    +
  • Dominic Forbush (Sandia)

  • +
  • Jeff Grasberger (Sandia)

  • +
  • Salman Husain (NREL - PI)

  • +
  • Adam Keester (Sandia)

  • +
  • Jorge Leon (Sandia)

  • +
  • David Ogden (NREL)

  • +
  • Kelley Ruehl (Sandia - PI)

  • +
  • Mohamed Shabara (NREL)

  • +
+

Former members of the development team include:

+
    +
  • Michael Lawson (NREL)

  • +
  • Carlos Michelen (Sandia)

  • +
  • Nathan Tom (NREL)

  • +
  • Jennifer Van Rij (NREL)

  • +
  • Yi-Hsiang Yu (NREL)

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/acknowledgements.html b/main/introduction/acknowledgements.html new file mode 100644 index 000000000..56e9a3fd5 --- /dev/null +++ b/main/introduction/acknowledgements.html @@ -0,0 +1,185 @@ + + + + + + + + + Acknowledgements — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Acknowledgements

+
+

External Contributors

+

In addition to development by WEC-Sim Developers, WEC-Sim has had many contributors, including:

+
    +
  • Ratanak So (Oregon State University)

  • +
  • Matt Hall (University of Maine)

  • +
  • Brad Ling (Azura Wave)

  • +
  • Adam Nelessen (Georgia Institute of Technology)

  • +
  • Sam Kanner (University of California at Berkeley)

  • +
  • Chris McComb (Carnegie Mellon University)

  • +
  • Sam Edwards (University of Michigan)

  • +
+

The association with the listed organization is credited to when a contribution to WEC-Sim was made. The contributor may no longer be associated with the listed organization at this time.

+
+
+

Funding

+

Development and maintenance of the WEC-Sim code is funded by the U.S. Department of Energy’s Water Power Technologies Office. WEC-Sim code development is a collaboration between the National Renewable Energy Laboratory and Sandia National Laboratories.

+

The National Renewable Energy Laboratory is a national laboratory of the U.S. Department of Energy, Office of Energy Efficiency and Renewable Energy, operated by the Alliance for Sustainable Energy, LLC. under contract No. DE-AC36-08GO28308.

+

Sandia National Laboratories is a multi-mission laboratory managed and operated by National Technology and Engineering Solutions of Sandia, LLC., a wholly owned subsidiary of Honeywell International, Inc., for the U.S. Department of Energy’s National Nuclear Security Administration under contract DE-NA0003525.

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/index.html b/main/introduction/index.html new file mode 100644 index 000000000..c550002b7 --- /dev/null +++ b/main/introduction/index.html @@ -0,0 +1,201 @@ + + + + + + + + + Introduction — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/license.html b/main/introduction/license.html new file mode 100644 index 000000000..2aabf0a66 --- /dev/null +++ b/main/introduction/license.html @@ -0,0 +1,372 @@ + + + + + + + + + License — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

License

+

WEC-Sim is copyright through the National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS). +The software is distributed under the Apache License 2.0.

+ +
+

Apache License 2.0

+
                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/overview.html b/main/introduction/overview.html new file mode 100644 index 000000000..06a4260ea --- /dev/null +++ b/main/introduction/overview.html @@ -0,0 +1,249 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

WEC-Sim (Wave Energy Converter SIMulator) is an open-source software for simulating wave energy converters. +It is developed in MATLAB/SIMULINK using the multi-body dynamics solver Simscape Multibody. +WEC-Sim has the ability to model devices that are comprised of hydrodynamic bodies, joints and constraints, power take-of systems, and mooring systems. +Simulations are performed in the time-domain by solving the governing wave energy converter equations of motion in the 6 rigid Cartesian degrees-of-freedom. +A body may also contain any number of generalized body modes to represent hydrodynamic effects in shear, torsion, bending, and others.

+
+../_images/WEC-Sim_flowChart.png + +
+

At a high level, the only external input WEC-Sim requires is hydrodynamic data from boundary element method (BEM) software such as WAMIT, NEMOH, Aqwa, and Capytaine. +The boundary element method data represents the hydrodynamic response of the device for a given wave frequency. +WEC-Sim uses this data to simulate devices in the time-domain where they can be coupled with controls, power take-off systems, and other external bodies and forces. +WEC-Sim outputs the motions, forces, and power for individual bodies, joints and PTOs in MATLAB for custom post-processing or coupling with external tools.

+

Several interfaces with Simulink are included that allow users to couple WEC-Sim with a wide variety of other models and scripts relevant to their devices. +Complex power take-off systems and advanced control algorithms are just two examples of the advanced tools that can be coupled with WEC-Sim.

+
+../_images/OSWEC_with_ptosim.png + +
+

Block diagram of an OSWEC device with hydraulic PTO created with PTO-Sim.

+
+
+
+../_images/wecccomp_diagram.png + +
+

Block diagram of the WECCCOMP device with advanced controller.

+
+
+

Together with PTO and control systems, WEC-Sim is able to model a wide variety of marine devices. +The WEC-Sim Applications repository contains a wide variety of scenarios that WEC-Sim can model. +This repository includes both demonstrations of WEC-Sim’s advanced features and applications of WEC-Sim to unique devices.

+

WEC-Sim’s capabilities include the ability to model both nonlinear hydrodynamic effects (Froude-Krylov forces and hydrostatic stiffness) and nonhydrodynamic bodies, body-to-body interactions, mooring systems, passive yawing. +WEC-Sim contains numerous numerical options and ability to perform highly customizable batch simulations. WEC-Sim can take in data from a variety of boundary element method software using its BEMIO (BEM-in/out) functionality and can output paraview files for visualization. +Some of its advanced features are highlighted in the figures below.

+ + + + + + + + + + + + + + + + +

Advanced Features Demonstration

nlh +Nonlinear hydrodynamics

num +Various numerical options

b2b +Body-to-body interactions

yaw +Passive yaw

mcr1 +Multiple case run: elevation

mcr2 +Multiple case run: power matrix

+

WEC-Sim can model a wide variety of marine renewable energy and offshore devices. +The figures below highlight a small sample of devices that WEC-Sim has successfully modeled in the past.

+ + + + + + + + + + + + + + + + + + + +

Sample of devices that have been with WEC-Sim

rm3 +Reference Model 3

oswec +Bottom-fixed Oscillating Surge WEC (OSWEC)

sphere +Hemisphere in Free Decay

ellipsoid +Ellipsoid

wigley +Wigley Ship Hull

gbm +Barge with Four Flexible Body Modes

wec3 +Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device

oc6p1 +OC6 Phase I DeepCwind Floating Semisubmersible

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/publications.html b/main/introduction/publications.html new file mode 100644 index 000000000..d92773b57 --- /dev/null +++ b/main/introduction/publications.html @@ -0,0 +1,226 @@ + + + + + + + + + Publications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Publications

+

Refer to the WEC-Sim Signature Project page for a complete list of WEC-Sim publications, including publications written by users of the WEC-Sim code outside of the WEC-Sim development team. +Here is a list of publications written by the WEC-Sim multi-lab team about the development and application of WEC-Sim:

+

[1] Y.-H. Yu, M. Lawson, K. Ruehl, and C. Michelen, “Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool,” in Proceedings of the 2nd Marine Energy Technology Symposium, METS 2014, Seattle, WA, 2014.

+

[2] Y.-H. Yu, Y. Li, K. Hallett, and C. Hotimsky, “Design and Analysis for a Floating Oscillating Surge Wave Energy Converter,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[3] M. Lawson, Y.-H. Yu, A. Nelessen, K. Ruehl, and C. Michelen, “Implementing Nonlinear Buoyancy and Excitation Forces in the WEC-Sim Wave Energy Converter Modeling Tool,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[4] K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y.-H. Yu, “Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool,” in Proceedings of the 33rd International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2014, San Francisco, CA, 2014.

+

[5] M. Lawson, Y.-H. Yu, K. Ruehl, and C. Michelen, “Improving and Validating the WEC-Sim Wave Energy Converter Code,” in Proceedings of the 3rd Marine Energy Technology Symposium, METS 2015, DC, 2015.

+

[6] N. Tom, M. Lawson, and Y. Yu, “Demonstration of the Recent Additions in Modeling Capabilities for the WEC-Sim Wave Energy Converter Design Tool,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[7] R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen, “Development of PTO-SIM: A Power Performance Module for the Open-Source Wave Energy Converter Code WEC-SIM,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[8] M. Lawson, B. Garzon, F. Wendt, Y.-H. Yu, and C. Michelen, “COER Hydrodynamics Modeling Competition: Modeling the Dynamic Response of a Floating Body Using the WEC-SIM and FAST Simulation Tools,” in Proceedings of the 34th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2015, St. John’s, Newfoundland, Canada, 2015.

+

[9] N. Tom, M. Lawson, and Y.-H. Yu, “Recent Additions in the Modeling Capabilities for the WEC-Sim-v1.1 Wave Energy Converter Design Tool,” in Proceedings of the 25th International Offshore and Polar Engineering Conference, ISOPE 2015, Kona, HI, 2015.

+

[10] R. So, S. Casey, S. Kanner, A. Simmons, and Brekken, T. K. A., “PTO-Sim: Development of a Power Take Off Modeling Tool for Ocean Wave Energy Conversion,” in Proceedings of the IEEE Power and Energy Society General Meeting, PES 2015, Denver, CO, 2015.

+

[11] A. Simmons, T. Brekken, P. Lomonaco, and C. Michelen, “Creating a Dynamometer for Experimental Validation of Power Take-Off Forces on a Wave Energy Converter,” in Proceedings of the IEEE Sustainability Technology Conference, SusTech 2015, Ogden, UT, 2015.

+

[12] A. Combourieu, M. Lawson, A. Babarit, K. Ruehl, A. Roy, R. Costello, P. L. Weywada, and H. Bailey, “WEC3: Wave Energy Converters modeling Code Comparison project,” in Proceedings of the 11th European Wave and Tidal Conference, EWTEC 2015, Nantes, France, 2015.

+

[13] K. Ruehl, C. Michelen, Y.-H. Yu, and M. Lawson, “Update on WEC-Sim Validation Testing and Code Development,” in Proceedings of the 4th Marine Energy Technology Symposium, METS 2016, DC, 2016.

+

[14] B. Bosma, K. Ruehl, A. Simmons, B. Gunawan, P. Lomonaco, and C. Kelley, “WEC-Sim Phase 1 Validation Testing – Experimental Setup and Initial Results,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[15] K. Ruehl, C. Michelen, B. Bosma, and Y.-H. Yu, “WEC-Sim Phase 1 Validation Testing – Numerical Modeling of Experiments,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[16] S. Sirnivas, Y.-H. Yu, M. Hall, and B. Bosma, 2016, “Coupled Mooring Analyses for the WEC-Sim Wave Energy Converter Design Tool,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[17] E. Quon, A. Platt, Y.-H. Yu, and M. Lawson, 2016, “Application of the Most Likely Extreme Response Method for Wave Energy Converters,” in Proceedings of the 35th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2016, Busan, South Korea, 2016.

+

[18] R. So, C. Michelen, B. Bosma, P. Lenee-Bluhm, and T. K. A. Brekken, “Statistical Analysis of a 1:7 Scale Field Test Wave Energy Converter Using WEC-Sim,” IEEE Transactions on Sustainable Energy, vol. 8, no. 3, pp. 1118–1126, Jul. 2017.

+

[19] J. Van Rij, Y.-H. Yu, and Y. Guo, “Structural loads analysis for wave energy converters,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017.

+

[20] Y.-H. Yu and D. Jenne, “Analysis of a wave-powered, reverse-osmosis system and its economic availability in the United States,” in Proceedings of the 36th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2017, Trondheim, Norway, 2017.

+

[21] J. Ringwood et al., “A competition for WEC control systems,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[22] F. Wendt et al., “International Energy Agency Ocean Energy Systems Task 10 Wave Energy Converter Modeling Verification and Validation,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[23] Y. Guo, Y.-H. Yu, and J. van Rij, “Inclusion of structural flexibility in design load analysis for wave energy converters,” in Proceedings of the 12th European Wave and Tidal Energy Conference, EWTEC 2017, Cork, Ireland, 2017.

+

[24] N. Tom, K. Ruehl, and F. Ferri, “Numerical model development and validation for the WECCCOMP control competition,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018.

+

[25] Y.-H. Yu, N. Tom, and D. Jenne, “Numerical analysis on hydraulic power take-off for wave energy converter and power smoothing methods,” in Proceedings of the 37th International Conference on Ocean, Offshore and Arctic Engineering, OMAE 2018, Madrid, Spain, 2018.

+
+

News Articles

+ + +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/introduction/release_notes.html b/main/introduction/release_notes.html new file mode 100644 index 000000000..da8fc7234 --- /dev/null +++ b/main/introduction/release_notes.html @@ -0,0 +1,722 @@ + + + + + + + + + Release Notes — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Release Notes

+
+

Citing WEC-Sim

+

To cite WEC-Sim, please use the citation for WEC-Sim software release and/or cite the following WEC-Sim publication.

+
+

WEC-Sim v6.1

+

[1] Kelley Ruehl, Adam Keester, Dominic Forbush, Jeff Grasberger, Salman Husain, Jorge Leon, David Ogden, and Mohamed Shabara, “WEC-Sim v6.1”. Zenodo, September 16, 2024. https://doi.org/10.5281/zenodo.13770349.

+
@software{wecsim,
+  author       = {Kelley Ruehl,
+                  Adam Keester,
+                  Dominic Forbush,
+                  Jeff Grasberger,
+                  Salman Husain,
+                  Jorge Leon,
+                  David Ogden,
+                  Mohamed Shabara},
+  title        = {WEC-Sim v6.1},
+  month        = September,
+  year         = 2024,
+  publisher    = {Zenodo},
+  version      = {v6.1},
+  doi          = {10.5281/zenodo.10023797},
+  url          = {https://doi.org/10.5281/zenodo.13770349}
+}
+
+
+https://zenodo.org/badge/20451353.svg + +
+
+

Publication

+

[1] D. Ogden, K. Ruehl, Y.H. Yu, A. Keester, D. Forbush, J. Leon, N. Tom, “Review of WEC-Sim Development and Applications” in Proceedings of the 14th European Wave and Tidal Energy Conference, EWTEC 2021, Plymouth, UK, 2021.

+
+
+
+

WEC-Sim v6.1

+

New Features

+
    +
  • Update docs on main by @salhus in #1031

  • +
  • Save mooring library to R2020b by @akeeste in #1040

  • +
  • Update readAQWA.m by @salhus in #1096

  • +
  • Update plotRadiationIRF.m by @AlufaSam in #1102

  • +
  • Update readNEMOH.m for compatibility with NEMOH v3.0 by @nathanmtom in #1105

  • +
  • Remove direct github installations from docs environment by @H0R5E in #1149

  • +
  • Exclude R2020b and R2021a from Windows test runners by @H0R5E in #1166

  • +
  • Add BEMIO cleanup function by @dforbush2 in #1076

  • +
  • Remove dead code from wecSim.m by @akeeste in #1170

  • +
  • Update wecSim.m to new MoorDyn dll by @jtgrasb in #1177

  • +
  • Merge main commits to dev by @jtgrasb in #1183

  • +
  • Port testing PR #1186 to main by @H0R5E in #1187

  • +
  • Add R2023b to Windows tests by @H0R5E in #1186

  • +
  • Nemoh v3.0.2 Examples by @MShabara in #1204

  • +
  • Update paraview docs by @jtgrasb in #1227

  • +
  • Update default branch to main by @akeeste in #1235

  • +
  • Apply #1235 and #1241 to dev branch by @H0R5E in #1240

  • +
  • PTO Extension Feature by @Allison-File in #1198

  • +
  • Updating tests on main and dev by @kmruehl in #1250

  • +
  • Updating WEC-Sim Issue Templates by @kmruehl in #1247

  • +
  • Enable WEC-Sim to use MoorDyn v2 capabilities by @jtgrasb in #1212

  • +
  • Add missing mask initialization line in spherical constraint by @akeeste in #1264

  • +
  • Update readCAPYTAINE.m to read Khs from .nc by @salhus in #1263

  • +
  • Update readCapytaine - fix reading multiple bodies with <6 dofs by @akeeste in #1274

  • +
  • Reposition % for readability by @Gusmano-2-OSU in #1272

  • +
  • Update waveSpread calculation in irregular waves by @dforbush2 in #1290

  • +
  • Add new examples for updated version of NEMOH (NEMOHv3.0.2) by @ashleynchong in #1226

  • +
  • Pull main into dev by @kmruehl in #1297

  • +
  • Expand regression tests by @akeeste in #1273

  • +
  • BEMIO Unit Updates by @jniffene in #1296

  • +
  • Speed up writeBEMIOH5 by @akeeste in #1301

  • +
  • Update readAQWA.m by @jtgrasb in #1253

  • +
  • Variable hydrodynamics by @akeeste in #1248

  • +
  • Update readCapytaine - get Khs from .nc files when bodies have less than 6 DOFs by @akeeste in #1275

  • +
  • Adds the QTFs to WEC-Sim by @MShabara in #1242

  • +
  • QTF - Variable Hydro compatibility by @akeeste in #1312

  • +
  • Resolve conflicts between variable hydro and GBM by @akeeste in <https://github.com/WEC-Sim/WEC-Sim/pull/1317>`_

  • +
+

Bug Fixes

+
    +
  • Update to MoorDyn to fix MoorDyn crashing MATLAB session. by @AlixHaider in #1012

  • +
  • Fix Direct Drive PTO Output order by @jtgrasb in #1095

  • +
  • Fix accelerator modes issue by @jtgrasb in #1100

  • +
  • Bugfix for plotBEMIO bodies by @akeeste in #1207

  • +
  • Fix to #1217, nonlinFK and body block changed by @dforbush2 in #1220

  • +
  • Fix on pDis function call by @dforbush2 in #1229

  • +
  • Bug fixes for WEC-Sim GUI and Run From Simulink features by @akeeste in #1195

  • +
  • Fix sign bug in the Generator Equivalent Circuit Block in PTO-Sim - Rebase PR to main by @jleonqu in #1236

  • +
  • Fix direct drive bugs by @jtgrasb in #1256

  • +
  • Minor fix for formatting in Developer manual by @akeeste in #1280

  • +
  • Bad BEMIO fcn fix by @dforbush2 in #1289

  • +
+

New Contributors

+
    +
  • @AlixHaider made their first contribution in #1012

  • +
  • @AlufaSam made their first contribution in #1102

  • +
  • @Allison-File made their first contribution in #1198

  • +
  • @Gusmano-2-OSU made their first contribution in #1272

  • +
  • @ashleynchong made their first contribution in #1226

  • +
+

Issues and Pull Requests

+
    +
  • v6.1 Changelog

  • +
  • > 104 issues closed since v6.0

  • +
  • > 48 PRs merged since v6.0

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.13770349.svg + +
+
+

WEC-Sim v6.0

+

New Features

+
    +
  • initial commit largeXYDispOption by @dforbush2 in #877

  • +
  • Update coordinate system figure by @JiaMiGit in #931

  • +
  • Property validation for WEC-Sim objects by @jtgrasb in #904

  • +
  • Dev: adding ampSpectraForWS function by @dforbush2 in #907

  • +
  • Customizable DOFs for plotBEMIO by @akeeste in #944

  • +
  • Calculation_of_Ainf_using_radiationIRF.m by @salhus in #946

  • +
  • Update citation names by @akeeste in #954

  • +
  • Update getDofNames() by @akeeste in #957

  • +
  • included readCAPYTAINE() argument to explicitly define KH.dat & Hydro by @dav-og in #962

  • +
  • Extract mask variable by @salhus in #958

  • +
  • Add tests to check that SLX file versions do not exceed R2020b by @H0R5E in #919

  • +
  • Products of Inertia in WEC-Sim by @akeeste in #981

  • +
  • Pull bug fixes #954, #999, #1002 from master into dev by @akeeste in #1011

  • +
  • updating readNEMOH based on #983 by @kmruehl in #990

  • +
  • Remove ‘fixed’ mass option from OSWEC input file by @jtgrasb in #1024

  • +
  • Save the applied added mass time series by @akeeste in #1023

  • +
  • Update tutorials by @kmruehl in #1030

  • +
  • Control applications docs by @jtgrasb in #1018

  • +
  • Update read- and writeBEMIOH5 to allow for pressure integration for mean drift by @nathanmtom in #1046

  • +
  • Add function to read h5 file to hydro data structure by @jtgrasb in #1048

  • +
  • Update radiationIRF.m by @nathanmtom in #1045

  • +
  • Normalize quaternion to increase simulation robustness by @akeeste in #1049

  • +
  • Plot bemio features by @jtgrasb in #1034

  • +
  • Updates to Morison Element Implementation by @nathanmtom in #1052

  • +
  • Moving PTO-Sim to main WEC-Sim library by @jleonqu in #1057

  • +
  • Add windows runner to dev branch unit test workflow by @H0R5E in #1061

  • +
  • Update docs dependencies by @H0R5E in #1080

  • +
  • Type property pto sim by @jleonqu in #1064

  • +
  • Added mass updates by @akeeste in #1058

  • +
  • Feature paraview by @agmoore4 in #1081

  • +
  • Paraview documentation hyperlink fix by @agmoore4 in #1093

  • +
  • use capytaine v2 to compute hydrostatics by @dav-og in #1092

  • +
  • Update paraview doc images by @jtgrasb in #1098

  • +
  • readNEMOH update to be compatible with v3.0.0 release (but not QTF) by @nathanmtom in #1087

  • +
  • Add simple direct drive PTO model by @jtgrasb in #1106

  • +
  • Control+pto docs by @jtgrasb in #1108

  • +
  • MOST Capabilities - Continuation by @jtgrasb in #1127

  • +
  • Implement an FIR filter to calculate radiation forces by @salhus in #1071

  • +
  • Updating documentation to include links for the Advanced Features Web by @jleonqu in #1126

  • +
  • Multiple Wave Spectra by @salhus in #1130

  • +
  • Update WECSim_Lib_Body_Elements.slx for N Waves Applications by @salhus in #1133

  • +
  • Update to MoorDyn v2 by @RyanDavies19 in #1134

  • +
  • Updating WEC-Sim tests for dev branch by @kmruehl in #1142

  • +
+

Bug Fixes

+
    +
  • Remove fixed mass option by @akeeste in #856

  • +
  • Move run(‘stopWecSim’) to wecSim.m by @jtgrasb in #885

  • +
  • Pull bug fixes into dev by @akeeste in #900

  • +
  • Save slx files in 2020b fixes #920 by @jtgrasb in #923

  • +
  • Fix readCAPYTAINE by @jtgrasb in #884

  • +
  • Fixes saveViz feature for elevation import by @jtgrasb in #929

  • +
  • Fix wave elevation import with rampTime = 0 by @jtgrasb in #917

  • +
  • readCapytaine_fixes_for_reading_dataformats_correctly by @salhus in #947

  • +
  • Pull #954 into dev by @akeeste in #955

  • +
  • Bug fix for direction in readCapytaine by @akeeste in #999

  • +
  • Fix sign bug reported on issue #993 by @jleonqu in #102

  • +
  • Dev: reverts PR 910, fixing error in nonLinearBuoyancy by @dforbush2 in #1017

  • +
  • Fix the transpose of linear restoring matrix to make roll mode rows to be 0 by @salhus in #1032

  • +
  • Bugfix resolving documentation build error by @kmruehl in #1059

  • +
  • fix_readWAMIT_and_writeBEMIOh5 by @salhus in #1065

  • +
  • Pulling master bugfixes into dev by @kmruehl in #1101

  • +
  • Bug fixes for v6.0 by @akeeste in #1136

  • +
  • Path fix for BEMIO example by @akeeste in #1144

  • +
+

New Contributors

+
    +
  • @JiaMiGit made their first contribution in #931

  • +
  • @agmoore4 made their first contribution in #1081

  • +
  • @RyanDavies19 made their first contribution in #1134

  • +
+

Issues and Pull Requests

+
    +
  • >130 issues closed since v5.0.1

  • +
  • >74 PRs merged since v5.0.1

  • +
  • v6.0 Changelog

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.10023797.svg + +
+
+

WEC-Sim v5.0.1

+

New Features

+

This is a bug fix release. New features since the previous release are not included.

+

Bug Fixes

+
    +
  • Fix saveViz by @jtgrasb in #866

  • +
  • Fix typo in docs. by @mancellin in #898

  • +
  • Update documentation tutorials to fix OSWEC inertia by @jtgrasb in #894

  • +
  • CI: Split docs jobs | Add color to docs logs | Cancel runs on new push | Add 2021b to MATLAB versions by @H0R5E in #862

  • +
  • Mac path fixes and make outputDir public by @ahmedmetin in #874

  • +
  • wecSimPCT Fix (Master) by @yuyihsiang in #870

  • +
  • Fix image bug in PTO-Sim in Library Browser by @jleonqu in #896

  • +
  • update to v5.0 citation by @akeeste in #911

  • +
  • fix non-linear hydro by @dforbush2 in #910

  • +
  • Pull dev bugfixes into master by @akeeste @jtgrasb in #950 (includes #929 #917 #884 by @jtgrasb)

  • +
+

New Contributors

+
    +
  • @mancellin made their first contribution in #898

  • +
  • @ahmedmetin made their first contribution in #874

  • +
+

Issues and Pull Requests

+ +https://zenodo.org/badge/DOI/10.5281/zenodo.7121186.svg + +
+
+

WEC-Sim v5.0

+

New Features

+
    +
  • Refactoring classes and properties @kmruehl in #803, #822, #828, #832, @akeeste in #838

  • +
  • Refactoring docs by @kmruehl in #840

  • +
  • Refactor BEMIO functions, tests, and documentation @akeeste in #790, #812, @H0R5E in #839, @dav-og in #806

  • +
  • Run from sim updates by @akeeste in #737

  • +
  • Allow binary STL files by @akeeste in #760

  • +
  • Update Read_AQWA and AQWA examples by @jtgrasb in #761, #779, #797, #831

  • +
  • Rename plotWaves by @jtgrasb in #765

  • +
  • Update to normalize to handle sorting mean drift forces by @nathanmtom in #808 #809

  • +
  • Remove passiveYawTest.m by @jtgrasb in #807

  • +
  • Wave class wave gauge update by @nathanmtom in #801

  • +
  • New pto sim lib by @jleonqu in #821

  • +
  • Warning/Error flags by @jtgrasb in #826

  • +
  • Add Google Analytics 4 by @akeeste in #864

  • +
+

Documentation

+
    +
  • Update WEC-Sim’s Developer Documentation for the Morison Element Implementation by @nathanmtom in #796

  • +
  • Update response class API by @akeeste in #802

  • +
  • Doc_auto_gen_masks by @salhus in #842

  • +
  • Move documentation compilation to GitHub Actions by @H0R5E in #817

  • +
  • Add branch build in docs workflow for testing PRs by @H0R5E in #834

  • +
  • Update the WEC-Sim Theory Documentation to Clarify Wave Power Calculation by @nathanmtom in #847

  • +
  • Update documentation on mean drift and current by @akeeste in #800

  • +
+

Bug Fixes

+
    +
  • Fix cable library links. Resolves #770 by @akeeste in #774 #775

  • +
  • Fix rate transition error by @akeeste in #799

  • +
  • Fix cable implementation by @dforbush2 in #827

  • +
  • PTO-Sim bug fix by @jleonqu in #833

  • +
  • Bug fix for the regular wave power full expression by @nathanmtom in #841

  • +
  • Fix documentation on dev branch by @H0R5E in #816

  • +
  • Bug fix: responseClass reading the MoorDyn Lines.out file too early, resolves #811 by @akeeste in #814

  • +
+

Issues and Pull Requests

+
+
    +
  • >52 issues closed since v4.4

  • +
  • >44 PRs merged since v4.4

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.6555137.svg + +
+
+

WEC-Sim v4.4

+

New Features

+
+
    +
  • Added WEC-Sim Library blocks for cable, spherical constraint, and spherical pto #712 #675

  • +
  • Added feature to add/remove WEC-Sim path and create temp directory for each run #685 #686

  • +
  • Updated WEC-Sim Library to 2020b and saved Simulink Library Functions to (*.m) files #686 #654

  • +
  • Split WEC-Sim Library into sublibraries for each class #720

  • +
  • Restructured WEC-Sim Continuous Integration tests into class-based tests #620

  • +
  • Added wave visualization with wave markers and post-processing #736 #678

  • +
  • Moved nonlinear hydrodynamics and morison elements to properties of the Body Class #692

  • +
+
+

Documentation

+
+
    +
  • Added developer manual content for WEC-Sim Library, Run from Simulink, Simulink Functions, Added Mass, Software Tests #728

  • +
  • Added user manual content for troubleshooting WEC-Sim #641

  • +
  • Updated content for PTO-Sim, ParaView, WEC-Sim Applications and Tutorials #668 #642 #649 #643

  • +
  • Added multi-version documentation for master and dev branches #630

  • +
+
+

Bug Fixes

+
+
    +
  • Resolved bug with macro for ParaView 5.9 #459

  • +
  • Resolved bugs in BEMIO with Read_Capytaine, READ_AQWA, and Write_H5 functions #727 #694 #636

  • +
  • Resolved bug with variable time-step solver #656

  • +
+
+

Issues and Pull Requests**

+
+
    +
  • > 57 issues closed since v4.3

  • +
  • > 54 PRs merged since v4.3

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.5608563.svg + +
+
+

WEC-Sim v4.3

+

New Features

+
+
    +
  • Added the ability for WEC-Sim to be run directly from Simulink #503 #512 #548

  • +
  • Added capability to read Capytaine (.nc) output. Includes examples of running Capytaine with hydrostatics #464

  • +
  • Created a more accurate infinite frequency added mass calculation #517

  • +
  • Added ability for setInitDisp to intake multiple initial rotations #516 #586

  • +
+
+

Documentation

+
+
    +
  • Restructured into four manuals: introduction, theory, user and development #455 #557

  • +
  • Update of code structure section #455, links #649 , diagrams #643, paraview #642,

  • +
  • Added section on suggested troubleshooting #641

  • +
+
+

Continuous integration tests

+
+
    +
  • Overhaul and speed up of tests #508 #620

  • +
  • Extension of tests to the applications cases #7

  • +
+
+

Clean up

+
+
+
    +
  • Created issue templates on GitHub #575 #634

  • +
  • Updated Morison Element warning flags #408

  • +
  • Clean up response class methods #491 #514

  • +
+
+
    +
  • Clean up paraview output functions #490

  • +
+
+

Bug Fixes

+
+
    +
  • Paraview macros and .pvsm files #459

  • +
  • BEMIO read mean drift force in R2021a #636

  • +
  • PTO-Sim calling workspace #632

  • +
  • Combine_BEM Ainf initialization #611

  • +
+
+

Issues and Pull Requests

+
+
    +
  • > 100 issues closed since v4.2

  • +
  • > 45 PRs merged since v4.2

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.5122959.svg + +
+
+

WEC-Sim v4.2

+

New Features

+
+
    +
  • Added normal/tangential option for Morison Force (simu.morisonElement = 2) #408

  • +
  • Added Drag Body (body(i).nhBody=2) #423 #384

  • +
  • WEC-Sim output saved to structure #426

  • +
  • Added WEC-Sim parallel execution for batch runs (wecSimPCT) using MATLAB parallel computing toolbox #438

  • +
  • Added end stops to PTOs #445

  • +
+
+

Documentation

+
+
    +
  • Automatically compile docs with TravisCI #439

  • +
  • Generate docs for master and dev branches of WEC-Sim

  • +
+
+

Bug Fixes

+
+
    +
  • Resolved convolution integral bug for body-to-body interactions #444

  • +
  • Resolved PTO-Sim bug for linear to rotary conversion blocks #247 #485

  • +
  • Resolved variant subsystem labeling bug #486 #479

  • +
+
+https://zenodo.org/badge/DOI/10.5281/zenodo.4391330.svg + +
+
+

WEC-Sim v4.1

+
    +
  • Added passive yaw

  • +
  • Revised spectral formulations per IEC TC114 TS 62600-2 Annex C

  • +
  • Updated examples on the WEC-Sim_Applications repository

  • +
  • Added unit tests with Jenkins

  • +
  • Added API documentation for WEC-Sim classes

  • +
  • Merged Pull Requests

    +
      +
    • Updated BEMIO for AQWA version comparability #373

    • +
    • Extended capabilities for ParaView visualization #355

    • +
    +
  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.3924765.svg + +
+
+

WEC-Sim v4.0

+
    +
  • Added mean drift force calculation

  • +
  • Added generalized body modes for simulating flexible WEC devices and for structure loading analysis

  • +
  • Updated BEMIO for mean drift force and generalized body modes

  • +
+https://zenodo.org/badge/DOI/10.5281/zenodo.3827897.svg + +
+
+

WEC-Sim v3.1

+
    +
  • Added wave gauges for three locations

  • +
  • Added command line documentation for objects

  • +
  • Added error and warning flags

  • +
  • Converted Morison Elements to script instead of block

  • +
  • Converted WEC-Sim and PTO-Sim library files back to slx format

  • +
  • Fixed plot error in MATLAB 2018b

  • +
+
+
+

WEC-Sim v3.0

+
    +
  • Added option of equal energy spacing for irregular waves (default)

  • +
  • Added option to calculate the wave elevation at a location different from the origin

  • +
  • Added option to define gamma for JONSWAP spectrum

  • +
  • Improved the WEC-Sim simulation speed when using rapid-acceleration mode

  • +
  • Fixed path bug in BEMIO for LINUX/OSX users

  • +
  • Changed/Added following WEC-Sim parameters

    + +
  • +
+
+
+

WEC-Sim v2.2

+ +
+
+

WEC-Sim v2.1

+
    +
  • Added MATLAB version of BEMIO (to replace python version)

  • +
  • Added variable time-step option with ‘ode45’ by @ratanakso

  • +
  • Update to MCR, option to not re-load *.h5 file by @bradling

  • +
  • Update to waveClass to allow for definition of min/max wave frequency by @bradling

  • +
+
+
+

WEC-Sim v2.0

+
    +
  • Updated WEC-Sim Library (generalized joints/constraints/PTOs)

  • +
  • Body-to-body interactions for radiation forces

  • +
  • Morison forces

  • +
  • Batch run mode (MCR)

  • +
  • Mooring sub-library implemented in mooringClass (no longer in body or joint)

  • +
  • More realistic PTO and mooring modeling through PTO-Sim and integration with MoorDyn

  • +
  • Non-hydrodynamic body option

  • +
  • Visualization using ParaView

  • +
+
+
+

WEC-Sim v1.3

+
    +
  • Added Morison Elements

  • +
  • Body2Body Interactions

  • +
  • Multiple Case Runs (wecSimMCR)

  • +
  • Moordyn

  • +
  • Added Non-hydro Bodies

  • +
  • Morison Forces

  • +
  • Joint Updates

  • +
  • Visualization with Paraview

  • +
+
+
+

WEC-Sim v1.2

+
    +
  • Nonlinear Froude-Krylov hydrodynamics and hydrostatics

  • +
  • State space radiation

  • +
  • Wave directionality

  • +
  • User-defined wave elevation time-series

  • +
  • Imports nondimensionalized BEMIO hydrodynamic data (instead of fully dimensional coefficients)

  • +
  • Variant Subsystems implemented to improve code stability (instead of if statements)

  • +
  • Bug fixes

  • +
+
+
+

WEC-Sim v1.1

+
    +
  • WEC-Sim v1.1, available on GitHub

  • +
  • Improvements in code stability through modifications to the added mass, radiation damping calculations, and impulse response function calculations

  • +
  • Implementation of state space representation of radiation damping convolution integral calculation

  • +
  • New hydrodynamic data format based on BEMIO output, a python code that reads data from WAMIT, NEMOH, and AQWA and writes to the Hierarchical Data Format 5 (HDF5) format used by WEC-Sim.

  • +
  • Documentation available on WEC-Sim Website

  • +
+
+
+

WEC-Sim v1.0

+
    +
  • Initial release of WEC-Sim (originally on OpenEI, now on GitHub)

  • +
  • Available as a static download

  • +
  • Documentation available in PDF

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/acknowledgements.html b/main/most/acknowledgements.html new file mode 100644 index 000000000..b8db0087c --- /dev/null +++ b/main/most/acknowledgements.html @@ -0,0 +1,176 @@ + + + + + + + + + Acknowledgements — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Acknowledgements

+

MOST software has been developed by the MOREnergy Lab of Politecnico di Torino, Italy.

+
+../_images/IMAGE_LogoPolitecnicodiTorino.jpg + +
+
+../_images/IMAGE_LogoMOREnergyLab.png + +
+
+

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/advanced_features.html b/main/most/advanced_features.html new file mode 100644 index 000000000..c19075875 --- /dev/null +++ b/main/most/advanced_features.html @@ -0,0 +1,521 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+

In this section, a more detailed look will be taken at some of the operational aspects of the new features introduced with MOST. Specifically, we will +focus on the pre-processing part in which all the data necessary for simulating Floating Offshore Wind Turbines (FOWT) and hybrid platforms are obtained. +For the simulation and post-processing part, please refer to the theory section of MOST (Theory) and the advanced features of WEC-Sim (Advanced Features).

+
+

MOST-IO

+

The pre-processing phase of MOST takes place through the use of the mostIO.m script in the ‘’mostData’’ subfolder, through which the following scripts +are launched (in this order):

+
    +
  • run_turbsim.m : creation of the data structure describing the input wind speeds;

  • +
  • Create_Mooring_Matrix.m : creation of the look-up table describing the mooring forces;

  • +
  • BladeData.m : creation of the data structure concerning the characteristics of the airfoils constituting the turbine blades;

  • +
  • WTproperties.m : creation of the data structure concerningo the geometric and inertial characteristics of the wind turbine;

  • +
  • Steady_States.m : computation of the steady-state values of certain quantities of interest when the average wind speed varies and used for the calculation of some quantities concerning the control logic;

  • +
  • Controller.m : creation of the data used to simulate the control logics (Baseline [D3] or ROSCO [D4])

  • +
  • AeroLoads.m : creation of the aerodynamic loads look-up table (acting on the blades root).

  • +
+

In the next subsections, MOST features will be discussed in detail, in particular, the settings to be provided to obtain the required data and the +operations performed in the various codes will be explained.

+
+

Wind Features

+

Wind speed can be defined by choosing between the two options of the wind class:

+
    +
  • Constant wind conditions

  • +
  • Turbulent wind conditions

  • +
+

The constant wind speed is constant in time and space while the second option includes the temporal and spatial turbulence of the wind. Below is an +image of the Variant Subsystem through which one of the two wind options can be enabled.

+
+../_images/IMAGE_wind_Choice.png + +
+
+

+
+

The simulation of the wind turbine for turbulent wind conditions requires the generation of a look-up table which relates the temporal and spatial +variation of wind speed on the wind turbine rotor plane (yz plane). Therefore the wind speed is discretized for 3 variables (2 spatial parameters, +y and z, and the time). The look-up table is generated using run_turbsim.m which computes turbulent wind field based on Turbsim +executable. Mean wind speed can be defined in run_turbsim.m script, while other parameters can be set-up in the Turbsim_inputfile.txt file, +the main ones are:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

Description

NumGrid_Z

Vertical grid-point matrix dimension

NumGrid_Y

Horizontal grid-point matrix dimension

TimeStep

Time step [s]

AnalysisTime

Length of analysis time series [s]

UsableTime

Usable length of output time series [s]

HubHt

Hub height [m]

GridHeight

Grid height [m]

GridWidth

Grid width [m]

VFlowAng

Vertical mean flow (uptilt) angle [deg]

HFlowAng

Horizontal mean flow (skew) angle [deg]

TurbModel

Turbulence model (“IECKAI”=Kaimal, “IECVKM”=von Karman, “GP_LLJ”, “NWTCUP”, “SMOOTH”, “WF_UPW”, “WF_07D”, “WF_14D”, “TIDAL”)

IECstandard

Number of IEC 61400-x standard (x=1,2, or 3 with optional 61400-1 edition number)

IECturbc

IEC turbulence characteristic (“A”, “B”, “C” or the turbulence intensity in percent)

IEC_WindType

IEC turbulence type (“NTM”=normal, “xETM”=extreme turbulence, “xEWM1”=extreme 1-year wind, “xEWM50”=extreme 50-year wind, where x=wind turbine class 1, 2, or 3)

ETMc

IEC Extreme Turbulence Model “c” parameter [m/s]

WindProfileType

Wind profile type (“JET”;”LOG”=logarithmic;”PL”=power law;”H2L”=Log law for TIDAL spectral model;”IEC”=PL on rotor disk, LOG elsewhere)

RefHt

Height of the reference wind speed [m]

PLExp

Power law exponent [-]

Z0

Surface roughness length [m]

PC_UW

Hub mean u’w’ Reynolds stress

PC_UV

Hub mean u’v’ Reynolds stress

PC_VW

Hub mean v’w’ Reynolds stress

+

A detailed description of using Turbsim is given here [D2].

+

Aerodynamic wind loads calculation in the Simulink model requires the average wind speed for each blade. This is found by computing the average wind +speed for four discretized points along the blade length during the simulation. Relative wind speed for each blade is computed including the influence +of the horizontal hub speed and the pitch and yaw rotation of the hub.

+
+
+

Mooring Features

+

MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. Specifically, the mooring look-up table +simulates a mooring system consisting of a certain number of lines suspended between two points (anchor and fairlead) and angularly equispaced. +This option is based on the catenary equations similarly to the open-source code MAP++ [D1].

+

In the simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outpus (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called “moor_matrix” and created through the Create_Mooring_Matrix.m script, in which the following +variables are specified:

+
    +
  • Water density (kg/m^3): rho_water

  • +
  • Gravity acceleration (m/s^2): gravity

  • +
  • Water depth (m): depth

  • +
  • Mooring line diameter (m): d

  • +
  • Linear mass (kg/m): linear_mass

  • +
  • Number of lines: number_lines

  • +
  • Fairlead and anchor positions of the first line (m): nodes

  • +
  • Mooring lines unstretched length (m): L

  • +
  • Sectional stiffness (N): EA

  • +
  • Seabed friction coefficient: CB

  • +
+

In addition, the user can specify the domain of the look-up tables, specifically:

+
    +
  • Amplitude and discretisation along surge direction (m): X

  • +
  • Amplitude and discretisation along sway direction (m): Y

  • +
  • Amplitude and discretisation along heave direction (m): Z

  • +
  • Amplitude and discretisation around roll axis (rad): RX

  • +
  • Amplitude and discretisation around pitch axis (rad): RY

  • +
  • Amplitude and discretisation around yaw axis (rad): RZ

  • +
+

The code for generating the “moor_matrix” structure at first calculates the positions of the fairleads and anchors of the other lines, +in accordance with the specified number and in an angularly equispaced manner, after which, for each combination of the inputs (surge, +sway, heave, roll, pitch, and yaw) it calculates the new positions of the fairleads. Given these positions, for each line it performs a +numerical optimization by which the vertical force and the horizontal force (along the projection of the line in the xy plane) are +calculated. Specifically, by means of the typical catenary equations, it is possible to calculate (knowing the characteristics of a line) +the above-mentioned vertical and horizontal forces having as input the vertical and horizontal distances between the two ends of the +line, so, in this case the optimization procedure searches for forces such that the distances are as close as possible to those +specified. Once the vertical and horizontal forces are calculated for each line, the resulting force and torque in the global reference +frame are applied to the origin of the reference frame attached to the structure.

+
+
+

Wind Turbine Features

+

The wind turbine is modelled as a multi-body system including the tower, the nacelle, the hub, and the blades. The properties of each wind turbine component +are defined in two structures that can be generated using the provided BladeData.m and WTproperties.m MATLAB codes. In the first, the +variables concerning the blades are defined, specifically (see figure below for a better comprehension):

+
    +
  • Blade radius values for which other properties are defined: radius

  • +
  • Value, for each specified radius, of the pre-bending distance out of the rotor plane: BlCrvAC

  • +
  • Value, for each specified radius, of the pre-bending angle out of the rotor plane: BlCrvAng

  • +
  • Value, for each specified radius, of the pre-bending distance in the rotor plane: BlSwpAC

  • +
  • Value, for each specified radius, of the twist angle: twist

  • +
  • Value, for each specified radius, of the chord: chord

  • +
  • Index of the airfoil type corresponding to each specified radius: airfoil_index

  • +
  • Matrix containing, for each type of airfoil existing, the values of lift, drag and torque coefficients as a function of angle of attack: airfoil

  • +
+

The following figure [D9] shows some of the values mentioned above.

+
+../_images/IMAGE_blade_geom.png + +
+
+

+
+

In the second script, the geometric and inertial properties of the turbine components are defined. For each of them the mass and inertia are defined, +in addition, the following other variables must be entered (see figure below for a better comprehension):

+
    +
  • Tower offset position relative to sea water level (m): tower.offset

  • +
  • Tower height (m): tower.height

  • +
  • Tower relative center of mass (relative to tower offset) (m): tower.cog_rel

  • +
  • Nacelle relative center of mass (relative to tower top) (m): nacelle.cog_rel

  • +
  • Twr2Shft (deg): nacelle.Twr2Shft

  • +
  • Tilt angle (deg): nacelle.tiltangle

  • +
  • Overhang (m): hub.overhang

  • +
  • Hub height (m): hub.height

  • +
  • Hub radius (m): hub.Rhub

  • +
  • Precone angle (deg): hub.precone

  • +
  • Blades relative center of mass (relative to hub center) (m): blade.cog_rel

  • +
  • Blade discretization nodes to average the wind speed: blade.bladeDiscr

  • +
  • Generator efficiency: gen_eff

  • +
  • CAD file path

  • +
+
+../_images/IMAGE_geometry.png + +
+
+

+
+

Once these dimensions are known, the positions of the centre of mass of each component in the inertial reference frame are calculated (origin at sea +level and at the centre of the tower, as far as the horizontal plane is concerned), as well as the total mass and inertia.

+
+

Control Features

+

In MOST there is the possibility of using two different wind turbine control logics (Baseline [D3] and ROSCO [D4]) +and as explained in the Theory Manual the steps to be taken in order to obtain the data needed for their simulation are the calculation +of the stationary values and the calculation of the controller gains. The first task is performed by the script Steady_States.m in the subfolder +“Control”. Specifically, through this, the stationary values of power, rotor speed, thrust force, generator torque and collective blade pitch angle are computed +for both of the aforementioned control logics. The following variables must be specified in the script:

+
    +
  • Value of power produced under nominal conditions and under conditions where the wind speed is greater than the nominal one: Prated

  • +
  • Wind speed at which power begins to be produced (and therefore at which the generator torque becomes non-zero): v_cutin

  • +
  • Wind speed above which no power is produced, and the blades rotate to a safe position (feather condition): v_cutout

  • +
  • Rated first try wind speed, meaning that the actual wind speed (probably close to this) will be calculated later: v_rated_try

  • +
  • Rated first try rotor speed, meaning that the actual one (probably close to this) will be calculated later: omega_rated_try

  • +
  • Wind speed discretization, which indicates how many stationary values will be calculate: v_discr

  • +
  • Minimum allowed value of the rotor speed (setting used only for the calculation of stationary values related to the ROSCO controller): omega_min

  • +
  • Boundary wind speed value between zone 1.5 (zone with constant and equal to minimum rotor speed) and zone 2 (zone with optimal tip speed ratio), this value is used only for the ROSCO controller: vw_R2in_try

  • +
  • Ratio of the maximum allowed thrust to what there would be if no limits were imposed: max_Thrust_factor

  • +
+

The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal one (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is also the case of some turbine types for what concerns the ROSCO controller. +The first step performed in the code is the calculation of the actual nominal conditions (rated wind speed, rotor speed and blade pitch angle): by +means of a constrained optimisation, the values of wind speed, rotor speed and blade pitch angle are sought such that the first two are as close as +possible to those set for the first attempt, with the constraint of having a thrust not exceeding the maximum and a power output equal to the rated +one. In the case of the Baseline controller, the first constraint does not apply, in the case of the ROSCO controller, on the other hand, we first +calculate the nominal conditions without the thrust constraint, then calculate the maximum thrust by multiplying the nominal one by the thrust factor +defined in the settings and then repeat the calculation to find the correct nominal values. The optimisation relies on a function that calculates the +aerodynamic forces at the hub by solving the BEM (Blade Element Momentum) theory, for more information on how this function works see ([D6] , [D7]).

+

The second step, performed only in the case of ROSCO, involves finding the wind speed for which transition from zone 1.5 to zone 2 (see [D4]) occurs. +In both zones it is desired to maximize power, but in zone 1.5 is where there is the additional constraint of minimum rotor speed. Here, to maximize +power, the rotor speed would need to be less than the minimum rotor speed, and to partially compensate for the resulting power deficit, a blade pitch +angle greater than zero is used. The search for the frontier wind speed is done by an optimization that looks for the wind speed for which the +difference between the rotor speed that maximizes power without imposing constraints equals the minimum wind speed. To find the rotor speed that +maximizes power for a given wind speed, a second nested optimization is used.

+

Finally, the last step involves calculating the stationary values as the wind speed changes. It is performed by a constrained optimization through which +the rotor speed and blade pitch values are sought such that the power produced is maximized while maintaining it at or below the rated power and +respecting the maximum thrust limit. Once the rotor speed and blade pitch values have been found for each wind speed analysed, the steady-state +values of the other quantities of interest (power, thrust, and generator torque) are evaluated.

+

Once the steady-state values for the two control logics have been calculated, it is possible to build the data structures needed for controller +simulation by running the Controller.m script in the “Control” subfolder. In this script a few settings have to be defined, which can refer to +both logics or just the Baseline or ROSCO controller.

+

The common settings are as follows:

+
    +
  • Maximum allowable torque rate: torqueMaxRate

  • +
  • Maximum allowable blade pitch rate: thetaMaxRate

  • +
  • Values needed to define the state space used to filter the rotor speed before providing this as input to the controllers: omegaFilter

  • +
+

The settings only valid for ROSCO are:

+
    +
  • Natural frequency of the electric generator torque control loop: wn_C

  • +
  • Damping ratio of the electric generator torque control loop: csi_C

  • +
  • Natural frequency of the blade pitch control loop: wn_theta_ROSCO

  • +
  • Damping ratio of the blade pitch control loop: csi_theta_ROSCO

  • +
  • Constants used in the “Set Point Smoothing” module: kb and kt

  • +
  • Gain related to the velocity (along the surge) of the nacelle, used to control floating wind turbines: KV

  • +
  • Values needed to define the state space used to filter the wind speed before providing this as input to the controller: windFilter

  • +
  • Values needed to define the transfer function used to filter the nacelle speed before providing this as input to the controller: pitchFilter

  • +
  • Values needed to define the transfer function used as a filter in the “Set Point Smoothing” module: SPSFilter

  • +
+

The settings only valid for Baseline are:

+
    +
  • Natural frequency of the blade pitch control loop: wn_theta_BL

  • +
  • Damping ratio of the blade pitch control loop: csi_theta_BL

  • +
+

Regarding the Baseline controller, at the operational level, the torque law is simply computed by creating a biunivocal relationship between the +steady-state (as wind speed changes) values of rotor speed and generator torque. As for the blade pitch loop, at first the value of +\(K_P^\prime\) and \(K_I^\prime\) are calculated (see Baseline), after which the power to pitch sensitivity, as a function of blade pitch angle, +is computed for each stationary point. To do this centered finite differences are used by calculating power via a function that solves the +aerodynamics via BEM theory. Finally, we perform quadratic regression of \(\frac{dP}{d\theta_{bl}}\) so that we have, in simulation, a simple +relationship between blade pitch and power-to-pitch sensitivity.

+

As for the ROSCO controller, however, at the operational level, in the script the \(A\) and \(B_{\theta_{bl}}\) matrices are calculated for +each wind speed for which stationary values were computed through centered finite differences; regarding the \(B_{T_{gen}}\) matrix, it is +calculated only once since it is constant (see ROSCO). Once the matrices are known, the values of \(K_P\) and \(K_I\) for the two controls (generator +torque and blade pitch) are calculated. Finally, the minimum allowable blade pitch value is calculated using an optimization procedure; specifically, +for each wind speed in region 3 (a rotor speed equal to the nominal one is assumed in this region), the blade pitch angle such that the maximum thrust +occurs is found. It represents the minimum angle value that can be imposed, below which there will be a thrust greater than the maximum allowed.

+
+
+

Aerodynamic Loads Features

+

The look-up tables of aerodynamic loads are generated using the AeroLoads.m script; the aerodynamic forces and torques are calculated as a function +of three input parameters: the wind speed, the difference between the rotor speed and the stationary rotor speed for that wind speed, and the difference +between the blade pitch angle and the steady-state angle for that wind speed. In order to calculate the required look-up tables, the user will need to +define the following variables:

+
    +
  • Rotor speed discretization values: o_discr

  • +
  • Blade pitch discretization values: theta_discr

  • +
  • Discretization range of rotor speed values around steady-state one (rad/s): o_A

  • +
  • Discretization range of blade pitch values around steady-state one (rad): theta_A

  • +
+

The discretisation range is used to determine the aerodynamic loads near the steady states, which include all cases that are likely to be reached during +operating conditions.

+
+
+
+

References

+
+
+
+[D1] +

Preprint M Masciola, J Jonkman, and A Robertson. Implementation of a multisegmented, quasi-static cable model.

+
+
+[D2] +

Neil Davis Kelley and Bonnie J Jonkman. Overview of the turbsim stochastic inflow turbulence simulator. Technical Report, National Renewable Energy Lab.(NREL), Golden, CO (United States), 2005.

+
+
+[D3] +(1,2) +

Morten H. Hansen. Control design for a pitch-regulated, variable speed wind turbine. Risø National Laboratory, 2005. ISBN 8755034098.

+
+
+[D4] +(1,2,3) +

Nikhar J Abbas, Daniel S Zalkind, Lucy Pao, and Alan Wright. A reference open-source controller for fixed and floating offshore wind turbines. Wind Energy Science, 7(1):53–73, 2022.

+
+
+[D5] +

Evan Gaertner, Jennifer Rinker, Latha Sethuraman, Frederik Zahle, Benjamin Anderson, Garrett Barter, Nikhar Abbas, Fanzhong Meng, Pietro Bortolotti, Witold Skrzypinski, George Scott, Roland Feil, Henrik Bredmose, Katherine Dykes, Matt Shields, Christopher Allen, and Anthony Viselli. Definition of the iea wind 15-megawatt offshore reference wind turbine technical report. 2020.

+
+
+[D6] +

S Andrew Ning. A simple solution method for the blade element momentum equations with guaranteed convergence. Wind Energy, 17(9):1327–1345, 2014.

+
+
+[D7] +

S A Ning, G Hayman, R Damiani, and J Jonkman. Development and validation of a new blade element momentum skewed-wake model within aerodyn: preprint. 2015.

+
+
+[D8] +

Christopher Allen, Anthony Viselli, Habib Dagher Andrew Goupee, Evan Gaertner, Nikhar Abbas, Matthew Hall, and Garrett Barter. Definition of the umaine volturnus-s reference platform developed for the iea wind 15-megawatt offshore reference wind turbine technical report. 2020.

+
+
+[D9] +

J M Jonkman, G J Hayman, B J Jonkman, R R Damiani, and R E Murray. Aerodyn v15 user's guide and theory manual.

+
+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/index.html b/main/most/index.html new file mode 100644 index 000000000..d775707d3 --- /dev/null +++ b/main/most/index.html @@ -0,0 +1,196 @@ + + + + + + + + + MOST Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/introduction.html b/main/most/introduction.html new file mode 100644 index 000000000..6e127d7c5 --- /dev/null +++ b/main/most/introduction.html @@ -0,0 +1,211 @@ + + + + + + + + + Introduction — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Introduction

+

With MOST, it is possible to simulate Floating Offshore Wind Turbines (FOWTs) and hybrid platforms thanks to the development of a wind turbine model which can be coupled with the WEC-Sim library. MOST requires several user inputs similar to WEC-Sim including hydrodynamic bodies requiring hydrodynamic coefficients from Boundary Element Method (BEM) software (e.g. Nemoh, Wamit or Ansys Aqwa), mooring, constraints, and simulation input details. Differently to WEC-Sim, MOST also includes user inputs relative to the wind turbine and wind, which will be explained in the next sections.

+

Numerical codes added to WEC-Sim are the following:

+ + + + + + + + + + + + + + + + + + +

File Type

File name

Pre-processing Executables

mostIO.m, run_turbsim.m, Create_Mooring_Matrix.m, BladeData.m, WTproperties.m, Steady_States.m, Controller.m and AeroLoads.m

Post-Processing Functions

userDefinedFunction.m

New MATLAB Classes

windClass.m and windTurbineClass.m

MOST Simulink Library

MOST_Lib.slx

+

The pre-processing executables and post-processing function can be found in the WEC-Sim Applications MOST example while the new classes and Simulink library have been added to the WEC-Sim source directly.

+

Existing WEC-Sim source code has also been modified to include further option features relative to the new capabilities. The following codes have been modified:

+ + + + + + + + + + + + + + + +

File name

Description

initializeWecSim

Modified to add functions relative to the wind, wind turbine, and new mooring blocks. New functions are created in each relative class to read data prepared during the pre-processing by the user. Control parameters are also added to give user choice of which control logic to be used.

mooringClass

It is now also possible to calculate mooring loads (static loads) using non-linear look-up tables computed during pre-processing and with system displacements as input. Compared to previous versions, the mooringClass now also has a function by means of which look-up tables are loaded from a file whose name is the new property called “lookupTableFile”.

postProcessWecSim + responseClass

Modified to add wind turbine results in the WEC-Sim output structure. Examples of new outputs are the timeseries of wind turbine power, rotor speed, blade pitch, and nacelle acceleration.

+

The following diagram summarizes the workflow for the simulation of wave energy converters, which has now been updated to include the simulation of floating offshore wind turbines or hybrid devices. The portions of the code introduced with MOST are highlighted in grey, the portions executed by WEC-Sim codes in green, and what is carried out by external software in yellow.

+
+../_images/IMAGE_workflow.png + +
+
+

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/license.html b/main/most/license.html new file mode 100644 index 000000000..f394b9801 --- /dev/null +++ b/main/most/license.html @@ -0,0 +1,374 @@ + + + + + + + + + License — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

License

+

The software is distributed under the Apache License 2.0.

+ +
+

Apache License 2.0

+
                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/overview.html b/main/most/overview.html new file mode 100644 index 000000000..25cfd0aab --- /dev/null +++ b/main/most/overview.html @@ -0,0 +1,184 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

MOST (Matlab for Offshore Simulation Tool), is a simulation tool operating in the WEC-Sim environment for simulating floating offshore wind turbines, hybrid wind-wave energy converters, platforms with multiple turbines, etc. +MOST builds on WEC-Sim in MATLAB/Simulink to add windClass and windTurbineClass objects that can define a given turbine and weather conditions. +Currently, MOST supports single-tower, three-bladed, horizontal-axis wind turbines controlled by Baseline or ROSCO controllers and providing geometric and inertial data as input.

+
+

MOST Developers

+

MOST is developed and maintained by the MORE Energy Lab, Politecnico di Torino, Italy. +The WEC-Sim+MOST coupling is a collaboration between the MORE Energy Lab and the WEC-Sim developers at Sandia National Laboratories and the National Renewable Energy Lab.

+

Current members of the MOST development team include:

+
    +
  • Giovanni Bracco (PI)

  • +
  • Emilio Faraggiana

  • +
  • Alberto Ghigo

  • +
  • Davide Issoglio

  • +
  • Ermando Petracca

  • +
  • Massimo Sirigu

  • +
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/publications.html b/main/most/publications.html new file mode 100644 index 000000000..8a4e9639e --- /dev/null +++ b/main/most/publications.html @@ -0,0 +1,169 @@ + + + + + + + + + Publications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Publications

+

[1] M. Sirigu, E. Faraggiana, A. Ghigo, G. Bracco, “Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody” Journal of Physics: Conference Series. Vol. 2257. No. 1. IOP Publishing, 2022.

+

[2] E. Faraggiana, M. Sirigu, A. Ghigo, G. Bracco, G. Mattiazzo, “An efficient optimisation tool for floating offshore wind support structures.” Energy Reports 8 (2022): 9104-9118..

+

[3] M. Sirigu, E. Faraggiana, A. Ghigo, E. Petracca, G. Bracco, G. Mattiazzo. “Development of a simplified blade root fatigue analysis for floating offshore wind turbines.” Trends in Renewable Energies Offshore (2022): 935-941..

+

[4] Faraggiana, E., et al. “An optimal design of the Hexafloat floating platform for offshore wind turbines.” Trends in Renewable Energies Offshore: Proceedings of the 5th International Conference on Renewable Energies Offshore (RENEW 2022, Lisbon, Portugal, 8–10 November 2022). CRC Press, 2022.

+

[5] Petracca, Ermando, et al. “Design and techno-economic analysis of a novel hybrid offshore wind and wave energy system.” Energies 15.8 (2022): 2739.

+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/release_notes.html b/main/most/release_notes.html new file mode 100644 index 000000000..47967de1a --- /dev/null +++ b/main/most/release_notes.html @@ -0,0 +1,194 @@ + + + + + + + + + Release Notes — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Release Notes

+
+

MOST v1.0.0 (within WEC-Sim v6.0)

+

New Features

+
    +
  • Addition of the windClass object

  • +
  • Addition of the windTurbineClass object

  • +
  • Addition of the MOST library

  • +
  • Release of a WEC-Sim+MOST Application

  • +
+
+
+

Citing MOST

+

When using MOST with WEC-Sim, please cite the following MOST publication in addition to the WEC-Sim software release and publication:

+
@inproceedings{sirigu2022development,
+  title={Development of MOST, a fast simulation model for optimisation of floating offshore wind turbines in Simscape Multibody},
+  author={Sirigu, M and Faraggiana, E and Ghigo, A and Bracco, G},
+  booktitle={Journal of Physics: Conference Series},
+  volume={2257},
+  number={1},
+  pages={012003},
+  year={2022},
+  organization={IOP Publishing}
+}
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/most/theory.html b/main/most/theory.html new file mode 100644 index 000000000..95259467c --- /dev/null +++ b/main/most/theory.html @@ -0,0 +1,560 @@ + + + + + + + + + Theory — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Theory

+

In this section, the features introduced with MOST will be explored, offering some theoretical background to understand their use. +To do this, the workflow shown in the Introduction will be followed: Pre-processing, User Inputs, Simulation, +and Post-processing.

+
+

Pre-processing

+

In the pre-processing phase, it is possible to create all the data required for the simulation (except the hydrodynamic coefficients) by +launching the mostIO.m script, which will call up other codes, each dedicated to specific data (e.g. wind turbine, control, or mooring) +and described in this section. As with other WEC-Sim examples, the bemio.m script should still be used to load the hydrodynamic coefficient data.

+
+

Mooring look-up table

+

MOST allows for simulation of a mooring look-up table to model a quasi-static, non-linear mooring system. +Specifically, the mooring look-up table simulates a mooring system consisting of a certain number of lines suspended between two points +(anchor and fairlead) and angularly equally spaced. This option is based on the catenary equations similarly to the open-source code MAP++ [D1]. +In the Simulink model, forces and torques due to moorings are determined through 6 different look-up tables having the 6 degrees of freedom surge, +sway, heave, roll, pitch, and yaw as inputs. The breakpoints (related to the inputs) and the outputs (Fx, Fy, Fz, Mx, My and Mz, i.e., the mooring +loads) are contained within a data structure called “moor_matrix” and created through the Create_Mooring_Matrix.m script.

+
+
+

Wind input

+

This section describes how the input wind field is generated; there are two possible methods: to have constant wind speed (in time and space) or to +have a wind speed field in which turbulence and non-uniform spatial distribution are taken into account. It is possible to specify wind method in wecSimInputFile.m by initializing the windClass with “constant” or “turbulent”. +In the first case there will be a constant wind speed at all times and at every point on the rotor area, while the second case considers the spatial +and temporal turbulence of the wind. Regarding the second case, the scatter of the wind speed is obtained using an external code, Turbsim, developed +by NREL, and integrated within the MOST code. The user can launch the run_turbsim.m script (in “turbsim” subfolder) to create the wind input data +structure, specifying some properties such as mean velocity and turbulence intensity. For more information, it is recommended to read the Advanced Features or the +documentation of TurbSim [D2]. The resulting data structure consists of the wind speed +(in the surge direction) at each instant and for each node of a spatial grid covering the rotor area. During the simulation, the wind speed +corresponding to the blade nodes will be obtained by interpolating between the grid points via look-up tables.

+
+
+

Wind turbine properties

+

All wind turbine components are modelled as rigid bodies; this includes the tower, the nacelle, the hub, and the blades. The inertial and geometrical +properties of the components must be defined in a MATLAB structure, the user can use the script WTproperties.m (“turbine_properties” subfolder) to write the parameters of the +desired wind turbine. In particular, mass, moment of inertia, centre of mass relative to the reference, and centre of mass in the global reference +frame (whose origin is at the sea water level) are defined for each body. In addition, other parameters such as tilt and precone angles, tower +height, electrical generator efficiency, and CAD file names are set. The CAD files to define the geometry can be imported from external software. +They must be saved in the folder “geometry”. The user must set the name of the CAD files in “WTcomponents” struct to allow MOST to upload the files.

+../_images/IMAGE_geometry.png + +
+

+
+

In addition to the general characteristics of the wind turbine, the user must set the specific properties for the blades by launching the BladeData.m +script, which defines the needed data structure by taking the information from some text files in the “BladeData” subfolder. In these, lift, drag, and +torque coefficients are specified for each type of airfoil used, as well as certain geometric characteristics of the blades such as twist angle and +chord length as a function of radius and geometric characteristics related to pre-bending.

+
+
+

Control properties

+

This section explains how the MOST controller characteristics to be used in simulations are calculated. As mentioned earlier, it is possible to choose +between two control logics (Baseline [D3] and ROSCO [D4]), and, for the creation of the data required for the +simulation, it is necessary to know the steady-states values, i.e. the stationary values of certain quantities of interest when varying, in this case, +the wind speed, which is considered constant for this purpose. The first step in obtaining the data required for the simulation is therefore to run +the script called Steady_States.m in the subfolder “control” to perform this calculation. Specifically, through this, the stationary values +of power, rotor speed, thrust force, generator torque, and blade pitch angle are computed for both of the aforementioned control logics. +The script calculates different stationary values according to the control logic because of their diversity. Specifically, only the ROSCO controller +imposes an upper limit for the thrust force, so when the wind speed is close to the nominal wind speed (where the force peak occurs), the blade pitch +value will be slightly higher to reduce the thrust and comply with the imposed limits. The second difference is that in the Baseline controller, no +minimum rotor speed is imposed, which is the case for some turbine types in the ROSCO case.

+

Below is a figure representing an example of steady-state values for Baseline and ROSCO controllers for the IEA 15 MW reference wind turbine [D5].

+../_images/IMAGE_Steady_States.png + +
+

+
+

In the following, the Baseline and ROSCO control logics will be briefly explained; for more information refer to [D3] (Baseline) +and [D4] (ROSCO).

+
+

Baseline

+

Baseline is a conventional, variable-speed, variable collective pitch controller, which is made up of two independent systems:

+
    +
  • A generator torque controller (consisting of a generator speed-torque law) designed to maximize power extraction below nominal wind speed

  • +
  • A blades collective pitch controller designed to regulate rotor and generator speed above nominal wind speed

  • +
+
+
Generator torque controller
+

The generator-torque control law is designed to have three main regions and two transition ones between them. Aerodynamic torque acts as an +accelerating load, the generator torque, converting mechanical energy to electrical energy, acts as a braking load. The generator torque is computed +as a tabulated function of the filtered generator speed, incorporating 4 operational control regions: 1, 1.5, 2, and 3.

+
    +
  • Region 1: control region before cut-in wind speed, where the generator is detached from the rotor to allow the wind to accelerate the rotor for start-up. In this region, the generator torque is zero and no power is extracted from the wind.

  • +
  • Region 1.5: transition region called start-up region and permits a smooth transition between null and optimal torque.

  • +
  • Region 2: control region where extracted power is maximized. Here, to maintain the tip speed ratio constant at its optimal value, the generator torque is proportional to the square of the filtered generator speed. Aerodynamic torque can be expressed as:

    +
    +\[T_{\text {aero }}=\frac{1}{2} \rho \pi \frac{R^5}{\lambda^3} C_P\left(\lambda, \theta_{\text {bl }}\right) \cdot \Omega^2=k_{\text {opt }} \cdot \Omega^2\ \ \ \ \ \ (1)\]
    +

    Where \(k_{opt}\) is obtained with TSR (Tip Speed Ratio, \(λ\)) and blade pitch values that lead to maximum power coefficient: \(λ = λ_{opt}\), \(\theta_{bl} = 0^{\circ}\);

    +
  • +
  • Region 3: above rated condition region, where the generator torque is kept constant at its rated value. In this region pitch control is active to maintain rotor speed at its rated value.

  • +
+

The figure below shows an example of control law of the Baseline generator torque controller for the IEA 15 MW reference wind turbine [D5].

+../_images/IMAGE_Baseline_Torque_Law.png + +
+

+
+
+
+
Blade pitch controller
+

Regarding the blade pitch controller, it regulates the generator speed in region 3 (where wind speed exceeds its rated value) to maintain it at its nominal +value through a scheduled proportional-integral control (PI). In this region the torque is kept constant at its rated value (\(T_{gen} = T_{gen,r} = P_{r} / \Omega_{r}\)). +Aerodynamic torque \(T_{\mathrm{aero\ }}\) depends on wind speed, rotor speed and blade pitch, but assuming in this region rotor speed maintains +its rated value \(\Omega_r\) (this assumption can be made since the control objective is to track that value) and neglecting power to +wind speed sensitivity, linearization around rated condition is:

+
+\[ \begin{align}\begin{aligned}\begin{split}T_{\text {aero }} \approx T_{\text {aero }}\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)+\left.\frac{d T_{\text {aero }}\left(U_{\text {wind }}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\substack{U_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r}}\left(\theta_{b l}-\theta_{b l, r}\right)=\end{split}\\\begin{split}=\frac{P\left(U_{\text {wind}, r}, \Omega_r, \theta_{b l, r}\right)}{\Omega_r}+\left.\frac{1}{\Omega_r} \frac{d P\left(U_{\text {wind}}, \Omega, \theta_{b l}\right)}{d \theta_{b l}}\right|_{\begin{array}{c} \theta_{\text {wind }}=U_{\text {wind}, r} \\ \Omega=\Omega_r \end{array}}\left(\theta_{b l}-\theta_{b l, r}\right)\ \ \ \ \ \ (2)\end{split}\end{aligned}\end{align} \]
+

where \(U_{wind,r}\) and \(\theta_{bl,r}\) are rated wind speed and blade pitch. Once first is chosen, \(\theta_{bl,r}\) is which one leads to a steady state +condition with extracted power equal to the rated one. So, aerodynamic torque expression becomes:

+
+\[T_{\mathrm{aero\ }}\approx\ \frac{P_r}{\Omega_r}+\frac{1}{\Omega_r}\frac{dP}{d\theta_{bl}}\Delta\theta_{bl}\ \ \ \ \ \ (3)\]
+

Where \(\Delta \theta _{bl}\) represents a small perturbation of the blade pitch angle about its linearization point \(\theta_{bl,r}\). By +expressing the blade-pitch regulation starting from the speed perturbation with a proportional-integrative control law (PI), it is possible to write:

+
+\[\Delta \theta_{b l}=K_P \Delta \Omega+K_I \int_0^t \Delta \Omega d t\ \ \ (4)\]
+

Where \(K_P\) is the proportional gain and \(K_I\) the integrative gain; \(\Delta\Omega\) represents a small perturbation of rotor speed about its rated value: +\(\Delta\Omega=\ (\Omega-\Omega_r)\). Combining last equations found with the equilibrium equation of the rotor around its rotation axis +\((T_{\mathrm{aero\ }}-\ T_{\mathrm{gen\ }}= I_{\mathrm{eq\ }}\dot{\Omega})\), it is possible to obtain, once defined \(\Delta\Omega=\ \dot{\delta}\), +the following relation:

+
+\[\frac{P_r}{\Omega_r}+\frac{1}{\Omega_r} \frac{d P}{d \theta_{b l}}\left(K_P \dot{\delta}+K_I \delta\right)-\frac{P_r}{\Omega_r}=I_{e q} \ddot{\delta}\ \ \ (5)\]
+

Which can be rearranged as:

+
+\[I_{e q} \ddot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_P}{\Omega_r}\right] \dot{\delta}+\left[-\frac{d P}{d \theta_{b l}} \frac{K_I}{\Omega_r}\right] \delta=0\ \ \ (6)\]
+

That in the canonical form becomes:

+
+\[M \ddot{\delta}+C \dot{\delta}+K \delta=0 \ \ \ \ (7)\]
+

With: \(\ M= I_{eq}\), \(\\C= \left[-\frac{dP}{d\theta_{bl}}\frac{K_P}{\Omega_r}\right]\), \(\\K=\left[-\frac{dP}{d\theta_{bl}}\frac{K_I}{\Omega_r}\right]\)

+

Now it is possible to choose proportional and integral gains in order to obtain desired characteristics of the blade pitch control. Its characteristics +directly depend on natural frequency and damping ratio:

+
+\[\omega_n=\sqrt{\frac{M}{K}}\ \ ,\ \ \ \ \ \ \zeta=\frac{C}{2M\omega_{n\ }}\ \ \ \ \ \ (8)\]
+

Once defined \(\omega_{n}\) and \(\zeta\), expressions of proportional and integral gains become:

+
+\[K_P=\frac{2\ I_{eq}{\ \omega}_n\ \zeta{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_P^\prime}{\frac{dP}{d\theta_{bl}}}\ ,\ \ \ \ \ \ \ K_I=\frac{I_{eq\ }\omega_n^2{\ \Omega}_r}{-\ \frac{dP}{d\theta_{bl}}}=\ \frac{K_I^\prime}{\frac{dP}{d\theta_{bl}}}\ \ \ \ \ \ \ \ \ \ (9)\]
+

The term \(\frac{dP}{d\theta_{bl}}\) is the power to pitch sensitivity, which depends on wind speed and blade pitch (related each other as previously +mentioned) adopted during linearization. So, to always have the same system characteristic (\(\omega_n\) and \(\zeta\)), proportional and integral +gains must vary with a variation of blade pitch and so of wind speed. Figure below shows power to pitch sensitivity with respect to blade pitch; as can be +seen there, it can be well approximated with a quadratic regression, through which quadratic form that minimize sum of square error is computed. Thanks to +this regression, power to pitch sensitivity expression becomes of the form:

+
+\[\frac{dP}{d\theta_{bl}}\ \approx\ c_1{\theta_{bl}}^2+c_2\theta_{bl}+c_3\ \ \ \ \ \ (10)\]
+

\(\frac{dP}{d\theta_{bl}}\) is the power to pitch sensitivity and \(c_1 (W/{deg}^3)\), \(c_2 (W/{deg}^2)\) and \(c_3 (W/deg)\) are the +coefficients of its quadratic regression.

+../_images/IMAGE_Baseline_PowerToPitch_Sensitivity.png + +
+

+
+

This approximation will make the calculation of controller gains computationally less demanding during simulation.

+
+
+
+

ROSCO

+

ROSCO controller (Reference Open-Source COntroller for fixed and floating offshore wind turbines) was developed by researchers at the Delft University +of Technology [D4] to provide a modular reference wind turbines controller that represent industry standards and performs comparably +or better than existing reference controllers, such as baseline, discussed in previous section. The primary functions of the controller are still to +maximize power in below-rated operations and to regulate rotor speed in above-rated ones, moreover, it also provides additional modules which can improve +control performances. ROSCO controller, as well as Baseline and most of other conventional ones, consists of two methods of actuation: generator torque +and collective blade pitch. Strategies of actuation are commonly separated into four main regions, with transition logic between them. Regions 1 and 4 +correspond to below cut-in and above cut-out wind speed conditions, these regions are generally out of interest for standard control purposes (performances +optimization) and so they will not be further discussed below. In region 1 generator torque is set to zero to allow the wind to accelerate the rotor for +start-up. In this region, no power is extracted. In region 4 blades are pitched to reduce thrust force to zero (feathering position).

+../_images/IMAGE_ROSCO_Power_Curve.png + +
+

+
+

Control strategies for regions 1.5, 2 and 3 are highly like those ones adopted in Baseline control. Region 2 is when wind speed is below rated condition, +here main goal is power extraction maximization. To do so, two methods can be used, a quadratic law (as in Baseline controller) of generator torque with +respect to rotor angular speed or a tip speed ratio (TSR) tracking to maintain the latter at its optimal value (in this case a wind speed estimation is needed). +Region 3 is when wind speed is above rated condition, here blade pitch is regulated to maintain rotor speed at its rated value and to stabilize platform (for +offshore floating wind turbines, through floating feedback module), while generator torque is kept constant at its rated value. Region 1.5 is a transition +region from cut-in wind speed and region 2. Here generator torque is regulated to maintain a defined minimum rotor speed and blades are pitched to compensate +resulting high values of TSR to improve power extraction.

+
+
ROSCO Implementation
+

Controller implementation starts from aerodynamic torque (\(T_{aero}\)) expression and rotor equilibrium equation:

+
+\[T_{aero}=\frac{1}{2}\ \rho\ A_D\ C_P\ (\lambda,\theta_{bl})\ \frac{{U_\infty}^3\ }{\Omega}\ \ \ \ \ \ (11)\]
+
+\[\dot{\Omega}=\frac{T_{\mathrm{aero\ }}-\ T_{gen}\ }{I_{\mathrm{eq\ }}}\ \ \ \ \ \ (12)\]
+

\(I_{\mathrm{eq\ }}\) is the rotor inertia, \(\rho\) is the air density, \(A_D\) is the rotor area, \(C_P\) is the power coefficient +and \(U_\infty\) is the undisturbed wind speed. The first-order linearization of eq 11 at some nominal steady-state operational point is:

+
+\[\begin{split}\Delta T_{aero}=\Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.\ \Delta\Omega+\Gamma_{\theta_{bl}}\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta\theta_{bl}+\Gamma_U\left|\begin{matrix}\ \\op\ \\\end{matrix}\right.\Delta U\ \ \ \ \ \ (13)\end{split}\]
+

With: \(\ \ \ \Gamma_\Omega\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\Omega\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.,{\ \ \ \ \ \Gamma}_{\theta_{bl}}\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial\theta_{bl}\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\mathrm{,\ \ \ \ \ \ \ }\Gamma_U\left|\begin{matrix}\ \\op\\\end{matrix}\right.=\partial T_{aero}/\partial U\ \left|\begin{matrix}\ \\op\\\end{matrix}\right.\)

+

“op” denotes the steady-state operational point at which linearization is made. Equation 12 can then be rewritten as (Δ denotes the perturbation from +steady state value “op” and \(\left \{ X_{op}=\lambda_{op},\\\ \theta_{bl, op} \right \}\)):

+
+\[\Delta \dot{\Omega}=A\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \Omega+B_{T_{g e n}} \Delta T_{g e n}+B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta \theta_{b l}+B_U\left(\boldsymbol{X}_{\mathrm{op}}\right) \Delta U\ \ \ \ \ \ (14)\]
+

With:

+
+\[\begin{split}A\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{I_{\mathrm{eq}}} \frac{\partial T_{\text {aero }}}{\partial \lambda} \frac{\partial \lambda}{\partial \Omega} \\\end{split}\]
+
+\[\begin{split}\frac{\partial T_{\text {aero }}}{\partial \lambda}=\frac{1}{2} \rho A_{\mathrm{D}} R U_{\mathrm{op}}^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \lambda} \lambda_{\mathrm{op}}-C_{\mathrm{p}, \mathrm{op}}\right) \\\end{split}\]
+
+\[\begin{split}\frac{\partial \lambda}{\partial \Omega}=\frac{R}{U_{\mathrm{op}}}, \quad\left(\lambda=\frac{\Omega R}{U}\right) \\\end{split}\]
+
+\[\begin{split}B_{T_{g e n}}=-\frac{1}{I_{\mathrm{eq}}} \\\end{split}\]
+
+\[B_{\theta_{b l}}\left(\boldsymbol{X}_{\mathrm{op}}\right)=\frac{1}{2 I_{\mathrm{eq}}} \rho A_{\mathrm{D}} R U_{\mathrm{op}}{ }^2 \frac{1}{\lambda_{\mathrm{op}}^2}\left(\frac{\partial C_{\mathrm{p}}}{\partial \theta_{b l}} \lambda_{\mathrm{op}}\right)\]
+

All derivatives are calculated at “op” conditions; \(\Delta U\), difference between actual wind speed and wind speed at linearization point, is considered +equal to zero during control tuning, that is computation of control gains. Both generator torque and blade pitch controllers are PI controllers, generically +defined as:

+
+\[y = K_P \ u + K_I \int_{0}^{T} u\ dt\ \ \ \ \ \ (15)\]
+

Where \(u\) represents the input and \(y\) the output, while \(K_P\) and \(K_I\) are respectively the proportional and integral gains. Generator torque +controller has as input and output:

+
+\[u=-\delta\Omega\ ,\ \ \ y=\Delta C_{gen}\ \ \ \ \ \ (16)\]
+

Blade pitch controller has as input and output:

+
+\[u=-\delta\Omega,\ \ \ y=\Delta\theta_{bl}\ \ \ \ \ \ (17)\]
+

\(\delta\Omega\) is defined as a perturbation from the reference speed:

+
+\[\Omega(t)=\Omega_{\mathrm{ref\ }}+\delta\Omega\longrightarrow-\delta\Omega=\Omega_{ref}-\Omega(t)\ \ \ \ \ \ (18)\]
+

While \(\Delta C_{gen}\) and \(\Delta\theta_{bl}\) are perturbations from steady state values:

+
+\[\theta_{bl}(t)={\theta_{bl}}_{\mathrm{op\ }}+\Delta\theta_{bl},{\ \ \ \ C}_{gen}(t)={C_{gen}}_{op}+\Delta C_{gen}\ \ \ \ \ \ (19)\]
+

Now, defining \(\Delta \Omega_{ref} =\Omega_{ref}-\Omega_{op}\) (assumed =0, since “op” point is chosen at a steady state condition with +\(\Omega_{op}=\Omega_{ref}\)), we can combine equation 14 with above definitions to obtain a differential equation that relates +\(\Delta \Omega =\Omega-\Omega_{op}\) and \(\Delta \Omega_{ref}\). Then, if the Laplace transform of this equation is considered, we arrive +to two closed-loop transfer functions (one for the generator torque module and the other for the blade pitch one) in the form:

+
+\[H(s)=\frac{\Delta \Omega(s)}{\Delta \Omega_{\mathrm{ref}}(s)}=\frac{B\left(K_P\left(x_{\mathrm{op}}\right) s+K_I\left(x_{\mathrm{op}}\right)\right)}{s^2+\left(B K_P\left(x_{\mathrm{op}}\right)-A\left(x_{\mathrm{op}}\right)\right) s+B K_I\left(x_{\mathrm{op}}\right)}\ \ \ \ \ \ (20)\]
+

Where \(B\) is \(B_{T_{gen}}\) or \(B_{\theta_{bl}}\), depending on which module is considered, since when generator torque loop is +considered, \(\Delta\theta_{bl}\) is set to zero and, when blade pitch loop is considered, \(\Delta T_{gen}\) can be equal to zero or +\(B_{T_{gen}}\) can be englobed in \(A\). Moreover, in both cases we consider \(\Delta U=0\). \(H(s)\) is a simple second order +system whose characteristics are strictly related to natural frequency and damping ratio of its canonical form. They can be defined, in order to +reach desired performance, choosing values of proportional and integral gains. If we call \(\omega_n\) the natural frequency and \(\zeta\) +the damping ratio, \(K_P\) and \(K_I\) expressions (varying with operational steady state point) are:

+
+\[K_P=\frac{1}{B\left(\boldsymbol{x}_{\mathrm{op}}\right)}\left(2 \zeta \omega_n+A\left(\boldsymbol{X}_{\mathrm{op}}\right)\right)\ \ \ \ \ \ (21)\]
+
+\[K_I=\frac{\omega_{\mathrm{n}}^2}{B\left(\boldsymbol{X}_{\mathrm{op}}\right)}\ \ \ \ \ \ (22)\]
+

Once transfer function of generator torque and blade pitch closed loop has been defined, and once way through which PI controllers’ gains are computed +has been explored, we can focus, specifically, on the two different modules to investigate the reference speed signals adopted and how the scheduling +of gains is performed, varying according to the conditions in which the system is.

+
+
+
Generator Torque Controller
+

Four different generator torque controllers are available in ROSCO, they are the possible combination between two methods for below wind speed operations +and two methods for above wind speed conditions. Regarding below rated operations, to maximize extracted power at each wind condition, a quadratic low +of generator torque with respect to rotor angular speed can be adopted. In this section we omit exploitation of this method since is the same adopted +in Baseline controller. Alternatively, a tip speed ratio tracking to maintain it at its optimal value can be adopted. If the wind speed can be measured +or estimated accurately, a generator torque controller can be designed to maintain the \(\lambda_{opt}\) and maximize power capture, so reference +rotor angular speed becomes:

+
+\[{\Omega_{ref}}_\tau=\frac{\lambda_{opt}\ \hat{U}}{R}\ \ \ \ \ \ (23)\]
+

Where subscript \(\tau\) indicates the reference speed of torque controller and \(\hat{U}\) is the estimated wind speed. From equations 14, 21 +and 22, it can be seen that integral gain \(K_I\) of generator torque controller is constant, whereas \(A\), so proportional gain \(K_P\), +are both dependent on \(U\) (wind speed). However, it was found that fixing \(K_P = K_P (U = Urated)\) does not negatively affect power production. +Regarding the two existing methods for above rated conditions, first of them considers a constant generator torque, defined as:

+
+\[T_{gen,ar}(t)=\ T_{rated}=\frac{P_{\mathrm{rated\ }}}{\Omega_{rated}}\ \ \ \ \ \ (24)\]
+

Where subscript “ar” means “above rated”. On the other hand, the second strategy considers a constant extracted power equal to its rated value, so +generator torque is defined as:

+
+\[T_{gen,ar}(t)=\frac{P_{\mathrm{rated\ }}}{\Omega}\ \ \ \ \ \ (25)\]
+
+
+
Blade Pitch Controller
+

Main goal of blade pitch controller is keeping rotor angular speed at its rated value, so reference speed is (both in below rated and above rated +conditions):

+
+\[\Omega_{\mathrm{ref\ },\theta_{bl}}=\Omega_{\mathrm{rated}}\ \ \ \ \ \ (26)\]
+

Where subscript \(\theta_{bl}\) means we refer to blade pitch controller. In below rated conditions, generator speed is lower than rated value, +so \(-\delta\Omega=\Omega_{ref}-\Omega\ >\ 0\) and, since gains are normally negative, \(\theta_{bl}\) is saturated at its minimum value, +defined by an additional module of ROSCO controller which will be discussed later. According to equations 21 and 22, to find controllers gain values, +\(B_{\theta_{bl}}\left({X}_{op}\right)\) and \(A\left({X}_{op}\right)\) should be computed. They change for any operation point at which +system is linearized, so they are function of \({X}_{op}=\ \left\{\lambda_{op},{\theta_{bl}}_{op}\right\}\). Linearization point can be the +optimal steady state values chosen during strategy definition, for which there is a unique relationship between \(\lambda_{op}\) and +\({\theta_{bl}}_{op}\). For this reason, \(B_{\theta_{bl}}\) and \(A\) can be expressed with respect to \({\theta_{bl}}_{op}\), +so gains’ values can be scheduled with \(\theta_{bl}\) as parameter.

+
+
+
Additional Control Modules
+

In this section principal additional modules are briefly discussed to understand their functions and how they modify control output; for more information +it is possible to consult [D4]. They are:

+
    +
  • Wind speed estimator : This module estimates wind sped used for TSR tracking in the generator torque controller. Employed algorithm is based on a continuous-discrete Kalman filter, which exploits system model, a wind auto regressive model and other information, like covariance matrices based on the expected wind field and measure’s confidence of rotor speed to estimate a mean wind speed across rotor area at each time.

  • +
  • Set Point Smoothing : Generator torque and blade pitch controllers will normally conflict with each other in near-rated operation due to incompatible reference rotor speed. To avoid this, a set point smoother can be employed; it shifts the speed reference signal of the inactive controller while the active one works. As an example, at above rated condition torque controller is the inactive one and vice versa. If TSR tracking were to be adopted for the torque generator, then the reference speed at high wind speeds would be higher than the one actually wanted (rated one), so the smoother brings the reference towards the rated speed and the resulting torque approaches the rated one, the one actually intended by adopting a constant torque strategy under above conditions.

  • +
  • Minimum pitch Saturation : This module defines a minimum value of blade pitch angle which will be used as a saturation limit during control operations. It mainly modifies expected blade pitch values in region 1.5 and near rated conditions and leads to two effects:

    +
    +
      +
    • Peak shaving : Near rated condition thrust value reaches the highest values, since below rated wind speed is lower and above rated condition blade pitching reduces that force. So, to limit loads, minimum pitch module imposes not null pitch angles also below rated wind speed, near that value.

    • +
    • Power maximization in low wind : In region 1.5, as mentioned in control region section, a minimum value of rotor speed is imposed, so at low wind speeds TSR deviates far from its optimal value. To compensate this fact and to increase power coefficient value in this condition, blade pitch is led to be greater.

    • +
    +
    +
  • +
  • Floating offshore wind turbine feedback : this module is though for FOWTs (Floating Offshore Wind Turbines) and introduces a new term in the PI blade pitch controller, which becomes:

    +
    +
    +\[\Delta \theta_{b l}=-k_{\mathrm{P}} \delta \Omega-k_{\mathrm{I}} \int_0^T \delta \Omega \mathrm{d} t+k_{\theta_{\text {bl,float }}} \dot{x}_t\ \ \ \ \ \ (27)\]
    +
    +

    Additional term is tower-top velocity \({\dot{x}}_t\) multiplied by \(k_{{\theta_{bl,float}}_\mathrm{\ }}\) gain. The latter is chosen from a +manipulation of rotor equilibrium equation and structure pitch equation, in which expression of thrust and power coefficients compare. The aim is to +find gains’ value that reduces rotor angular acceleration to tower speed sensitivity to mitigate structure pitch effect on rotor aerodynamic torque. +This expedient increases the average extracted power and stabilizes the structure.

    +
  • +
+
+

+
+

In this case, TSR tracking was chosen for torque control at wind speeds lower than nominal one and a constant torque equal to nominal in above rated +conditions. Furthermore, the wind speed is assumed to be a priori known, so the Kalmann filter constituting the estimation module will not be +exploited.

+
+
+
+
+

Aerodynamic Loads

+

The aerodynamic loads due to the interaction between wind and blades are determined during the simulation using look-up tables previously obtained +during pre-processing. Specifically, the “AeroLoads” script in the “aeroloads” subfolder handles this by using a function, based on BEM (Blade Element +Momentum Theory), which receives as input the wind speed, rotor speed, and blade pitch angle and outputs the aerodynamic forces and torques acting on +the blade root. For more information on the resolution of BEMT see [D6] and [D7]. The aerodynamic forces do not take into +account the flexibility of the blade (rigid body assumption), the deflection of the wake due to the rotor misalignment with respect to the wind and +the wake dynamics. The domain of the tables will consist of the wind speeds for which the stationary values were previously calculated and a number +of values of rotor speed and blade pitch angle evenly spaced around the stationary value corresponding to the wind speed. The look-up table of +the aerodynamic loads has only one input for the wind speed, so the average wind speed is determined by interpolating four points for each blade in +the wind grid along the blade length. The discretization points are defined by “blade.bladeDiscr” in WTproperties.m script. It is preferable to define +those points starting from the middle of the blade and not from the root because the wind speed has more influence at the final section of the blade. The horizontal hub speed, due to surge and pitch oscillation, is added to the wind speed. +Furthermore, the pitch motion and yaw motion of the hub multiplied by the distance from the hub of discretization points (blade.bladeDiscr) are also +added to wind speed.

+
+
+
+

User inputs

+

In addition to the settings defined in pre-processing, to use MOST it is necessary to define simulation settings and decide which input files (created +in the pre-processing) to use, this is done via the WEC-Sim library script wecSimInputFile.m.

+
+
+

Simulation

+

The simulation of floating wind turbines or hybrid systems is carried out in the Simulink environment using the WEC-Sim libraries and the MOST library +(“MOST_lib.slx”), for the wind turbine part and its control. In order to launch the simulation, it is necessary to use the wecSim.m executable, +which calls up wecSimInputFile.m for defining the input data and the initializeWecSim.m function for setting up the classes and defining the active +variant subsystems according to the settings made. Below is an example of a Simulink model for the simulation of a floating wind turbine.

+../_images/IMAGE_Volturn15MW_Simulink_example.png + +
+

+
+

The platform and mooring subsystems are libraries of WEC-Sim that solve the hydrodynamic and hydrostatic loads acting on the platform and the forces +due to moorings according to the settings and file names provided. The turbine subsystem is the MOST library, visible in the figure below.

+../_images/IMAGE_MOST_Library.png + +
+

+
+

The MOST model is mainly composed of rigid bodies (representing the various components of the turbine) connected via fixed joints or, in the case of +the link between the hub and nacelle, with a revolute joint. An example of a component (hub) can be seen in the figure below and includes the calculation of +inertial forces (in the “Body Properties” block) and weight force (in the “External Force and Torque” block). In the case of blades, aerodynamic forces +are also applied via a similar block.

+../_images/IMAGE_Body_Block_example.png + +
+

+
+

In the ‘Aerodynamics + Control’ subsystem, the aerodynamic forces and torque values of the generator and collective blade pitch are derived. In the +“Control” and “Blade wind speed” subsystems, variant subsystems are contained in which it is decided whether to use the Baseline or ROSCO controller +and whether to have constant or turbulent wind. With regard to wind block, here the relative speed with respect to the interested blade nodes is +calculated, receiving the movements of the structure and the wind field as inputs. Finally, the “AeroLoads” subsystem contains the look-up tables of +the aerodynamic loads obtained in pre-processing.

+../_images/IMAGE_Aeroload_Control_Submodel.png + +
+

+
+
+
+

Post-processing

+

Post-processing consists of processing the simulation output data and saving it, as well as of the possible creation of an (ASCII) text file containing +the simulation report. For this we rely on the WEC-Sim executables stopWecSim.m and postProcessWecSim.m, which use the rensponseClass for processing +the results, and on the userDefinedFunction.m script to plot time-domain simulation input and output by also exploiting some functions of the rensponseClass. +The responseClass contains all the output time-series and methods to plot and interact with the results. It is not initialized by the user; instead, it +is created automatically at the end of a WEC-Sim simulation. The responseClass does not input any parameter back to WEC-Sim, only taking output data from +the various objects and blocks. After WEC-Sim is done running, there will be a new variable called output saved to the MATLAB workspace. +The output object is an instance of the responseClass; it contains all the relevant time-series results of the simulation. +The figure below shows an example of some input-output plots from a simulation of the IEA 15 MW reference wind turbine mounted on the VolturnUS semi-submersible +platform ([D5] and [D8]).

+../_images/IMAGE_Results_Plots_example.png + +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/objects.inv b/main/objects.inv new file mode 100644 index 000000000..24263f8a8 Binary files /dev/null and b/main/objects.inv differ diff --git a/main/search.html b/main/search.html new file mode 100644 index 000000000..b806f2b25 --- /dev/null +++ b/main/search.html @@ -0,0 +1,161 @@ + + + + + + + + Search — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/main/searchindex.js b/main/searchindex.js new file mode 100644 index 000000000..bf56a29ad --- /dev/null +++ b/main/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"API": [[26, null]], "Acknowledgements": [[8, null], [14, null]], "Added Mass": [[0, "added-mass"]], "Additional Control Modules": [[22, "additional-control-modules"]], "Advanced Features": [[0, null], [15, null], [25, null]], "Advanced Features Series": [[33, "advanced-features-series"]], "Aerodynamic Loads": [[22, "aerodynamic-loads"]], "Aerodynamic Loads Features": [[15, "aerodynamic-loads-features"]], "Apache License 2.0": [[10, "apache-license-2-0"], [18, "apache-license-2-0"]], "BEMIO": [[25, "bemio"], [33, "bemio"]], "BEMIO Functions": [[25, "bemio-functions"]], "BEMIO hydro Data Structure": [[25, "bemio-hydro-data-structure"]], "Baseline": [[22, "baseline"]], "Blade Pitch Controller": [[22, "id13"]], "Blade pitch controller": [[22, "blade-pitch-controller"]], "Body Blocks": [[28, "body-blocks"]], "Body Class": [[26, "body-class"], [28, "body-class"], [33, "body-class"]], "Body Class Initialization": [[28, "body-class-initialization"]], "Body Features": [[25, "body-features"]], "Body Mass and Geometry Features": [[25, "body-mass-and-geometry-features"]], "Body-To-Body Interactions": [[25, "body-to-body-interactions"]], "Body-to-Body Interactions": [[27, "body-to-body-interactions"]], "Boundary Element Method (BEM)": [[24, "boundary-element-method-bem"]], "Cable Block": [[28, "cable-block"]], "Cable Class": [[26, "cable-class"], [28, "cable-class"]], "Cable Class Initialization": [[28, "cable-class-initialization"]], "Cable Features": [[25, "cable-features"]], "Calculation of K_{r} from State Space Matrices": [[24, "calculation-of-k-r-from-state-space-matrices"]], "Callback Functions": [[3, "callback-functions"]], "Citing MOST": [[21, "citing-most"]], "Citing WEC-Sim": [[13, "citing-wec-sim"]], "Code Structure": [[28, null], [33, "code-structure"]], "Comparison of Performance Between Option 1 and Option 2": [[0, "comparison-of-performance-between-option-1-and-option-2"]], "Constraint Blocks": [[28, "constraint-blocks"]], "Constraint Class": [[26, "constraint-class"], [28, "constraint-class"]], "Constraint Class Initialization": [[28, "constraint-class-initialization"]], "Constraint and PTO Features": [[25, "constraint-and-pto-features"]], "Control Features": [[15, "control-features"]], "Control properties": [[22, "control-properties"]], "Controller Features": [[25, "controller-features"]], "Controls": [[27, "controls"]], "Convolution Integral Formulation": [[24, "convolution-integral-formulation"]], "Coordinate System": [[24, "coordinate-system"]], "Copyright": [[10, "copyright"], [18, "copyright"]], "Custom Parameters": [[3, "custom-parameters"]], "Debugging": [[31, "debugging"]], "Decay Tests": [[25, "decay-tests"]], "Declutching Control": [[25, "declutching-control"]], "Degenerate Mass Distribution": [[31, "degenerate-mass-distribution"]], "Desalination": [[27, "desalination"]], "Developer Manual": [[2, null]], "Device Geometry": [[32, "device-geometry"], [32, "user-tutorials-oswec-device-geometry"]], "Dispersion Relation": [[24, "dispersion-relation"]], "Download WEC-Sim": [[29, "download-wec-sim"]], "Drag Bodies": [[25, "drag-bodies"]], "Examples: Sphere Float with Various Controllers": [[25, "examples-sphere-float-with-various-controllers"]], "External Contributors": [[8, "external-contributors"]], "External Simulink/Simscape Blocks": [[28, "external-simulink-simscape-blocks"]], "Extract Mask Variables": [[0, "extract-mask-variables"]], "FAQs": [[31, "faqs"]], "Finite Impulse Response (FIR) Filters": [[25, "finite-impulse-response-fir-filters"]], "Fixed Body": [[0, "fixed-body"]], "Fixed Time-Step (ode4)": [[25, "fixed-time-step-ode4"]], "Formatting": [[3, "formatting"]], "Frame Block": [[28, "frame-block"]], "Free Decay": [[27, "free-decay"], [31, "free-decay"]], "Functions & External Codes": [[28, "functions-external-codes"]], "Funding": [[8, "funding"]], "Generalized Body Modes": [[24, "generalized-body-modes"], [25, "generalized-body-modes"], [27, "generalized-body-modes"]], "Generator Torque Controller": [[22, "id12"]], "Generator torque controller": [[22, "generator-torque-controller"]], "Geometry File": [[34, "geometry-file"]], "Getting Started": [[1, null], [29, null]], "Hydraulic PTO": [[24, "hydraulic-pto"]], "Hydrodynamic Data": [[34, "hydrodynamic-data"]], "Hydrodynamic Data File": [[31, "hydrodynamic-data-file"]], "Hydrostatic Stability": [[31, "hydrostatic-stability"]], "Identify Root Cause": [[31, "identify-root-cause"]], "Incorporating Joint/Actuation Stroke Limits": [[25, "incorporating-joint-actuation-stroke-limits"]], "Input File": [[34, "input-file"]], "Install ParaView and WEC-Sim Macros": [[25, "install-paraview-and-wec-sim-macros"]], "Install WEC-Sim": [[29, "install-wec-sim"]], "Installation": [[33, "installation"]], "Introduction": [[9, null], [17, null]], "Irregular Wave Binning": [[25, "irregular-wave-binning"]], "Irregular Wave Power": [[24, "irregular-wave-power"]], "Irregular Waves": [[24, "irregular-waves"], [31, "irregular-waves"]], "Irregular Waves with Seeded Phase": [[25, "irregular-waves-with-seeded-phase"]], "JONSWAP (JS) Spectrum": [[24, "jonswap-js-spectrum"]], "Large X-Y Displacements": [[25, "large-x-y-displacements"]], "Latching Control": [[25, "latching-control"]], "Library Development": [[3, "library-development"]], "Library Masks": [[3, "library-masks"]], "License": [[10, null], [18, null]], "Linear PTO": [[24, "linear-pto"]], "Loading a ParaView State File": [[25, "loading-a-paraview-state-file"]], "MATLAB Merge Tool": [[3, "matlab-merge-tool"]], "MATLAB Requirements": [[29, "matlab-requirements"]], "MOST Developers": [[19, "most-developers"]], "MOST Manual": [[16, null]], "MOST v1.0.0 (within WEC-Sim v6.0)": [[21, "most-citation"]], "MOST-IO": [[15, "most-io"]], "Mask Structure": [[3, "mask-structure"]], "Mechanical PTO": [[24, "mechanical-pto"]], "Model Files": [[32, "model-files"], [32, "user-tutorials-oswec-model-files"]], "Model Predictive Control (MPC)": [[25, "model-predictive-control-mpc"]], "Modifying Constraints and PTOs": [[25, "modifying-constraints-and-ptos"]], "MoorDyn": [[24, "id21"], [25, "moordyn"]], "MoorDyn Visualization in ParaView": [[25, "moordyn-visualization-in-paraview"]], "Mooring": [[24, "mooring"], [27, "mooring"]], "Mooring Blocks": [[28, "mooring-blocks"]], "Mooring Class": [[26, "mooring-class"], [28, "mooring-class"]], "Mooring Class Initialization": [[28, "mooring-class-initialization"]], "Mooring Features": [[15, "mooring-features"], [25, "mooring-features"]], "Mooring Lookup Table": [[24, "mooring-lookup-table"], [25, "mooring-lookup-table"]], "Mooring Matrix": [[24, "mooring-matrix"], [25, "mooring-matrix"]], "Mooring look-up table": [[22, "mooring-look-up-table"]], "Morison Element": [[0, "morison-element"]], "Morison Elements": [[24, "morison-elements"], [25, "morison-elements"]], "Moving Body": [[0, "moving-body"]], "Multiple Condition Run": [[27, "multiple-condition-run"]], "Multiple Condition Runs (MCR)": [[25, "multiple-condition-runs-mcr"]], "Multiple Wave-Spectra": [[25, "multiple-wave-spectra"]], "News Articles": [[12, "news-articles"]], "Non-Hydrodynamic Bodies": [[25, "non-hydrodynamic-bodies"]], "Nonhydrodynamic Body": [[27, "nonhydrodynamic-body"]], "Nonlinear Buoyancy and Froude-Krylov Excitation": [[25, "nonlinear-buoyancy-and-froude-krylov-excitation"]], "Nonlinear Buoyancy and Froude-Krylov Wave Excitation": [[24, "nonlinear-buoyancy-and-froude-krylov-wave-excitation"]], "Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid": [[25, "nonlinear-buoyancy-and-froude-krylov-wave-excitation-tutorial-heaving-ellipsoid"]], "Nonlinear Hydro Visualization in ParaView": [[25, "nonlinear-hydro-visualization-in-paraview"]], "Nonlinear Hydrodynamic Body": [[27, "nonlinear-hydrodynamic-body"]], "Nonlinear Settings": [[25, "nonlinear-settings"]], "Note on the Issue Board": [[31, "note-on-the-issue-board"]], "Numerical Methods": [[24, "numerical-methods"]], "Numerical Test Cases": [[31, "numerical-test-cases"]], "OSWEC Tutorial": [[32, "oswec-tutorial"]], "OSWEC with Hydraulic PTO": [[25, "oswec-with-hydraulic-pto"]], "Ocean Current": [[24, "ocean-current"], [25, "ocean-current"]], "Online Training Course": [[33, "online-training-course"]], "Open an Issue": [[31, "open-an-issue"]], "Option 1": [[0, "option-1"], [24, "option-1"]], "Option 2": [[0, "option-2"], [24, "option-2"]], "Option 3": [[24, "option-3"]], "Oscillating Surge WEC (OSWEC)": [[32, "oscillating-surge-wec-oswec"]], "Other Features": [[25, "other-features"]], "Other Tests": [[31, "other-tests"]], "Overview": [[4, null], [11, null], [19, null], [24, null], [33, "overview"]], "PTO Blocks": [[28, "pto-blocks"]], "PTO Class": [[26, "pto-class"], [28, "pto-class"]], "PTO Class Initialization": [[28, "pto-class-initialization"]], "PTO-Sim": [[25, "pto-sim"], [27, "pto-sim"]], "PTO-Sim Blocks": [[28, "pto-sim-blocks"]], "PTO-Sim Class": [[28, "pto-sim-class"]], "PTO-Sim Class Initialization": [[28, "pto-sim-class-initialization"]], "ParaView Visualization Parameters": [[25, "paraview-visualization-parameters"]], "Parallel Computing Toolbox (PCT)": [[25, "parallel-computing-toolbox-pct"]], "Parameter Specifics": [[3, "parameter-specifics"]], "Paraview Visualization": [[25, "paraview-visualization"], [27, "paraview-visualization"]], "Passive Control (Proportional)": [[25, "passive-control-proportional"]], "Passive Yaw": [[27, "passive-yaw"]], "Passive Yaw Implementation": [[25, "passive-yaw-implementation"]], "Pierson\u2013Moskowitz (PM) Spectrum": [[24, "pierson-moskowitz-pm-spectrum"]], "Plot Elevation": [[25, "plot-elevation"]], "Plot Forces": [[25, "plot-forces"]], "Plot Response": [[25, "plot-response"]], "Plot Spectrum": [[25, "plot-spectrum"]], "Post-processing": [[22, "post-processing"]], "Power Take-Off (PTO)": [[24, "power-take-off-pto"]], "Pre-processing": [[22, "pre-processing"]], "Publication": [[13, "publication"]], "Publications": [[12, null], [20, null]], "Pull Requests": [[5, null]], "RM3 PTO Extension": [[27, "rm3-pto-extension"]], "RM3 Tutorial": [[32, "rm3-tutorial"]], "RM3 with Direct Drive PTO": [[25, "rm3-with-direct-drive-pto"]], "RM3 with Hydraulic PTO": [[25, "rm3-with-hydraulic-pto"]], "RM3 with MoorDyn": [[25, "rm3-with-moordyn"]], "ROSCO": [[22, "rosco"]], "ROSCO Implementation": [[22, "rosco-implementation"]], "Radiation Force calculation": [[25, "radiation-force-calculation"]], "Ramp Function": [[24, "ramp-function"]], "Reactive Control (Proportional-Integral)": [[25, "reactive-control-proportional-integral"]], "Reactive Control with Direct Drive Power Take-Off": [[25, "reactive-control-with-direct-drive-power-take-off"]], "Realization Theory": [[24, "realization-theory"]], "References": [[15, "references"], [24, "references"], [25, "references"], [32, "references"]], "Regular Wave Power": [[24, "regular-wave-power"]], "Regular Waves": [[24, "regular-waves"]], "Release Notes": [[13, null], [21, null]], "Response Class": [[26, "response-class"], [28, "response-class"]], "Review Relevant Documentation": [[31, "review-relevant-documentation"]], "Review of Rigid Body Dynamics": [[0, "review-of-rigid-body-dynamics"]], "Run from Simulink": [[3, "run-from-simulink"]], "Running WEC-Sim": [[25, "running-wec-sim"], [34, "running-wec-sim"]], "Running as Function": [[25, "running-as-function"]], "Running from Simulink": [[25, "running-from-simulink"]], "STL File Generation": [[25, "stl-file-generation"]], "Save Visualization": [[25, "save-visualization"]], "Search WEC-Sim Issues": [[31, "search-wec-sim-issues"]], "Series 1 - Multiple Condition Runs (MCR)": [[33, "series-1-multiple-condition-runs-mcr"]], "Series 10 - Desalination": [[33, "series-10-desalination"]], "Series 11 - WEC-Sim Visualization": [[33, "series-11-wec-sim-visualization"]], "Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation": [[33, "series-2-nonlinear-buoyancy-and-froude-krylov-wave-excitation"]], "Series 3 - Non-hydrodynamic Bodies": [[33, "series-3-non-hydrodynamic-bodies"]], "Series 4 - Body-to-Body Interactions": [[33, "series-4-body-to-body-interactions"]], "Series 5 - PTO-Sim": [[33, "series-5-pto-sim"]], "Series 6 - WEC-Sim Controls": [[33, "series-6-wec-sim-controls"]], "Series 7 - Modeling Cables": [[33, "series-7-modeling-cables"]], "Series 8 - Using MoorDyn with WEC-Sim": [[33, "series-8-using-moordyn-with-wec-sim"]], "Series 9 - Modeling OWC Devices": [[33, "series-9-modeling-owc-devices"]], "Setting PTO or Constraint Extension": [[25, "setting-pto-or-constraint-extension"]], "Simulation": [[22, "simulation"]], "Simulation Class": [[26, "simulation-class"], [28, "simulation-class"]], "Simulation Class Initialization": [[28, "simulation-class-initialization"]], "Simulation Features": [[25, "simulation-features"]], "Simulink Functions": [[3, "simulink-functions"]], "Simulink Model": [[34, "simulink-model"]], "Sinusoidal Steady-State Response": [[24, "sinusoidal-steady-state-response"]], "Software Tests": [[6, null]], "Solution Singularity": [[31, "solution-singularity"]], "Source Details": [[28, "source-details"]], "State Space": [[24, "state-space"]], "State-Space Representation": [[25, "state-space-representation"]], "Step 1. Add WEC-Sim to the MATLAB Path": [[29, "step-1-add-wec-sim-to-the-matlab-path"]], "Step 1: Pre-Processing": [[34, "step-1-pre-processing"]], "Step 1: Run BEMIO": [[32, "step-1-run-bemio"], [32, "user-tutorials-oswec-step-one"]], "Step 2. Verify the Path": [[29, "step-2-verify-the-path"]], "Step 2: Build Simulink Model": [[32, "step-2-build-simulink-model"], [32, "user-tutorials-oswec-step-two"]], "Step 2: Generate Hydrodata File": [[34, "step-2-generate-hydrodata-file"]], "Step 3. Add WEC-Sim Library to Simulink": [[29, "step-3-add-wec-sim-library-to-simulink"]], "Step 3: Build Simulink Model": [[34, "step-3-build-simulink-model"]], "Step 3: Write wecSimInputFile.m": [[32, "step-3-write-wecsiminputfile-m"], [32, "user-tutorials-oswec-step-three"]], "Step 4. Test the Installation": [[29, "step-4-test-the-installation"]], "Step 4: Run WEC-Sim": [[32, "step-4-run-wec-sim"], [32, "user-tutorials-oswec-step-four"]], "Step 4: Write wecSimInputFile.m": [[34, "step-4-write-wecsiminputfile-m"]], "Step 5: Post-processing": [[32, "step-5-post-processing"], [32, "user-tutorials-oswec-step-five"]], "Step 5: Run WEC-Sim": [[34, "step-5-run-wec-sim"]], "Summary": [[3, "summary"]], "Terminology": [[24, "terminology"]], "Theoretical Implementation": [[0, "theoretical-implementation"]], "Theory": [[22, null]], "Theory & Workflow": [[33, "theory-workflow"]], "Theory Manual": [[23, null]], "Time-Domain Formulation": [[24, "time-domain-formulation"]], "Time-Step Features": [[25, "time-step-features"]], "Training Materials": [[33, null]], "Troubleshooting": [[31, null]], "Tutorial": [[33, "tutorial"]], "Tutorial: OSWEC with PTO-Sim": [[25, "tutorial-oswec-with-pto-sim"]], "Tutorial: RM3 with PTO-Sim": [[25, "tutorial-rm3-with-pto-sim"]], "Tutorials": [[32, null]], "Two-Body Point Absorber (RM3)": [[32, "two-body-point-absorber-rm3"]], "Units": [[24, "units"]], "User Manual": [[30, null]], "User inputs": [[22, "user-inputs"]], "Variable Time-Step (ode45)": [[25, "variable-time-step-ode45"]], "Viscous Damping": [[24, "viscous-damping"], [25, "viscous-damping"]], "Viscous Damping and Morison Elements": [[24, "viscous-damping-and-morison-elements"], [25, "viscous-damping-and-morison-elements"]], "Viscous Drag": [[31, "viscous-drag"]], "Visualization Markers": [[27, "visualization-markers"]], "WEC-Sim (Wave Energy Converter SIMulator)": [[7, null]], "WEC-Sim Applications": [[27, null]], "WEC-Sim Applications Tests": [[6, "wec-sim-applications-tests"]], "WEC-Sim Case Files": [[34, "wec-sim-case-files"]], "WEC-Sim Classes": [[28, "wec-sim-classes"]], "WEC-Sim Developers": [[7, "wec-sim-developers"]], "WEC-Sim Examples": [[32, "wec-sim-examples"]], "WEC-Sim Implementations": [[0, "wec-sim-implementations"]], "WEC-Sim Issues": [[31, "wec-sim-issues"]], "WEC-Sim Library": [[3, null], [28, "wec-sim-library"]], "WEC-Sim Post-Processing": [[25, "wec-sim-post-processing"]], "WEC-Sim Source Code": [[28, "wec-sim-source-code"]], "WEC-Sim Tests": [[6, "wec-sim-tests"]], "WEC-Sim Visualization": [[25, "wec-sim-visualization"]], "WEC-Sim Visualization in ParaView": [[25, "wec-sim-visualization-in-paraview"]], "WEC-Sim v1.0": [[13, "id251"]], "WEC-Sim v1.1": [[13, "id250"]], "WEC-Sim v1.2": [[13, "id249"]], "WEC-Sim v1.3": [[13, "id248"]], "WEC-Sim v2.0": [[13, "id247"]], "WEC-Sim v2.1": [[13, "id246"]], "WEC-Sim v2.2": [[13, "id245"]], "WEC-Sim v3.0": [[13, "id244"]], "WEC-Sim v3.1": [[13, "id243"]], "WEC-Sim v4.0": [[13, "id242"]], "WEC-Sim v4.1": [[13, "id239"]], "WEC-Sim v4.2": [[13, "id226"]], "WEC-Sim v4.3": [[13, "id198"]], "WEC-Sim v4.4": [[13, "id174"]], "WEC-Sim v5.0": [[13, "id137"]], "WEC-Sim v5.0.1": [[13, "id121"]], "WEC-Sim v6.0": [[13, "id56"]], "WEC-Sim v6.1": [[13, "id1"], [13, "id3"]], "WEC-Sim\u2019s Implementation": [[0, "wec-sim-s-implementation"]], "WECCCOMP": [[27, "wecccomp"]], "Wave Class": [[26, "wave-class"], [28, "wave-class"], [33, "wave-class"]], "Wave Class Initialization": [[28, "wave-class-initialization"]], "Wave Directional Spreading": [[25, "wave-directional-spreading"]], "Wave Directionality": [[25, "wave-directionality"]], "Wave Features": [[25, "wave-features"]], "Wave Gauge Placement": [[25, "wave-gauge-placement"]], "Wave Markers": [[25, "wave-markers"]], "Wave Spectra": [[24, "wave-spectra"]], "Wind Features": [[15, "wind-features"]], "Wind Turbine Features": [[15, "wind-turbine-features"]], "Wind input": [[22, "wind-input"]], "Wind turbine properties": [[22, "wind-turbine-properties"]], "Workflow": [[34, null]], "Working with the Added Mass Implementation": [[0, "working-with-the-added-mass-implementation"]], "Write HDF5": [[27, "write-hdf5"]], "Writing Input File from Mask": [[3, "writing-input-file-from-mask"]], "Writing Mask Parameters from Input File": [[3, "writing-mask-parameters-from-input-file"]], "Writing Your Own h5 File": [[25, "writing-your-own-h5-file"]], "elevationImport": [[28, "elevationimport"]], "irregular": [[28, "irregular"]], "noWave": [[28, "nowave"]], "noWaveCIC": [[28, "nowavecic"]], "regular": [[28, "regular"]], "regularCIC": [[28, "regularcic"]], "spectrumImport": [[28, "spectrumimport"]]}, "docnames": ["developer/advanced_features", "developer/getting_started", "developer/index", "developer/library", "developer/overview", "developer/pull_requests", "developer/software_tests", "index", "introduction/acknowledgements", "introduction/index", "introduction/license", "introduction/overview", "introduction/publications", "introduction/release_notes", "most/acknowledgements", "most/advanced_features", "most/index", "most/introduction", "most/license", "most/overview", "most/publications", "most/release_notes", "most/theory", "theory/index", "theory/theory", "user/advanced_features", "user/api", "user/applications", "user/code_structure", "user/getting_started", "user/index", "user/troubleshooting", "user/tutorials", "user/webinars", "user/workflow"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinxcontrib.bibtex": 9}, "filenames": ["developer/advanced_features.rst", "developer/getting_started.rst", "developer/index.rst", "developer/library.rst", "developer/overview.rst", "developer/pull_requests.rst", "developer/software_tests.rst", "index.rst", "introduction/acknowledgements.rst", "introduction/index.rst", "introduction/license.rst", "introduction/overview.rst", "introduction/publications.rst", "introduction/release_notes.rst", "most/acknowledgements.rst", "most/advanced_features.rst", "most/index.rst", "most/introduction.rst", "most/license.rst", "most/overview.rst", "most/publications.rst", "most/release_notes.rst", "most/theory.rst", "theory/index.rst", "theory/theory.rst", "user/advanced_features.rst", "user/api.rst", "user/applications.rst", "user/code_structure.rst", "user/getting_started.rst", "user/index.rst", "user/troubleshooting.rst", "user/tutorials.rst", "user/webinars.rst", "user/workflow.rst"], "indexentries": {"adjmassfactor (objects.bodyclass attribute)": [[26, "objects.bodyClass.adjMassFactor", false]], "b2b (objects.simulationclass attribute)": [[26, "objects.simulationClass.b2b", false]], "base (objects.cableclass attribute)": [[26, "objects.cableClass.base", false]], "bem (objects.waveclass attribute)": [[26, "objects.waveClass.bem", false]], "bodies (objects.responseclass attribute)": [[26, "objects.responseClass.bodies", false]], "bodyclass (class in objects)": [[26, "objects.bodyClass", false]], "bodyclass (objects.bodyclass attribute)": [[26, "objects.bodyClass.bodyClass", false]], "cableclass (class in objects)": [[26, "objects.cableClass", false]], "cableclass (objects.cableclass attribute)": [[26, "objects.cableClass.cableClass", false]], "cablelength (objects.cableclass attribute)": [[26, "objects.cableClass.cableLength", false]], "cables (objects.responseclass attribute)": [[26, "objects.responseClass.cables", false]], "calcspectralmoment() (in module functions.bemio)": [[25, "functions.BEMIO.calcSpectralMoment", false]], "calculateforceaddedmass() (objects.bodyclass method)": [[26, "objects.bodyClass.calculateForceAddedMass", false]], "calcwavenumber() (in module functions.bemio)": [[25, "functions.BEMIO.calcWaveNumber", false]], "callmoordynlib() (objects.mooringclass method)": [[26, "objects.mooringClass.callMoorDynLib", false]], "centerbuoyancy (objects.bodyclass attribute)": [[26, "objects.bodyClass.centerBuoyancy", false]], "centergravity (objects.bodyclass attribute)": [[26, "objects.bodyClass.centerGravity", false]], "checkinputs() (objects.cableclass method)": [[26, "objects.cableClass.checkInputs", false]], "checkinputs() (objects.constraintclass method)": [[26, "objects.constraintClass.checkInputs", false]], "checkinputs() (objects.mooringclass method)": [[26, "objects.mooringClass.checkInputs", false]], "checkinputs() (objects.ptoclass method)": [[26, "objects.ptoClass.checkInputs", false]], "cicdt (objects.simulationclass attribute)": [[26, "objects.simulationClass.cicDt", false]], "cicendtime (objects.simulationclass attribute)": [[26, "objects.simulationClass.cicEndTime", false]], "closemoordynlib() (objects.mooringclass method)": [[26, "objects.mooringClass.closeMoorDynLib", false]], "combinebem() (in module functions.bemio)": [[25, "functions.BEMIO.combineBEM", false]], "constraintclass (class in objects)": [[26, "objects.constraintClass", false]], "constraintclass (objects.constraintclass attribute)": [[26, "objects.constraintClass.constraintClass", false]], "constraints (objects.responseclass attribute)": [[26, "objects.responseClass.constraints", false]], "current (objects.waveclass attribute)": [[26, "objects.waveClass.current", false]], "damping (objects.cableclass attribute)": [[26, "objects.cableClass.damping", false]], "damping (objects.ptoclass attribute)": [[26, "objects.ptoClass.damping", false]], "direction (objects.waveclass attribute)": [[26, "objects.waveClass.direction", false]], "dof (objects.bodyclass attribute)": [[26, "objects.bodyClass.dof", false]], "domainsize (objects.simulationclass attribute)": [[26, "objects.simulationClass.domainSize", false]], "dt (objects.simulationclass attribute)": [[26, "objects.simulationClass.dt", false]], "dtout (objects.simulationclass attribute)": [[26, "objects.simulationClass.dtOut", false]], "elevationfile (objects.waveclass attribute)": [[26, "objects.waveClass.elevationFile", false]], "endtime (objects.simulationclass attribute)": [[26, "objects.simulationClass.endTime", false]], "equilibriumposition (objects.ptoclass attribute)": [[26, "objects.ptoClass.equilibriumPosition", false]], "excitationirf (objects.bodyclass attribute)": [[26, "objects.bodyClass.excitationIRF", false]], "excitationirf() (in module functions.bemio)": [[25, "functions.BEMIO.excitationIRF", false]], "explorer (objects.simulationclass attribute)": [[26, "objects.simulationClass.explorer", false]], "extension (objects.constraintclass attribute)": [[26, "objects.constraintClass.extension", false]], "extension (objects.ptoclass attribute)": [[26, "objects.ptoClass.extension", false]], "fir (objects.simulationclass attribute)": [[26, "objects.simulationClass.FIR", false]], "flex (objects.bodyclass attribute)": [[26, "objects.bodyClass.flex", false]], "follower (objects.cableclass attribute)": [[26, "objects.cableClass.follower", false]], "gamma (objects.waveclass attribute)": [[26, "objects.waveClass.gamma", false]], "gbmdof (objects.bodyclass attribute)": [[26, "objects.bodyClass.gbmDOF", false]], "geometryfile (objects.bodyclass attribute)": [[26, "objects.bodyClass.geometryFile", false]], "gravity (objects.simulationclass attribute)": [[26, "objects.simulationClass.gravity", false]], "h5file (objects.bodyclass attribute)": [[26, "objects.bodyClass.h5File", false]], "hardstops (objects.constraintclass attribute)": [[26, "objects.constraintClass.hardStops", false]], "hardstops (objects.ptoclass attribute)": [[26, "objects.ptoClass.hardStops", false]], "height (objects.waveclass attribute)": [[26, "objects.waveClass.height", false]], "hydrostiffness (objects.bodyclass attribute)": [[26, "objects.bodyClass.hydroStiffness", false]], "inertia (objects.bodyclass attribute)": [[26, "objects.bodyClass.inertia", false]], "inertia (objects.cableclass attribute)": [[26, "objects.cableClass.inertia", false]], "inertiaproducts (objects.bodyclass attribute)": [[26, "objects.bodyClass.inertiaProducts", false]], "inertiaproducts (objects.cableclass attribute)": [[26, "objects.cableClass.inertiaProducts", false]], "initial (objects.bodyclass attribute)": [[26, "objects.bodyClass.initial", false]], "initial (objects.cableclass attribute)": [[26, "objects.cableClass.initial", false]], "initial (objects.constraintclass attribute)": [[26, "objects.constraintClass.initial", false]], "initial (objects.mooringclass attribute)": [[26, "objects.mooringClass.initial", false]], "initial (objects.ptoclass attribute)": [[26, "objects.ptoClass.initial", false]], "lineardamping (objects.bodyclass attribute)": [[26, "objects.bodyClass.linearDamping", false]], "lineardamping (objects.cableclass attribute)": [[26, "objects.cableClass.linearDamping", false]], "loadlookuptable() (objects.mooringclass method)": [[26, "objects.mooringClass.loadLookupTable", false]], "location (objects.constraintclass attribute)": [[26, "objects.constraintClass.location", false]], "location (objects.mooringclass attribute)": [[26, "objects.mooringClass.location", false]], "location (objects.ptoclass attribute)": [[26, "objects.ptoClass.location", false]], "lookuptable (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTable", false]], "lookuptablefile (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTableFile", false]], "lookuptableflag (objects.mooringclass attribute)": [[26, "objects.mooringClass.lookupTableFlag", false]], "marker (objects.waveclass attribute)": [[26, "objects.waveClass.marker", false]], "mass (objects.bodyclass attribute)": [[26, "objects.bodyClass.mass", false]], "mass (objects.cableclass attribute)": [[26, "objects.cableClass.mass", false]], "matrix (objects.mooringclass attribute)": [[26, "objects.mooringClass.matrix", false]], "mcrexcelfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.mcrExcelFile", false]], "mcrmatfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.mcrMatFile", false]], "meandrift (objects.bodyclass attribute)": [[26, "objects.bodyClass.meanDrift", false]], "mode (objects.simulationclass attribute)": [[26, "objects.simulationClass.mode", false]], "moordyn (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDyn", false]], "moordyn (objects.responseclass attribute)": [[26, "objects.responseClass.moorDyn", false]], "moordyninputfile (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynInputFile", false]], "moordynlines (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynLines", false]], "moordynnodes (objects.mooringclass attribute)": [[26, "objects.mooringClass.moorDynNodes", false]], "mooring (objects.responseclass attribute)": [[26, "objects.responseClass.mooring", false]], "mooringclass (class in objects)": [[26, "objects.mooringClass", false]], "morisondt (objects.simulationclass attribute)": [[26, "objects.simulationClass.morisonDt", false]], "morisonelement (objects.bodyclass attribute)": [[26, "objects.bodyClass.morisonElement", false]], "name (objects.bodyclass attribute)": [[26, "objects.bodyClass.name", false]], "name (objects.cableclass attribute)": [[26, "objects.cableClass.name", false]], "name (objects.constraintclass attribute)": [[26, "objects.constraintClass.name", false]], "name (objects.mooringclass attribute)": [[26, "objects.mooringClass.name", false]], "name (objects.ptoclass attribute)": [[26, "objects.ptoClass.name", false]], "nonhydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.nonHydro", false]], "nonlineardt (objects.simulationclass attribute)": [[26, "objects.simulationClass.nonlinearDt", false]], "nonlinearhydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.nonlinearHydro", false]], "normalizebem() (in module functions.bemio)": [[25, "functions.BEMIO.normalizeBEM", false]], "nummoordyn (objects.simulationclass attribute)": [[26, "objects.simulationClass.numMoorDyn", false]], "orientation (objects.cableclass attribute)": [[26, "objects.cableClass.orientation", false]], "orientation (objects.constraintclass attribute)": [[26, "objects.constraintClass.orientation", false]], "orientation (objects.ptoclass attribute)": [[26, "objects.ptoClass.orientation", false]], "paraview (objects.bodyclass attribute)": [[26, "objects.bodyClass.paraview", false]], "paraview (objects.cableclass attribute)": [[26, "objects.cableClass.paraview", false]], "paraview (objects.simulationclass attribute)": [[26, "objects.simulationClass.paraview", false]], "period (objects.waveclass attribute)": [[26, "objects.waveClass.period", false]], "phaseseed (objects.waveclass attribute)": [[26, "objects.waveClass.phaseSeed", false]], "plotaddedmass() (in module functions.bemio)": [[25, "functions.BEMIO.plotAddedMass", false]], "plotbemio() (in module functions.bemio)": [[25, "functions.BEMIO.plotBEMIO", false]], "plotelevation() (objects.waveclass method)": [[26, "objects.waveClass.plotElevation", false]], "plotexcitationirf() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationIRF", false]], "plotexcitationmagnitude() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationMagnitude", false]], "plotexcitationphase() (in module functions.bemio)": [[25, "functions.BEMIO.plotExcitationPhase", false]], "plotforces() (objects.responseclass method)": [[26, "objects.responseClass.plotForces", false]], "plotradiationdamping() (in module functions.bemio)": [[25, "functions.BEMIO.plotRadiationDamping", false]], "plotradiationirf() (in module functions.bemio)": [[25, "functions.BEMIO.plotRadiationIRF", false]], "plotresponse() (objects.responseclass method)": [[26, "objects.responseClass.plotResponse", false]], "plotspectrum() (objects.waveclass method)": [[26, "objects.waveClass.plotSpectrum", false]], "plotstl() (objects.bodyclass method)": [[26, "objects.bodyClass.plotStl", false]], "pressure (objects.simulationclass attribute)": [[26, "objects.simulationClass.pressure", false]], "pretension (objects.cableclass attribute)": [[26, "objects.cableClass.preTension", false]], "pretension (objects.ptoclass attribute)": [[26, "objects.ptoClass.pretension", false]], "ptoclass (class in objects)": [[26, "objects.ptoClass", false]], "ptoclass (objects.ptoclass attribute)": [[26, "objects.ptoClass.ptoClass", false]], "ptos (objects.responseclass attribute)": [[26, "objects.responseClass.ptos", false]], "ptosim (objects.responseclass attribute)": [[26, "objects.responseClass.ptoSim", false]], "qtfs (objects.bodyclass attribute)": [[26, "objects.bodyClass.QTFs", false]], "quaddrag (objects.bodyclass attribute)": [[26, "objects.bodyClass.quadDrag", false]], "quaddrag (objects.cableclass attribute)": [[26, "objects.cableClass.quadDrag", false]], "radiationirf() (in module functions.bemio)": [[25, "functions.BEMIO.radiationIRF", false]], "radiationirfss() (in module functions.bemio)": [[25, "functions.BEMIO.radiationIRFSS", false]], "ramptime (objects.simulationclass attribute)": [[26, "objects.simulationClass.rampTime", false]], "ratetransition (objects.simulationclass attribute)": [[26, "objects.simulationClass.rateTransition", false]], "readaqwa() (in module functions.bemio)": [[25, "functions.BEMIO.readAQWA", false]], "readbemioh5() (in module functions.bemio)": [[25, "functions.BEMIO.readBEMIOH5", false]], "readcapytaine() (in module functions.bemio)": [[25, "functions.BEMIO.readCAPYTAINE", false]], "readnemoh() (in module functions.bemio)": [[25, "functions.BEMIO.readNEMOH", false]], "readwamit() (in module functions.bemio)": [[25, "functions.BEMIO.readWAMIT", false]], "reloadh5data (objects.simulationclass attribute)": [[26, "objects.simulationClass.reloadH5Data", false]], "responseclass (class in objects)": [[26, "objects.responseClass", false]], "responseclass (objects.responseclass attribute)": [[26, "objects.responseClass.responseClass", false]], "reversedimensionorder() (in module functions.bemio)": [[25, "functions.BEMIO.reverseDimensionOrder", false]], "rho (objects.simulationclass attribute)": [[26, "objects.simulationClass.rho", false]], "savestructure (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveStructure", false]], "savetext (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveText", false]], "saveviz() (objects.responseclass method)": [[26, "objects.responseClass.saveViz", false]], "saveworkspace (objects.simulationclass attribute)": [[26, "objects.simulationClass.saveWorkspace", false]], "setcg() (objects.cableclass method)": [[26, "objects.cableClass.setCg", false]], "setinitdisp() (objects.bodyclass method)": [[26, "objects.bodyClass.setInitDisp", false]], "setinitdisp() (objects.cableclass method)": [[26, "objects.cableClass.setInitDisp", false]], "setinitdisp() (objects.constraintclass method)": [[26, "objects.constraintClass.setInitDisp", false]], "setinitdisp() (objects.mooringclass method)": [[26, "objects.mooringClass.setInitDisp", false]], "setinitdisp() (objects.ptoclass method)": [[26, "objects.ptoClass.setInitDisp", false]], "simmechanicsfile (objects.simulationclass attribute)": [[26, "objects.simulationClass.simMechanicsFile", false]], "simulationclass (class in objects)": [[26, "objects.simulationClass", false]], "simulationclass (objects.simulationclass attribute)": [[26, "objects.simulationClass.simulationClass", false]], "solver (objects.simulationclass attribute)": [[26, "objects.simulationClass.solver", false]], "spectrumfile (objects.waveclass attribute)": [[26, "objects.waveClass.spectrumFile", false]], "spectrumtype (objects.waveclass attribute)": [[26, "objects.waveClass.spectrumType", false]], "spread (objects.waveclass attribute)": [[26, "objects.waveClass.spread", false]], "starttime (objects.simulationclass attribute)": [[26, "objects.simulationClass.startTime", false]], "statespace (objects.simulationclass attribute)": [[26, "objects.simulationClass.stateSpace", false]], "stiffness (objects.cableclass attribute)": [[26, "objects.cableClass.stiffness", false]], "stiffness (objects.ptoclass attribute)": [[26, "objects.ptoClass.stiffness", false]], "variablehydro (objects.bodyclass attribute)": [[26, "objects.bodyClass.variableHydro", false]], "viz (objects.bodyclass attribute)": [[26, "objects.bodyClass.viz", false]], "viz (objects.cableclass attribute)": [[26, "objects.cableClass.viz", false]], "viz (objects.waveclass attribute)": [[26, "objects.waveClass.viz", false]], "volume (objects.bodyclass attribute)": [[26, "objects.bodyClass.volume", false]], "waterdepth (objects.waveclass attribute)": [[26, "objects.waveClass.waterDepth", false]], "wave (objects.responseclass attribute)": [[26, "objects.responseClass.wave", false]], "waveclass (class in objects)": [[26, "objects.waveClass", false]], "windturbine (objects.responseclass attribute)": [[26, "objects.responseClass.windTurbine", false]], "writebemioh5() (in module functions.bemio)": [[25, "functions.BEMIO.writeBEMIOH5", false]], "writetext() (objects.responseclass method)": [[26, "objects.responseClass.writeText", false]], "yaw (objects.bodyclass attribute)": [[26, "objects.bodyClass.yaw", false]], "zerocross (objects.simulationclass attribute)": [[26, "objects.simulationClass.zeroCross", false]]}, "objects": {"functions.BEMIO": [[25, 0, 1, "", "calcSpectralMoment"], [25, 0, 1, "", "calcWaveNumber"], [25, 0, 1, "", "combineBEM"], [25, 0, 1, "", "excitationIRF"], [25, 0, 1, "", "normalizeBEM"], [25, 0, 1, "", "plotAddedMass"], [25, 0, 1, "", "plotBEMIO"], [25, 0, 1, "", "plotExcitationIRF"], [25, 0, 1, "", "plotExcitationMagnitude"], [25, 0, 1, "", "plotExcitationPhase"], [25, 0, 1, "", "plotRadiationDamping"], [25, 0, 1, "", "plotRadiationIRF"], [25, 0, 1, "", "radiationIRF"], [25, 0, 1, "", "radiationIRFSS"], [25, 0, 1, "", "readAQWA"], [25, 0, 1, "", "readBEMIOH5"], [25, 0, 1, "", "readCAPYTAINE"], [25, 0, 1, "", "readNEMOH"], [25, 0, 1, "", "readWAMIT"], [25, 0, 1, "", "reverseDimensionOrder"], [25, 0, 1, "", "writeBEMIOH5"]], "objects": [[26, 1, 1, "", "bodyClass"], [26, 1, 1, "", "cableClass"], [26, 1, 1, "", "constraintClass"], [26, 1, 1, "", "mooringClass"], [26, 1, 1, "", "ptoClass"], [26, 1, 1, "", "responseClass"], [26, 1, 1, "", "simulationClass"], [26, 1, 1, "", "waveClass"]], "objects.bodyClass": [[26, 2, 1, "", "QTFs"], [26, 2, 1, "", "adjMassFactor"], [26, 2, 1, "", "bodyClass"], [26, 3, 1, "", "calculateForceAddedMass"], [26, 2, 1, "", "centerBuoyancy"], [26, 2, 1, "", "centerGravity"], [26, 2, 1, "", "dof"], [26, 2, 1, "", "excitationIRF"], [26, 2, 1, "", "flex"], [26, 2, 1, "", "gbmDOF"], [26, 2, 1, "", "geometryFile"], [26, 2, 1, "", "h5File"], [26, 2, 1, "", "hydroStiffness"], [26, 2, 1, "", "inertia"], [26, 2, 1, "", "inertiaProducts"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "linearDamping"], [26, 2, 1, "", "mass"], [26, 2, 1, "", "meanDrift"], [26, 2, 1, "", "morisonElement"], [26, 2, 1, "", "name"], [26, 2, 1, "", "nonHydro"], [26, 2, 1, "", "nonlinearHydro"], [26, 2, 1, "", "paraview"], [26, 3, 1, "", "plotStl"], [26, 2, 1, "", "quadDrag"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "variableHydro"], [26, 2, 1, "", "viz"], [26, 2, 1, "", "volume"], [26, 2, 1, "", "yaw"]], "objects.cableClass": [[26, 2, 1, "", "base"], [26, 2, 1, "", "cableClass"], [26, 2, 1, "", "cableLength"], [26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "damping"], [26, 2, 1, "", "follower"], [26, 2, 1, "", "inertia"], [26, 2, 1, "", "inertiaProducts"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "linearDamping"], [26, 2, 1, "", "mass"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 2, 1, "", "paraview"], [26, 2, 1, "", "preTension"], [26, 2, 1, "", "quadDrag"], [26, 3, 1, "", "setCg"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "stiffness"], [26, 2, 1, "", "viz"]], "objects.constraintClass": [[26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "constraintClass"], [26, 2, 1, "", "extension"], [26, 2, 1, "", "hardStops"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "location"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 3, 1, "", "setInitDisp"]], "objects.mooringClass": [[26, 3, 1, "", "callMoorDynLib"], [26, 3, 1, "", "checkInputs"], [26, 3, 1, "", "closeMoorDynLib"], [26, 2, 1, "", "initial"], [26, 3, 1, "", "loadLookupTable"], [26, 2, 1, "", "location"], [26, 2, 1, "", "lookupTable"], [26, 2, 1, "", "lookupTableFile"], [26, 2, 1, "", "lookupTableFlag"], [26, 2, 1, "", "matrix"], [26, 2, 1, "", "moorDyn"], [26, 2, 1, "", "moorDynInputFile"], [26, 2, 1, "", "moorDynLines"], [26, 2, 1, "", "moorDynNodes"], [26, 2, 1, "", "name"], [26, 3, 1, "", "setInitDisp"]], "objects.ptoClass": [[26, 3, 1, "", "checkInputs"], [26, 2, 1, "", "damping"], [26, 2, 1, "", "equilibriumPosition"], [26, 2, 1, "", "extension"], [26, 2, 1, "", "hardStops"], [26, 2, 1, "", "initial"], [26, 2, 1, "", "location"], [26, 2, 1, "", "name"], [26, 2, 1, "", "orientation"], [26, 2, 1, "", "pretension"], [26, 2, 1, "", "ptoClass"], [26, 3, 1, "", "setInitDisp"], [26, 2, 1, "", "stiffness"]], "objects.responseClass": [[26, 2, 1, "", "bodies"], [26, 2, 1, "", "cables"], [26, 2, 1, "", "constraints"], [26, 2, 1, "", "moorDyn"], [26, 2, 1, "", "mooring"], [26, 3, 1, "", "plotForces"], [26, 3, 1, "", "plotResponse"], [26, 2, 1, "", "ptoSim"], [26, 2, 1, "", "ptos"], [26, 2, 1, "", "responseClass"], [26, 3, 1, "", "saveViz"], [26, 2, 1, "", "wave"], [26, 2, 1, "", "windTurbine"], [26, 3, 1, "", "writeText"]], "objects.simulationClass": [[26, 2, 1, "", "FIR"], [26, 2, 1, "", "b2b"], [26, 2, 1, "", "cicDt"], [26, 2, 1, "", "cicEndTime"], [26, 2, 1, "", "domainSize"], [26, 2, 1, "", "dt"], [26, 2, 1, "", "dtOut"], [26, 2, 1, "", "endTime"], [26, 2, 1, "", "explorer"], [26, 2, 1, "", "gravity"], [26, 2, 1, "", "mcrExcelFile"], [26, 2, 1, "", "mcrMatFile"], [26, 2, 1, "", "mode"], [26, 2, 1, "", "morisonDt"], [26, 2, 1, "", "nonlinearDt"], [26, 2, 1, "", "numMoorDyn"], [26, 2, 1, "", "paraview"], [26, 2, 1, "", "pressure"], [26, 2, 1, "", "rampTime"], [26, 2, 1, "", "rateTransition"], [26, 2, 1, "", "reloadH5Data"], [26, 2, 1, "", "rho"], [26, 2, 1, "", "saveStructure"], [26, 2, 1, "", "saveText"], [26, 2, 1, "", "saveWorkspace"], [26, 2, 1, "", "simMechanicsFile"], [26, 2, 1, "", "simulationClass"], [26, 2, 1, "", "solver"], [26, 2, 1, "", "startTime"], [26, 2, 1, "", "stateSpace"], [26, 2, 1, "", "zeroCross"]], "objects.waveClass": [[26, 2, 1, "", "bem"], [26, 2, 1, "", "current"], [26, 2, 1, "", "direction"], [26, 2, 1, "", "elevationFile"], [26, 2, 1, "", "gamma"], [26, 2, 1, "", "height"], [26, 2, 1, "", "marker"], [26, 2, 1, "", "period"], [26, 2, 1, "", "phaseSeed"], [26, 3, 1, "", "plotElevation"], [26, 3, 1, "", "plotSpectrum"], [26, 2, 1, "", "spectrumFile"], [26, 2, 1, "", "spectrumType"], [26, 2, 1, "", "spread"], [26, 2, 1, "", "viz"], [26, 2, 1, "", "waterDepth"]]}, "objnames": {"0": ["mat", "function", "MATLAB function"], "1": ["mat", "class", "MATLAB class"], "2": ["mat", "attribute", "MATLAB attribute"], "3": ["mat", "method", "MATLAB method"]}, "objtypes": {"0": "mat:function", "1": "mat:class", "2": "mat:attribute", "3": "mat:method"}, "terms": {"": [1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "0": [0, 3, 6, 9, 16, 22, 24, 25, 26, 28, 29, 31, 32, 34], "000": [25, 32], "002": 25, "01": [25, 32], "012003": 21, "01341": 24, "02": 25, "0378": 25, "05": 25, "057f_": 24, "06": 25, "07": 24, "085": 32, "08go28308": 8, "09": 24, "091": 32, "1": [3, 9, 10, 12, 15, 18, 20, 21, 22, 23, 25, 26, 28, 31], "10": [0, 12, 13, 20, 22, 24, 25, 26, 28, 29, 32, 34], "100": [12, 13, 25, 26, 28, 32, 34], "1000": [0, 25, 26, 28], "10000": 25, "1001": 25, "1002": 13, "10023797": 13, "1011": 13, "1012": 13, "1017": 13, "1018": 13, "102": 13, "1023": 13, "1024": 13, "1025": 25, "1030": 13, "1031": 13, "1032": 13, "1034": 13, "104": [13, 24], "1040": 13, "1045": 13, "1046": 13, "1048": 13, "1049": 13, "105": 25, "1052": 13, "1057": 13, "1058": 13, "1059": 13, "1061": 13, "1064": 13, "1065": 13, "1071": 13, "1076": 13, "1080": 13, "1081": 13, "1087": 13, "1092": 13, "1093": 13, "1095": 13, "1096": 13, "1098": 13, "11": [12, 22, 25, 32], "1100": 13, "1101": 13, "1102": 13, "1105": 13, "1106": 13, "110791": 25, "1108": 13, "1118": 12, "1126": [12, 13], "1127": 13, "1130": 13, "1133": 13, "1134": 13, "1136": 13, "1142": 13, "1144": 13, "1149": 13, "1166": 13, "1170": 13, "1177": 13, "1183": 13, "1186": 13, "1187": 13, "1195": 13, "1198": 13, "11th": [12, 24], "12": [12, 22, 24, 25], "120": 25, "1200000": [25, 32], "1204": 13, "1207": 13, "1212": 13, "1217": 13, "1220": 13, "1226": 13, "1227": 13, "1229": 13, "1235": 13, "1236": 13, "1240": 13, "1241": 13, "1242": 13, "1247": 13, "1248": 13, "1250": 13, "1253": 13, "1256": 13, "1263": 13, "1264": 13, "127": 32, "127000": [32, 34], "1272": 13, "1273": 13, "1274": 13, "1275": 13, "1280": 13, "1289": 13, "1290": 13, "1296": 13, "1297": 13, "12th": [12, 24], "13": [12, 22, 25], "130": 13, "1301": 13, "1312": 13, "1317": 13, "1327": 15, "1333e7": 25, "1341": 24, "1345": 15, "13770349": 13, "1392": 25, "14": [12, 22, 25], "142": 25, "149": 24, "14th": 13, "15": [12, 15, 20, 22, 24, 25], "150": 25, "154": 24, "1592791": 29, "16": [12, 13, 22, 24, 25], "17": [12, 15, 22, 24], "170": 25, "18": [12, 22, 25], "180": 25, "1862": 25, "1868": 25, "189": 24, "19": [12, 22], "1950": 24, "1962": 24, "1964": 24, "1969": 24, "1973": 24, "1978": 24, "1996": 24, "1a": 31, "1b": 31, "1e": [0, 25, 26], "1e5": 25, "1kb": 31, "1m": 25, "1st": 25, "1x2": 26, "1x3": [0, 25, 26], "1x6": [25, 26], "2": [3, 9, 12, 15, 16, 20, 22, 23, 25, 26, 28, 31], "20": [12, 22, 25, 32], "200": [25, 26], "2004": [10, 18], "2005": [15, 24], "2006": [24, 25], "2008": 24, "2012": 24, "2013": 12, "2014": [10, 12, 15, 18, 24, 32], "2015": [12, 15, 24, 25], "2016": 12, "2017": [12, 25], "2018": 12, "2018b": 13, "2019": [24, 25, 28], "2019a": 25, "2020": [12, 15, 24, 25], "2020b": 13, "2021": [12, 13, 25], "2021b": 13, "2022": [12, 15, 20, 21], "2024": 13, "20907301": [25, 32], "21": [12, 22, 24, 25, 32], "21105": 24, "21306090": [25, 32], "2195": 24, "22": [12, 22], "2216": 24, "225": 32, "2257": [20, 21], "23": [12, 13, 22], "230": 25, "24": [12, 22, 25, 32], "241": 25, "247": 13, "25": [12, 22, 25], "2500": 25, "25th": 12, "26": 22, "265": 24, "27": 22, "2739": 20, "275": 24, "2784": 25, "28": [25, 32], "28542224": [25, 32], "287": 24, "29": [25, 32], "2a": 31, "2b": 31, "2f_": 24, "2fjoss": 24, "2kh": 24, "2m": 22, "2nd": [12, 24, 25, 32], "3": [0, 3, 9, 10, 11, 12, 15, 18, 20, 22, 23, 25, 26, 27, 28], "30": 32, "300": 25, "3000": 25, "301": 32, "306": 32, "32": 24, "33rd": 12, "341721e6": 25, "342": 25, "34th": 12, "35": 25, "355": 13, "35th": 12, "36": 24, "360": 0, "3600000": 25, "36th": 12, "37": 32, "37085481": [25, 32], "373": 13, "375264e6": 25, "37th": 12, "38": 6, "384": 13, "3a": 31, "3b": 31, "3d": [25, 26], "3dof": [25, 28, 32], "3fk": 25, "3rd": 12, "3sc": 25, "3x1": 26, "3x3": 26, "4": [0, 9, 10, 12, 18, 20, 22, 24, 25, 26, 28, 31], "40": 25, "400": [25, 32, 34], "407": 32, "408": 13, "41": 24, "419": 32, "423": 13, "426": 13, "43": 6, "4352": 24, "4364": 24, "438": 13, "439": 13, "44": [13, 24], "444": 13, "445": 13, "45": 13, "455": 13, "459": 13, "464": 13, "478": 25, "479": 13, "48": 13, "481": [25, 32], "485": 13, "486": 13, "490": 13, "491": 13, "499": 25, "4a": 31, "4th": 12, "5": [0, 10, 12, 13, 15, 18, 20, 22, 24, 25, 28, 29], "50": [0, 10, 15, 18, 25], "500": 25, "503": 13, "508": 13, "512": 13, "514": 13, "516": 13, "517": 13, "5181": 24, "5190": 24, "52": 13, "5281": 13, "53": 15, "54": 13, "542": 32, "548": 13, "557": 13, "56": 25, "57": [13, 25, 32], "575": 13, "586": 13, "590": 24, "5e6": 25, "5th": 20, "6": [0, 7, 10, 11, 12, 13, 15, 18, 22, 24, 25, 26, 28], "60": 26, "603": 24, "61": 25, "611": 13, "61400": 15, "615": 32, "620": 13, "62399": 24, "62600": [13, 24, 28], "63": [24, 25], "630": [13, 25], "632": 13, "634": 13, "636": 13, "641": 13, "642": 13, "643": 13, "649": 13, "654": 13, "656": 13, "66": [25, 32], "6664": 25, "668": 13, "675": 13, "678": 13, "685": [13, 24], "686": 13, "6894": 25, "69": 24, "692": 13, "694": 13, "6dof": [3, 24, 26, 28], "6i": 25, "6x1": 26, "6x6": [25, 26, 28], "6x6xn": 26, "7": [0, 10, 12, 13, 15, 18, 22, 24, 25, 26, 28, 29], "70": 25, "700": 25, "705": 24, "712": 13, "714": 24, "72": 32, "720": 13, "727": [13, 32], "728": 13, "73": 15, "736": 13, "737": 13, "74": 13, "75": [24, 25], "760": 13, "761": 13, "765": 13, "77": 25, "770": 13, "774": 13, "775": 13, "779": 13, "790": 13, "796": 13, "797": 13, "799": 13, "7th": 24, "8": [0, 10, 12, 18, 20, 22, 24, 25, 28, 32, 34], "80": 25, "800": 13, "801": 13, "802": 13, "803": 13, "806": 13, "807": 13, "808": 13, "809": 13, "81": 26, "811": 13, "812": 13, "814": 13, "816": 13, "817": 13, "82": [25, 32], "821": 13, "822": 13, "826": 13, "827": 13, "828": 13, "831": 13, "832": 13, "833": 13, "834": 13, "838": 13, "839": 13, "84": 25, "840": 13, "841": 13, "842": 13, "84416": 24, "847": 13, "85": 25, "850": [25, 32], "856": 13, "85e6": [32, 34], "86": 25, "862": 13, "864": 13, "866": 13, "86e9": 25, "870": [13, 25], "874": 13, "8755034098": 15, "877": 13, "878": 32, "884": 13, "885": 13, "894": 13, "896": 13, "898": 13, "9": [0, 10, 12, 13, 15, 18, 22, 25, 26, 28, 29, 32, 34], "90": 25, "900": 13, "904": 13, "907": [13, 32], "91": 25, "910": 13, "9104": 20, "911": 13, "9118": 20, "917": 13, "919": 13, "920": 13, "923": 13, "929": 13, "931": 13, "935": 20, "94": 32, "941": 20, "944": 13, "94407091": [25, 32], "94419614": [25, 32], "946": 13, "947": 13, "95": 25, "950": 13, "954": 13, "955": 13, "957": 13, "958": 13, "96": 25, "962": 13, "981": 13, "983": 13, "99": 25, "990": 13, "993": 13, "999": [13, 25, 26, 32, 34], "A": [0, 3, 5, 10, 11, 12, 13, 15, 18, 20, 21, 22, 24, 25, 28, 29, 31, 34], "AND": [10, 18], "AS": [10, 18], "And": [25, 27], "As": [0, 3, 15, 22, 25, 34], "At": [11, 25, 28], "But": 0, "By": [22, 25], "FOR": [10, 18], "For": [0, 1, 3, 7, 10, 15, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "If": [0, 3, 5, 10, 18, 22, 24, 25, 26, 28, 29, 31, 34], "In": [0, 3, 5, 6, 8, 10, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32, 34], "It": [3, 4, 11, 15, 17, 22, 24, 25, 26, 27, 28, 31, 34], "Its": 22, "NOT": 26, "Near": 22, "No": [8, 20, 25], "Not": [10, 18], "OF": [10, 18], "OR": [10, 18], "On": [22, 25], "One": [3, 25, 26, 27], "That": 22, "The": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "Then": [22, 25], "There": [0, 25, 26, 28, 31, 32], "These": [0, 3, 25, 27, 28, 31, 32], "To": [0, 3, 5, 6, 13, 15, 22, 24, 29, 31, 32], "With": [17, 22, 25], "_": [0, 13, 22, 24, 25], "_common_input_fil": 25, "_n": 22, "_r": 22, "_t": 22, "a1": 32, "a2": 32, "a3": 32, "a_": [0, 22, 24, 25], "a_d": [22, 24], "a_r": 24, "abba": 15, "abil": [3, 7, 11, 13, 25, 28], "abl": [0, 3, 11, 28, 34], "about": [0, 3, 12, 22, 24, 25, 26, 28, 32, 34], "abov": [0, 3, 10, 15, 18, 22, 24, 25, 26, 28, 31, 33], "absolut": 26, "absorb": [24, 25, 29, 30], "ac36": 8, "acaus": 25, "acc": 26, "acceler": [0, 13, 15, 17, 22, 24, 25, 26, 28], "accept": [3, 10, 18], "acces": 3, "access": [0, 3, 25, 29, 31], "accompani": 28, "accomplish": 25, "accord": [3, 15, 22, 24, 25], "accordingli": 25, "account": [0, 22, 24, 25, 27, 28], "accumul": [25, 26, 28], "accur": [13, 22, 24, 25, 31], "accuraci": [3, 4, 24, 25, 31], "acheiv": 3, "achiev": 25, "acknowledg": [7, 9, 10, 16, 18], "across": [6, 22, 24, 25], "act": [10, 15, 18, 22, 24, 25, 26, 32], "action": [6, 13, 29], "activ": [22, 28, 31, 34], "actual": [15, 22, 25, 26], "actualaddedmassforc": 26, "actuat": [22, 26, 28], "ad": [2, 3, 4, 6, 13, 17, 22, 24, 25, 26, 28, 29, 34], "adam": [7, 8, 13], "adapt": 7, "add": [1, 3, 10, 13, 17, 18, 19, 24, 25, 28, 31], "addendum": [10, 18], "addit": [3, 8, 10, 12, 15, 18, 21, 24, 25, 26, 27, 28, 29, 31, 32, 34], "addition": [0, 24, 25, 28, 32, 34], "addlindisp": 26, "addpath": 29, "address": [0, 3, 31], "addtion": 25, "addwecsimsourc": 29, "adequ": [25, 28], "adjac": [24, 25], "adjmassfactor": [0, 26], "adjust": [0, 24, 25, 28], "adjustmassmatrix": 0, "administr": 8, "admitt": 25, "adopt": 22, "advanc": [2, 3, 11, 13, 16, 22, 24, 27, 28, 29, 30, 31, 32, 34], "advanced_featur": 27, "advis": [10, 18], "aero": 22, "aerodyn": 15, "aeroload": [15, 17, 22], "affect": [0, 3, 22, 25], "afford": 25, "afo": 25, "aforement": [15, 22], "after": [0, 15, 22, 25, 26, 28, 31], "ag": 0, "again": [25, 31], "against": [3, 10, 18], "agenc": 12, "aggreg": 25, "agk": 0, "agmoore4": 13, "agre": [10, 18], "agreement": [10, 18], "ah1": [25, 34], "ah1filenam": 25, "ahmedmetin": 13, "ai": 25, "aid": 31, "aim": [22, 24], "ainf": [13, 25], "air": 22, "airfoil": [15, 22], "airfoil_index": 15, "akeest": 13, "al": [12, 20, 25], "alain": 25, "alan": 15, "alberto": 19, "algebar": 0, "algebra": 0, "algorithm": [11, 22, 24, 25, 33], "align": 25, "alixhaid": 13, "all": [0, 3, 5, 6, 10, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "alleg": [10, 18], "allen": 15, "alli": 25, "allianc": 8, "alliedmot": 25, "allison": 13, "allow": [0, 1, 3, 11, 13, 15, 22, 24, 25, 26, 27, 28, 29, 32], "almost": 25, "alon": [10, 18], "along": [10, 15, 18, 22, 24, 25, 26, 27, 28, 33], "alongsid": [10, 18], "alpha": [0, 24], "alreadi": [25, 32], "also": [0, 3, 4, 6, 7, 11, 15, 17, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "alter": 0, "altern": [0, 22, 24, 25, 31], "although": 25, "alufasam": 13, "alwai": [3, 22, 24, 25, 32], "amax": 25, "american": 24, "amin": 25, "among": [0, 25, 34], "amplitud": [0, 15, 24, 25], "ampspectraforw": 13, "an": [0, 3, 7, 10, 11, 12, 13, 15, 18, 20, 22, 24, 25, 26, 27, 28, 29, 32, 33, 34], "analys": [12, 15], "analysi": [12, 13, 15, 20, 24, 25, 32], "analysistim": 15, "analyt": 13, "ancellin": 24, "anchor": [15, 22, 27], "anderson": 15, "andrew": [15, 24], "angfreq": 25, "angl": [15, 22, 24, 25, 26], "angular": [0, 22, 24, 25, 26, 28], "angularli": [15, 22], "ani": [0, 3, 5, 7, 10, 11, 18, 22, 24, 25, 26, 28, 29, 32], "anim": 25, "annex": 13, "annot": [10, 18], "anoth": [0, 3, 25, 27, 28, 31], "ansi": [17, 24], "anthoni": 15, "anyon": 4, "anywher": 34, "ap_a": 25, "ap_b": 25, "apach": [9, 16], "api": [13, 25, 28, 30], "apli": 26, "appear": [3, 10, 18, 24], "append": 25, "appendix": [10, 18], "appli": [0, 10, 13, 15, 18, 22, 24, 25, 26, 28], "applic": [0, 2, 7, 10, 11, 12, 13, 17, 18, 21, 24, 25, 26, 28, 30, 31, 32, 33], "approach": [0, 22, 24, 25, 26, 28], "appropri": [10, 18, 25, 27, 31, 32], "approx": [22, 24], "approxim": [0, 22, 24, 25, 28, 31], "apr": 24, "april": 12, "aqwa": [11, 13, 17, 24, 25, 27, 32, 34], "ar": [0, 3, 4, 5, 6, 7, 10, 11, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "arbitrari": 25, "arctic": [12, 24], "area": [0, 22, 24, 25, 26, 28, 31], "area_i": 26, "area_n": 26, "area_t": 26, "area_x": 26, "area_z": 26, "aren": 25, "argument": [0, 13, 24, 25], "aris": [0, 10, 18, 24], "arm": 0, "around": [15, 22, 24], "arrai": [22, 25, 26, 27, 28], "arriv": 22, "arrow": 25, "articl": 9, "ascend": 25, "ascii": [22, 26], "ashleynchong": 13, "asilomar": 24, "ask": 31, "aspect": [3, 15, 24, 25], "assembli": 25, "assert": [10, 18], "assign": [3, 26], "assist": [25, 31], "associ": [8, 10, 18, 24, 26, 28], "assum": [0, 10, 15, 18, 22, 24, 25, 26, 28, 31], "assumpt": [22, 24, 25], "asympot": 24, "atanh": 25, "attach": [10, 15, 18, 25, 27], "attack": 15, "attempt": [0, 15, 25, 31], "attribut": [3, 10, 18, 28], "augment": 25, "august": 12, "aur": [24, 25], "author": [10, 13, 18, 21], "authorship": [10, 18], "auto": [3, 22], "automat": [13, 22, 25, 26, 28, 29], "avail": [3, 6, 10, 12, 13, 18, 22, 24, 25, 28, 29, 31, 32, 33, 34], "averag": [15, 22, 24, 25], "avg": 25, "avi": 25, "avoid": [22, 24], "awai": 32, "award": 12, "ax": [25, 26], "axi": [0, 15, 19, 22, 24, 25, 26, 28], "axial": 24, "axisanglelist": 26, "axislimit": [25, 26], "axisymmetr": 25, "az": 25, "azimuth": 26, "azura": 8, "b": [0, 10, 12, 15, 18, 22, 24, 25, 26, 28, 31], "b1": 24, "b10": 24, "b11": 24, "b12": 24, "b13": 24, "b14": 24, "b15": 24, "b16": 24, "b17": 24, "b18": 24, "b19": 24, "b2": 24, "b20": 24, "b21": 24, "b2b": [3, 25, 26, 27], "b3": 24, "b4": 24, "b5": 24, "b6": 24, "b7": 24, "b8": 24, "b9": 24, "b_": [15, 22, 24, 25], "b_d": 24, "b_r": 24, "b_u": 22, "ba": 0, "babarit": [12, 24, 25], "bacelli": 25, "back": [13, 22, 25, 28], "background": 22, "backward": 3, "bad": 13, "bailei": 12, "balanc": 31, "band": 24, "bar": 25, "barg": [11, 25, 27], "barnett": 24, "barter": 15, "base": [3, 5, 10, 13, 15, 18, 22, 24, 25, 26, 27, 28, 31, 32, 33, 34], "baseconnect": [25, 26, 28], "baselin": [15, 19], "basi": [10, 18], "basic": 32, "batch": [7, 11, 13, 25, 27, 28], "becaus": [0, 15, 22, 24, 25, 31, 32], "becom": [0, 15, 22, 24, 25, 32], "been": [0, 10, 11, 14, 15, 17, 18, 22, 24, 25, 28, 32], "beetween": 28, "befor": [3, 15, 22, 25, 28, 31], "begin": [0, 3, 15, 22, 24, 25], "behalf": [10, 18], "behav": 25, "behavior": 31, "behaviour": 25, "behind": 0, "being": [0, 3, 24, 25, 26, 28, 31, 32, 33], "below": [0, 3, 10, 11, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "bem": [11, 15, 17, 22, 23, 25, 26, 27, 28, 31, 33, 34], "bem_data": 28, "bemdata": 28, "bemio": [11, 13, 22, 24, 27, 28, 29, 30, 31, 34], "bemt": 22, "benchmark": [24, 25], "bend": [11, 15, 22, 24, 25], "benefici": [10, 18, 25], "benjamin": 15, "berkelei": 8, "best": 25, "better": [15, 22, 25], "between": [3, 7, 8, 13, 15, 19, 22, 24, 25, 26, 28, 31, 34], "big": 33, "bigg": 0, "bin": 28, "binari": [3, 13], "bind": [10, 18], "biunivoc": 15, "bl": [15, 22], "blade": [15, 17, 19, 20, 26], "bladedata": [15, 17, 22], "bladediscr": [15, 22], "bladepitch": 26, "bladerootload": 26, "blank": 31, "blcrvac": 15, "blcrvang": 15, "block": [0, 3, 11, 13, 17, 22, 25, 26, 29, 30, 31, 32, 33, 34], "blswpac": 15, "blue": [3, 25], "bluhm": 12, "bmatrix": [0, 24], "bode": 25, "bodi": [3, 7, 11, 12, 13, 15, 17, 22, 23, 30, 31, 34], "body2": 25, "body2bodi": 13, "bodyblockhandl": 3, "bodyclass": [0, 3, 25, 26, 28, 32, 34], "bodyclasscallback": 3, "bodynam": 26, "bodynum": 26, "bold": 31, "boldsymbol": [22, 24], "bonni": 15, "booktitl": 21, "bortolotti": 15, "bosma": 12, "both": [0, 3, 6, 7, 11, 12, 15, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "bottom": [11, 24, 25, 26], "bound": [25, 26], "boundari": [11, 15, 17, 23, 25, 34], "bouw": 24, "box": 28, "bracco": [19, 20, 21], "brad": 8, "bradl": 13, "brake": [22, 25], "branch": [1, 3, 5, 6, 13], "break": 24, "breakpoint": [15, 22], "bredmos": 15, "brekken": [12, 24, 25], "bretschneid": 32, "brief": 28, "briefli": 22, "brien": 24, "bring": 22, "browser": [13, 25, 29], "brushless": 25, "bshaft": 25, "bu": 25, "bug": [5, 13, 31], "bugfix": 13, "build": [6, 13, 15, 19, 28], "built": [0, 25], "bulk": 28, "bulkmodulu": 25, "buoi": [27, 28], "buoyanc": [12, 23, 26, 28, 34], "buoyant": [25, 26, 31], "burden": 3, "busan": 12, "button": [3, 25], "c": [6, 10, 12, 13, 15, 18, 22, 24, 25, 28, 29, 32], "c1": 25, "c2": 25, "c3": 25, "c4": 25, "c5": 25, "c6": 25, "c7": 25, "c_": [0, 22, 24, 25], "c_1": 22, "c_2": 22, "c_3": 22, "c_d": 24, "c_p": 22, "c_r": 24, "ca": [3, 12, 24, 25, 26, 32], "ca_i": 26, "ca_n": 26, "ca_t": 26, "ca_x": 26, "ca_z": 26, "cabbel": 24, "cabl": [3, 13, 15, 30], "cableclass": [25, 26, 28], "cabledamp": [25, 28], "cablelength": 26, "cablenam": [25, 26, 28], "cablestiff": [25, 28], "cad": [15, 22, 25, 34], "cal": [25, 34], "calcspectralmo": 25, "calcuat": 24, "calcul": [0, 3, 13, 15, 17, 22, 26, 28, 31, 32, 33, 34], "calculateforceaddedmass": [0, 26], "calculation_of_ainf_using_radiationirf": 13, "calcwavenumb": 25, "california": 8, "call": [0, 3, 13, 15, 17, 22, 25, 26, 28, 29, 31, 32], "caller": [25, 28], "callmoordynlib": 26, "camera": 25, "can": [0, 1, 3, 7, 11, 15, 17, 19, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "canada": 12, "cancel": [3, 13, 25], "cannot": [0, 3, 10, 18, 25, 31], "canon": 22, "capabl": [11, 12, 13, 17, 24, 25, 28], "capacit": 25, "capit": 0, "captur": [22, 24, 25], "capytain": [11, 13, 24, 25, 27, 32, 34], "care": 31, "carefulli": 31, "carlo": 7, "carlson": 24, "carnegi": 8, "carpent": 0, "carri": [10, 17, 18, 22], "cartesian": [7, 11], "cartwright": 24, "case": [0, 3, 6, 11, 13, 15, 22, 24, 25, 27, 28, 29, 30, 32, 33], "casei": 12, "catch": 25, "categor": 25, "categori": [3, 28], "catenari": [15, 22, 25, 27], "caus": [0, 10, 18, 24, 26], "causal": [24, 25], "caution": 25, "cb": [15, 24, 25, 26], "cd": [3, 25, 26, 28, 29], "cd_n": 26, "cd_t": 26, "cd_x": 26, "cd_y": 26, "cd_z": 26, "cdot": [0, 22, 24], "celer": 25, "cell": [25, 26], "cellpressures_hydrostat": 26, "cellpressures_tim": 26, "cellpressures_wavelinear": 26, "cellpressures_wavenonlinear": 26, "center": [0, 15, 24, 25, 26, 28, 32, 34], "centerbuoy": [26, 28], "centerbuoyancyparam": 3, "centergrav": [25, 26, 28], "centergravityparam": 3, "centr": [12, 15, 22], "central": 0, "centroid": 25, "certain": [0, 3, 10, 15, 18, 22, 25, 29], "cfg": 25, "cg": [24, 25, 26], "ch": 24, "chain": 25, "challeng": 3, "chang": [0, 3, 5, 10, 13, 15, 18, 22, 25, 27, 31], "changelog": 13, "char": 26, "charact": [10, 18], "character": [24, 25, 32], "characterist": [0, 15, 22, 24, 25, 26, 28], "charg": [10, 18, 28], "check": [3, 6, 13, 25, 26, 28, 29, 31], "checkbox": 3, "checkinput": 26, "checkout": 3, "checkvalv": 26, "choic": 17, "choos": [10, 15, 18, 22, 25], "chop": 25, "chord": [15, 22], "chosen": [3, 22, 25, 28], "chri": 8, "christoph": 15, "ci": 13, "cic": [27, 31], "cicdt": [25, 26], "cicendtim": [26, 31], "circ": 22, "circuit": [13, 24, 25, 28], "citat": 13, "cite": [9, 16], "cl": 25, "claim": [10, 18], "clarif": 31, "clarifi": [3, 13, 31], "class": [3, 13, 15, 17, 22, 24, 25, 30, 31, 32, 34], "classnam": 28, "clean": [3, 5, 13], "cleanup": 13, "clear": [25, 29], "clearli": 24, "click": [25, 28, 32], "clone": 29, "close": [12, 13, 15, 22, 24, 25, 26, 28, 31], "closemoordynlib": 26, "co": [0, 12, 15, 24, 25], "code": [0, 1, 3, 4, 5, 6, 8, 10, 12, 13, 15, 17, 18, 22, 24, 25, 27, 29, 30, 31, 32, 34], "coe": 25, "coeff": 25, "coeffic": 26, "coeffici": [0, 13, 15, 17, 22, 24, 25, 26, 27, 28, 33, 34], "coer": 12, "cog": 26, "cog_rel": 15, "coil": 25, "coincid": 26, "collabor": [7, 8, 19], "collect": [15, 22], "colleg": 12, "color": [3, 13, 25, 26], "column": [0, 25, 26, 28], "com": [1, 13, 24, 25, 27, 29], "combin": [0, 10, 15, 18, 22, 24, 25, 28], "combine_bem": 13, "combinebem": 25, "combourieu": 12, "come": [3, 24, 29], "command": [3, 6, 13, 25, 28, 29, 32, 34], "comment": 25, "commerci": [10, 18, 25], "commit": [1, 3, 5, 6, 13], "common": [3, 10, 15, 18, 24, 25, 28, 31], "commonli": 22, "commun": [10, 18], "comp": 26, "compar": [0, 3, 13, 17, 22, 24, 25, 31], "comparison": [12, 24, 25], "compat": [3, 13, 25, 29], "compens": [15, 22], "competit": [11, 12, 25, 27], "compil": [10, 13, 18, 25, 28], "complet": [12, 25, 31, 32], "complex": [3, 11, 24, 25, 28], "compli": [10, 15, 18, 22], "complianc": [10, 18], "compon": [0, 15, 22, 24, 25, 26, 28, 34], "compos": [22, 25], "comprehens": [15, 25], "compress": [25, 26, 28], "compris": [7, 11, 28], "comput": [10, 13, 15, 17, 18, 22, 24, 26, 29, 32, 34], "computation": 22, "concaten": 25, "concept": 25, "concern": 15, "concerningo": 15, "condit": [0, 10, 15, 18, 19, 22, 24, 26, 28, 30, 32, 34], "conduct": 25, "conf": 24, "confer": [12, 13, 20, 21, 24], "confid": 22, "configur": [1, 10, 18, 24, 28], "confirm": [25, 31], "conflict": [3, 5, 13, 22], "conjug": 25, "conjunct": [25, 34], "connect": [22, 24, 25, 26, 28, 31, 32], "connnect": 25, "consecut": [25, 26], "consequenti": [10, 18], "conserv": [25, 26], "consid": [0, 22, 24, 25], "consider": 25, "consist": [10, 15, 18, 22, 24, 25, 27, 28, 31, 32, 34], "conspicu": [10, 18], "constant": [0, 15, 22, 24, 25, 28], "constitut": [10, 15, 18, 22], "constrain": [15, 25, 28, 32], "constraint": [3, 11, 13, 15, 17, 24, 30, 31, 32, 34], "constraint1": [25, 32, 34], "constraintclass": [25, 26, 28, 32, 34], "constraintnam": [26, 28], "constru": [10, 18], "construct": [24, 25], "constructor": 26, "consult": 22, "contact": 24, "contain": [0, 3, 7, 10, 11, 15, 18, 22, 24, 25, 26, 27, 28, 32, 34], "content": [10, 13, 18, 25, 29], "context": 3, "continu": [3, 4, 6, 13, 22, 24, 25, 26, 31], "contour": 24, "contract": [8, 10, 18], "contrain": 28, "contraintclass": 26, "contribut": [0, 1, 7, 8, 10, 12, 13, 18, 24, 25, 26, 29], "contributor": [9, 10, 13, 18, 29], "contributori": [10, 18], "control": [10, 11, 12, 13, 17, 18, 19, 24, 26, 28, 30, 32], "conveni": [31, 32], "convent": [1, 22, 24, 25], "converg": [15, 25], "convers": [10, 12, 13, 18, 24, 25, 28], "convert": [0, 11, 12, 13, 17, 19, 22, 24, 25, 28, 32, 34], "convolut": [3, 13, 23, 25, 26, 28, 31, 32], "coordin": [13, 23, 25, 26, 28, 34], "coorespond": 27, "copi": [1, 3, 10, 18, 25, 29, 31], "copyright": [9, 16], "core": 0, "coreform": 25, "corioli": 24, "cork": 12, "correct": [3, 15, 24, 25, 29, 31], "correctli": [3, 25, 26, 28, 29, 31, 34], "correspond": [0, 3, 15, 22, 24, 25, 26, 27, 28, 32, 34], "cosh": 0, "cosin": 25, "cost": 25, "costello": 12, "could": 25, "couldn": 25, "count": 25, "counterclaim": [10, 18], "counterpart": 3, "coupl": [11, 12, 17, 19, 25, 27, 28], "cours": [12, 30], "covari": 22, "cover": [22, 24, 25, 27], "crank": [25, 28], "crash": 13, "crc": 20, "creat": [0, 1, 3, 11, 12, 13, 15, 17, 22, 25, 26, 28, 31, 32, 34], "create_mooring_matrix": [15, 17, 22], "creation": [15, 22], "credit": 8, "crest": 24, "critic": [3, 32, 34], "cross": [0, 10, 18, 25, 26], "csi_c": 15, "csi_theta_bl": 15, "csi_theta_rosco": 15, "cube": [25, 26], "cubit": 25, "cummin": 24, "current": [0, 3, 4, 6, 7, 13, 19, 23, 26, 31, 34], "custom": [11, 25, 28, 32, 34], "customari": [10, 18], "customiz": [11, 13], "customvisibilitycallback": 3, "cut": 22, "cylind": [0, 24, 25, 28], "d": [0, 10, 12, 13, 15, 18, 22, 24, 25], "d1": [15, 22], "d2": [15, 22], "d3": [15, 22], "d4": [15, 22], "d5": [15, 22], "d6": [15, 22], "d7": [15, 22], "d8": [15, 22], "d9": 15, "d_": 24, "d_d": 24, "d_r": 24, "dagher": 15, "dai": 12, "damag": [10, 18], "damiani": 15, "damp": [3, 13, 15, 22, 23, 26, 27, 28, 31, 32, 34], "dampen": 24, "damper": [24, 25], "daniel": 15, "dash": 25, "dasin": 24, "dat": [13, 25, 34], "data": [0, 3, 11, 13, 15, 17, 19, 22, 24, 26, 27, 28, 32, 33], "databas": 34, "dataset": 25, "date": [10, 18], "dav": 13, "davi": 15, "david": [7, 13, 19, 24, 25], "dc": 12, "dd": 25, "ddot": [0, 22, 24], "de": [8, 10, 18], "dead": 13, "debug": 30, "decai": [11, 24, 28, 30], "decemb": 12, "decid": 22, "declutch": 27, "decompos": 0, "decomposit": [0, 24], "decreas": [0, 3, 25, 26, 31], "dedic": 22, "deep": [24, 25], "deepcwind": [11, 24, 25], "deepli": 25, "deepwat": 25, "default": [0, 3, 13, 24, 25, 26, 28, 34], "defend": [10, 18], "deficit": 15, "defin": [0, 1, 3, 7, 10, 13, 15, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "definit": [0, 3, 10, 13, 15, 18, 22, 24, 25, 28, 32, 34], "deflect": 22, "deform": [0, 24], "deg": [15, 22, 25, 26], "degre": [0, 7, 11, 15, 22, 24, 25, 26, 27, 28, 31, 34], "delai": 0, "delclutch": 25, "delcuth": 25, "delet": [3, 5, 25], "delft": 22, "delhommeau": 24, "deliber": [10, 18], "delta": [22, 24, 25], "demand": 22, "demonstr": [0, 11, 12, 25, 27, 32], "denot": [0, 22, 24, 34], "dens": 25, "densiti": [0, 15, 22, 24, 25, 26, 28], "denver": 12, "depart": [7, 8, 12], "depend": [0, 3, 13, 22, 24, 25, 27, 28], "depict": 0, "depth": [0, 15, 24, 25, 26], "deriv": [0, 10, 18, 22, 24, 25, 31], "desalin": [7, 25, 30], "descend": 24, "describ": [0, 3, 4, 10, 15, 18, 22, 24, 25, 28, 31, 32, 33, 34], "descript": [15, 17, 25, 28, 31, 34], "design": [10, 12, 15, 18, 20, 22, 24, 25, 28, 32, 34], "desir": [0, 3, 15, 22, 24, 25, 28, 31, 32], "destblocknam": 3, "detach": 22, "detail": [0, 1, 3, 15, 17, 24, 25, 27, 30, 34], "detect": 28, "determin": [0, 10, 15, 18, 22, 24, 25, 28, 34], "detract": 31, "dev": [3, 5, 6, 13], "develoepr": 1, "develop": [0, 1, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 28, 29, 31, 32, 33, 34], "deviat": 22, "devic": [7, 11, 13, 17, 24, 25, 28, 31, 34], "devis": 25, "df": 24, "dforbush2": 13, "di": [14, 19], "dia": 24, "diagon": 24, "diagram": [3, 11, 13, 17, 25, 28, 34], "dialog": [3, 25], "diamet": [0, 15, 24], "differ": [0, 3, 5, 10, 13, 15, 17, 18, 22, 24, 25, 27, 28, 31, 32], "differenti": [22, 24, 25, 28], "difficult": [0, 3, 24, 31], "difficulti": [0, 31], "diffract": [0, 24, 25], "diffractionforc": 25, "digit": 25, "dimens": [15, 25, 26, 32], "dimension": [13, 24], "direciton": 26, "direct": [0, 10, 13, 15, 18, 22, 24, 26, 28, 31, 32], "direction": [13, 24], "directli": [3, 13, 17, 22, 24, 25, 28, 31], "directori": [1, 3, 6, 13, 24, 25, 27, 28, 29, 32, 34], "disabl": 26, "disableal": 26, "disclaim": [10, 18], "discret": [3, 15, 22, 24, 25, 28], "discretis": 15, "discuss": [0, 10, 15, 18, 22, 24, 33], "disk": 15, "dispar": 25, "dispers": [23, 25], "displac": [0, 17, 24, 26, 27, 28, 31], "displai": [10, 18, 29], "dissip": [25, 32], "distanc": [0, 15, 22, 24, 25, 26], "distinct": [3, 24, 25, 28, 32], "distribut": [0, 6, 10, 18, 22, 24, 25, 26], "divers": [15, 22], "divid": [25, 28], "dll": [13, 26], "dmass": 0, "dn": 25, "do": [0, 10, 13, 15, 18, 22, 25, 28, 29, 31], "doc": [13, 28], "doc_auto_gen_mask": 13, "document": [0, 1, 3, 4, 6, 10, 13, 18, 22, 25, 27, 28, 29, 34], "doe": [0, 3, 10, 12, 15, 18, 22, 24, 25, 28, 31, 32, 33], "doesn": [13, 25], "dof": [13, 24, 25, 26, 27, 28], "doi": [13, 24], "domain": [0, 7, 11, 15, 22, 23, 25, 28, 34], "domains": [25, 26], "domin": [0, 7, 13, 25], "don": 3, "done": [15, 22, 25, 28, 31, 32], "donload": 33, "dot": [0, 22, 24, 25], "doubl": [25, 28, 32], "down": 25, "download": [13, 25, 28, 30, 31, 33, 34], "dp": [15, 22], "drag": [0, 13, 15, 22, 24, 26, 28, 32], "dramat": 24, "drift": [13, 24, 25, 26], "drive": [13, 24, 26, 28], "drivetrain": 25, "drogu": 24, "drop": [25, 32], "dt": [0, 22, 25, 26, 28, 32, 34], "dtfenonlin": 13, "dtme": 13, "dtnl": 13, "dtnsrdc": 24, "dtout": [25, 26], "due": [0, 7, 15, 22, 24, 25, 26], "durat": 25, "dure": [0, 3, 15, 17, 22, 24, 25, 26, 28, 32, 34], "dx": 25, "dy": 25, "dyke": 15, "dylib": 26, "dynam": [7, 11, 12, 22, 24, 25, 28], "dynamomet": 12, "dz": 25, "e": [0, 3, 6, 12, 15, 17, 20, 21, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "ea": 15, "each": [0, 3, 6, 10, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "earli": 13, "earlier": [22, 24], "eas": 31, "easi": [3, 31, 34], "easier": [24, 25], "easiest": [29, 32], "easili": [3, 5, 25, 27, 29], "econom": [12, 20], "edit": [1, 3, 15, 25], "editor": 3, "editori": [10, 18], "edward": 8, "eer": 12, "effect": [0, 11, 22, 24, 25, 31], "effici": [8, 15, 20, 22, 25], "effmodel": 25, "effort": [4, 31], "efftabledeltap": 25, "efftablemecheff": 25, "efftableshaftspe": 25, "efftablevoleff": 25, "egeland": 24, "eight": 28, "either": [0, 3, 10, 18, 25, 26, 28], "elabor": [10, 18, 25], "electr": [15, 22, 25, 26, 28], "electri": 25, "electricgen": 25, "electricgeneratorec": 25, "electromagnet": 25, "electron": [10, 18], "element": [2, 3, 11, 13, 15, 17, 22, 23, 26, 28, 31, 32, 34], "elev": [0, 3, 11, 13, 24, 26, 27, 28, 32], "elevationdata": 28, "elevationfil": [25, 26, 28], "elevationimport": [25, 26, 32], "elevationtospectrum": 28, "elipsoid": 25, "ellipsoid": [11, 27], "els": 3, "elsewher": 15, "emilio": 19, "empir": 24, "emploi": 22, "empti": [24, 25], "enabl": [3, 13, 15, 25, 34], "encompass": 26, "encourag": 24, "end": [0, 3, 10, 13, 15, 18, 22, 24, 25, 26, 28, 32, 34], "endtim": [25, 26, 28, 32, 34], "energi": [8, 10, 11, 12, 13, 15, 17, 18, 19, 20, 22, 24, 25, 28, 32], "engag": 4, "engin": [8, 10, 12, 18, 24, 25], "englob": 22, "enhanc": 25, "enk": 24, "enough": 31, "ensur": [3, 5, 6, 25, 31], "enter": [15, 28], "entir": [0, 3, 24, 25], "entiti": [10, 18], "enviro": 0, "environ": [13, 19, 22, 24], "eq": 22, "eqn": 0, "equal": [0, 13, 15, 22, 24, 25, 26, 28], "equalenergi": 25, "equat": [0, 3, 7, 11, 15, 22, 24, 25, 28, 34], "equilibrium": [22, 25, 26, 31, 32], "equilibriumposit": 26, "equispac": 15, "equival": [13, 24, 25, 28], "erica": 27, "erlend": 24, "ermando": [19, 20], "error": [0, 3, 13, 22, 26, 29, 31], "errorifloadnewmodel": 29, "ertekin": 24, "especi": [3, 4, 25, 28, 31], "essenti": [3, 24, 25, 31], "establish": [12, 25], "estim": [0, 22, 25], "et": [12, 20, 25], "eta": [0, 24, 25], "etabuttoncallback": 3, "etadata": 25, "etc": [0, 3, 19, 25, 26, 28, 31], "etmc": 15, "european": [12, 13, 24], "evalu": [15, 24, 31], "evan": 15, "even": [10, 18], "evenli": [22, 24], "event": [10, 18, 24], "everi": [22, 25, 28, 29, 31], "ew": 24, "ewtec": [12, 13], "ewtec2015": 24, "ex": [25, 28, 34], "ex_im": 25, "ex_k": 25, "ex_ma": 25, "ex_ph": 25, "ex_r": 25, "ex_t": 25, "ex_w": 25, "exact": 25, "exactli": 24, "examin": [24, 25], "exampl": [0, 1, 3, 10, 11, 13, 17, 18, 22, 24, 27, 28, 29, 30, 31, 33, 34], "exc": 24, "exce": [13, 22, 25], "exceed": [15, 25], "excel": [25, 27], "except": [3, 5, 10, 18, 22, 24, 25], "excit": [3, 12, 23, 26, 28, 34], "excitationforc": 25, "excitationirf": [25, 26], "exclud": [10, 13, 18, 25], "exclus": [10, 18], "excoeff": 25, "execut": [3, 6, 10, 13, 15, 17, 18, 22, 25, 26, 27, 28, 32, 34], "exercis": [10, 18, 25], "exert": [0, 24, 25, 26], "exhibit": 25, "exist": [15, 17, 22, 25, 31], "exp": 24, "expand": 13, "expect": [22, 25, 31], "expedi": 22, "expens": 25, "experi": [12, 25, 28], "experienc": 25, "experiment": [0, 12, 24, 25, 27, 32], "expertis": 12, "explain": [15, 17, 22, 31], "explicitli": [10, 13, 18, 24], "exploit": 22, "explor": [0, 3, 12, 22, 25, 26, 29, 34], "expon": [15, 24], "exponenti": 24, "export": [25, 34], "express": [0, 10, 13, 18, 22, 24], "extend": 13, "extens": [13, 26, 30, 32], "extent": 25, "extern": [0, 4, 7, 9, 11, 17, 22, 29, 30], "extra": 25, "extract": [2, 13, 22, 24, 25, 28, 33], "extractmaskvari": 0, "extrapl": 0, "extrapol": 0, "extrem": [12, 15, 25, 31], "f": [0, 12, 24, 26, 28], "f_": [0, 24, 25], "face": [3, 25, 26], "facet": 26, "facil": 12, "facilit": 24, "fact": 22, "factor": [0, 15, 24, 25], "faddedmass": 0, "fail": [6, 31], "failur": [10, 18, 31], "fair": 31, "fairlead": [15, 22, 26], "falc": 25, "fall": 31, "faln": 24, "familiar": [25, 32], "fanzhong": 15, "faq": 30, "far": [15, 22, 25], "faraggiana": [19, 20, 21], "fare": 12, "farm": 12, "fashion": 25, "fast": [12, 20, 21], "faster": 25, "fatigu": 20, "fault": 27, "fcn": 13, "fd": 24, "feather": [15, 22], "featur": [2, 3, 4, 5, 6, 11, 13, 16, 17, 21, 22, 24, 27, 28, 29, 30, 31, 32, 34], "februari": 12, "fed": 25, "fee": [10, 18], "feed": [24, 28], "feedback": [22, 25], "feedthrough": 24, "feil": 15, "ferri": 12, "fetch": 24, "few": [15, 25], "fexcpredict": 25, "fidel": [24, 28], "field": [0, 12, 15, 22, 24, 25, 26, 28], "fifth": 24, "fifti": [10, 18], "fig": 26, "figur": [0, 3, 11, 13, 15, 22, 24, 25, 26, 29, 31, 32, 34], "file": [0, 10, 11, 13, 15, 17, 18, 22, 26, 27, 28, 29, 30, 33], "filedir": 25, "filenam": [3, 25, 26], "fileparam": 3, "filepath": 3, "filter": [13, 15, 22], "final": [15, 22, 32], "find": [15, 22, 24], "finit": [15, 24, 31], "fir": [13, 26], "first": [0, 3, 13, 15, 22, 24, 25, 26, 28, 31, 32], "fit": [10, 18, 25, 31], "five": 28, "fix": [5, 11, 13, 15, 22, 26, 27, 28, 32, 34], "fix_readwamit_and_writebemioh5": 13, "fk_im": 25, "fk_ma": 25, "fk_ph": 25, "fk_re": 25, "fkforc": 25, "flag": [3, 13, 25, 26, 28], "flap": [25, 27, 32, 34], "flex": [25, 26, 28], "flexibl": [0, 3, 4, 7, 11, 12, 13, 22, 24, 25, 26, 27, 28], "flight": 12, "flip": 0, "float": [11, 12, 15, 17, 19, 20, 21, 22, 24, 26, 27, 28, 31, 32], "floor": 27, "flow": [0, 15, 24, 25, 26, 31], "flowrat": 25, "flowrateaccumul": 25, "fluid": [0, 24, 25, 26, 27, 28], "flux": 24, "focu": [5, 15, 22], "focus": [25, 33], "folder": [3, 22, 25, 26, 27, 28, 29], "follow": [0, 3, 6, 10, 13, 15, 17, 18, 21, 22, 24, 25, 26, 28, 29, 31, 32, 34], "followerconnect": [25, 26, 28], "foolproof": 31, "foral": [0, 24], "forbush": [7, 13, 25], "forc": [0, 3, 11, 12, 13, 15, 22, 24, 26, 28, 31, 32, 33, 34], "forceactu": 26, "forceaddedmass": 26, "forceconstraint": 26, "forceexcit": 26, "forceinternalmechan": 26, "forcelineardamp": 26, "forcemoor": 26, "forcemorisonandvisc": 26, "forceradiationdamp": 26, "forcerestor": 26, "forcetot": 26, "fork": [1, 5], "form": [0, 10, 18, 22, 24, 25, 28, 34], "format": [2, 13, 25, 26, 28, 34], "former": 7, "formul": [0, 13, 23, 25, 27], "formula": [24, 25], "forthcom": 25, "forward": [3, 12], "found": [0, 15, 17, 22, 24, 25, 27, 28], "four": [11, 13, 15, 22, 25, 27, 28, 29], "fourth": [24, 25], "fowt": [15, 17, 22], "fr": 24, "frac": [0, 15, 22, 24, 25], "fraction": 0, "frame": [0, 3, 15, 22, 25, 26, 32], "frameless": 25, "framework": 6, "franc": [12, 24], "francisco": [12, 32], "frederik": 15, "free": [10, 11, 18, 24, 25, 26, 28, 30, 32], "free_decai": 25, "freedom": [0, 7, 11, 15, 22, 24, 25, 26, 27, 28, 31, 34], "freeli": 25, "freemdom": 24, "frequenc": [0, 3, 11, 13, 15, 22, 24, 25, 26, 28, 31, 34], "frequent": 31, "friction": [15, 24, 26], "from": [0, 1, 2, 5, 10, 11, 13, 15, 17, 18, 22, 26, 27, 28, 29, 31, 32, 33, 34], "front": [24, 25, 31], "frontier": 15, "froud": [0, 11, 13, 23, 26, 34], "full": [10, 13, 18, 24, 26, 31, 32], "fullfil": 29, "fulli": [13, 24, 25], "function": [0, 2, 6, 11, 13, 15, 17, 22, 23, 26, 29, 30, 31, 32, 33, 34], "functionnam": 28, "fund": [7, 9, 31, 32], "fundament": 32, "further": [0, 17, 22, 24, 25, 28], "furthermor": [22, 25], "futur": [4, 25, 31], "fx": [15, 22, 25], "fy": [15, 22, 25], "fz": [15, 22, 25], "g": [0, 3, 6, 15, 17, 20, 21, 22, 24, 25, 26, 28, 29, 31, 32, 33, 34], "ga": 28, "gaertner": 15, "gain": [15, 22, 25], "gamma": [13, 22, 24, 26, 28], "gamma_": 22, "gamma_u": 22, "garrett": 15, "garzon": 12, "gashydaccumul": 25, "gather": 24, "gato": 25, "gaug": [13, 26], "gbm": [13, 24, 25, 26], "gbmdof": 26, "gdf": 34, "gen": [15, 22], "gen_eff": 15, "gener": [0, 3, 6, 7, 10, 11, 12, 13, 15, 18, 23, 26, 28, 29, 30, 31, 32, 33], "genpath": 29, "gentorqu": 26, "geometr": [15, 19, 22], "geometri": [0, 22, 24, 26, 27, 28], "geometryfil": [25, 26, 28, 32, 34], "geomfil": 28, "geophys": 24, "georg": 15, "georgia": 8, "geq": 24, "geq1": 24, "german": 24, "get": [0, 2, 3, 4, 13, 25, 30, 31], "getdialogcontrol": 3, "getdofnam": 13, "getparamet": 3, "gh": 24, "ghigo": [19, 20, 21], "gienapp": 24, "gif": [25, 26], "giorgio": 25, "giovanni": 19, "git": [1, 3, 5, 13, 29, 31], "github": [1, 3, 5, 6, 10, 13, 18, 27, 28, 29, 31], "give": [10, 17, 18, 28], "given": [0, 3, 11, 15, 19, 24, 25, 26, 27, 28, 34], "gk": [0, 24], "global": [0, 3, 15, 22, 25, 26, 28, 32, 34], "glyph": 25, "go": [25, 26, 27, 29, 31], "goal": 22, "golden": 15, "gome": 25, "good": [25, 31], "goodwil": [10, 18], "googl": 13, "goto": 28, "goupe": [15, 24], "govern": [0, 7, 10, 11, 18], "gp_llj": 15, "grai": 3, "graident": 0, "grant": [10, 18], "graphic": 0, "graphiccolor": 25, "grasberg": [7, 13], "gravit": [0, 24, 25], "graviti": [0, 15, 24, 25, 26, 28, 31, 32, 34], "greater": [0, 3, 15, 22, 25, 26, 31], "greatli": [3, 24], "green": [3, 17, 25], "grei": 17, "grid": [15, 22, 25], "gridheight": 15, "gridwidth": 15, "grossli": [10, 18], "ground": [25, 32], "group": [24, 28], "grove": 24, "growth": 24, "guarante": 15, "gui": [3, 13, 32, 34], "guid": [15, 31], "gunawan": 12, "guo": 12, "gusmano": 13, "gx": 25, "gy": 25, "gz": 25, "h": [0, 12, 13, 15, 22, 24, 25, 28], "h0r5e": 13, "h2l": 15, "h5": [3, 13, 24, 26, 27, 28, 29, 31, 32, 34], "h5button": 3, "h5buttoncallback": 3, "h5file": 26, "h_": 24, "ha": [3, 7, 8, 10, 11, 14, 17, 18, 22, 24, 25, 28, 31, 32], "habib": 15, "had": [7, 8, 31], "hal": 24, "half": 25, "hall": [8, 12, 15, 24], "hallett": [12, 32], "hand": [0, 15, 22, 24, 25], "handl": [0, 13, 22, 24, 25, 26], "hankel": 24, "hansen": 15, "har": 12, "hard": 25, "harder": 25, "hardstop": [25, 26], "hardstopcallback": 3, "hardwar": [3, 25, 32], "harmless": [10, 18], "harmon": 24, "harvest": 25, "haskind": 25, "hasselman": 24, "hasselmann": 24, "hat": [22, 24], "have": [0, 1, 3, 10, 11, 13, 15, 17, 18, 22, 24, 25, 28, 29, 31], "hayman": 15, "hdf5": [13, 25, 26, 30, 31, 32, 34], "hdfgroup": 34, "hdfview": 34, "head": [0, 24, 25], "header": [25, 31], "heav": [0, 15, 22, 24, 27, 32], "heavili": 28, "height": [15, 22, 24, 25, 26, 27, 28, 32, 34], "help": [3, 12, 25, 31, 33], "hemispher": 11, "henc": 25, "henrik": 15, "henriqu": 25, "here": [0, 12, 15, 22, 24, 25, 31, 33], "herebi": [10, 18], "herein": [10, 18], "hertz": 24, "hexafloat": 20, "hflowang": 15, "hi": 12, "hidden": 3, "hide": 3, "hierarch": [13, 25], "high": [0, 11, 22, 25, 26, 28, 34], "higher": [15, 22, 24, 26], "highest": 22, "highli": [11, 22, 24, 25, 27, 31], "highlight": [11, 17, 25, 27, 31], "hil": 32, "hing": [25, 32], "hinsdal": 12, "histor": 3, "histori": [5, 25, 26], "hit": 32, "hjulstad": 24, "hold": [10, 18, 24, 25, 28], "homepag": 34, "honeywel": 8, "hope": 31, "horizon": 25, "horizont": [0, 15, 19, 22, 24], "host": [1, 25, 29, 33], "hotimski": [12, 32], "hover": 3, "how": [0, 3, 12, 15, 22, 25, 27, 28, 29, 32, 33, 34], "howev": [0, 3, 10, 15, 18, 22, 24, 25, 29, 31, 34], "hsiang": [7, 24], "hst": 25, "html": [10, 18], "http": [1, 10, 13, 18, 24, 25, 27, 29, 34], "hub": [15, 22, 26], "hubht": 15, "hull": [11, 25], "husain": [7, 13], "hybrid": [15, 17, 19, 20, 22, 24, 25], "hydpistoncompress": 25, "hydraul": [11, 12, 23, 26, 28], "hydraulicacc": 25, "hydrauliccyl": 25, "hydraulicmotor": [25, 26], "hydro": [13, 26, 27, 28, 31], "hydro2": 25, "hydro3": 25, "hydrodata": [25, 29, 31, 32], "hydrodynam": [0, 7, 11, 12, 13, 17, 22, 24, 26, 28, 30, 32], "hydroforc": [0, 26], "hydroforceindex": 26, "hydroforceindexiniti": 26, "hydrograph": 24, "hydrohanam": 26, "hydrostat": [11, 13, 22, 24, 25, 26, 28, 34], "hydrostatics_0": [25, 34], "hydrostatics_1": [25, 34], "hydrostatics_sub_dir": 25, "hydrostatiscs_0": 25, "hydrostiff": [26, 31], "hyperbol": 24, "hyperlink": 13, "hz": [24, 28], "i": [0, 1, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "i_": [0, 22, 24], "ib": 0, "ibod": 0, "ideal": [0, 25], "ident": [0, 3, 25, 28], "identif": 24, "identifi": [3, 25, 27], "idepend": 1, "iea": [15, 22], "iec": [13, 15, 24, 28], "iec_windtyp": 15, "ieckai": 15, "iecstandard": 15, "iecturbc": 15, "iecvkm": 15, "ieee": [12, 25], "ii": [10, 18, 25], "iii": [10, 18], "ilin": 25, "illustr": 24, "imag": [13, 15, 25, 28], "imaginari": 25, "imbal": 31, "immedi": [3, 31], "impact": [24, 25, 31], "impart": 25, "imped": 25, "imperfect": 25, "imping": 0, "implement": [3, 12, 13, 15, 24, 26, 27, 28, 31, 32, 33, 34], "impli": [0, 10, 18, 24, 25], "import": [0, 3, 10, 13, 18, 22, 24, 25, 27, 28, 32], "importbodygeometri": 25, "impos": [0, 15, 22, 25], "improv": [4, 10, 12, 13, 18, 22, 25, 31], "impuls": [13, 24, 26, 28, 33], "inabl": [10, 18], "inacces": 0, "inaccur": 31, "inact": 22, "inadequ": 25, "inc": 8, "incid": [0, 24, 25, 26, 28], "incident": [10, 18], "includ": [0, 3, 6, 7, 8, 10, 11, 12, 13, 15, 17, 18, 19, 22, 24, 25, 26, 27, 28, 29, 32, 34], "inclus": [4, 10, 12, 18, 25], "incom": [24, 25, 26, 28, 32], "incompat": 22, "incomplet": [6, 31], "incompress": 24, "incorpor": [5, 10, 18, 22], "incorrect": 0, "increas": [13, 22, 24, 25, 26, 31], "increasingli": 0, "increment": 25, "incur": [10, 18], "indefinit": 31, "indemn": [10, 18], "indemnifi": [10, 18], "indepen": 0, "independ": [0, 22, 24, 25, 26], "index": [10, 15, 18, 24, 25, 26, 28], "indic": [10, 15, 18, 22, 24, 25, 26, 31], "indirect": [10, 18], "individu": [0, 3, 10, 11, 18, 25], "induc": [24, 25], "industri": [7, 22, 24, 25], "ineffici": 25, "inerti": [15, 19, 22, 25, 26], "inertia": [0, 13, 15, 22, 24, 25, 26, 28, 31, 32, 34], "inertiaproduct": [0, 26], "infilebuttoncallback": 3, "infin": 24, "infinit": [0, 13, 24, 25, 28, 31], "inflow": 15, "influenc": [15, 22, 24, 28], "inform": [3, 6, 7, 10, 15, 18, 22, 24, 25, 28, 29, 31, 32, 34], "infring": [10, 18], "infti": [0, 22, 24, 25], "inher": [25, 31], "inid": 25, "initi": [0, 3, 12, 13, 22, 24, 25, 26, 27, 31, 32, 34], "initializewecsim": [0, 17, 22, 25, 32], "initil": 26, "inproceed": 21, "input": [0, 11, 13, 15, 16, 17, 19, 24, 25, 26, 28, 31, 32], "inputdata": 25, "inputorcustomcallback": 3, "insert": 24, "insid": [3, 25], "insignificantli": 31, "instabl": 0, "instal": [13, 30, 31, 32, 34], "instanc": [3, 22, 25, 26, 28, 29, 32, 34], "instant": 22, "instantan": [24, 25, 26, 28, 34], "instanti": [28, 32, 34], "instead": [0, 13, 22, 25, 28], "institut": [8, 10, 18, 24], "instruct": [3, 25, 29, 32, 33], "insuffici": 31, "int_": [22, 24], "int_0": 22, "intak": 13, "integ": [25, 26], "integar": 25, "integr": [3, 6, 13, 22, 23, 26, 28, 31, 32], "intend": [4, 22, 24, 31], "intens": [15, 22], "intention": [10, 18, 31], "interact": [11, 13, 22, 24, 28, 30], "interdepend": 3, "interest": [15, 22, 25, 27], "interfac": [10, 11, 18, 25, 31], "interi": 26, "intern": [3, 4, 8, 12, 20, 24, 26], "interplai": [3, 25], "interpol": [22, 24, 25, 26, 28], "intertia": 28, "interv": 25, "intop_": [24, 25], "intop_0": 25, "introduc": [15, 17, 22], "introduct": [13, 16, 22], "invari": 24, "investig": [22, 31], "inviscid": [24, 31], "involv": [15, 24], "io": [10, 16, 18], "iop": [20, 21], "ireland": 12, "irf": [24, 25, 31], "irr": 31, "irregular": [3, 13, 23, 26, 32], "irrevoc": [10, 18], "irrot": 24, "isbn": 15, "isequ": 3, "isol": 25, "isop": 12, "issoglio": 19, "issu": [0, 10, 13, 18, 30], "ital": 31, "itali": [14, 19], "item": 3, "iter": [25, 28], "its": [0, 3, 10, 11, 12, 13, 18, 22, 24, 25, 26, 28, 29, 31, 32], "ixi": 26, "ixx": 26, "ixz": 26, "iyi": [26, 32], "iyz": 26, "izz": 26, "j": [12, 13, 15, 25, 26, 28], "januari": [10, 12, 18], "jcc": 25, "jeff": [7, 13], "jem": 25, "jenkin": 13, "jenn": 12, "jennif": [7, 15], "jerica": 24, "jet": [12, 15], "jiamigit": 13, "jleonqu": 13, "jn": 24, "jniffen": 13, "job": 13, "john": 12, "johnson": 24, "joint": [7, 11, 13, 22, 24, 26, 28, 31, 32, 34], "jonkman": 15, "jonswap": [13, 28], "jorg": [7, 13], "joss": 24, "journal": [20, 21, 24], "jtgrasb": 13, "jul": 12, "juli": 12, "june": [12, 24], "just": [11, 15], "k": [0, 12, 13, 22, 24, 25, 32], "k1": 25, "k2": 25, "k_": [22, 25], "k_e": 24, "k_h": 25, "k_i": [15, 22, 25], "k_p": [15, 22, 25], "k_r": 24, "ka": 25, "kaimal": 15, "kalman": 22, "kalmann": 22, "kanner": [8, 12, 32], "karman": 15, "katherin": 15, "kb": 15, "kc": 0, "ke": 25, "keep": [3, 5, 22, 25, 31], "keester": [7, 13], "kellei": [7, 12, 13, 15, 25], "kept": 22, "kernel": 24, "kg": [0, 15, 24, 25, 26, 32, 34], "kh": [0, 13, 24, 25, 34], "kh_0": [25, 34], "kh_1": [25, 34], "kilogram": 24, "kind": [10, 18], "kinemat": [0, 24, 25], "kitaigorodskii": 24, "kmruehl": 13, "kn": 25, "know": [12, 15, 22], "knowledg": 25, "known": [0, 15, 22, 25], "kona": 12, "korea": 12, "kristiansen": 24, "krokstad": 24, "kruseman": 24, "krylov": [0, 11, 13, 23, 26, 34], "kt": 15, "kulegan": 0, "kung": 24, "kurniawan": 24, "kv": 15, "kw": 25, "l": [12, 15, 22, 24], "la": 25, "lab": [12, 14, 15, 19], "label": [13, 25], "laboratori": [7, 8, 10, 12, 15, 18, 19], "lack": 31, "lambda": [0, 22, 24], "lambda_": [22, 24], "languag": [10, 18], "laplac": [22, 24], "larg": [0, 24, 27, 28, 29, 31], "larger": [25, 31], "largexydisplac": 25, "largexydispopt": 13, "last": [15, 22, 24, 27, 29], "lastli": [25, 34], "latch": 27, "later": [0, 15, 22, 25], "latest": [3, 5, 29], "latha": 15, "latter": [22, 28], "launch": [15, 22], "law": [10, 15, 18, 22, 24, 25, 26], "lawson": [7, 12, 32], "lawsuit": [10, 18], "layout": [25, 31], "lbrace": 0, "ldot": 24, "lead": [22, 25], "learn": 27, "least": [10, 18, 28, 34], "leav": 25, "led": 22, "lee": 24, "left": [0, 22, 24, 25], "legaci": [5, 25], "legal": [10, 18], "lene": 12, "length": [0, 15, 22, 24, 25, 26], "leon": [7, 13], "leq": 24, "less": [3, 13, 15, 22, 25], "level": [11, 15, 22, 24, 25, 26, 28, 34], "lever": 0, "leverag": 12, "lf": [13, 29, 31], "li": [12, 24, 25, 32, 34], "liabil": [10, 18], "liabl": [10, 18], "lib": [3, 13, 25, 26, 28], "librari": [2, 13, 17, 21, 22, 25, 30, 31, 32, 33, 34], "library_fil": 3, "licens": [9, 16], "licensor": [10, 18], "lien": [24, 25], "lift": [15, 22], "light": 3, "like": [12, 15, 22, 25, 31], "limit": [0, 3, 10, 15, 18, 22, 24, 26, 32], "lindbeck": 27, "line": [3, 13, 15, 22, 24, 25, 26, 27, 28], "line1": 26, "line2": 26, "linear": [0, 13, 15, 17, 22, 23, 25, 26, 28, 34], "linear_mass": 15, "lineardamp": [25, 26, 31], "linearli": 24, "ling": 8, "link": [3, 10, 13, 18, 22, 25, 28, 31], "linkag": 24, "linspac": 25, "linux": 13, "lisbon": 20, "lisfilenam": 25, "list": [3, 8, 10, 12, 18, 25, 26, 28, 29, 32, 33, 34], "literatur": 24, "litig": [10, 18], "littl": 25, "llc": [8, 10, 18], "lmc": 25, "ln": 24, "load": [3, 12, 13, 17, 24, 26, 28], "load_h5": 25, "loadfil": 25, "loadinputfilecallback": 3, "loadlookupt": 26, "loc": 26, "local": [0, 1, 3, 6, 25, 28, 29], "locat": [0, 6, 13, 24, 25, 26, 27, 28, 32, 34], "lock": 25, "log": [13, 15], "logarithm": 15, "logic": [15, 17, 22], "lomonaco": 12, "long": [3, 31], "longer": [8, 13, 25], "longrightarrow": 22, "look": [15, 17, 25, 26, 28], "lookup": [23, 26, 28], "lookupt": 26, "lookuptablefil": [17, 25, 26], "lookuptableflag": 26, "loop": [0, 3, 15, 22, 25, 32], "lope": 25, "loss": [10, 18, 24, 25], "lost": 26, "low": [22, 25, 26], "lower": [22, 24, 25, 26], "lowerlimitbound": 25, "lowerlimitdamp": 25, "lowerlimitspecifi": [3, 25], "lowerlimitstiff": 25, "lowerlimittransitionregionwidth": 25, "lti": 24, "luci": 15, "lump": [0, 24, 25, 26, 28], "lunar": 12, "lvert": 0, "m": [0, 3, 5, 12, 13, 15, 17, 20, 21, 22, 24, 25, 26, 27, 28, 29, 31, 33], "m0": 24, "m3": 24, "m_": [0, 24], "m_k": 24, "mac": 13, "macro": [13, 28], "made": [3, 4, 6, 8, 10, 13, 18, 22, 24, 25], "madrid": 12, "magnet": [24, 25, 26], "magnitud": [0, 25], "mai": [0, 1, 3, 8, 10, 11, 12, 18, 24, 25, 28, 29, 31, 32, 34], "mail": [10, 18], "main": [5, 6, 8, 10, 13, 15, 18, 22, 25, 29, 34], "mainli": 22, "maintain": [3, 5, 15, 19, 22, 24, 31], "mainten": 8, "major": 25, "make": [3, 10, 12, 13, 18, 22, 25, 31], "malfunct": [10, 18], "manag": [8, 10, 18], "mancellin": 13, "mani": [7, 8, 15, 25, 27, 31], "manipul": [0, 22, 25], "manner": [15, 25, 31], "manual": [0, 3, 4, 13, 15, 24, 25, 28, 29, 32, 34], "map": [0, 15, 22], "march": 12, "marin": [11, 12, 24, 25, 32], "mark": [10, 18, 25], "marker": [3, 13, 26, 30], "markov": 24, "masciola": 15, "mask": [2, 13, 25, 34], "maskparamet": 3, "maskvar": 3, "maskviz": 3, "mass": [2, 13, 15, 22, 24, 26, 28, 32, 34], "massimo": 19, "massless": 25, "master": 13, "mat": [3, 25, 26, 27, 28], "match": 25, "materi": 30, "math": 0, "mathbf": 24, "mathemat": 0, "mathrm": 22, "mathwork": 3, "matlab": [0, 2, 6, 7, 11, 12, 13, 15, 17, 19, 22, 25, 26, 27, 28, 30, 31, 32, 34], "matlabpath": 29, "matric": [15, 22, 25], "matrix": [0, 11, 13, 15, 22, 23, 26, 27, 28], "matt": [8, 15], "matthew": [15, 24], "matthieu": 24, "mattiazzo": 20, "max": [13, 25, 26], "max_thrust_factor": 15, "maxim": [15, 22, 25], "maximum": [0, 15, 22, 25], "maximumheight": 26, "maynooth": 12, "mccomb": 8, "mcr": [13, 27, 32, 34], "mcrbuildgain": 25, "mcrbuildtim": 25, "mcrexcelfil": [25, 26], "mcrmatfil": [3, 25, 26], "mcropt1": 27, "mcropt2": 27, "mcropt3": 27, "mcropt4": 27, "md": 24, "me": [0, 24, 25], "mean": [10, 13, 15, 17, 18, 22, 24, 25, 26, 34], "meandrift": [25, 26], "measur": [22, 24, 25, 28], "mechan": [10, 18, 22, 23, 25, 26, 27, 28, 29, 34], "media": [10, 18], "medium": [10, 18], "meerburg": 24, "meet": [10, 12, 18, 25], "megaflux": 25, "megawatt": 15, "mellon": 8, "member": [4, 7, 19, 28], "memori": 24, "meng": 15, "ment": 25, "mention": [15, 22], "meparam": 3, "merchant": [10, 18], "mere": [10, 18], "merg": [2, 5, 6, 13], "mergetool": 3, "mesh": [25, 26, 31, 34], "meshmagick": 25, "messag": [3, 5, 26, 31], "met": [0, 12, 24], "metab": 3, "meter": [24, 25], "method": [0, 3, 11, 12, 13, 15, 17, 22, 23, 25, 26, 27, 28, 34], "mf": 0, "mf0310": 25, "mfp": 25, "michael": 7, "michelen": [7, 12, 24, 32], "michigan": 8, "middl": 22, "might": 25, "mike": 25, "mileston": 12, "min": [13, 26], "mingw": 25, "minim": [22, 24], "minimum": [15, 22, 25], "minor": [13, 25], "minu": 25, "misalign": 22, "miss": 13, "mission": 8, "mitig": 22, "mix": 25, "mk": 24, "mller": 24, "mlmerg": 3, "mmx": 25, "mn": 25, "moan": 24, "modal": [24, 25], "mode": [3, 7, 11, 13, 23, 26, 28, 30], "model": [0, 3, 7, 11, 12, 13, 15, 17, 20, 21, 22, 24, 26, 27, 28, 29, 31], "modelfil": 28, "modif": [10, 13, 18, 24], "modifi": [0, 3, 10, 17, 18, 22, 24, 27, 28, 29, 32], "modul": [12, 15, 24, 25], "modular": 22, "moham": [7, 13], "moment": [0, 22, 24, 25, 26, 28, 32, 34], "momentum": [15, 22, 26], "month": 13, "moodyn": 25, "moor": [3, 7, 11, 12, 13, 17, 23, 30, 31, 32, 33, 34], "moor_matrix": [15, 22], "moordyn": [13, 23, 26, 27, 28, 29], "moordyncal": 28, "moordynconnect": 28, "moordyninputfil": 26, "moordynlin": [25, 26], "moordynnod": [25, 26], "mooringclass": [13, 17, 24, 25, 26, 28], "mooringlookupt": 28, "mooringmatrix": [26, 28], "mooringnam": 28, "more": [3, 6, 7, 10, 13, 15, 18, 19, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "morenergi": 14, "moreov": 22, "morison": [2, 3, 13, 23, 26], "morisondt": [25, 26], "morisonel": [3, 13, 25, 26], "morrison": 0, "morten": 15, "moskowitz": [28, 32], "most": [0, 3, 12, 13, 14, 17, 20, 22, 24, 25, 28], "most_lib": [17, 22], "mostdata": 15, "mostio": [15, 17, 22], "motion": [0, 7, 11, 22, 24, 25, 26, 28, 31, 32, 34], "motionmechan": 26, "motor": [25, 26, 28], "mount": 22, "move": [12, 13, 24, 25, 32], "movement": [22, 24, 25], "mpcfcn": 25, "mshabara": 13, "much": [25, 31], "muliawan": 24, "multi": [0, 7, 8, 11, 12, 13, 15], "multibodi": [0, 7, 11, 20, 21, 24, 29, 31, 34], "multidirect": 32, "multipl": [0, 5, 11, 13, 19, 24, 26, 28, 30, 32, 34], "multipli": [15, 22, 25], "multiseg": 15, "multisurf": 34, "murrai": 15, "must": [0, 3, 5, 6, 10, 15, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "mw": 22, "mx": [15, 22, 25], "my": [15, 22, 25], "mz": [15, 22, 25], "n": [12, 13, 15, 22, 24, 25, 26, 32], "n_": 26, "n_x": 26, "n_y": 26, "n_z": 26, "na0003525": [8, 10, 18], "nacel": [15, 17, 22, 26], "nacelleacceler": 26, "name": [3, 10, 13, 15, 17, 18, 22, 25, 26, 28, 32, 34], "nan": 26, "nangl": 26, "nant": [12, 24], "narrow": 24, "nasa": 12, "nat": 25, "nathan": 7, "nathanmtom": 13, "nation": [7, 8, 10, 12, 15, 18, 19], "nativ": 25, "natur": [7, 15, 22, 25], "navig": [5, 6, 25, 29, 32], "nb": 25, "nc": [13, 25], "ndof": 25, "ndt": 25, "ndw": 25, "necessari": [3, 15, 22, 24, 25, 28, 31], "necessarili": [10, 18, 25, 31], "need": [0, 15, 22, 24, 25, 28, 29, 34], "neg": [0, 22, 25, 26], "neglect": [0, 22, 24, 25], "neglig": [10, 18], "neil": 15, "nelessen": [8, 12], "nemoh": [11, 13, 17, 24, 25, 27, 32, 34], "nemohv3": 13, "nest": 15, "net": [24, 25, 26], "netcdf": 25, "neutral": 25, "nevarez": 25, "new": [3, 4, 5, 6, 9, 13, 15, 17, 21, 22, 24, 25, 27, 28, 29, 31, 32], "new_featur": 3, "newer": 29, "newfoundland": 12, "newman": 24, "newslett": 12, "next": [0, 3, 12, 15, 17, 25, 31, 32], "nf": 25, "nh": 25, "nhbodi": 13, "nikhar": 15, "ning": 15, "nm": [24, 25, 32, 34], "nmpc": 25, "node": [15, 22, 24, 25, 26], "nolt": 24, "nomin": [15, 22], "non": [3, 10, 13, 15, 17, 18, 22, 24, 26, 27, 31], "nondimension": [13, 24], "nonhydro": [3, 25, 26, 27, 28], "nonhydro_bodi": 25, "nonhydrodyam": 28, "nonhydrodynam": [11, 26, 28, 30], "nonhydroparam": 3, "nonlinear": [7, 11, 12, 13, 23, 26, 28, 30, 31, 34], "nonlinearbuoy": 13, "nonlineardt": [25, 26], "nonlinearhydro": [25, 26, 31], "nonlinfk": 13, "nonumb": 24, "nonzero": [24, 26], "nor": 31, "normal": [0, 10, 13, 15, 18, 22, 24, 25, 26], "normalizebem": 25, "north": 24, "norwai": 12, "note": [9, 16, 24, 25, 27, 32], "noth": [10, 18], "notic": [10, 18], "notwithstand": [10, 18], "novel": [20, 31], "novemb": [12, 20], "now": [3, 13, 17, 22, 25, 29], "nowav": [26, 31], "nowavec": [31, 32], "nrel": [7, 12, 15, 22], "nrx": 25, "nry": 25, "nrz": 25, "nsm": [32, 34], "ntess": [10, 18], "nth": 25, "ntm": 15, "nu": 0, "nuclear": 8, "nui": 12, "null": 22, "num": 3, "number": [0, 3, 7, 11, 15, 21, 22, 24, 25, 26, 28, 31], "number_lin": 15, "numer": [0, 11, 12, 15, 17, 23, 25, 27, 28, 30, 32], "numgrid_i": 15, "numgrid_z": 15, "nummoordyn": 26, "numpointsi": [25, 26], "numpointsx": [25, 26], "nwtcup": 15, "nx": 25, "nx2": 26, "ny": 25, "nz": 25, "o": [12, 24, 25], "o_a": 15, "o_discr": 15, "obj": 26, "object": [3, 10, 13, 18, 19, 21, 22, 25, 26, 28, 34], "objectclass": 28, "oblig": [10, 18], "observ": [24, 25], "obtain": [0, 10, 15, 18, 22, 24, 25, 28, 29, 31], "oc6": [11, 25], "occur": [15, 22, 25, 31], "ocean": [12, 23], "octob": 12, "ode4": [26, 27], "ode45": [13, 26, 27], "off": [3, 7, 11, 12, 23, 26, 27, 28, 29], "offer": [10, 18, 22, 25], "offic": [7, 8, 12], "offset": 15, "offshor": [11, 12, 15, 17, 19, 20, 21, 22, 24], "often": [24, 25], "og": 13, "ogden": [7, 12, 13], "ok": 25, "olav": 24, "olber": 24, "oldest": 29, "oma": [12, 24, 32], "omax": 25, "omega": [0, 22, 24, 25], "omega_": [22, 24], "omega_min": 15, "omega_n": 22, "omega_r": 22, "omega_rated_tri": 15, "omegafilt": 15, "omit": 22, "onc": [1, 5, 15, 22, 24, 25, 29, 31, 32], "one": [0, 5, 10, 15, 18, 22, 24, 25, 26, 28, 31, 32, 34], "ones": [15, 22, 25], "onli": [0, 3, 5, 10, 11, 15, 18, 22, 24, 25, 26, 28, 32, 34], "onlin": 30, "onth": 25, "op": 22, "opac": [25, 26], "open": [0, 3, 7, 11, 12, 15, 22, 24, 25, 28, 29, 32], "openei": 13, "openor": [12, 24], "oper": [8, 15, 19, 22, 25, 32], "oppos": [0, 25], "opposit": [25, 31], "opt": [22, 25], "optim": [15, 20, 22, 24, 25], "optimalgaincalc": 25, "optimis": [15, 20, 21], "option": [3, 11, 13, 15, 17, 22, 23, 25, 26, 28, 29, 31, 32, 34], "opyion": 26, "orang": 3, "orbit": 0, "order": [3, 5, 6, 13, 15, 22, 24, 25, 26, 28, 32, 34], "ordinari": 24, "oregon": [8, 12], "org": [10, 13, 18, 24, 34], "organ": [3, 8, 12, 21, 31], "orient": [0, 25, 26, 28, 34], "origin": [1, 5, 10, 13, 15, 18, 22, 25, 29, 32, 34], "oscil": [0, 11, 12, 22, 24, 25, 28, 30, 31], "osmosi": 12, "osu": 13, "oswec": [11, 13, 27, 29, 30, 31, 34], "oswec_hydraulic_crank_pto": 25, "oswec_hydraulic_pto": 25, "oswec_nonlinear_viz": 25, "osx": [13, 26], "other": [0, 3, 7, 10, 11, 15, 18, 22, 24, 26, 27, 28, 29, 30, 34], "otherwis": [10, 18, 25, 26, 28], "out": [10, 11, 13, 15, 17, 18, 22, 25, 32], "outperform": 25, "outpu": 15, "output": [0, 3, 11, 13, 15, 17, 22, 24, 25, 26, 27, 28, 29, 32, 34], "outputdata": 25, "outputdir": 13, "outputtxt": 26, "outsid": [12, 25, 28, 31], "outstand": [10, 18], "over": [0, 24, 25, 26], "overhang": 15, "overhaul": 13, "overlai": 25, "overli": 25, "overlin": [24, 25], "overrid": [25, 26], "overview": [2, 3, 9, 15, 16, 23, 25, 32], "overwrit": 28, "overwritten": 28, "own": [8, 10, 13, 18, 27, 31, 32, 34], "owner": [10, 18], "ownership": [10, 18], "p": [12, 22, 24, 25], "p_": [22, 24], "p_r": 22, "pacif": 24, "packet": 24, "page": [12, 21, 29, 31], "pai": 25, "panel": [24, 25], "pao": 15, "parallel": [0, 13, 29, 32, 34], "paramet": [0, 13, 15, 17, 22, 24, 26, 28, 31, 32, 34], "parametr": 28, "paraview": [11, 13, 26, 28, 30], "paraview_visu": 25, "pars": [28, 32, 34], "parser": 13, "part": [3, 10, 15, 18, 22, 24, 25], "parti": [10, 18, 28], "partial": [0, 15, 22, 24], "particl": [0, 24], "particular": [0, 10, 15, 18, 22, 25, 31], "particularli": [24, 25, 28], "partli": [0, 24], "pass": [5, 6, 28, 31, 34], "passiv": [7, 11, 13, 26, 30], "passiveyaw": 25, "passiveyawtest": 13, "past": [11, 25, 31], "patent": [10, 18], "path": [3, 13, 15, 25, 26, 31, 32, 34], "pathwai": 25, "pbi": 25, "pc_uv": 15, "pc_uw": 15, "pc_vw": 15, "pcc": 25, "pct": [29, 32, 34], "pde": 26, "pdest": 3, "pdf": 13, "pdi": 13, "pe": 12, "peak": [15, 22, 24, 25, 26, 28], "per": [13, 24, 25, 26, 28], "percent": [10, 15, 18], "perez": 24, "perform": [5, 7, 10, 11, 12, 15, 18, 22, 24, 25, 28, 31], "period": [0, 24, 25, 26, 27, 28, 32, 34], "perman": [3, 26], "permiss": [10, 18], "permit": 22, "permut": 25, "perp": 0, "perpendicular": [0, 25], "perpetu": [10, 18], "person": 1, "pertain": [10, 18], "pertin": [0, 3, 25], "perturb": 22, "petracca": [19, 20], "petroleum": 24, "phase": [3, 11, 12, 13, 15, 22, 24, 26, 27, 28], "phaserand": 13, "phasese": [13, 25, 26], "phenomena": 24, "phenomenon": 0, "phi": 24, "phi_": [0, 24, 25], "physic": [0, 3, 20, 21, 24, 25, 31, 34], "pi": [0, 7, 19, 22, 24, 25], "pictur": 33, "pierson": [28, 32], "pietro": 15, "pile": 24, "pipelin": 25, "piprecharg": 25, "piston": [24, 25, 26, 28], "pistoncf": 26, "pistonncf": 26, "pistonstrok": 25, "pitch": [15, 17, 24, 25, 26, 28, 32], "pitchfilt": 15, "pixel": [25, 26], "pl": 15, "place": [3, 10, 15, 18, 25, 32, 34], "placement": 0, "plai": [25, 32], "plan": 1, "planar": [24, 28], "plane": [0, 15, 25], "plant": 25, "plate": [25, 32], "platform": [15, 17, 19, 20, 22], "platt": 12, "pleas": [1, 3, 5, 13, 15, 21, 24, 25, 29, 31, 33, 34], "plexp": 15, "plot": [13, 22, 26, 27, 28, 32, 33], "plotaddedmass": 25, "plotbemio": [13, 25], "plotbodi": 25, "plotdirect": 25, "plotdof": 25, "plotelev": [25, 26], "plotexcitationirf": 25, "plotexcitationmagnitud": 25, "plotexcitationphas": 25, "plotforc": [25, 26], "plotfreqdep": 25, "plotradiationdamp": 25, "plotradiationirf": [13, 25], "plotrespons": [25, 26], "plotspectrum": [25, 26], "plotstl": [25, 26], "plotwav": 13, "plu": [7, 25], "plymouth": 13, "pm": [25, 26, 28], "pmax": 25, "pmin": 25, "pmlineargener": 26, "pmrotarygener": 26, "point": [0, 15, 22, 24, 25, 26, 27, 28, 29, 30], "polar": 12, "pole": 24, "politecnico": [14, 19], "pond": 12, "popul": [3, 25], "popup": 3, "port": [13, 32], "portion": [17, 25], "portug": 20, "posit": [0, 15, 22, 24, 25, 26, 27, 28, 31], "positiontargetprior": 25, "positiontargetspecifi": 25, "positiontargetvalu": 25, "possibl": [0, 3, 10, 15, 17, 18, 22, 25, 26, 28, 31], "possibli": 28, "post": [0, 11, 13, 15, 16, 17, 28, 30, 33, 34], "postprocesswecsim": [0, 17, 22], "pot": 34, "potenti": [0, 24, 25], "power": [7, 8, 10, 11, 12, 13, 15, 17, 18, 22, 23, 26, 27, 28, 32], "powerinternalmechan": 26, "pp": 12, "pr": [5, 13], "practic": 25, "prate": 15, "pre": [3, 15, 16, 17, 25, 28], "preced": 3, "precis": 25, "precon": [15, 22], "precursor": 34, "predict": [0, 24, 27], "prefer": [1, 10, 18, 22], "prefil": 25, "preliminari": [12, 32], "prepar": [10, 17, 18], "preprint": 15, "preprocess": 3, "prescrib": [25, 26], "presenc": [24, 25], "present": [3, 25, 32, 33], "preserv": 0, "press": 20, "pressur": [0, 13, 24, 25, 26], "pressureaccumul": 25, "pressuredi": 13, "pressureglyph": 25, "presum": 25, "pretens": [25, 26], "prevent": [0, 25, 28], "previou": [0, 13, 17, 22, 25, 31], "previous": [22, 25, 31], "primari": 22, "primarili": [3, 25, 28], "prime": [15, 22], "primit": 25, "princip": 22, "principl": 32, "print": 3, "prior": [5, 6, 25], "priori": 22, "prioriti": [25, 26], "probabl": [15, 26], "probe": 0, "problem": [24, 25, 29, 31], "proc": 24, "proce": 25, "procedur": 15, "proceed": [12, 13, 20, 24, 32], "process": [0, 3, 11, 13, 15, 16, 17, 28, 30, 31, 33], "processor": 34, "produc": [15, 24, 25, 29], "product": [0, 10, 13, 18, 22, 24, 25, 26], "profil": [15, 24], "program": [25, 34], "programmat": [0, 25], "progress": [24, 31], "project": [0, 12, 15, 24, 27, 32], "promin": [10, 18], "prompt": 3, "propag": [24, 25], "proper": 24, "properi": 26, "properli": [3, 26, 28, 31], "properti": [0, 3, 13, 15, 17, 24, 25, 26, 28, 32, 34], "proport": [0, 22], "propos": 24, "propuls": 12, "provid": [0, 3, 10, 15, 18, 19, 22, 24, 25, 28, 29, 31, 32, 33, 34], "psourc": 3, "pto": [3, 11, 12, 13, 23, 30, 31, 32, 34], "pto1": [25, 32, 34], "ptoclass": [25, 26, 28, 32, 34], "ptodamp": 28, "ptonam": [26, 28], "ptosim": [25, 26, 28], "ptosimclass": [25, 26, 28], "ptosimnam": 28, "ptosimnum": 28, "ptosimtyp": 28, "ptostiff": 28, "public": [9, 16, 21, 24], "publicli": [10, 18], "publish": [13, 20, 21], "pull": [1, 2, 3, 6, 13, 29], "purpos": [10, 18, 22, 25, 28, 31], "pursu": 24, "push": [1, 5, 13], "pvd": 25, "pvsm": [13, 25], "pwd": 29, "py": 25, "python": [13, 24, 25, 28], "q": [22, 24], "qtf": [13, 24, 26], "quad": 22, "quaddrag": [25, 26, 28, 31], "quadprog": 25, "quadrat": [15, 22, 24, 25, 26], "qualiti": [25, 28, 34], "quantiti": [15, 22, 27, 28], "quasi": [15, 22, 24], "quaternion": 13, "question": 31, "quickli": 31, "quit": 25, "quon": 12, "r": [0, 12, 15, 22, 25], "r2": 25, "r2020b": [13, 29], "r2021a": 13, "r2023b": 13, "r2t": 25, "r_": [0, 24, 25], "ra": 25, "ra_k": 25, "ra_t": 25, "ra_w": 25, "rad": [0, 15, 24, 25, 26, 28, 32, 34], "radian": 24, "radiat": [3, 13, 24, 26, 28, 31, 34], "radiationcoeffici": 25, "radiationirf": [13, 25], "radiationirfss": 25, "radiu": [15, 22], "ramp": [23, 25, 26, 28, 32, 34], "rampt": 13, "ramptim": [13, 25, 26, 28, 32, 34], "random": [24, 25, 26], "randomli": [25, 28], "randpredefin": 13, "rang": [15, 24, 25, 28], "rank": 24, "rao": 25, "rapid": [13, 25, 26], "rard": 24, "rare": 0, "ratanak": [8, 25], "ratanakso": 13, "rate": [13, 15, 22, 25, 26], "ratetransit": 26, "rather": [24, 25], "ratio": [15, 22, 25], "rbg": 25, "rbrace": 0, "re": [0, 13, 24, 26, 31], "reach": [12, 15, 22, 25], "reacquir": 34, "reaction": [24, 32], "reactiv": [27, 28], "read": [3, 13, 17, 22, 24, 25, 26, 28, 31, 32, 34], "read_aqwa": 13, "read_capytain": 13, "readabl": [10, 13, 18], "readaqwa": [13, 25], "readbemioh5": 25, "readcapytain": [13, 25], "readcapytaine_fixes_for_reading_dataformats_correctli": 13, "reader": 24, "readi": [29, 32], "readnemoh": [13, 25, 34], "readwamit": 25, "real": [24, 25, 26], "realist": [13, 24, 25, 27, 28, 31], "realiz": 25, "realli": 25, "rearrang": 22, "reason": [0, 10, 18, 22, 24, 25], "rebas": 13, "recalcul": 31, "receiv": [10, 12, 18, 22, 28], "recent": 12, "recipi": [10, 18], "recogn": 25, "recommend": [3, 22, 24, 25, 26, 27, 29, 34], "recompil": 28, "reconcil": 31, "record": [3, 25, 33], "recreat": [25, 31], "rectcheckvalv": 25, "rectifi": [25, 28], "rectifyingcheckvalv": 25, "red": [3, 25], "redistribut": [10, 18], "reduc": [15, 22, 24, 25], "reduct": 24, "reevalu": 31, "ref": 22, "refactor": 13, "refer": [0, 1, 3, 4, 5, 6, 7, 11, 12, 22, 23, 26, 28, 29, 30, 31, 33, 34], "refht": 15, "refin": [25, 31], "reflect": [25, 34], "refresh": 29, "regard": [10, 15, 18, 22, 25], "regardless": [0, 25], "region": [15, 22, 26], "regress": [13, 15, 22], "regul": [15, 22], "regular": [0, 3, 13, 23, 25, 26, 27, 31, 32, 34], "regularc": [25, 27, 31, 32], "rel": [0, 15, 17, 22, 24, 25, 26, 28, 32], "relat": [0, 3, 15, 22, 23, 25, 28, 31], "relationship": [15, 22, 24, 28], "relcoord": 26, "releas": [4, 5, 6, 9, 12, 16, 25, 29, 32], "relet": 0, "relev": [4, 11, 22, 25, 27, 28, 32, 34], "reli": [15, 22, 24, 25, 29], "reload": 25, "reloadh5data": [25, 26], "remain": [0, 5, 10, 18, 25], "remaind": 0, "rememb": 25, "remind": 0, "remot": [1, 3], "remov": [0, 13, 29, 31], "removewecsimsourc": 29, "renam": [3, 13, 25, 32, 34], "renew": [7, 8, 10, 11, 12, 15, 18, 19, 20, 24, 25], "rensponseclass": 22, "reopen": 31, "reorder": [3, 25], "repeat": [15, 24, 25, 31], "replac": [13, 25], "report": [6, 13, 15, 20, 22, 24, 25, 27, 31], "reposit": 13, "repositori": [1, 5, 6, 7, 11, 13, 25, 27, 29], "repres": [0, 10, 11, 15, 18, 22, 24, 25, 28], "represent": [0, 13, 24], "reproduc": [10, 18, 24, 25], "reproduct": [10, 18], "request": [2, 6, 13, 31], "requir": [10, 11, 13, 15, 17, 18, 22, 24, 25, 26, 27, 28, 30, 31, 32, 34], "research": [12, 22, 24, 25], "resist": [25, 26, 28], "resolut": [22, 25], "resolv": [3, 5, 13, 25], "reson": [24, 25], "resourc": 31, "respect": [0, 15, 22, 24, 25, 28], "respond": 31, "respons": [10, 11, 12, 13, 18, 23, 30, 31, 32, 33, 34], "responseclass": [13, 17, 22, 25, 26, 28], "respos": 25, "rest": 28, "restart": 29, "restor": [0, 13, 24, 25, 28, 31], "restoremassmatrix": [0, 26], "restrict": [25, 26, 28, 32], "restructur": 13, "result": [0, 3, 6, 10, 12, 15, 17, 18, 22, 24, 25, 26, 28, 31, 32, 33], "retain": [10, 18, 25], "retard": 24, "return": [3, 25, 26, 31], "revamp": 12, "reveal": 24, "revers": [12, 25], "reversedimensionord": 25, "revert": 13, "review": [3, 13, 24, 25], "revis": [3, 5, 10, 13, 18], "revolut": 22, "rewritten": 22, "reynold": [0, 15], "rgb": 25, "rgme": [25, 26], "rhino": [25, 34], "rho": [0, 22, 24, 25, 26], "rho_wat": 15, "rhub": 15, "ric": 24, "richter": 24, "right": [0, 10, 18, 22, 24, 25], "rightarrow": 24, "rigid": [7, 11, 22, 24, 25, 28, 32], "rij": [7, 12], "ringwood": 12, "rinker": 15, "rippl": 12, "rise": 31, "risk": [10, 18], "ris\u00f8": 15, "rload": 25, "rm3": [29, 30, 31], "rm3_b2b": 25, "rm3_chydraulic_pto": 25, "rm3_dd_pto": 25, "rm3_mcr": 25, "rm3_moordyn_viz": 25, "rm3fromsimulink": 32, "rm3moordyn": 25, "robertson": 15, "robust": [0, 13, 25, 28, 31], "rod": [25, 28], "roi": 12, "roland": 15, "role": 28, "roll": [13, 15, 22, 24, 25], "root": [15, 20, 22, 24], "rosco": [15, 19], "rosetta": 25, "rotari": [13, 24, 25, 26, 28], "rotarygener": 26, "rotat": [0, 13, 15, 22, 24, 25, 26, 28, 32, 34], "rotationmatrix": 26, "rotloc": 26, "rotor": [15, 17, 22, 24], "rotorspe": 26, "rough": 15, "rout": 25, "routin": 33, "row": [13, 26], "royalti": [10, 18], "rpf": 25, "rpm": 25, "ruehl": [7, 12, 13, 24, 25, 32], "rule": 24, "run": [0, 2, 6, 11, 13, 15, 22, 26, 28, 29, 30, 31], "run_turbsim": [15, 17, 22], "runb2b": 27, "runfreedecai": 27, "runner": 13, "runnl": 27, "runtim": [3, 26], "runyawcas": 27, "rvert": 0, "rx": [15, 24, 25], "ry": [15, 24, 25], "ryan": 25, "ryandavies19": 13, "rz": [15, 24, 25], "s_": 24, "s_f": 25, "sacrific": 25, "safe": 15, "sai": 25, "salhu": 13, "salin": 24, "salman": [7, 13], "sam": 8, "same": [0, 3, 22, 24, 25, 26, 28, 31, 32], "sampl": [11, 24, 25, 26], "san": [12, 32], "sandia": [7, 8, 10, 12, 18, 19], "sate": 24, "satisfi": [0, 24], "satur": 22, "save": [3, 13, 22, 26, 28, 29, 32, 34], "saveset": 26, "savestructur": [3, 26], "savetext": 26, "saveviz": [13, 25, 26], "saveworkspac": 26, "sc_im": 25, "sc_ma": 25, "sc_ph": 25, "sc_re": 25, "scale": [12, 24, 25, 32], "scan": 3, "scatter": [22, 25], "scenario": [7, 11, 24, 25], "schaaf": 24, "schedul": 22, "schemat": [0, 25], "scienc": 15, "scott": 15, "script": [3, 11, 13, 15, 22, 25, 27, 28, 29, 32], "sea": [12, 15, 22, 24, 25, 27], "seab": [15, 24, 25, 26, 28, 32], "search": [15, 24, 25, 28, 29], "seattl": [12, 32], "second": [0, 15, 22, 24, 25, 26, 28, 32], "section": [3, 4, 10, 13, 15, 17, 18, 22, 24, 25, 27, 28, 29, 31, 32, 33, 34], "secur": 8, "see": [0, 10, 15, 18, 22, 24, 25, 27, 29, 32], "seed": [3, 26], "seek": 25, "seen": [22, 25], "segment": [24, 26], "select": [3, 24, 25, 28, 32], "selector": 25, "sell": [10, 18, 24], "semi": [22, 25], "semisubmers": [11, 24, 25], "sens": [25, 28], "sensit": [15, 22], "sent": [10, 18, 28], "separ": [5, 10, 18, 22, 24, 25, 26, 28], "septemb": [12, 13], "sequenc": 25, "seri": [13, 15, 20, 21, 22, 25, 26, 28, 30, 31, 32], "serv": [25, 31, 34], "servic": [10, 12, 18], "session": 13, "set": [0, 3, 12, 15, 22, 24, 26, 27, 28, 29, 31, 32, 33, 34], "set_param": 29, "setcg": 26, "sethuraman": 15, "setinitdisp": [13, 25, 26], "setup": [3, 12, 25, 27, 34], "sever": [3, 11, 17, 25, 27], "shabara": [7, 13], "shaft": 25, "shall": [10, 18], "shallow": 24, "shape": [24, 25], "share": [10, 12, 18, 27, 31], "shave": 22, "shear": [11, 25], "shield": 15, "shift": 22, "ship": [11, 24, 25], "shorelin": 24, "should": [0, 3, 5, 6, 22, 25, 26, 28, 29, 31, 32], "show": [0, 3, 15, 22, 25, 28, 32, 33, 34], "shown": [0, 3, 22, 24, 25, 28, 29, 32, 34], "side": [0, 12, 25, 31], "sigma": [0, 24], "sign": 13, "signal": [22, 25, 28, 34], "signatur": 12, "signifi": 25, "signific": [24, 25, 26, 28, 31], "significantli": 25, "sim": [1, 2, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 24, 26, 30], "sim_appl": [13, 25], "similar": [0, 3, 17, 22, 24, 25, 28, 31, 32], "similarli": [3, 15, 22, 25], "simmechan": [25, 26], "simmechanicsfil": [25, 26, 28, 32, 34], "simmon": [12, 24], "simpl": [0, 13, 15, 22, 24, 25, 32], "simpledd": 26, "simpler": 25, "simplest": 25, "simpli": [15, 25], "simplic": 25, "simplif": 24, "simplifi": [20, 24, 25], "simscap": [0, 7, 11, 20, 21, 25, 26, 27, 29, 30, 31, 34], "simu": [3, 13, 25, 26, 28, 31, 32, 34], "simul": [0, 3, 11, 12, 13, 15, 16, 17, 19, 20, 21, 24, 27, 29, 30, 31, 32, 34], "simulationclass": [3, 25, 26, 28, 32, 34], "simulink": [0, 2, 7, 11, 13, 15, 17, 19, 22, 24, 26, 30, 31], "simulink_model_nam": 33, "simultan": 25, "sin": [0, 24, 25], "sinc": [13, 15, 22, 25, 26, 28, 32], "sine": 24, "singl": [19, 24, 25, 28, 32], "singular": 24, "sinh": [0, 24], "sinusoid": [0, 23, 28, 32], "sirigu": [19, 20, 21], "sirigu2022develop": 21, "sirniva": 12, "situat": [24, 28], "six": [24, 28], "sixth": 24, "size": [24, 25, 26, 31], "skew": 15, "skrzypinski": 15, "slam": 24, "slender": [0, 24], "slice": 25, "slide": 33, "slider": 25, "slightli": [15, 22, 25], "sllibrarybrows": 29, "slow": 25, "slower": 24, "slx": [3, 13, 17, 22, 25, 28, 32, 33, 34], "small": [0, 11, 22, 24, 25, 28, 31], "smaller": 25, "smooth": [12, 15, 22], "smoother": 22, "smund": 24, "snl": 12, "so": [0, 3, 8, 12, 15, 22, 24, 25, 31], "societi": [12, 24, 25], "soft": 25, "softwar": [0, 2, 3, 5, 7, 10, 11, 12, 13, 14, 17, 18, 21, 22, 24, 25, 31, 33, 34], "sole": [10, 18], "solid": 0, "solut": [0, 8, 10, 15, 18, 24, 25, 28, 34], "solv": [0, 7, 11, 15, 22, 24, 25, 28, 31, 34], "solvabl": 0, "solver": [3, 7, 11, 13, 24, 25, 26, 27, 28], "some": [0, 3, 11, 15, 22, 25, 28, 31, 33], "sort": [13, 25], "sought": 15, "sourc": [1, 3, 6, 7, 10, 11, 12, 15, 17, 18, 22, 24, 25, 29, 30, 32, 33, 34], "sourcefunctionssimulinkmask": 0, "sous": 24, "south": 12, "space": [3, 12, 13, 15, 22, 23, 26, 31, 32], "spain": 12, "span": 32, "spar": [25, 27, 32], "spatial": [15, 22], "speci": 26, "special": [0, 3, 10, 18, 25, 27, 31], "specif": [0, 4, 10, 13, 15, 18, 22, 24, 25, 28, 31], "specifi": [15, 22, 24, 25, 26, 27, 28, 34], "spectra": [13, 23, 28], "spectral": [13, 15, 24, 25, 28], "spectrum": [3, 13, 26, 27, 28, 32], "spectrumbuttoncallback": 3, "spectrumdata": 28, "spectrumfil": [3, 26, 28], "spectrumimport": [26, 32], "spectrumtyp": [25, 26, 28], "sped": 22, "speed": [13, 15, 17, 22, 24, 25, 26, 31], "spend": 31, "sphere": [26, 27], "spherempc": 25, "spheric": [13, 25, 28], "spike": 31, "split": [3, 13, 25], "spread": 26, "spreadsheet": 27, "spring": [24, 25, 26], "spsfilter": 15, "sq": 24, "sqrt": [22, 24, 25], "squar": [22, 24, 25], "srcblocknam": 3, "ss": [24, 25], "ss_a": 25, "ss_b": 25, "ss_c": 25, "ss_conv": 25, "ss_d": 25, "ss_k": 25, "ss_o": 25, "ss_r2": 25, "st": 12, "stabil": [0, 6, 13, 22, 25, 26, 29], "stabl": [5, 25, 31], "stai": 25, "stand": 24, "standard": [15, 22, 24, 25, 26, 28], "starrett": 25, "start": [2, 4, 22, 25, 26, 27, 28, 30, 32, 34], "startendtim": 26, "starttim": [25, 26, 28, 32, 34], "startup": 29, "state": [3, 8, 10, 12, 13, 15, 18, 22, 23, 26, 27, 28, 31, 32], "statement": [10, 13, 18, 31], "statespac": [25, 26, 31], "static": [13, 15, 17, 22, 24, 29], "stationari": [0, 15, 22, 24], "statist": [12, 24, 25, 26, 27], "stator": 24, "steadi": [15, 22, 23, 28, 31], "steady_st": [15, 17, 22], "step": [0, 3, 13, 15, 22, 24, 26, 27, 28, 31], "stiff": [11, 15, 24, 25, 26, 28, 31, 32, 34], "still": [0, 22, 24, 25, 28, 31], "stl": [3, 13, 26, 28, 32, 34], "stlbutton": 3, "stlbuttoncallback": 3, "stochast": 15, "stop": [3, 13, 25, 31], "stoppag": [10, 18], "stopwecsim": [13, 22, 25], "storag": [0, 25, 29], "store": [0, 3], "storeforceaddedmass": [0, 26], "stori": 12, "storm": 24, "strategi": [22, 25], "strength": 24, "stress": 15, "stretch": [24, 25, 28], "strictli": 22, "string": [3, 25, 26], "strong": 24, "strongli": 24, "struct": [22, 25, 26], "structur": [0, 12, 13, 15, 17, 20, 22, 24, 26, 30, 32, 34], "studi": [24, 25], "style": [25, 26], "sub": [13, 24, 25, 26, 28], "subfold": [15, 22, 29], "subject": [10, 18, 24, 25], "sublibari": 3, "sublibrari": [3, 13], "sublicens": [10, 18], "submerg": 25, "submers": 22, "submiss": [10, 18], "submit": [4, 5, 6, 10, 18, 31], "submodul": [13, 27], "suboptim": 25, "subscript": [0, 22], "subsect": [15, 24, 25], "subsequ": [10, 18, 25], "subset": 3, "subsidiari": 8, "substack": 22, "substanti": 25, "subsystem": [3, 13, 15, 22, 25, 28], "subtract": 0, "success": 12, "successfulli": [11, 25], "sudden": 25, "suffici": [24, 25, 28, 31], "suggest": [13, 26], "suit": [0, 25], "sum": [0, 22, 24, 25, 26], "sum_": 24, "summar": [17, 27, 28], "summari": [25, 26], "sun": 24, "super": 25, "superposit": [24, 25], "supersed": [10, 18], "suppli": [24, 28, 31, 32], "support": [4, 10, 12, 18, 19, 20, 24, 25, 28, 31, 34], "sure": [3, 25], "surfac": [0, 15, 24, 25, 26, 28, 31, 32, 34], "surg": [0, 11, 12, 15, 22, 24, 25, 30], "surround": 25, "suspend": [15, 22], "sustain": [8, 12, 24, 25], "sustech": 12, "svd": 24, "swai": [0, 15, 22, 24, 25], "sweep": 25, "swell": [24, 25], "swl": 32, "symbol": 0, "symposium": [12, 32], "synthesi": 24, "syst": 24, "system": [0, 7, 10, 11, 12, 13, 15, 17, 18, 20, 22, 23, 25, 26, 27, 28, 34], "t": [0, 3, 12, 13, 22, 24, 25, 26, 28], "t_": [15, 22, 24, 25], "t_0": 25, "tab": 3, "tabl": [0, 3, 15, 17, 23, 26, 28, 34], "tabul": 22, "tag": [0, 5, 24, 29, 31], "taghipour": 24, "take": [0, 3, 7, 11, 12, 15, 22, 23, 28, 29, 31], "taken": [0, 15, 22, 24, 25], "tallest": 24, "tangent": 24, "tangenti": [0, 13, 25, 26], "tanh": [0, 24, 25], "target": 25, "task": [12, 15, 25, 31], "tau": [22, 24], "tau_": 24, "taut": [25, 28], "taylor": 24, "tc114": 13, "td": 24, "team": [4, 7, 12, 19, 27, 31, 33, 34], "teamer": 12, "tec": 25, "tech": 12, "technic": [15, 24, 25], "techno": 20, "technologi": [7, 8, 10, 12, 18, 22, 24, 25, 32], "ted": 25, "temp": 13, "temperatur": 24, "templat": [13, 31], "tempor": [15, 22], "ten": 25, "tend": [24, 25], "tension": [24, 25, 26, 28], "tensor": [0, 32], "term": [0, 10, 18, 22, 24, 25, 28], "termin": [10, 18], "terminologi": 23, "test": [0, 2, 5, 12, 13, 24, 27, 28, 30], "tether": 25, "text": [0, 3, 10, 18, 22, 24, 26, 31], "textual": 3, "than": [3, 13, 15, 22, 24, 25, 26, 27, 29, 31], "thank": [17, 22], "thei": [1, 3, 11, 22, 24, 25, 28, 31, 33, 34], "them": [3, 15, 22, 25, 31], "themfor": 33, "theoret": [22, 24, 25], "theori": [0, 10, 13, 15, 16, 18, 25, 31], "therefor": [0, 15, 22, 24, 25], "thereof": [10, 18], "theta": [0, 22, 24, 25], "theta_": [15, 22, 24], "theta_a": 15, "theta_discr": 15, "thetamaxr": 15, "thi": [0, 1, 3, 5, 8, 10, 11, 13, 15, 18, 22, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "thing": 25, "think": 28, "third": [10, 18, 24, 25, 28, 32], "thorough": 31, "thoroughli": 31, "those": [3, 10, 15, 18, 22, 25, 28, 31], "though": [0, 22], "three": [3, 13, 15, 19, 22, 24, 25, 28], "threshold": [25, 26], "through": [3, 10, 13, 15, 18, 22, 24, 25, 27, 28, 29, 31, 32], "throughout": 24, "throw": 3, "thrust": [15, 22], "thu": [24, 25], "ti": [3, 28, 34], "tidal": [12, 13, 15, 24], "tie": 3, "tild": 24, "tilt": [15, 22], "tiltangl": 15, "time": [0, 3, 5, 6, 7, 8, 11, 13, 15, 22, 23, 26, 27, 28, 29, 31, 32, 34], "timeseri": [17, 26], "timesperfram": [25, 26], "timestep": [0, 15, 25, 26], "tip": [15, 22], "titl": [10, 13, 18, 21], "todai": 12, "togeth": [0, 11, 24, 31], "tom": [7, 12, 13], "tomorrow": 12, "tonn": 32, "too": [3, 13, 25, 31], "tool": [2, 11, 12, 19, 20, 32], "toolbox": [13, 29, 32, 34], "tooltip": 3, "top": [15, 22, 25, 26, 34], "topic": [25, 27, 31, 33], "torino": [14, 19], "torqu": [15, 24, 25, 26, 28], "torquemaxr": 15, "torsion": [11, 24], "tort": [10, 18], "total": [0, 6, 15, 24, 25], "toward": [22, 32], "tower": [15, 19, 22, 26], "towerbaseload": 26, "towertopload": 26, "track": [3, 5, 10, 13, 18, 22], "trade": [10, 18], "trademark": [10, 18], "tradit": 25, "train": [12, 25, 30], "transact": [12, 24, 25], "transfer": [10, 15, 18, 22, 25, 26], "transform": [10, 18, 22, 25], "transient": 24, "transit": [13, 15, 22, 26], "translat": [0, 10, 18, 24, 25, 26, 28, 32], "transport": 0, "transpos": 13, "travel": 24, "travisci": 13, "treat": 0, "treatment": 0, "trend": 20, "trondheim": 12, "troubleshoot": [13, 29, 30], "true": [25, 28], "try": [15, 32], "tsr": 22, "tune": [22, 25, 31], "turbin": [17, 19, 20, 21], "turbine_properti": 22, "turbinepow": 26, "turbmodel": 15, "turbsim": [15, 22], "turbsim_inputfil": 15, "turbul": [15, 22], "turn": [3, 25, 26], "tutori": [13, 27, 28, 30, 34], "twist": [15, 22], "two": [0, 11, 15, 22, 24, 25, 28, 29, 30, 31], "twr2shft": 15, "txt": [15, 25, 26], "type": [0, 3, 6, 10, 13, 15, 17, 18, 22, 24, 25, 26, 28, 29, 32, 34], "typenumb": 28, "typic": [3, 15, 25, 28], "typo": 13, "u": [0, 7, 8, 10, 12, 15, 18, 22, 24], "u_": [0, 22, 24], "uigetfil": 3, "uk": 13, "umain": 15, "unabl": 25, "unachiev": 25, "unchang": [0, 24], "unconstrain": 28, "under": [3, 8, 10, 15, 18, 22, 25, 32], "underbrac": 0, "understand": [3, 22, 25], "undistrub": 25, "undisturb": [22, 24, 25, 32], "unforc": 24, "unfortun": 31, "uniform": [22, 24, 26], "union": [10, 18], "uniqu": [0, 11, 22, 25], "unit": [0, 6, 12, 13, 15, 23, 25, 26], "univers": [8, 12, 22], "unless": [10, 18, 24, 25, 31], "unlik": 25, "unnecessarili": 25, "unphys": 31, "unrealist": 24, "unsolv": 0, "unspecifi": 25, "unstabl": [0, 31], "unstretch": [15, 25], "untun": 25, "up": [3, 12, 13, 15, 17, 25, 26, 27, 28, 29, 31, 32, 33], "updat": [1, 3, 5, 12, 13, 17, 25, 26, 29, 33], "upload": [22, 31], "upon": [0, 12, 24, 25], "upper": [15, 22, 25], "upperlimitbound": 25, "upperlimitdamp": 25, "upperlimitspecifi": [3, 25], "upperlimitstiff": 25, "upperlimittransitionregionwidth": 25, "uptilt": 15, "upward": 24, "urat": 22, "url": [13, 24, 25], "us": [0, 1, 3, 5, 7, 10, 11, 12, 13, 15, 17, 18, 21, 22, 24, 25, 26, 27, 28, 29, 31, 32, 34], "usa": 32, "usabl": [4, 15], "usabletim": 15, "usag": 25, "user": [0, 3, 6, 7, 11, 12, 13, 15, 16, 17, 24, 25, 26, 27, 28, 29, 31, 32, 33, 34], "userdefinedelev": 24, "userdefinedfunct": [17, 22, 25, 32], "userdefinedfunctionsmcr": 25, "usernam": [1, 5], "usual": 25, "ut": 12, "util": [3, 24, 25, 31], "v": [0, 15, 24, 25, 31], "v009t09a078": 24, "v1": [9, 12, 16, 33], "v15": 15, "v2": [9, 24, 25, 33], "v3": 9, "v4": 9, "v5": 9, "v6": [9, 16], "v_": [0, 25], "v_0": 24, "v_cutin": 15, "v_cutout": 15, "v_discr": 15, "v_rated_tri": 15, "valid": [3, 12, 13, 15, 24, 25, 26, 32], "valu": [0, 3, 15, 22, 24, 25, 26, 27, 28, 31], "valv": [25, 26, 28], "van": [7, 12], "varargin": 25, "vari": [15, 22, 24, 25, 27, 28], "variabl": [2, 3, 13, 15, 22, 24, 26, 27, 28, 32], "variablehydro": 26, "variablenam": 25, "varianc": 24, "variant": [13, 15, 22, 28], "variat": [15, 22, 25, 26, 28], "varieti": [7, 11], "variou": [3, 11, 15, 22, 24, 27, 28, 31], "vdot": 24, "vec": [0, 24], "vector": [0, 24, 25, 26, 28], "veloc": [0, 15, 22, 24, 25, 26, 28], "ver": 29, "verbal": [10, 18], "veri": [0, 7, 25, 31, 32], "verif": [12, 25, 32], "verifi": [6, 25], "versa": 22, "versatil": 27, "version": [3, 5, 10, 12, 13, 17, 18, 25, 29], "versu": 26, "vertic": [0, 15, 24, 25], "vessel": 24, "vflowang": 15, "vi0": 25, "via": [6, 15, 22, 24, 25, 28, 29], "vice": 22, "victor": 25, "video": [12, 25, 26], "view": [0, 25, 28, 29, 34], "viewer": 25, "viscos": [0, 24], "viscou": [0, 23, 26, 28], "viselli": 15, "visibl": [3, 22, 25, 29], "visit": 24, "visual": [11, 13, 26, 28, 30, 34], "visualis": 26, "viz": [25, 26], "vme": [25, 26], "vo": 25, "vol": [12, 20], "voltag": [25, 26], "volturnu": [15, 22], "volum": [0, 21, 24, 25, 26, 28, 31], "von": 15, "vtk": [25, 26], "vtp": 26, "vw_r2in_tri": 15, "w": [0, 15, 22, 24, 25], "w64": 25, "wa": [0, 3, 8, 10, 12, 18, 22, 25, 29, 32, 34], "wai": [22, 25, 27, 28, 29, 31], "wait": 25, "wake": [15, 22], "walden": 24, "wamit": [11, 13, 17, 24, 25, 27, 32, 34], "want": [0, 22, 25, 27, 28], "warn": [13, 25], "warranti": [10, 18], "water": [0, 7, 8, 12, 15, 22, 24, 25, 26, 31, 34], "waterdepth": [25, 26], "wave": [0, 3, 8, 11, 12, 13, 17, 19, 20, 23, 27, 30, 32, 34], "wave_mark": 25, "waveclass": [3, 13, 25, 26, 28, 32, 34], "waveclasscallback": 3, "wavegamma": 28, "wavegauge1elev": 26, "wavegauge2elev": 26, "wavegauge3elev": 26, "waveheight": 28, "wavelength": 24, "wavenumb": 25, "waveperiod": 28, "wavespectrum": 28, "wavespread": 13, "wavestar": [11, 25, 27], "wavetyp": [26, 28], "we": [0, 15, 22, 24, 29, 31, 34], "weakli": [24, 25], "weather": 19, "web": 13, "webinar": [12, 28, 33], "webpag": 34, "websit": [10, 13, 18, 25], "webstor": 24, "wec": [1, 2, 4, 5, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 22, 24, 26, 30], "wec3": 12, "wecccomp": [11, 12, 25, 30], "wecsim": [3, 6, 13, 22, 24, 25, 28, 29, 31, 32, 34], "wecsim_appl": 6, "wecsim_lib": [3, 28], "wecsim_lib_body_el": [3, 13], "wecsim_lib_c": 3, "wecsim_lib_constraint": 3, "wecsim_lib_fram": 3, "wecsim_lib_moor": 3, "wecsim_lib_pto": 3, "wecsimapptest": 6, "wecsimfcn": [25, 32, 34], "wecsiminputfil": [3, 22, 25, 26, 28, 31, 33], "wecsiminputfile_customparamet": 3, "wecsiminputfile_simulinkcustomparamet": [3, 25], "wecsiminuptfil": 0, "wecsimmcr": [13, 25, 27, 31, 32, 34], "wecsimpct": [13, 25, 31, 32, 34], "wecsimsourc": 29, "wecsimtest": 6, "weight": [0, 22], "welcom": 31, "well": [0, 15, 22, 25, 27, 34], "wendt": 12, "were": [15, 22, 25], "wet": [24, 31, 34], "weywada": 12, "wf_07d": 15, "wf_14d": 15, "wf_upw": 15, "what": [3, 15, 17, 33], "whatev": 1, "wheeler": 24, "when": [0, 3, 4, 5, 6, 8, 13, 15, 21, 22, 24, 25, 26, 27, 28, 31, 32, 34], "whenev": [3, 31], "where": [0, 5, 10, 11, 15, 18, 22, 24, 25, 28, 29, 34], "wherea": [3, 22, 25], "wherev": [10, 18], "whether": [10, 18, 22, 25], "which": [0, 3, 10, 15, 17, 18, 22, 24, 25, 26, 27, 28, 31, 32, 34], "while": [0, 10, 15, 17, 18, 22, 24, 25, 26, 28, 29, 31, 32, 34], "who": [4, 25, 28, 29, 31], "whole": [0, 10, 18], "wholli": 8, "whom": [10, 18], "whose": [0, 17, 22, 26], "why": 31, "wide": [7, 11, 32], "widen": 25, "width": [15, 25], "wiglei": [11, 25], "wilson": 25, "win": 12, "wind": [12, 17, 19, 20, 21, 24, 25], "windclass": [17, 19, 21, 22], "windfilt": 15, "window": [3, 6, 13, 25, 26, 28, 29, 32, 34], "windpow": 12, "windprofiletyp": 15, "windspe": 26, "windturbin": 26, "windturbineclass": [17, 19, 21, 26], "windturbinenam": 26, "winner": 12, "wish": [4, 25, 28, 29, 31], "within": [0, 3, 7, 10, 15, 16, 18, 22, 24, 25, 28, 29, 34], "without": [0, 3, 10, 15, 18, 24, 25, 27, 31], "witold": 15, "wmax": 25, "wmin": 25, "wn_c": 15, "wn_theta_bl": 15, "wn_theta_rosco": 15, "word": 0, "work": [5, 10, 12, 15, 18, 22, 25, 31, 32, 34], "workflow": [0, 4, 5, 13, 17, 22, 25, 28, 30, 31], "workspac": [0, 3, 13, 22, 25, 26, 28, 32], "world": 12, "worldwid": [10, 18], "worskpac": 3, "would": [3, 15, 22, 24, 25, 28], "wpto": 12, "wright": 15, "write": [10, 13, 18, 22, 26, 28, 30], "write_h5": 13, "writebemioh5": [13, 25], "writeblocksfrominput": 3, "writeinputfromblock": 3, "writelinefromvar": 3, "writetext": 26, "written": [3, 10, 12, 18, 25, 26, 27], "wtcompon": 22, "wtih": 0, "wtproperti": [15, 17, 22], "www": [10, 18, 24, 25, 34], "x": [0, 15, 22, 24, 26, 28, 32], "x3": 25, "x_": [22, 24], "x_i": [0, 25], "x_r": 24, "x_rot": 26, "xbodi": 34, "xetm": 15, "xewm1": 15, "xewm50": 15, "xi_piston": 25, "xl": 25, "xy": 15, "y": [0, 12, 13, 15, 22, 24, 26, 28, 32], "yaw": [7, 11, 13, 15, 22, 24, 26, 30], "ye": [24, 26], "year": [13, 15, 21], "yellow": [3, 17], "yi": [7, 24], "you": [1, 10, 18, 25, 27, 29, 31], "your": [1, 5, 10, 18, 27, 31, 32, 34], "yu": [7, 12, 13, 24, 32], "yuan": 24, "yuyihsiang": 13, "yz": 15, "z": [0, 15, 24, 25, 26, 28, 32], "z0": 15, "z_": [0, 25], "z_i": 25, "zahl": 15, "zalkind": 15, "zenodo": 13, "zero": [15, 22, 24, 25, 26, 28, 31], "zerocross": 26, "zeta": 22, "zone": 15, "\u00e3": 25, "\u00e5": 24, "\u00e9": [24, 25], "\u03b4": 22, "\u03bb": 22, "\u03bb_": 22}, "titles": ["Advanced Features", "Getting Started", "Developer Manual", "WEC-Sim Library", "Overview", "Pull Requests", "Software Tests", "WEC-Sim (Wave Energy Converter SIMulator)", "Acknowledgements", "Introduction", "License", "Overview", "Publications", "Release Notes", "Acknowledgements", "Advanced Features", "MOST Manual", "Introduction", "License", "Overview", "Publications", "Release Notes", "Theory", "Theory Manual", "Overview", "Advanced Features", "API", "WEC-Sim Applications", "Code Structure", "Getting Started", "User Manual", "Troubleshooting", "Tutorials", "Training Materials", "Workflow"], "titleterms": {"": 0, "0": [10, 13, 18, 21], "1": [0, 13, 24, 29, 32, 33, 34], "10": 33, "11": 33, "2": [0, 10, 13, 18, 24, 29, 32, 33, 34], "3": [13, 24, 29, 32, 33, 34], "4": [13, 29, 32, 33, 34], "5": [32, 33, 34], "6": 33, "7": 33, "8": 33, "9": 33, "To": 25, "absorb": 32, "acknowledg": [8, 14], "actuat": 25, "ad": 0, "add": 29, "addit": 22, "advanc": [0, 15, 25, 33], "aerodynam": [15, 22], "an": 31, "apach": [10, 18], "api": 26, "applic": [6, 27], "articl": 12, "baselin": 22, "bem": 24, "bemio": [25, 32, 33], "between": 0, "bin": 25, "blade": 22, "block": 28, "board": 31, "bodi": [0, 24, 25, 26, 27, 28, 32, 33], "boundari": 24, "build": [32, 34], "buoyanc": [24, 25, 33], "cabl": [25, 26, 28, 33], "calcul": [24, 25], "callback": 3, "case": [31, 34], "caus": 31, "cite": [13, 21], "class": [26, 28, 33], "code": [28, 33], "comparison": 0, "comput": 25, "condit": [25, 27, 33], "constraint": [25, 26, 28], "contributor": 8, "control": [15, 22, 25, 27, 33], "convert": 7, "convolut": 24, "coordin": 24, "copyright": [10, 18], "cours": 33, "current": [24, 25], "custom": 3, "damp": [24, 25], "data": [25, 31, 34], "debug": 31, "decai": [25, 27, 31], "declutch": 25, "degener": 31, "desalin": [27, 33], "detail": 28, "develop": [2, 3, 7, 19], "devic": [32, 33], "direct": 25, "direction": 25, "dispers": 24, "displac": 25, "distribut": 31, "document": 31, "domain": 24, "download": 29, "drag": [25, 31], "drive": 25, "dynam": 0, "element": [0, 24, 25], "elev": 25, "elevationimport": 28, "ellipsoid": 25, "energi": 7, "exampl": [25, 32], "excit": [24, 25, 33], "extens": [25, 27], "extern": [8, 28], "extract": 0, "faq": 31, "featur": [0, 15, 25, 33], "file": [3, 25, 31, 32, 34], "filter": 25, "finit": 25, "fir": 25, "fix": [0, 25], "float": 25, "forc": 25, "format": 3, "formul": 24, "frame": 28, "free": [27, 31], "from": [3, 24, 25], "froud": [24, 25, 33], "function": [3, 24, 25, 28], "fund": 8, "gaug": 25, "gener": [22, 24, 25, 27, 34], "geometri": [25, 32, 34], "get": [1, 29], "h5": 25, "hdf5": 27, "heav": 25, "hydraul": [24, 25], "hydro": 25, "hydrodata": 34, "hydrodynam": [25, 27, 31, 33, 34], "hydrostat": 31, "identifi": 31, "implement": [0, 22, 25], "impuls": 25, "incorpor": 25, "initi": 28, "input": [3, 22, 34], "instal": [25, 29, 33], "integr": [24, 25], "interact": [25, 27, 33], "introduct": [9, 17], "io": 15, "irregular": [24, 25, 28, 31], "issu": 31, "j": 24, "joint": 25, "jonswap": 24, "k_": 24, "krylov": [24, 25, 33], "larg": 25, "latch": 25, "librari": [3, 28, 29], "licens": [10, 18], "limit": 25, "linear": 24, "load": [15, 22, 25], "look": 22, "lookup": [24, 25], "m": [32, 34], "macro": 25, "manual": [2, 16, 23, 30], "marker": [25, 27], "mask": [0, 3], "mass": [0, 25, 31], "materi": 33, "matlab": [3, 29], "matric": 24, "matrix": [24, 25], "mcr": [25, 33], "mechan": 24, "merg": 3, "method": 24, "mode": [24, 25, 27], "model": [25, 32, 33, 34], "modifi": 25, "modul": 22, "moor": [15, 22, 24, 25, 26, 27, 28], "moordyn": [24, 25, 33], "morison": [0, 24, 25], "moskowitz": 24, "most": [15, 16, 19, 21], "move": 0, "mpc": 25, "multipl": [25, 27, 33], "new": 12, "non": [25, 33], "nonhydrodynam": 27, "nonlinear": [24, 25, 27, 33], "note": [13, 21, 31], "nowav": 28, "nowavec": 28, "numer": [24, 31], "ocean": [24, 25], "ode4": 25, "ode45": 25, "off": [24, 25], "onlin": 33, "open": 31, "option": [0, 24], "oscil": 32, "oswec": [25, 32], "other": [25, 31], "overview": [4, 11, 19, 24, 33], "owc": 33, "own": 25, "parallel": 25, "paramet": [3, 25], "paraview": [25, 27], "passiv": [25, 27], "path": 29, "pct": 25, "perform": 0, "phase": 25, "pierson": 24, "pitch": 22, "placement": 25, "plot": 25, "pm": 24, "point": 32, "post": [22, 25, 32], "power": [24, 25], "pre": [22, 34], "predict": 25, "process": [22, 25, 32, 34], "properti": 22, "proport": 25, "pto": [24, 25, 26, 27, 28, 33], "public": [12, 13, 20], "pull": 5, "r": 24, "radiat": 25, "ramp": 24, "reactiv": 25, "realiz": 24, "refer": [15, 24, 25, 32], "regular": [24, 28], "regularc": 28, "relat": 24, "releas": [13, 21], "relev": 31, "represent": 25, "request": 5, "requir": 29, "respons": [24, 25, 26, 28], "review": [0, 31], "rigid": 0, "rm3": [25, 27, 32], "root": 31, "rosco": 22, "run": [3, 25, 27, 32, 33, 34], "save": 25, "search": 31, "seed": 25, "seri": 33, "set": 25, "sim": [0, 3, 6, 7, 13, 21, 25, 27, 28, 29, 31, 32, 33, 34], "simscap": 28, "simul": [7, 22, 25, 26, 28], "simulink": [3, 25, 28, 29, 32, 34], "singular": 31, "sinusoid": 24, "softwar": 6, "solut": 31, "sourc": 28, "space": [24, 25], "specif": 3, "spectra": [24, 25], "spectrum": [24, 25], "spectrumimport": 28, "sphere": 25, "spread": 25, "stabil": 31, "start": [1, 29], "state": [24, 25], "steadi": 24, "step": [25, 29, 32, 34], "stl": 25, "stroke": 25, "structur": [3, 25, 28, 33], "summari": 3, "surg": 32, "system": 24, "tabl": [22, 24, 25], "take": [24, 25], "terminologi": 24, "test": [6, 25, 29, 31], "theoret": 0, "theori": [22, 23, 24, 33], "time": [24, 25], "tool": 3, "toolbox": 25, "torqu": 22, "train": 33, "troubleshoot": 31, "turbin": [15, 22], "tutori": [25, 32, 33], "two": 32, "unit": 24, "up": 22, "us": 33, "user": [22, 30], "v1": [13, 21], "v2": 13, "v3": 13, "v4": 13, "v5": 13, "v6": [13, 21], "variabl": [0, 25], "variou": 25, "verifi": 29, "viscou": [24, 25, 31], "visual": [25, 27, 33], "wave": [7, 24, 25, 26, 28, 31, 33], "wec": [0, 3, 6, 7, 13, 21, 25, 27, 28, 29, 31, 32, 33, 34], "wecccomp": 27, "wecsiminputfil": [32, 34], "wind": [15, 22], "within": 21, "work": 0, "workflow": [33, 34], "write": [3, 25, 27, 32, 34], "x": 25, "y": 25, "yaw": [25, 27], "your": 25}}) \ No newline at end of file diff --git a/main/theory/index.html b/main/theory/index.html new file mode 100644 index 000000000..c690a80a1 --- /dev/null +++ b/main/theory/index.html @@ -0,0 +1,225 @@ + + + + + + + + + Theory Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/theory/theory.html b/main/theory/theory.html new file mode 100644 index 000000000..c11315e26 --- /dev/null +++ b/main/theory/theory.html @@ -0,0 +1,1294 @@ + + + + + + + + + Overview — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Overview

+

Modeling wave energy converters (WECs) involves the interaction between the +incident waves, device motion, power-take-off (PTO mechanism), and mooring. +WEC-Sim uses a radiation and diffraction method [B1, B2] to +predict power performance and design optimization. The radiation and +diffraction method generally obtains the hydrodynamic forces from a +frequency-domain boundary element method (BEM) solver using linear coefficients +to solve the system dynamics in the time domain.

+
+../_images/Physics.png +
+
+
+

Coordinate System

+

The WEC-Sim Coordinate System figure illustrates a +3-D floating point absorber subject to incoming waves in water. The figure also +defines the coordinates and the 6 degree of freedom (DOF) in WEC-Sim. The +WEC-Sim coordinate system assumes that the positive X-axis defines a wave angle +heading of zero (e.g., a wave propagating with along a zero-degree direction is +moving in the +X direction). The positive Z-axis is in the vertical upwards +direction, and the positive Y-axis direction is defined by the right-hand rule. +In the vectors and matrices used in the code, Surge (x), Sway (y), and Heave +(z) correspond to the first, second and third position respectively. Roll (Rx), +Pitch (Ry), and Yaw (Rz) correspond to the fourth, fifth, and sixth position +respectively.

+
+../_images/coordinateSystem.png + +
+
+

WEC-Sim Coordinate System

+
+
+
+
+
+

Units

+

All units within WEC-Sim are in the MKS (meters-kilograms-seconds system) and +angular measurements are specified in radians (except for wave directionality +which is defined in degrees).

+
+
+

Boundary Element Method (BEM)

+

In WEC-Sim, wave forcing components are modeled using linear coefficients +obtained from a frequency-domain potential flow Boundary Element Method (BEM) +solver (e.g., WAMIT [B3], Aqwa [B4], NEMOH [B5], and Capytaine [B6, B7]). +The BEM solutions are obtained by solving the Laplace equation +for the velocity potential, which assumes the flow is inviscid, incompressible, +and irrotational. More details on the theory for the frequency-domain BEM can +be found in [B3].

+

WEC-Sim imports nondimensionalized hydrodynamic coefficients from an *.h5 +data structure generated by BEMIO for the BEM solvers: WAMIT, +Aqwa, NEMOH or Capytaine. Alternatively, the *.h5 data structure can be +manually defined by the user. The WEC-Sim code scales the hydrodynamic +coefficients according to the equations below, where \(\rho\) is the water +density, \(\omega\) is the wave frequency in rad/s, and \(g\) is +gravity:

+
+\begin{gather*} +|\overline{F_{exc}(\omega)}| = \frac{|F_{exc}(\omega)|}{\rho g} \\ +\overline{A(\omega)} = \frac{A(\omega)}{\rho} \\ +\overline{B(\omega)} = \frac{B(\omega)}{\rho \omega} \\ +\overline{K_{hs}} = \frac{K_{hs}}{\rho g} +\end{gather*}

where \(F_{exc}\) is the wave-excitation force and torque vector, \(A\) +is the radiation added mass coefficient, \(B\) is the radiation wave +damping coefficient, and \(K_{hs}\) is the linear hydrostatic restoring +coefficient.

+
+
+

Time-Domain Formulation

+

A common approach to determining the hydrodynamic forces is to use linear wave +theory which assumes the waves are the sum of incident, radiated, and +diffracted wave components. The dynamic response of the system is calculated by +solving WEC system equations of motion [B2, B8]. The +equation of motion for a floating body about its center of gravity can be given +as:

+
+\[m\ddot{X}=F_{exc}(t)+F_{md}(t)+F_{rad}(t)+F_{pto}(t)+F_{v}(t)+F_{me}(t)+F_{B}(t)+F_{m}(t)\]
+

where \(\ddot{X}\) is the (translational and rotational) acceleration +vector of the device, \(m\) is the mass matrix, \(F_{exc}(t)\) is the +wave excitation force and torque (6-element) vector, \(F_{md}(t)\) is the +mean drift force and torque vector, \(F_{rad}(t)\) is the +force and torque vector resulting from wave radiation, \(F_{pto}(t)\) is +the PTO force and torque vector, \(F_{v}(t)\) is the damping force and +torque vector, \(F_{me}(t)\) is the Morison Element force and torque +vector, \(F_{B}(t)\) is the net buoyancy restoring force and torque vector, +and \(F_{m}(t)\) is the force and torque vector resulting from the mooring +connection.

+

\(F_{exc}(t)\) , \(F_{rad}(t)\) , and \(F_{B}(t)\) are calculated +using hydrodynamic coefficients provided by the frequency-domain BEM solver. +The radiation term includes an added-mass term, matrix \(A(\omega)\), and +wave damping term, matrix \(B(\omega)\), associated with the acceleration +and velocity of the floating body, respectively, and given as functions of +radian frequency (\(\omega\)) by the BEM solver. The wave excitation term +\(F_{exc}(\omega)\) includes a Froude-Krylov force component generated by +the undisturbed incident waves and a diffraction component that results from +the presence of the floating body. The buoyancy term \(F_{B}(t)\) depends +on the hydrostatic stiffness \(K_{hs}\) coefficient, displacement of the +body, and its mass.

+
+
+

Numerical Methods

+

WEC-Sim can be used for regular and irregular wave simulations, but note that +\(F_{rad}(t)\) is calculated differently for +sinusoidal steady-state response scenarios and random sea simulations. The +sinusoidal steady-state response is often used for simple WEC designs with +regular incoming waves. However, for random sea simulations or any simulations +where fluid memory effects of the system are essential, the convolution +integral method is recommended to represent the fluid memory retardation force +on the floating body. To speed computation of the convolution integral, the +state space representation method can be specified to approximate this +calculation as a system of linear ordinary differential equations.

+
+

Ramp Function

+

A ramp function (\(R_{f}\)), necessary to avoid strong transient flows at +the earlier time steps of the simulation, is used to calculate the wave +excitation force. The ramp function is given by

+
+\[\begin{split}R_{f}(t)=\begin{cases} +\frac{1}{2}(1+\cos(\pi+\frac{\pi t}{t_{r}})) & \frac{t}{t_{r}}<1\\ +1 & \frac{t}{t_{r}}\geq1 +\end{cases}\end{split}\]
+

where \(t\) is the simulation time and \(t_{r}\) is the ramp time.

+
+
+

Sinusoidal Steady-State Response

+

This approach assumes that the system response is in sinusoidal steady-state +form; therefore, it is only valid for regular wave simulations. The radiation +term can be calculated using the added mass and the wave radiation damping term +for a given wave frequency, which is obtained from

+
+\[F_{rad}(t)=-A(\omega)\ddot{X}-B(\omega)\dot{X}\]
+

where \(\dot{X}\) is the velocity vector of the floating body, +\(A(\omega)\) is the added mass matrix, and \(B(\omega)\) is the +radiation damping matrix.

+

The free surface profile is based on linear wave theory for a given wave +height, wave frequency, and water depth. The regular wave excitation force is +obtained from

+
+\[F_{exc}(t)=\Re\left[ R_{f}(t)\frac{H}{2}F_{exc}(\omega, \theta)e^{i\omega t} \right]\]
+

where \(\Re\) denotes the real part of the formula, \(R_{f}\) is the +ramp function, \(H\) is the wave height, \(F_{exc}\) is the frequency +dependent complex wave-excitation amplitude vector, and \(\theta\) is the +wave direction.

+

The mean drift force has two contributions:

+
+
    +
  • 2nd-order hydrodynamic pressure due to the first-order wave

  • +
  • Interaction between the first-order motion and the first-order wave

  • +
+
+

Currently, WEC-Sim only reads mean drift coefficients representing the first contribution. +The mean drift force can optionally be included if these coefficients are defined in the BEM data. +The mean drift force is obtained from:

+
+\[F_{md}(t)=\left(\frac{H}{2}\right)^2F_{md}(\omega,\theta)\]
+

The mean drift force is combined with the excitation force in the response class output.

+
+

Note

+

Currently, WEC-Sim only supports mean drift coefficients and QTF from WAMIT.

+
+
+
+

Convolution Integral Formulation

+

In the case of an irregular wave spectrum, the fluid memory has an important +impact on the WEC dynamics. This fluid memory effect is captured by the +convolution integral formulation based upon the Cummins equation +[B9] is used. The radiation term can be calculated by

+
+\[F_{rad}(t)=-A_{\infty}\ddot{X}-\intop_{0}^{t}K_{r}(t-\tau)\dot{X}(\tau)d\tau\]
+

where \(A_{\infty}\) is the added mass matrix at infinite frequency and +\(K_{r}\) is the radiation impulse response function. This representation +also assumes that there is no motion for \(t<0\). The radiation impulse +response function is defined as

+
+\[K_{r}(t) = \frac{2}{\pi} \intop_{0}^{\infty} B(\omega) cos(\omega t) d\omega\]
+

For regular waves, the equation described in the last subsection is used to +calculate the wave excitation vector. For irregular waves, the free surface +elevation is constructed from a linear superposition of a number of regular +wave components. Each regular wave component is extracted from a wave spectrum, +\(S(\omega)\), describing the wave energy distribution over a range of wave +frequencies, generally characterized by a significant wave height and peak wave +period. The irregular excitation force can be calculated as the real part of an +integral term across all wave frequencies as follows

+
+\[F_{exc}(t)=\Re\left[ R_{f}(t) \sum_{j=1}^{N} + F_{exc}(\omega_{j}, \theta) + e^{i(\omega_{j}t+\phi_{j})} + \sqrt{2S(\omega_{j})d\omega_{j}} \right]\]
+

where \(\phi\) is the randomized phase angle and \(N\) is the number of +frequency bands selected to discretize the wave spectrum. For repeatable +simulation of an irregular wave field \(S(\omega)\), WEC-Sim allows +specification of \(\phi\), refer to the Multiple Wave-Spectra +section.

+

Additionally, an excitation force impulse response function is defined +as

+
+\[K_{e}(t) = \frac{1}{2\pi} \intop_{-\infty}^{\infty} + F_{exc}(\omega,\theta)e^{i\omega t} d\omega\]
+

The excitation impulse response function is only used for the userDefinedElevation wave case.

+
+
+

State Space

+

It is highly desirable to represent the radiation convolution integral +described in the last subsection in state space (SS) form [B10]. This +has been shown to dramatically increase computational speeds +[B11] and allow utilization of conventional control methods +that rely on linear state space models. An approximation will need to be made +as \(K_{r}\) is solved from a set of partial differential equations where +as a linear state space is constructed from a set of ordinary differential +equations. In general, a linear system is desired such that:

+
+\[\begin{split}\dot{X}_{r} \left( t \right) = + \mathbf{A_{r}} X_{r} \left( t \right) + + \mathbf{B_{r}} \mathbf{u} (t);~~X_{r}\left( 0 \right) = 0~~ \nonumber \\ +\int_{0}^{t} \mathbf{K_{r}} \left( t- \tau \right) d\tau \approx + \mathbf{C_{r}} X_{r} \left( t \right) + + \mathbf{D_{r}} \mathbf{u} \left( t \right)~~\end{split}\]
+

with \(\mathbf{A_{r}},~\mathbf{B_{r}},~\mathbf{C_{r}},~\mathbf{D_{r}}\) +being the time-invariant state, input, output, and feed through matrices, while +\(u\) is the input to the system and \(X_{r}\) is the state vector +describing the convolution kernel as time progresses.

+
+

Calculation of \(K_{r}\) from State Space Matrices

+

The impulse response of a single-input zero-state state-space model is +represented by

+
+\[\begin{split}\dot{x} &= \mathbf{A_{r}} x + \mathbf{B_{r}} u \\ + y &= \mathbf{C_{r}} x\end{split}\]
+

where \(u\) is an impulse. If the initial state is set to \(x(0)= +\mathbf{B_{r}} u\) the response of the unforced (\(u=0\)) system

+
+\[\begin{split}\dot{x} &= \mathbf{A_{r}} x \\ + y &= \mathbf{C_{r}} x\end{split}\]
+

is clearly equivalent to the zero-state impulse response. The impulse response +of a continuous system with a nonzero \(\mathbf{D_r}\) matrix is infinite +at \(t=0\); therefore, the lower continuity value +\(\mathbf{C_{r}}\mathbf{B_{r}}\) is reported at \(t=0\). The general +solution to a linear time invariant (LTI) system is given by:

+
+\[x(t) = e^{\mathbf{A_{r}}t} x(0) + + \int_{0}^{t} e^{\mathbf{A_{r}}(t-\tau)} \mathbf{B_{r}} u (\tau) d\tau~~\]
+

where \(e^{\mathbf{A_{r}}}\) is the matrix exponential and the calculation +of \(K_{r}\) follows:

+
+\[K_{r}(t) = \mathbf{C_{r}}e^{\mathbf{A_{r}}t}\mathbf{B_{r}}~~\]
+
+
+

Realization Theory

+

The state space realization of the hydrodynamic radiation coefficients can be +pursued in the time domain (TD). This consists of finding the minimal order of +the system and the discrete time state matrices +(\(\mathbf{A_{d}},~\mathbf{B_{d}},~\mathbf{C_{d}},~\mathbf{D_{d}}\)) from +samples of the impulse response function. This problem is easier to handle for +a discrete-time system than for continuous-time. The reason being is that the +impulse response function of a discrete-time system is given by the Markov +parameters of the system:

+
+\[\mathbf{\tilde{K}_{r}} \left( t_{k} \right) = + \mathbf{C_{d}}\mathbf{A_{d}}^{k}\mathbf{B_{d}}~~\]
+

where \(t_{k}=k\Delta t\) for \(k=0,~1,~2,~\ldots\) with \(\Delta +t\) being the sampling period. The feedthrough matrix \(\mathbf{D_d}\) is +assumed to be zero in order to maintain causality of the system, as a non-zero +\(\mathbf{D_d}\) results in an infinite value at \(t=0\).

+

The most common algorithm to obtain the realization is to perform a Singular +Value Decomposition (SVD) on the Hankel matrix of the impulse response +function, as proposed by Kung [B12]. The order of the system and +state-space parameters are determined from the number of significant singular +values and the factors of the SVD. The Hankel matrix (\(H\)) of the impulse +response function

+
+\[\begin{split}H = \begin{bmatrix} + \mathbf{K_{r}}(2) & \mathbf{K_{r}}(3) & \ldots & \mathbf{K_{r}}(n) \\ + \mathbf{K_{r}}(3) & \mathbf{K_{r}}(4) & \ldots & 0 \\ + \vdots & \vdots & \ddots & \vdots \\ + \mathbf{K_{r}}(n) & 0 & \cdots & 0 + \end{bmatrix} &\\\end{split}\]
+

can be reproduced exactly by the SVD as

+
+\[H = \mathbf{U} \Sigma \mathbf{V^{*}}\]
+

where \(\Sigma\) is a diagonal matrix containing the Hankel singular values +in descending order. Examination of the Hankel singular values reveals there +are only a small number of significant states and that the rank of \(H\) +can be greatly reduced without a significant loss in accuracy +[B11, B13]. Further detail into the SVD method and +calculation of the state space parameters will not be discussed here and the +reader is referred to [B11, B13].

+
+
+
+
+

Regular Waves

+

Regular waves are defined as planar sinusoidal waves, where the incident wave is defined as \(\eta(x,y,t)\) :

+
+\[\eta(x,y,t)= \frac{H}{2} \cos( \omega t - k (x\cos \theta + y\sin \theta) + \phi)\]
+

where \(H\) is the wave height, \(\omega\) is the wave frequency +(\(\omega = \frac{2\pi}{T}\)), \(k\) is the wave number (\(k = +\frac{2\pi}{\lambda}\)), \(\theta\) is the wave direction, and \(\phi\) +is the wave phase.

+
+

Dispersion Relation

+

For ocean waves, the dispersion relation is a relation between the wave angular frequency and the wave number (i.e. wavelength). +The dispersion relation is derived using separation of variables to satisfy the free surface kinematic and dynamic boundary conditions. +For a more detailed derivation please the reader is referred here The dispersion relation that WEC-sim uses is defined as:

+
+\[\begin{split}\omega^{2} = gk\tanh\left(kh\right) \approx \begin{cases} +gk & \text{as } kh \rightarrow \infty \\ +gk^{2}h & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+

where \(\omega\) is the wave angular frequency (\(\omega = \frac{2\pi}{T}\)), \(g\) is gravitational acceleration, +\(k\) is the wave number (\(k=\frac{2\pi}{\lambda}\)), and \(h\) is the water depth. The dispersion relation can be +simplified if the floating body is located in deep water, \(h \rightarrow \infty\) . The simplification comes from the hyperbolic +tangent function having an asympote of 1 as its argument tends to infinity (\(\tanh \left( \infty \right) \rightarrow 1\)). +The deep water condition can still be met if the water depth is not infinite while the following expression holds \(kh \geq \pi\) . +The dispersion relation can then be used to derive the phase velocity which refers to the speed that an observer would need to travel for +the wave to appear stationary (unchanging). The phase velocity of a two-dimensional progressive wave is given by the following expression:

+
+\[\begin{split}c_{p} = \frac{\omega}{k} = \sqrt{\frac{g}{k}\tanh\left(kh\right)} \approx \begin{cases} +\sqrt{\frac{g}{k}}=\frac{g}{\omega} & \text{as } kh \rightarrow \infty \\ +\sqrt{gh} & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+
+
+

Regular Wave Power

+

The time-averaged power, per unit wave crest with, for a propagating water wave

+
+\[P_{w} = \frac{1}{2}\rho g A^{2} c_{g}\]
+

where \(\rho\) is the fluid density, \(g\) is gravitational acceleration, \(A\) is the wave amplitude, and \(c_{g}\) is wave group velocity. +The group velocity is the speed of propagation of a packet of waves which is always slower than the wave phase velocity. For a more detailed derivation on the +group velocity the reader is referred here. The group velocity of a two-dimensional progressive wave +is given by the following expression:

+
+\[c_{g} = \frac{\delta \omega}{\delta k} = \frac{1}{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right)\]
+

where \(\sinh\) is the hyperbolic sine function. The square root term is the phase velocity which can be used to simplify the group velocity expression as follows:

+
+\[\begin{split}c_{g} = \frac{1}{2} c_{p} \left( 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right) \approx \begin{cases} +\frac{1}{2} c_{p} & \text{as } kh \rightarrow \infty \\ +1 & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+

Inserting the full expression for the group velocity into the wave power equation provides the following:

+
+\[P_{w} = \frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}\tanh\left(kh\right)} \left[ 1 + \frac{2kh}{\sinh \left( 2kh \right)} \right]\]
+

Similar to the other wave property expressions, the wave power expression can be simplified for both deep and shallow water conditions as follows:

+
+\[\begin{split}P_{w} \approx +\begin{cases} +\frac{1}{4}\rho g A^{2} \sqrt{\frac{g}{k}} = \frac{1}{8\pi}\rho g^{2} A^{2} T & \text{as } kh \rightarrow \infty \\ +\frac{1}{4}\rho g A^{2} \sqrt{gh} & \text{as } kh \rightarrow 0 +\end{cases}\end{split}\]
+
+

Note

+

The deep water condition is often used without proper validation of the wave environment which can have a significant effect on wave power. +WEC-Sim by default will calculate the wave power using the full expression, no simplification, unless the hydrodynamic data is imported with +the assumption of infinite water depth.

+
+
+
+
+

Irregular Waves

+

Irregular waves are modeled as the linear superposition of a large number of +harmonic waves at different frequencies and angles of incidence, where the +incident wave is defined as \(\eta(x,y,t)\) :

+
+\[\eta(x,y,t) = \sum_{i} \frac{H_{i}}{2} \cos( \omega_{i} t - + k_{i} (x\cos \theta_{i} + y \sin \theta_{i}) + \phi_{i})\]
+

where \(H\) is the wave height, \(\omega\) is the wave frequency +(\(\omega = \frac{2\pi}{T}\)), \(k\) is the wave number (\(k = +\frac{2\pi}{\lambda}\)), \(\theta\) is the wave direction, and \(\phi\) +is the wave phase (randomized for irregular waves).

+
+

Wave Spectra

+

The linear superposition of regular waves of distinct amplitudes and periods is +characterized in the frequency domain by a wave spectrum. Through statistical +analysis, spectra are characterized by specific parameters such as significant +wave height, peak period, wind speed, fetch length, and others. Common types of +wave spectra that are used by the offshore industry are discussed in the +following sections. The general form of the wave spectra available in WEC-Sim +is given by:

+
+\[S\left( f , \theta \right)= S\left( f \right)D\left( \theta \right)~~\]
+

where \(S\left( f\right)\) is the wave power spectrum, \(f\) is the +wave frequency (in Hertz), \(D\left( \theta \right)\) is the directional +distribution, and \(\theta\) is the wave direction (in Degrees). The +formulation of \(D\left( \theta \right)\) requires that

+
+\[\int_{0}^{\infty} \int_{-\pi}^{\pi} + S \left( f \right) D \left( \theta \right) d\theta df = + \int_{0}^{\infty} S\left( f \right) df\]
+

so that the total energy in the directional spectrum must be the same as the +total energy in the one-dimensional spectrum.

+
+\[S\left( f \right) = A_{ws} f^{-5}\exp\left[-B_{ws} f^{-4} \right]~~\]
+

where \(A_{ws}\) and \(B_{ws}\) are coefficients that vary depending on +the wave spectrum and \(\exp\) stands for the exponential function. +Spectral moments of the wave spectrum, denoted \(m_{k}~,~k=0, 1, 2,...\), +are defined as

+
+\[m_{k} = \int_{0}^{\infty} f^{k} S \left( f \right) df ~~\]
+

The spectral moment, \(m_{0}\) is the variance of the free surface which +allows one to define the mean wave height of the tallest third of waves, +significant wave height \(H_{m0}\) (in m), as:

+
+\[H_{m0} = 4 \sqrt{m_{0}}~~\]
+
+
+

Irregular Wave Power

+

The time-averaged wave power available for a given irregular sea state can be calcuated from:

+
+\[P_{w} = \rho g \int_{0}^{\infty} S \left( f \right) c_{g} \left( f \right) df\]
+

where the expression for group velocity for regular waves can be inserted for each frequency used +to describe the sea spectrum.

+
+

Pierson–Moskowitz (PM) Spectrum

+

The PM spectrum is applicable to a fully developed sea, when the growth of the +waves is not limited by the fetch [B14]. The two-parameter PM spectrum is +based on a significant wave height and peak wave frequency. For a given +significant wave height, the peak frequency can be varied to cover a range of +conditions including developing and decaying seas. In general, the parameters +depend strongly on wind speed, and also wind direction, fetch, and locations of +storm fronts. The spectral density of the surface elevation defined by the PM +spectrum [B15] is defined by:

+
+\[S_{PM}\left( f \right) = \frac{{H_{m0}}^2}{4} + \left( 1.057f_{p} \right)^{4} f^{-5} \exp + \left[-\frac{5}{4} \left( \frac{f_{p}}{f}\right)^{4} \right]\]
+

This implies coefficients of the general form:

+
+\[\begin{split}A_{ws} &= \frac{{H_{m0}}^2}{4}\left(1.057f_{p}\right)^{4} \approx + \frac{5}{16} {H_{m0}}^2 {f_{p}}^{4} \approx \frac{B_{ws}}{4}{H_{m0}}^2 \\ +B_{ws} &= \left(1.057f_{p}\right)^{4} \approx \frac{5}{4}{f_{p}}^{4}\end{split}\]
+

where \(H_{m0}\) is the significant wave height, \(f_{p}\) is the peak +wave frequency \(\left(=1/T_{p}\right)\), and \(f\) is the wave +frequency.

+
+
+

JONSWAP (JS) Spectrum

+

The JONSWAP (Joint North Sea Wave Project) spectrum is formulated as a +modification of the PM spectrum for developing sea sate in a fetch-limited +situation [B16]. The spectrum accounts for a higher peak and a narrower +spectrum in a storm situation for the same total energy as compared to the PM +spectrum. The spectral density of the surface elevation defined by the JS +spectrum [B15] is defined by:

+
+\[S_{JS}\left( f \right) = C_{ws} \left(\gamma\right) S_{PM} \gamma^{\alpha}\]
+

where \(\gamma\) is the nondimensional peak-shape parameter.

+

The normalizing factor, \(C_{ws}\left(\gamma\right)\), is defined as:

+
+\[C_{ws}\left(\gamma\right) = \frac{\int_{0}^{\infty} S_{PM}\left( f \right)df} + {\int_{0}^{\infty}S_{PM}\left(f\right)\gamma^{\alpha}df} = + 1 -0.287\ln\left(\gamma\right)\]
+

The peak-shape parameter exponent \(\alpha\) is defined as:

+
+\[\begin{split}\alpha = \exp \left[ -\left( \frac{\frac{f}{f_{p}}-1}{\sqrt{2} \sigma}\right)^{2} \right],~~ +\sigma = \begin{cases} 0.07 & f \leq f_{p} \\0.09 & f > f_{p} \end{cases} ~~\end{split}\]
+

The peak-shape parameter is defined based on the following relationship between +the significant wave height, \(H_{m0}\), and peak period, \(T_{p}\):

+
+\[\begin{split}\gamma = \begin{cases} + 5 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} \leq 3.6 \\ + \exp\left(5.75 - 1.15\frac{T_{p}}{\sqrt{H_{m0}}} \right) & \text{for } 3.6 \leq \frac{T_{p}}{\sqrt{H_{m0}}} \leq 5 \\ + 1 & \text{for } \frac{T_{p}}{\sqrt{H_{m0}}} > 5 +\end{cases}\end{split}\]
+

with general form coefficients thus defined:

+
+\[\begin{split}A_{ws} &= \frac{B_{ws}}{4}{H_{m0}}^2 C_{ws}\left(\gamma \right) \gamma^{\alpha} \\ +B_{ws} &= \frac{5}{4}{f_{p}}^{4}\end{split}\]
+
+
+
+
+

Ocean Current

+

An ocean current is a continuous, directed movement of sea water generated by a number of forces acting upon the water, including wind, +the Coriolis effect, breaking waves, cabbeling, temperature and salinity differences, and other ocean phenomena. Depth contours, shoreline configurations, and +interactions with other currents influence a current’s direction and strength. Ocean current can vary in space and time, but are generally modeled assuming a +horizontally uniform flow field of constant velocity and direction, varying only as a function of depth.

+
+../_images/oceanCurrentProfiles.png + +
+
+

Ocean Current Profiles Within WEC-Sim

+
+
+
+

Within WEC-Sim there are three options to model ocean currents:

+
+

Option 1

+

In Option 1, the sub-surface current is depth independent and is equal to the current at the water surface:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+

where \(\theta_{c}\) is the current direction.

+
+
+

Option 2

+

In Option 2, the sub-surface current profile varies with depth following a 1/7th power law:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right]^{1/7} \left[ \cos \left(\theta_{c}\right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+

where \(d_{current}\) is the water depth where the sub-surface current is 0.

+
+
+

Option 3

+

In Option 3, the sub-surface current profile varies linearly with depth:

+
+\[\vec{U}_{ss,current}(z) = U_{ss,current}(0)\left[ 1 + \frac{z}{d_{current}} \right] \left[ \cos \left(\theta_{c} \right) \hat{i} + \sin \left(\theta_{c} \right) \hat{j} \right]\]
+
+

Note

+

WEC-Sim does not adjust the linear wave hydrodynamics based on the presence +of ocean currents and assumes a linear superposition between current and +wave forces. The ocean current option is used only in the Morison Element +force calculation.

+
+
+
+
+

Power Take-Off (PTO)

+

Throughout the following sections, unless specification is made between linear +and rotary PTOs, units are not explicitly stated.

+
+

Linear PTO

+

The PTO mechanism is represented as a linear spring-damper system where the +reaction force is given by:

+
+\[F_{pto}=-K{}_{pto}X_{rel}-C_{pto}\dot{X}_{rel}\]
+

where \(K_{pto}\) is the stiffness of the PTO, \(C_{pto}\) is the +damping of the PTO, and \(X_{rel}\) and \(\dot{X}_{rel}\) are the +relative motion and velocity between two bodies. The instantaneous power +absorbed by the PTO is given by:

+
+\[P_{pto} = -F_{pto}\dot{X}_{rel} = \left(K_{pto}X_{rel} \dot{X}_{rel} + + C_{pto} \dot{X}^{2}_{rel} \right)\]
+
+
+

Hydraulic PTO

+

The PTO mechanism is modeled as a hydraulic system [B17], where the +reaction force is given by:

+
+\[F_{pto}=\Delta{} p_{piston}A_{piston}\]
+

where \(\Delta{} p_{piston}\) is the differential pressure of the hydraulic +piston and \(A_{piston}\) is the piston area. The instantaneous hydraulic +power absorbed by the PTO is given by:

+
+\[P_{pto}=-F_{pto}\dot{X}_{rel}\]
+
+
+

Mechanical PTO

+

The PTO mechanism is modeled as a direct-drive linear generator system +[B17], where the reaction force is given by:

+
+\[F_{pto}=(\frac{\pi}{\tau_{pm}})\lambda_{fd}i_{sq}\]
+

where \(\tau_{pm}\) is the magnet pole pitch (the center-to-center distance +of adjacent magnetic poles), \(\lambda_{fd}\) is the flux linkage of the +stator \(d\)-axis winding due to flux produced by the rotor magnets, and +\(i_{sq}\) is the stator \(q\)-axis current. The instantaneous +mechanical power absorbed by the PTO is given by:

+
+\[P_{pto}=-F_{pto}\dot{X}_{rel}\]
+

For more information about application of pto systems in WEC-Sim, refer to +Constraint and PTO Features section.

+
+
+
+

Mooring

+

The mooring load is represented using a linear quasi-static mooring stiffness +or by using the mooring forces calculated from MoorDyn, which is an +open-source lumped-mass mooring dynamics model.

+
+

Mooring Matrix

+

When linear quasi-static mooring stiffness is used, the mooring load can be +calculated by

+
+\[F_{m}=-K_{m}X-C_{m}\dot{X}\]
+

where \(K_{m}\) and \(C_{m}\) are the stiffness and damping matrices +for the mooring system, and \(X\) and \(\dot{X}\) are the displacement +and velocity of the body, respectively.

+
+
+

Mooring Lookup Table

+

The Mooring Lookup Table searches a user-supplied 6DOF force lookup table. +The lookup table must contain six parameters: the resultant mooring force in each degree of freedom. +Each force must be indexed by position in all six degrees of freedom, as shown below. +The mooringClass does not assume a value for empty indices or forces. +All degrees of freemdom must be initialized and supplied by the user. +The mooring force is linearly interpolated between indexed positions based on the instantaneous position of the mooring system using a Simulink N-D Lookup Table for each force component. +The fidelity of the mooring lookup table is entirely dependent on the user-defined input.

+
+
+

MoorDyn

+

MoorDyn discretizes each mooring line in a mooring system into evenly-sized +line segments connected by node points (see MoorDyn figure). The line mass is lumped at these node points along with +gravitational and buoyancy forces, hydrodynamic loads, and reactions from +contact with the seabed. Hydrodynamic drag and added mass +are calculated based on Morison’s equation. A mooring line’s axial stiffness +is modeled by applying a linear stiffness to each line segment in tension only. +A damping term is also applied in each segment to dampen non-physical resonance +caused by the lumped-mass discretization. Bending and torsional stiffnesses are +neglected. Bottom contact is represented by vertical stiffness and damping +forces applied at the nodes when a node is located below the seabed. +[B18, B19].

+
+../_images/MoorDyn_Graphic.png + +
+
+

MoorDyn mooring model elements

+
+
+
+

For more information about application of mooring systems in WEC-Sim, refer to +Mooring Features section.

+
+
+
+

Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+

The linear model assumes that the body motion and the waves consist of small +amplitudes in comparison to the wavelengths. A weakly nonlinear approach is +applied to account for the nonlinear hydrodynamic forces induced by the +instantaneous water surface elevation and body position. Rather than using the +BEM calculated linear wave-excitation and hydrostatic coefficients, the +nonlinear buoyancy and the Froude-Krylov force components can be obtained by +integrating the static and dynamic pressures over each panel along the wetted +body surface at each time step. Linear wave theory is used to determine the +flow velocity and pressure field, so the values become unrealistically large +for wetted panels that are above the mean water level. To correct this, the +Wheeler stretching method is applied [B20], which applies +a correction to the instantaneous wave elevation that forces its height to be +equal to the water depth when calculating the flow velocity and pressure,

+
+
+\[z^* = \frac{D(D+z)}{(D+\eta)} - D\]
+
+

where \(D\) is the mean water depth, and \(\eta\) is the z-value on the +instantaneous water surface.

+
+

Note

+

The nonlinear WEC-Sim method is not intended to model highly nonlinear hydrodynamic events, such as wave slamming and wave breaking.

+
+

For more information about application of nonlinear hydrodynamics in WEC-Sim, +refer to Nonlinear Buoyancy and Froude-Krylov Excitation section.

+
+
+

Viscous Damping and Morison Elements

+

Additional damping and added-mass can be added to the WEC system. This +facilitates experimental validation of the WEC-Sim code, particularly in the +event that the BEM hydrodynamic outputs are not sufficiently representative of +the physical system.

+
+

Viscous Damping

+

Linear damping and quadratic drag forces add flexibility to the definition of viscous forcing

+
+
+\[\begin{split}F_{v} &= -C_{v}\dot{X}-\frac{C_{d} \rho A_{d}}{2}\dot{X}|\dot{X}| \\ + &= -C_{v}\dot{X}-C_{D}\dot{X}|\dot{X}|\end{split}\]
+
+

where \(C_{v}\) is the linear (viscous) damping coefficient, \(C_{d}\) +is the quadratic drag coefficient, \(\rho\) is the fluid density, and +\(A_{d}\) is the characteristic area for drag calculation. Alternatively, +one can define \(C_{D}\) directly.

+

Because BEM codes are potential flow solvers and neglect the effects of +viscosity, \(F_{v}\) generally must be included to accurately model device +performance. However, it can be difficult to select representative drag +coefficients, as they depend on device geometry, scale, and relative velocity +between the body and the flow around it. Empirical data on the drag coefficient +can be found in various literature and standards, but is generally limited to +simple geometries evaluated at a limited number of scales and flow conditions. +For realistic device geometries, the use of computational fluid dynamic +simulations or experimental data is encouraged.

+
+
+

Morison Elements

+

The Morison Equation assumes that the fluid forces in an oscillating flow on a +structure of slender cylinders or other similar geometries arise partly from +pressure effects from potential flow and partly from viscous effects. A slender +cylinder implies that the diameter, D, is small relative to the wave length, +\(\lambda\), which is generally met when \(D/\lambda < 0.1 - 0.2\). If +this condition is not met, wave diffraction effects must be taken into account. +Assuming that the geometries are slender, the resulting force can be +approximated by a modified Morison formulation [B21]. The +formulation for each element on the body can be given as

+
+
+\[F_{me}=\rho\forall\dot{v} + \rho\forall C_{a}(\dot{v}-\ddot{X}) + + \frac{C_{d}\rho A_{d}}{2}(v-\dot{X})|v-\dot{X}|\]
+
+

where \(v\) is the fluid particle velocity due to the wave and current speed, +\(C_{a}\) is the coefficient of added mass, and \(\forall\) is the +displaced volume.

+
+

Note

+

WEC-Sim does not consider buoyancy effects when calculating the forces +from Morison elements.

+
+

For more information about application of Morison Elements in WEC-Sim, refer to +Morison Elements section.

+
+
+
+

Generalized Body Modes

+

Additional generalized body modes (GBM) are included to account for solving a +multibody system with relative body motions, dynamics, or structural +deformation. This implementation assumes the modal properties are given, +obtainable in closed-form expressions or with finite element analysis. Once the +hydrodynamic coefficients that include these additional flexible DOF are +obtained from the BEM solver, the 6DOF rigid body motion for each body and the +additional GBM DOFs are solved together in one system of equations. See this +example and Advanced Features for more details on implementing GBM.

+
+
+

Terminology

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Term or Variable

Definition

\(A(\omega)\)

Frequency dependent radiation added mass and inertia (kg and kg-m^2)

\(\overline{A(\omega)}\)

Normalized frequency dependent radiation added mass

\(A_{\infty}\)

Added mass and inertia at infinite frequency (kg and kg-m^2)

\(A_{d}\)

Characteristic drag area

\(\boldsymbol{A_d}\)

State space discrete time state matrix

\(\boldsymbol{A_r}\)

State space time-invariant state matrix

\(A_{ws}\)

Wave spectrum coefficient

\(\alpha\)

Wave spectrum coefficient (JONSWAP)

\(B(\omega)\)

Frequency dependent radiation wave damping (N/m/s)

\(\overline{B(\omega)}\)

Normalized frequency dependent radiation wave damping

\(\boldsymbol{B_d}\)

State space discrete time input matrix

\(\boldsymbol{B_r}\)

State space time-invariant input matrix

\(B_{ws}\)

Wave spectrum coefficient

BEM

Boundary Element Method

BEMIO

Boundary Element Method Input/Output

\(cg\)

Center of gravity

\(cb\)

Center of buoyancy

\(C_{a}\)

Morison element coefficient of added mass

\(C_{d}\)

Quadratic drag coefficient

\(C_{m}\)

Mooring damping matrix (N/m/s)

\(C_{pto}\)

PTO damping coefficient (N/m/s)

\(\boldsymbol{C_d}\)

State space discrete time output matrix

\(\boldsymbol{C_r}\)

State space time-invariant output matrix

\(C_{ws}\)

Wave spectrum coefficient (JONSWAP)

\(C_{v}\)

Linear viscous damping coefficient (N/m/s)

$CASE

WEC-Sim case directory

dof

Degree of freedom

\(D\)

Mean water depth

\(\boldsymbol{D_d}\)

State space discrete time feed through matrix

\(\boldsymbol{D_r}\)

State space time-invariant feed through matrix

\(\eta\)

Incident wave (m)

\(f\)

Wave frequency (Hz)

\(f_{p}\)

Peak wave frequency (Hz)

\(F_{B}\)

Net buoyancy restoring force (N) or torque (Nm)

\(F_{exc}\)

Wave excitation force (N) or torque (Nm)

\(\overline{F_{exc}}\)

Normalized wave excitation force (m^3) or torque (m^4)

\(F_{rad}\)

Wave radiation force (N) or torque (Nm)

\(F_{pto}\)

Power take-off force (N) or torque (Nm)

\(F_{me}\)

Morison element force (N) or torque (Nm)

\(F_{v}\)

Damping or friction force (N) or torque (Nm)

\(F_{m}\)

Mooring connection force (N) or torque (Nm)

\(g\)

Gravitational acceleration (m/s/s)

GBM

Generalized body mode

\(h\)

Water depth (m)

\(H\)

Wave height (m)

\(\boldsymbol{H}\)

Hankel matrix of the impulse response function

\(H_{s}\)

Significant wave height, mean wave height of the tallest third of waves (m)

\(H_{m0}\)

Spectrally derived significant wave height (m)

Heave (Z)

Motion along the Z-axis

IRF

Impulse Response function

JS

JONSWAP Spectrum

\(k\)

Wave number (rad/m), \(k = \frac{2\pi}{\lambda}\)

\(K_e\)

Excitation impulse response function

\(\overline{K_e}\)

Normalized excitation impulse response function

\(K_{hs}\)

Linear hydrostatic restoring coefficient (N/m)

\(\overline{K_{hs}}\)

Normalized linear hydrostatic restoring coefficient

\(K_{m}\)

Mooring stiffness matrix (N/m)

\(K_{pto}\)

PTO stiffness coefficient (N/m)

\(K_r\)

Radiation impulse response function

\(\overline{K_r}\)

Normalized radiation impulse response function

\(\lambda\)

Wave length (m)

\(\lambda_{fd}\)

Flux linkage

\(m\)

Mass of body (kg)

\(m_k\)

Spectral moment of k, for k = 0,1,2,…

\(\omega\)

Wave frequency (rad/s), \(\omega = \frac{2\pi}{T}\)

\(\phi\)

Wave phase (rad)

\(\sigma\)

Wave spectrum coefficient (JONSWAP)

\(\gamma\)

Wave spectrum nondimensional peak shape parameter

Pitch (RY)

Rotation about the Y-axis

PM

Pierson-Moskowitz Spectrum

\(P_{PTO}\)

Power from the PTO

PTO

Power Take-Off

\(R_{f}\)

Ramp function

\(\rho\)

Water density (kg/m3)

Roll (RX)

Rotation about the X-axis

Surge (X)

Motion along the X-axis

Sway (Y)

Motion along the Y-axis

\(S(\omega)\)

Frequency dependent wave spectrum

\(t\)

Simulation time (s)

\(t_{r}\)

Ramp time (s)

\(\theta\)

Wave direction (Degrees)

\(T_{p}\)

Peak period (s)

\(\tau\)

Magnetic pole pitch

\(\boldsymbol{u}\)

State space input

\(V_0\)

Displaced water volume (m^3)

$WECSIM

WEC-Sim source code directory

\(X\)

Translation and rotation displacement vector (m) or (rad)

\(X_r\)

State space state vector

Yaw (RZ)

Rotation about the Z-axis

+
+
+

References

+
+
+
+[B1] +

Ye Li and Yi-Hsiang Yu. A Synthesis of Numerical Methods for Modeling Wave Energy Converter-Point Absorbers. Renewable and Sustainable Energy Reviews, 16(6):4352–4364, 2012.

+
+
+[B2] +(1,2) +

Aurélien Babarit, J. Hals, M.J. Muliawan, A. Kurniawan, T. Moan, and J. Krokstad. Numerical Benchmarking Study of a Selection of Wave Energy Converters. Renewable Energy, 41:44–63, 2012.

+
+
+[B3] +(1,2) +

CH Lee and JN Newman. WAMIT User Manual. 2006.

+
+
+[B4] +

ANSYS Aqwa. URL: http://www.ansys.com/Products/Other+Products/ANSYS+AQWA (visited on May 21, 2014).

+
+
+[B5] +

Nemoh a Open source BEM. URL: http://openore.org/tag/nemoh/ (visited on May 21, 2014).

+
+
+[B6] +

Matthieu Ancellin and Frédéric Dias. Capytaine: a Python-based linear potential flow solver. Journal of Open Source Software, 4(36):1341, apr 2019. URL: https://doi.org/10.21105%2Fjoss.01341, doi:10.21105/joss.01341.

+
+
+[B7] +

Aurélien Babarit and Gérard Delhommeau. Theoretical and numerical aspects of the open source BEM solver NEMOH. In Proceedings of the 11th European Wave and Tidal Energy Conference (EWTEC2015). Nantes, France, 2015.

+
+
+[B8] +

Jerica D. Nolte and R. C. Ertekin. Wave power calculations for a wave energy conversion device connected to a drogue. Journal of Renewable and Sustainable Energy, 2014.

+
+
+[B9] +

WE Cummins. The Impulse Response Function and Ship Motions. Technical Report, David Taylor Model Dasin-DTNSRDC, 1962.

+
+
+[B10] +

Z. Yu and J. Falnes. State-space Modelling of a Vertical Cylinder in Heave. Applied Ocean Research, 5:265–275, 1996.

+
+
+[B11] +(1,2,3) +

R. Taghipour, T. Perez, and T. Moan. Hybrid Frequency-time Domain Models for Dynamic Response Analysis of Marine Structures. Ocean Engineering, 7:685–705, 2008.

+
+
+[B12] +

Sun-Yuan Kung. A new identification and model reduction algorithm via singular value decomposition. In Proc. 12th Asilomar Conf. Circuits, Syst. Comput., Pacific Grove, CA, 705–714. 1978.

+
+
+[B13] +(1,2) +

Erlend Kristiansen, Åsmund Hjulstad, and Olav Egeland. State-space representation of radiation forces in time-domain vessel models. Ocean Engineering, 32(17):2195–2216, 2005.

+
+
+[B14] +

W. J. Pierson and L. A. Moskowitz. Proposed Spectral Form for Fully Developed Wind Seas Based on the Similarity Theory of S. A. Kitaigorodskii. Geophysical Research, 69:5181–5190, 1964.

+
+
+[B15] +(1,2) +

IEC 62600-2. Marine Energy - Wave, Tidal, and other water current converters. URL: https://webstore.iec.ch/publication/62399 (visited on June 8, 2020).

+
+
+[B16] +

K. Hasselman, T.P. Barnett, E. Bouws, H. Carlson, D.E. Cartwright, K. Enke, J.A. Ewing, H. Gienapp, D.E. Hasselmann, P. Kruseman, A. Meerburg, P. Mller, D.J. Olbers, K. Richter, W. Sell, and H. Walden. Measurements of wind-wave growth and swell decay during the Joint North Sea Wave Project (JONSWAP). Technical Report 12, German Hydrographic Institute, 1973.

+
+
+[B17] +(1,2) +

R. So, A. Simmons, T. Brekken, K. Ruehl, and C. Michelen. Development of PTO-SIM: A Power Performance Module for the Open-Souse Wave Energy Converter Code WEC-SIM. In Proceedings of OMAE 2015. 2015.

+
+
+[B18] +

Matthew Hall and Andrew Goupee. Validation of a lumped-mass mooring line model with deepcwind semisubmersible model test data. Ocean Engineering, 104:590–603, 2015.

+
+
+[B19] +

Matthew Hall. Moordyn v2: new capabilities in mooring system components and load cases. In International Conference on Offshore Mechanics and Arctic Engineering, volume 84416, V009T09A078. American Society of Mechanical Engineers, 2020.

+
+
+[B20] +

J D Wheeler and others. Methods for calculating forces produced by irregular waves. In Offshore Technology Conference. 1969.

+
+
+[B21] +

J R Morison, M P O'brien, J W Johnson, and S A Schaaf. The force exerted by surface waves on piles. Petroleum Transactions, AIME, 189:149–154, 1950.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/advanced_features.html b/main/user/advanced_features.html new file mode 100644 index 000000000..adca5f974 --- /dev/null +++ b/main/user/advanced_features.html @@ -0,0 +1,3471 @@ + + + + + + + + + Advanced Features — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Advanced Features

+

The advanced features documentation provides an overview of WEC-Sim features +and applications that were not covered in the WEC-Sim Tutorials. +The diagram below highlights some of WEC-Sim’s advanced features, details of +which will be described in the following sections. Most advanced features have +a corresponding example case within the WEC-Sim_Applications repository or the WEC-Sim/Examples +directory in the WEC-Sim source code. For those topics of interest, it is +recommended that users run and understand the output of an application while +reading the documentation on the feature.

+
+../_images/codeFeatures.png + +
+
+

BEMIO

+

The Boundary Element Method Input/Output (BEMIO) functions are used to +pre-process the BEM hydrodynamic data prior to running WEC-Sim. For more +information about the WEC-Sim workflow, refer to +Running WEC-Sim. The following section can also be +followed in conjunction with the cases in the WEC-Sim/Examples directory in the +WEC-Sim source code. This includes several cases with WAMIT, NEMOH, Aqwa, and Capytaine. +For more information, refer to Series 1 - Multiple Condition Runs (MCR). BEMIO functions perform the +following tasks:

+
    +
  • Read BEM results from WAMIT, NEMOH, Aqwa, or Capytaine.

  • +
  • Calculate the radiation and excitation impulse response functions (IRFs).

  • +
  • Calculate the state space realization for the radiation IRF.

  • +
  • Save the resulting data in Hierarchical Data Format 5 (HDF5).

  • +
  • Plot typical hydrodynamic data for user verification.

  • +
+
+

Note

+

Previously the python based BEMIO code was used for this purpose. The python BEMIO functions have been converted to MATLAB and are included in the WEC-Sim source code. The python based BEMIO code will remain available but will no longer be supported.

+
+
+

BEMIO Functions

+
+
+functions.BEMIO.readWAMIT(hydro, filename, exCoeff)
+

Reads data from a WAMIT output file.

+

If generalized body modes are used, the output directory must also +include the *.cfg, *.mmx, and *.hst files. +If simu.nonlinearHydro = 3 will be used, the output directory must also +include the *.3fk and *.3sc files.

+

See WEC-Sim/examples/BEMIO/WAMIT for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that WAMIT input data will be appended to

  • +
  • filename (string) – Path to the WAMIT output file

  • +
  • exCoeff (integer) – Flag indicating the type of excitation force coefficients to +read, ‘diffraction’ (default), ‘haskind’, or ‘rao’

  • +
+
+
Returns:
+

hydro – Structure of hydro data with WAMIT data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readNEMOH(hydro, filedir)
+

Reads data from a NEMOH working folder.

+

See WEC-Sim\examples\BEMIO\NEMOH for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that NEMOH input data will be appended to

  • +
  • filename (string) –

    Path to the NEMOH working folder, must include:

    +
    +
      +
    • Nemoh.cal

    • +
    • Mesh/Hydrostatics.dat (or Hydrostatiscs_0.dat, Hydrostatics_1.dat, etc. for multiple bodies)

    • +
    • Mesh/KH.dat (or ``KH_0.dat, KH_1.dat, etc. for multiple bodies)

    • +
    • Results/RadiationCoefficients.tec

    • +
    • Results/ExcitationForce.tec

    • +
    • Results/DiffractionForce.tec - If simu.nonlinearHydro = 3 will be used

    • +
    • Results/FKForce.tec - If simu.nonlinearHydro = 3 will be used

    • +
    +
    +

  • +
+
+
Returns:
+

hydro – Structure of hydro data with NEMOH data appended

+
+
Return type:
+

struct

+
+
+
+ +
+

Note

+
    +
  • Instructions on how to download and use the open source BEM code NEMOH are provided on the NEMOH website.

  • +
  • The NEMOH Mesh.exe code creates the Hydrostatics.dat and KH.dat files (among other files) for one input body at a time. For the readNEMOH function to work correctly in the case of a multiple body system, the user must manually rename Hydrostatics.dat and KH.dat files to Hydrostatics_0.dat, Hydrostatics_1.dat, …, and KH_0.dat, KH_1.dat,…, corresponding to the body order specified in the Nemoh.cal file.

  • +
+
+
+
+functions.BEMIO.readAQWA(hydro, ah1Filename, lisFilename)
+

Reads data from AQWA output files.

+

See WEC-Sim\examples\BEMIO\AQWA for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that Aqwa input data will be appended to

  • +
  • ah1Filename (string) – .AH1 AQWA output file

  • +
  • lisFilename (string) – .LIS AQWA output file

  • +
+
+
Returns:
+

hydro – Structure of hydro data with Aqwa data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readCAPYTAINE(hydro, filename, hydrostatics_sub_dir)
+

Reads data from a Capytaine netcdf file

+

See WEC-Sim\examples\BEMIO\CAPYTAINE for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data that Capytaine input data will be appended to

  • +
  • filename (string) – Capytaine .nc output file

  • +
  • hydrostatics_sub_dir (string) – Path to directory where Hydrostatics.dat and KH.dat files are saved

  • +
+
+
Returns:
+

hydro – Structure of hydro data with Capytaine data appended

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.normalizeBEM(hydro)
+

Normalizes BEM hydrodynamic coefficients in the same manner +that WAMIT outputs are normalized. Specifically, the linear restoring +stiffness is normalized as \(C_{i,j}/(\rho g)\); added mass is normalized as +\(A_{i,j}/\rho\); radiation damping is normalized as \(B_{i,j}/(\rho \omega)\); and, +exciting forces are normalized as \(X_i/(\rho g)\). And, if necessary, sort +data according to ascending frequency.

+

This function is not called directly by the user; it is automatically +implemented within the readWAMIT, readCAPYTAINE, readNEMOH, and readAQWA +functions.

+
+
Parameters:
+

hydro ([1 x 1] struct) – Structure of hydro data that will be normalized and sorted +depending on the value of hydro.code

+
+
Returns:
+

hydro – Normalized hydro data

+
+
Return type:
+

[1 x 1] struct

+
+
+
+ +
+
+functions.BEMIO.combineBEM(hydro)
+

Combines multiple BEM outputs into one hydrodynamic ‘system.’ This function +requires that all BEM outputs have the same water depth, wave frequencies, +and wave headings. This function would be implemented following multiple +readWAMIT, readNEMOH, readCAPYTAINE, or readAQWA and before radiationIRF, +radiationIRFSS, excitationIRF, writeBEMIOH5, or plotBEMIO function calls.

+

See WEC-Sim\examples\BEMIO\NEMOH for examples of usage.

+
+
Parameters:
+

hydro ([1 x n] struct) – Structures of hydro data that will be combined into a single +structure

+
+
Returns:
+

hydro – Combined structure.

+
+
Return type:
+

[1 x 1] struct

+
+
+
+ +
+
+functions.BEMIO.radiationIRF(hydro, tEnd, nDt, nDw, wMin, wMax)
+

Calculates the normalized radiation impulse response function. This is +equivalent to the radiation IRF in the theory section normalized by +\(\rho\):

+
+

\(\overline{K}_{r,i,j}(t) = {\frac{2}{\pi}}\intop_0^{\infty}{\frac{B_{i,j}(\omega)}{\rho}}\cos({\omega}t)d\omega\)

+
+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • tEnd (float) – Calculation range for the IRF, where the IRF is calculated from t += 0 to tEnd, and the default is 100 s

  • +
  • nDt (float) – Number of time steps in the IRF, the default is 1001

  • +
  • nDw (float) – Number of frequency steps used in the IRF calculation +(hydrodynamic coefficients are interpolated to correspond), the +default is 1001

  • +
  • wMin (float) – Minimum frequency to use in the IRF calculation, the default is +the minimum frequency from the BEM data

  • +
  • wMax (float) – Maximum frequency to use in the IRF calculation, the default is +the maximum frequency from the BEM data

  • +
+
+
Returns:
+

hydro – Structure of hydro data with radiation IRF

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.radiationIRFSS(hydro, Omax, R2t)
+

Calculates the state space (SS) realization of the normalized radiation IRF. +If this function is used, it must be implemented after the radiationIRF function.

+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • Omax (integer) – Maximum order of the SS realization, the default is 10

  • +
  • R2t (float) – \(R^2\) threshold (coefficient of determination) for the SS +realization, where \(R^2\) may range from 0 to 1, and the +default is 0.95

  • +
+
+
Returns:
+

hydro – Structure of hydro data with radiation IRF state space +coefficients

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.excitationIRF(hydro, tEnd, nDt, nDw, wMin, wMax)
+

Calculates the normalized excitation impulse response function:

+
+

\(\overline{K}_{e,i,\theta}(t) = {\frac{1}{2\pi}}\intop_{-\infty}^{\infty}{\frac{X_i(\omega,\theta)e^{i{\omega}t}}{{\rho}g}}d\omega\)

+
+

Default parameters can be used by inputting []. +See WEC-Sim\examples\BEMIO for examples of usage.

+
+
Parameters:
+
    +
  • hydro (struct) – Structure of hydro data

  • +
  • tEnd (float) – Calculation range for the IRF, where the IRF is calculated from t += 0 to tEnd, and the default is 100 s

  • +
  • nDt (float) – Number of time steps in the IRF, the default is 1001

  • +
  • nDw (float) – Number of frequency steps used in the IRF calculation +(hydrodynamic coefficients are interpolated to correspond), the +default is 1001

  • +
  • wMin (float) – Minimum frequency to use in the IRF calculation, the default is +the minimum frequency from the BEM data

  • +
  • wMax (float) – Maximum frequency to use in the IRF calculation, the default is +the maximum frequency from the BEM data

  • +
+
+
Returns:
+

hydro – Structure of hydro data with excitation IRF

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.readBEMIOH5(filename, number, meanDrift)
+

Function to read BEMIO data from an h5 file into a hydrodata structure +for the bodyClass

+
+
Parameters:
+
    +
  • filename (string) – Path to the BEMIO .h5 file to read

  • +
  • number (integer) – Body number to read from the .h5 file. For example, body(2) in +the input file must read body2 from the .h5 file.

  • +
  • meanDrift (integer) – Flag to optionally read mean drift force coefficients

  • +
+
+
Returns:
+

hydroData – Struct of hydroData used by the bodyClass. Different format than +the BEMIO hydro struct

+
+
Return type:
+

struct

+
+
+
+ +
+
+functions.BEMIO.reverseDimensionOrder(inputData)
+

This function reverse the order of the dimensions in data. +Called by readBEMIOH5() to permute data into the correct format.

+

This required permutation is a legacy of the Load_H5 +function that reordered dimensions of hydroData after reading

+
+
Parameters:
+

inputData (array) – Any numeric data array

+
+
Returns:
+

outputData – Input data array with the order of its dimensions reversed

+
+
Return type:
+

array

+
+
+
+ +
+
+functions.BEMIO.calcSpectralMoment(angFreq, S_f, order)
+
+
Parameters:
+
    +
  • angFreq ([1 n] float vector) – Vector of wave angular frequencies

  • +
  • S_f ([1 n] float vector) – Vector of wave spectra

  • +
  • order (float) – Order of the spectral moment

  • +
+
+
Returns:
+

mn – Spectral moment of the nth order

+
+
Return type:
+

float vector

+
+
+
+ +
+
+functions.BEMIO.calcWaveNumber(omega, waterDepth, g, deepWater)
+

Solves the wave dispersion relation \(\omega^2 = g k*tanh(k h)\) for +the wave number

+
+
Parameters:
+
    +
  • omega (float) – Wave frequency [rad/s]

  • +
  • waterDepth (float) – Water depth [m]

  • +
  • g (float) – Gravitational acceleration [m/s^2]

  • +
  • deepWater (integar) – waveClass flag inidicating a deep water wave [-]

  • +
+
+
Returns:
+

k – Wave number [m]

+
+
Return type:
+

float

+
+
+
+ +
+
+functions.BEMIO.writeBEMIOH5(hydro)
+

Writes the hydro data structure to a .h5 file.

+

See WEC-Sim\tutorials\BEMIO for examples of usage.

+
+
Parameters:
+

hydro ([1 x 1] struct) – Structure of hydro data that is written to hydro.file

+
+
+
+ +
+

Note

+

Technically, this step should not be necessary - the MATLAB data structure hydro is written to a *.h5 file by BEMIO and then read back into a new MATLAB data structure hydroData for each body by WEC-Sim. The reasons this step was retained were, first, to remain compatible with the python based BEMIO output and, second, for the simpler data visualization and verification capabilities offered by the *.h5 file viewer.

+
+
+
+functions.BEMIO.plotBEMIO(varargin)
+

Plots the added mass, radiation damping, radiation IRF, excitation force +magnitude, excitation force phase, and excitation IRF for each body in +the given degrees of freedom.

+

Usage: +plotBEMIO(hydro, hydro2, hydro3, ...)

+

See WEC-Sim\examples\BEMIO for additional examples.

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotAddedMass(varargin)
+

Plots the added mass for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotAddedMass(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotRadiationDamping(varargin)
+

Plots the radiation damping for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotRadiationDamping(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotRadiationIRF(varargin)
+

Plots the radiation IRF for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotRadiationIRF(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationMagnitude(varargin)
+

Plots the excitation force magnitude for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationMagnitude(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationPhase(varargin)
+

Plots the excitation force phase for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationPhase(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+functions.BEMIO.plotExcitationIRF(varargin)
+

Plots the excitation IRF for each hydro structure’s bodies in +the given degrees of freedom.

+

Usage: +plotExcitationIRF(hydro, hydro2, hydro3, ...)

+
+
Parameters:
+

varargin (struct(s)) – The hydroData structure(s) created by the other BEMIO functions. +One or more may be input.

+
+
+
+ +
+
+

BEMIO hydro Data Structure

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Variable

Format

Description

A

[nDOF,nDOF,Nf]

radiation added mass

Ainf

[nDOF,nDOF]

infinite frequency added mass

B

[nDOF,nDOF,Nf]

radiation wave damping

theta

[1,Nh]

wave headings (deg)

body

{1,Nb}

body names

cb

[3,Nb]

center of buoyancy

cg

[3,Nb]

center of gravity

code

string

BEM code (WAMIT, NEMOH, AQWA, or CAPYTAINE)

K_hs

[6,6,Nb]

hydrostatic restoring stiffness

dof

[1, Nb]

Degrees of freedom (DOF) for each body. Default DOF for each body is 6 plus number of possible generalized body modes (GBM).

ex_im

[nDOF,Nh,Nf]

imaginary component of excitation force or torque

ex_K

[nDOF,Nh,length(ex_t)]

excitation IRF

ex_ma

[nDOF,Nh,Nf]

magnitude of excitation force or torque

ex_ph

[nDOF,Nh,Nf]

phase of excitation force or torque

ex_re

[nDOF,Nh,Nf]

real component of excitation force or torque

ex_t

[1,length(ex_t)]

time steps in the excitation IRF

ex_w

[1,length(ex_w)]

frequency step in the excitation IRF

file

string

BEM output filename

fk_im

[nDOF,Nh,Nf]

imaginary component of Froude-Krylov contribution to the excitation force or torque

fk_ma

[nDOF,Nh,Nf]

magnitude of Froude-Krylov excitation component

fk_ph

[nDOF,Nh,Nf]

phase of Froude-Krylov excitation component

fk_re

[nDOF,Nh,Nf]

real component of Froude-Krylov contribution to the excitation force or torque

g

[1,1]

gravity

h

[1,1]

water depth

Nb

[1,1]

number of bodies

Nf

[1,1]

number of wave frequencies

Nh

[1,1]

number of wave headings

plotDofs

[length(plotDofs),2]

degrees of freedom to be plotted (default: [1,1;3,3;5,5])

plotBodies

[1,length(plotBodies)]

BEM bodies to be plotted (default: [1:Nb])

plotDirections

[1,length(plotDirections)]

indices indicating wave directions to plot from list of headings (default: [1])

ra_K

[nDOF,nDOF,length(ra_t)]

radiation IRF

ra_t

[1,length(ra_t)]

time steps in the radiation IRF

ra_w

[1,length(ra_w)]

frequency steps in the radiation IRF

rho

[1,1]

density

sc_im

[nDOF,Nh,Nf]

imaginary component of scattering contribution to the excitation force or torque

sc_ma

[nDOF,Nh,Nf]

magnitude of scattering excitation component

sc_ph

[nDOF,Nh,Nf]

phase of scattering excitation component

sc_re

[nDOF,Nh,Nf]

real component of scattering contribution to the excitation force or torque

ss_A

[nDOF,nDOF,ss_O,ss_O]

state space A matrix

ss_B

[nDOF,nDOF,ss_O,1]

state space B matrix

ss_C

[nDOF,nDOF,1,ss_O]

state space C matrix

ss_conv

[nDOF,nDOF]

state space convergence flag

ss_D

[nDOF,nDOF,1]

state space D matrix

ss_K

[nDOF,nDOF,length(ra_t)]

state space radiation IRF

ss_O

[nDOF,nDOF]

state space order

ss_R2

[nDOF,nDOF]

state space R2 fit

T

[1,Nf]

wave periods

Vo

[1,Nb]

displaced volume

w

[1,Nf]

wave frequencies

+
+
+

Writing Your Own h5 File

+

The most common way of creating a *.h5 file is using BEMIO to post-process the outputs of a BEM code. +This requires a single BEM solution that contains all hydrodynamic bodies and accounts for body-to-body interactions. +Some cases in which you might want to create your own h5 file are:

+
    +
  • Use experimentally determined coefficients or a mix of BEM and experimental coefficients.

  • +
  • Combine results from different BEM files and have the coefficient matrices be the correct size for the new total number of bodies.

  • +
  • Modify the BEM results for any other reason.

  • +
+

MATLAB and Python have functions to read and write *.h5 files easily. +WEC-Sim includes one function writeBEMIOH5 to help you create your own *.h5 file. +The first step is to have all the required coefficients and properties in Matlab in the correct hydroData format. +Then writeBEMIOH5 is used to create and populate the *.h5 file.

+
+
+
+

Simulation Features

+

This section provides an overview of WEC-Sim’s simulation class features; for +more information about the simulation class code structure, refer to +Simulation Class.

+
+

Running WEC-Sim

+

The subsection describes the various ways to run WEC-Sim. The standard method is +to type the command wecSim in the MATLAB command window when in a $CASE +directory. This is the same method described in the Workflow and +Tutorials sections.

+
+

Running as Function

+

WEC-Sim allows users to execute WEC-Sim as a function by using wecSimFcn. +This option may be useful for users who wish to devise their own batch runs, +isolate the WEC-Sim workspace, create a special set-up before running WEC-Sim, +or link to another software.

+
+ +
+
+

Multiple Condition Runs (MCR)

+

WEC-Sim allows users to easily perform batch runs by typing wecSimMCR into +the MATLAB Command Window. This command executes the Multiple Condition Run +(MCR) option, which can be initiated three different ways:

+
+

Option 1. Specify a range of sea states and PTO damping coefficients in +the WEC-Sim input file, example: +waves.height = 1:0.5:5; waves.period = 5:1:15; +pto(1).stiffness=1000:1000:10000; pto(1).damping=1200000:1200000:3600000;

+

Option 2. Specify the excel filename that contains a set of wave +statistic data in the WEC-Sim input file. This option is generally useful +for power matrix generation, example: +simu.mcrExcelFile = "<Excel file name>.xls"

+

Option 3. Provide a MCR case .mat file, and specify the filename in +the WEC-Sim input file, example: +simu.mcrMatFile = "<File name>.mat"

+
+

For Multiple Condition Runs, the *.h5 hydrodynamic data is only loaded +once. To reload the *.h5 data between runs, set simu.reloadH5Data =1 in +the WEC-Sim input file.

+

If the Simulink model relies upon From Workspace input blocks other than those utilized by the WEC-Sim library blocks (e.g. waves.elevationFile), these can be iterated through using Option 3. The MCR file header MUST be a cell containing the exact string 'LoadFile'. The pathways of the files to be loaded to the workspace must be given in the cases field of the MCR .mat file. WEC-Sim MCR will then run WEC-Sim in sequence, once for each file to be loaded. The variable name of each loaded file should be consistent, and specified by the From Workspace block.

+

For more information, refer to Series 1 - Multiple Condition Runs (MCR), and the RM3_MCR example on the WEC-Sim Applications repository.

+

The RM3_MCR examples on the WEC-Sim Applications repository demonstrate the +use of WEC-Sim MCR for each option above (arrays, .xls, .mat). The fourth case +demonstrates how to vary the wave spectrum input file in each case run by +WEC-Sim MCR.

+

The directory of an MCR case can contain a userDefinedFunctionsMCR.m +file that will function as the standard userDefinedFunctions.m file. +Within the MCR application, the userDefinedFunctionsMCR.m script +creates a power matrix from the PTO damping coefficient after all cases have +been run.

+

For more information, refer to Series 1 - Multiple Condition Runs (MCR).

+
+
+

Parallel Computing Toolbox (PCT)

+

WEC-Sim allows users to execute batch runs by typing wecSimPCT into the +MATLAB Command Window. This command executes the MATLAB Parallel Computing +Toolbox (PCT), +which allows parallel capability for Multiple Condition Runs (MCR) but adds +an additional MATLAB dependency to use this feature. Similar to MCR, this +feature can be executed in three ways (Options 1~3).

+

For PCT runs, the *.h5 hydrodynamic data must be reload, regardless the +setting for simu.reloadH5Data in the WEC-Sim input file.

+
+

Note

+

The userDefinedFunctionsMCR.m is not compatible with wecSimPCT. +Please use userDefinedFunctions.m instead.

+
+
+
+

Radiation Force calculation

+

The radiation forces are calculated at each time-step by the convolution of the body velocity and the +radiation Impulse Response Function – which is calculated using the cosine transform of the radiation-damping. +Speed-gains to the simulation can be made by using alternatives to the convolution operation, namely,

+
    +
  1. The State-Space Representation,

  2. +
  3. The Finite Impulse Response (FIR) Filters.

  4. +
+

Simulation run-times were benchmarked using the RM3 example simulated for 1000 s. Here is a summary of normalized +run-times when the radiation forces are calculated using different routes. The run-times are normalized by the +run-time for a simulation where the radiation forces are calculated using “Constant Coefficients” ( \(T_0\) ):

+
+
+ + + + + + + + + + + + + + + + + +

Radiation Force Calculation Approach

Normalized Run Time

Constant Coefficients

\(T_0\)

Convolution

\(1.57 \times T_0\)

State-Space

\(1.14 \times T_0\)

FIR Filter

\(1.35 \times T_0\)

+
+
+

State-Space Representation

+

The convolution integral term in the equation of motion can be linearized using +the state-space representation as described in the Theory Manual section. To +use a state-space representation, the simu.stateSpace simulationClass variable +must be defined in the WEC-Sim input file, for example:

+
+

simu.stateSpace = 1

+
+
+
+

Finite Impulse Response (FIR) Filters

+

By default, WEC-Sim uses numerical integration to calculate the convolution integral, while +FIR filters implement the same using a discretized convolution, by using FIR filters – digital filters +that are inherently stable. Convolution of Impulse Response Functions of Finite length, i.e., those +that dissipate and converge to zero can be accomplished using FIR filters. +The convolution integral can also be calculated using FIR filters by setting:

+
+

simu.FIR=1.

+
+
+

Note

+

By default simu.FIR=0, unless specified otherwise.

+
+
+
+
+

Time-Step Features

+

The default WEC-Sim solver is ‘ode4’. Refer to the NonlinearHydro example +on the WEC-Sim Applications +repository for a comparisons between ‘ode4’ to +‘ode45’. The following +variables may be changed in the simulationClass (where N is number of increment +steps, default: N=1):

+
    +
  • Fixed time-step: simu.dt

  • +
  • Output time-step: simu.dtOut=N*simu.dt

  • +
  • Nonlinear Buoyancy and Froude-Krylov Excitation time-step: simu.nonlinearDt=N*simu.dt

  • +
  • Convolution integral time-step: simu.cicDt=N*simu.dt

  • +
  • Morison force time-step: simu.morisonDt = N*simu.dt

  • +
+
+

Fixed Time-Step (ode4)

+

When running WEC-Sim with a fixed time-step, 100-200 time-steps per wave period +is recommended to provide accurate hydrodynamic force calculations (ex: simu.dt += T/100, where T is wave period). However, a smaller time-step may be required +(such as when coupling WEC-Sim with MoorDyn or PTO-Sim). To reduce the required +WEC-Sim simulation time, a different time-step may be specified for nonlinear +buoyancy and Froude-Krylov excitation and for convolution integral +calculations. For all simulations, the time-step should be chosen based on +numerical stability and a convergence study should be performed.

+
+
+

Variable Time-Step (ode45)

+

To run WEC-Sim with a variable time-step, the following variables must be +defined in the simulationClass:

+
    +
  • Numerical solver: simu.solver='ode45'

  • +
  • Max time-step: simu.dt

  • +
+

This option sets the maximum time step of the simulation (simu.dt) and +automatically adjusts the instantaneous time step to that required by MATLAB’s +differential equation solver.

+
+
+
+
+

Wave Features

+

This section provides an overview of WEC-Sim’s wave class features. For more +information about the wave class code structure, refer to +Wave Class. The various wave features can be +compared by running the cases within the WEC-Sim/Examples/RM3 and the +WEC-Sim/Examples/OSWEC directories.

+
+

Irregular Wave Binning

+

WEC-Sim’s default spectral binning method divides the wave spectrum into 499 +bins with equal energy content, defined by 500 wave frequencies. As a result, +the wave forces on the WEC using the equal energy method are only computed at +each of the 500 wave frequencies. The equal energy formulation speeds up the +irregular wave simulation time by reducing the number of frequencies the wave +train is defined by, and thus the number of frequencies for which the wave +forces are calculated. It prevents bins with very little energy from being +created and unnecessarily adding to the computational cost. The equal energy +method is specified by defining the following wave class variable in the +WEC-Sim input file:

+
+

waves.bem.option = 'EqualEnergy';

+
+

By comparison, the traditional method divides the wave spectrum into a +sufficiently large number of equally spaced bins to define the wave spectrum. +WEC-Sim’s traditional formulation uses 999 bins, defined by 1000 wave +frequencies of equal frequency distribution. To override WEC-Sim’s default +equal energy method, and instead use the traditional binning method, the +following wave class variable must be defined in the WEC-Sim input file:

+
+

waves.bem.option = 'Traditional';

+
+

Users may override the default number of wave frequencies by defining +waves.bem.count. However, it is on the user to ensure that the wave spectrum +is adequately defined by the number of wave frequencies, and that the wave +forces are not impacted by this change.

+
+
+

Wave Directionality

+

WEC-Sim has the ability to model waves with various angles of incidence, +\(\theta\). To define wave directionality in WEC-Sim, the following wave +class variable must be defined in the WEC-Sim input file:

+
+

waves.direction = <user defined wave direction(s)>; %[deg]

+
+

The incident wave direction has a default heading of 0 Degrees (Default = 0), +and should be defined as a column vector for more than one wave direction. For +more information about the wave formulation, refer to +Wave Spectra.

+
+
+

Wave Directional Spreading

+

WEC-Sim has the ability to model waves with directional spreading, +\(D\left( \theta \right)\). To define wave directional spreading in +WEC-Sim, the following wave class variable must be defined in the WEC-Sim input +file:

+
+

waves.spread = <user defined directional spreading>;

+
+

The wave directional spreading has a default value of 1 (Default = 1), and +should be defined as a column vector of directional spreading for each one wave +direction. For more information about the spectral formulation, refer to +Wave Spectra.

+
+

Note

+

Users must define appropriate spreading parameters to ensure energy is +conserved. Recommended directional spreading functions include +Cosine-Squared and Cosine-2s.

+
+
+
+

Multiple Wave-Spectra

+

The Wave Directional Spreading feature only allows splitting the same wave-front. +However, quite often mixed-seas are composed of disparate Wave-Spectra with unique +periods, heights, and directions. An example would be a sea-state composed of +swell-waves and chop-waves.

+

Assuming that the linear potential flow theory holds, the wave inputs to the system can be +super-imposed. This implies, the effects of multiple Wave-Spectra can be simulated, if the +excitation-forces for each Wave-Spectra is calculated, and added to the pertinent +Degree-of-Freedom.

+

WEC-Sim can simulate the dynamics of a body experiencing multiple Wave-Spectra each with +their unique directions, periods, and heights. In order to calculate the excitation-forces +for multiple Wave-Spectra, WEC-Sim automatically generates multiple instances of +excitation-force sub-systems. The user only needs to create multiple instances of +the waves class.

+

Here is an example for setting up multiple Wave-Spectra in the WEC-Sim input file:

+
waves(1)           = waveClass('regularCIC');   % Initialize Wave Class and Specify Type
+waves(1).height    = 2.5;                       % Wave Height [m]
+waves(1).period    = 8;                         % Wave Period [s]
+waves(1).direction = 0;                         % Wave Direction (deg.)
+waves(2)           = waveClass('regularCIC');   % Initialize Wave Class and Specify Type
+waves(2).height    = 2.5;                       % Wave Height [m]
+waves(2).period    = 8;                         % Wave Period [s]
+waves(2).direction = 90;                        % Wave Direction (deg.)
+
+
+
+

Note

+

1. If using a wave-spectra with different wave-heading directions, ensure that the BEM data has +the hydrodynamic coefficients corresponding to the desired wave-heading direction,

+

2. All wave-spectra should be of the same type, i.e., if waves(1) is initialized +as waves(1) = waveClass('regularCIC'), the following waves(#) object should +initialized the same way.

+
+

Addtionally, the multiple Wave-Spectra can be visualized as elaborated in Wave Markers. +The user needs to define the marker parameters for each Wave-Spectra, as one would for a single Wave-Spectra.

+

Here is an example of 2 Wave-Spectra being visualized using the wave wave-markers feature:

+
+../_images/Nwave.png + +
+

Here is a visualization of two Wave-Spectra, represented by red markers and blue markers respectively.

+
+
+

Irregular Waves with Seeded Phase

+

By default, the phase for all irregular wave cases are generated randomly. In +order to reproduce the same time-series every time an irregular wave simulation +is run, the following wave class variable may be defined in the WEC-Sim input +file:

+
+

waves.phaseSeed = <user defined seed>;

+
+

By setting waves.phaseSeed equal to 1,2,3,…,etc, the random wave phase +generated by WEC-Sim is seeded, thus producing the same random phase for each +simulation.

+
+
+

Wave Gauge Placement

+

Wave gauges can be included through the wave class parameters:

+
waves.marker.location
+waves.marker.size
+waves.marker.style
+
+
+

By default, the wave surface elevation at the origin is calculated by WEC-Sim. +In past releases, there was the option to define up to three numerical wave gauge +locations where WEC-Sim would also calculate the undisturbed linear incident wave +elevation. WEC-Sim now has the feature to define wave markers that oscillate +vertically with the undistrubed linear wave elevation (see Wave Markers). +This feature does not limit the number of point measurements of the undisturbed +free surface elevation and the time history calculation at the marker location +is identical to the previous wave gauge implementation. Users who desire to +continuing using the previous wave gauge feature will only need to update the +variable called within WEC-Sim and an example can be found in the +WECCCOMP Repository.

+
+

Note

+

The numerical wave markers (wave gauges) do not handle the incident wave interaction with the radiated or diffracted +waves that are generated because of the presence and motion of any hydrodynamic bodies.

+
+
+
+

Ocean Current

+

The speed of an ocean current can be included through the wave class parameters:

+
waves.current.option
+waves.current.speed
+waves.current.direction
+waves.current.depth
+
+
+

The current option determines the method used to propagate the surface current across the +specified depth. Option 0 is depth independent, option 1 uses a 1/7 power law, option 2 +uses linear variation with depth and option 3 specifies no ocean current. +The current.speed parameter represents the surface current speed, and current.depth +the depth at which the current speed decays to zero (given as a positive number). +See Ocean Current for more details on each method. +These parameters are used to calculate the fluid velocity in the Morison Element calculation.

+
+
+
+

Body Features

+

This section provides an overview of WEC-Sim’s body class features; for more +information about the body class code structure, refer to +Body Class.

+
+

Body Mass and Geometry Features

+

The mass of each body must be specified in the WEC-Sim input file. The +following features are available:

+
    +
  • Floating Body - the user may set body(i).mass = 'equilibrium' +which will calculate the body mass based on displaced volume and water +density. If simu.nonlinearHydro = 0, then the mass is calculated using the +displaced volume contained in the *.h5 file. If simu.nonlinearHydro = 1 +or simu.nonlinearHydro = 2, then the mass is calculated using the displaced +volume of the provided STL geometry file.

  • +
  • Fixed Body - if a body is fixed to the seabed using a fixed constraint, the mass +and moment of inertia may be set to arbitrary values such as 999 kg and [999 999 999] +kg-m^2. If the constraint forces on the fixed body are important, the mass and inertia +should be set to their real values.

  • +
  • Import STL - to read in the geometry (*.stl) into Matlab use the +body(i).importBodyGeometry() method in the bodyClass. This method will import the +mesh details (vertices, faces, normals, areas, centroids) into the +body(i).geometry property. This method is also used for nonlinear +buoyancy and Froude-Krylov excitation and ParaView visualization files. Users +can then visualize the geometry using the body(i).plotStl method.

  • +
+
+
+

Nonlinear Buoyancy and Froude-Krylov Excitation

+

WEC-Sim has the option to include the nonlinear hydrostatic restoring and +Froude-Krylov forces when solving the system dynamics of WECs, accounting for +the weakly nonlinear effect on the body hydrodynamics. To use nonlinear +buoyancy and Froude-Krylov excitation, the body(ii).nonlinearHydro bodyClass +variable must be defined in the WEC-Sim input file, for example:

+
+

body(ii).nonlinearHydro = 2

+
+

For more information, refer to the Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the NonlinearHydro +example on the WEC-Sim Applications +repository.

+
+

Nonlinear Settings

+

body(ii).nonlinearHydro - +The nonlinear hydrodynamics option can be used with the parameter: +body(ii).nonlinearHydro in your WEC-Sim input file. When any of the three +nonlinear options (below) are used, WEC-Sim integrates the wave pressure over +the surface of the body, resulting in more accurate buoyancy and Froude-Krylov +force calculations.

+
+

Option 1. body(ii).nonlinearHydro = 1 This option integrates the pressure +due to the mean wave elevation and the instantaneous body position.

+

Option 2. body(ii).nonlinearHydro = 2 This option integrates the pressure +due to the instantaneous wave elevation and the instantaneous body position. +This option is recommended if nonlinear effects need to be considered.

+
+

simu.nonlinearDt - +An option available to reduce the nonlinear simulation time is to specify a +nonlinear time step, simu.nonlinearDt=N*simu.dt, where N is number of +increment steps. The nonlinear time step specifies the interval at which the +nonlinear hydrodynamic forces are calculated. As the ratio of the nonlinear to +system time step increases, the computation time is reduced, again, at the +expense of the simulation accuracy.

+
+

Note

+

WEC-Sim’s nonlinear buoyancy and Froude-Krylov wave excitation option may +be used for regular or irregular waves but not with user-defined irregular +waves.

+
+
+
+

STL File Generation

+

When the nonlinear option is turned on, the geometry file (*.stl) +(previously only used for visualization purposes in linear simulations) is used +as the discretized body surface on which the nonlinear pressure forces are +integrated. As in the linear case, the STL mesh origin must be at a body’s center of gravity.

+

A good STL mesh resolution is required when using the nonlinear buoyancy and Froude-Krylov wave excitation in +WEC-Sim. The simulation accuracy will increase with increased surface +resolution (i.e. the number of discretized surface panels specified in the +*.stl file), but the computation time will also increase. +There are many ways to generate an STL file; however, it is important to verify +the quality of the mesh before running WEC-Sim simulations with the nonlinear +hydro flag turned on. An STL file can be exported from most CAD programs, but +few allow adequate mesh refinement. By default, most CAD programs write an STL +file similar to the left figure, with the minimum panels possible. +To accurately model nonlinear hydrodynamics in WEC-Sim, STL files should be refined to +have an aspect ratio close to one, and contain a high resolution in the vertical direction +so that an accurate instantaneous displaced volume can be calculated.

+
+../_images/rectangles.png + +
+

Many commercial and free software exist to convert between mesh formats and +refine STL files, including:

+ +
+
+

Nonlinear Buoyancy and Froude-Krylov Wave Excitation Tutorial - Heaving Ellipsoid

+

The body tested in the study is an ellipsoid with a cross- section +characterized by semi-major and -minor axes of 5.0 m and 2.5 m in the wave +propagation and normal directions, respectively . The ellipsoid is at its +equilibrium position with its origin located at the mean water surface. The +mass of the body is then set to 1.342×105 kg, and the center of gravity is +located 2 m below the origin.

+
+../_images/nonlinearEllipsoid.png + +
+

STL file with the discretized body surface is shown below (ellipsoid.stl)

+
+../_images/nonlinearMesh.png + +
+

The single-body heave only WEC model is shown below (nonLinearHydro.slx)

+
+../_images/nonlinearWEC.png + +
+

The WEC-Sim input file used to run the nonlinear hydro WEC-Sim simulation:

+
%% Simulation Data
+simu = simulationClass();               
+simu.simMechanicsFile = 'ellipsoid.slx';   
+simu.mode = 'normal';                   % Specify Simulation Mode ('normal','accelerator','rapid-accelerator')
+simu.explorer='off';                     % Turn SimMechanics Explorer (on/off)
+simu.startTime = 0;                     
+simu.rampTime = 50;                        
+simu.endTime=150;                       
+simu.dt = 0.05;                         
+simu.rho=1025;                                                                                                           
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                 
+waves.height = 4;                            
+waves.period = 6;   
+
+%% Body Data
+body(1) = bodyClass('../../hydroData/ellipsoid.h5');
+body(1).mass = 'equilibrium';           
+body(1).inertia = ...              
+    [1.375264e6 1.375264e6 1.341721e6];      
+body(1).geometryFile = '../../geometry/elipsoid.stl' ;    
+body(1).quadDrag.cd=[1 0 1 0 1 0];
+body(1).quadDrag.area=[25 0 pi*5^2 0 pi*5^5 0];
+body(1).nonlinearHydro = 2;                       % Non-linear hydro on/off
+
+%% PTO and Constraint Parameters
+% Fixed Constraint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 -12.5];        
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');              
+pto(1).stiffness=0;                             
+pto(1).damping=1200000;                      
+pto(1).location = [0 0 -12.5];
+
+
+

Simulation and post-processing is the same process as described in the +Tutorials section.

+
+
+
+

Viscous Damping and Morison Elements

+

WEC-Sim allows for the definition of additional damping and added-mass terms +to allow users to tune their models precisely. Viscous damping and Morison Element +may be defined for hydrodynamic, drag, or flexible bodies. It is highly recommended +that users add viscous or Morison drag to create a realistic model.

+

When the Morison Element +option is used in combination with a hydrodynamic or flexible body, it serves as a +tuning method. The equation of motion for hydrodynamic and flexible bodies with a +Morison Element is more complex than the traditional Morison Element formulation. +A traditional Morison Element may be created by using a drag body +(body(#).nonHydro=2) with body(#).morisonElement.option = 1 or 2. +For more information about the numerical formulation of viscous damping and +Morison Elements, refer to the theory section Viscous Damping and Morison Elements.

+
+

Viscous Damping

+

A viscous damping force in the form of a linear damping coefficient +\(C_{v}\) can be applied to each body by defining the following body class +parameter in the WEC-Sim input file (which has a default value of zero):

+
body(i).linearDamping
+
+
+

A quadratic drag force, proportional to the square of the body’s velocity, can +be applied to each body by defining the quadratic drag coefficient +\(C_{d}\), and the characteristic area \(A_{d}\) for drag calculation. +This is achieved by defining the following body class parameters in the WEC-Sim +input file (each of which have a default value of zero):

+
body(i).quadDrag.cd
+body(i).quadDrag.area
+
+
+

Alternatively, one can define \(C_{D}\) directly:

+
body(i).quadDrag.drag
+
+
+
+
+

Morison Elements

+

To use Morison Elements, the following body class variable must be +defined in the WEC-Sim input file with body(ii).morisonElement.option.

+

Implementation Option 0 Morison Elements are not included in the body force and moment calculations.

+

Implementation Option 1 allows for the Morison Element properties to be defined +independently for the x-, y-, and z-axis while Implementation Option 2 uses a +normal and tangential representation of the Morison Element properties. Note +that the two options allow the user flexibility to implement hydrodynamic +forcing that best suits their modeling needs; however, the two options have +slightly different calculation methods and therefore the outputs will not +necessarily provide the same forcing values. The user is directed to look at +the Simulink Morison Element block within the WEC-Sim library to better +determine which approach better suits their modeling requirements.

+

Morison Elements must be defined for each body using the +body(i).morisonElement property of the body class. This property +requires definition of the following body class parameters in the WEC-Sim input +file (each of which have a default value of zero(s)).

+

For body(ii).morisonElement.option  = 1

+
body(i).morisonElement.cd = [c_{dx} c_{dy} c_{dz}]
+body(i).morisonElement.ca = [c_{ax} c_{ay} c_{az}]
+body(i).morisonElement.area = [A_{x} A_{y} A_{z}]
+body(i).morisonElement.VME = [V_{me}]
+body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}]
+body(i).morisonElement.z = [0 0 0]
+
+
+
+

Note

+

For Option 1, the unit normal body(#).morisonElement.z must be +initialized as a [n x3] vector, where n is the number of Morison Elements, although it will not be used in the +hydrodynamic calculation.

+
+

For body(ii).morisonElement.option  = 2

+
body(i).morisonElement.cd = [c_{dn} c_{dt} 0]
+body(i).morisonElement.ca = [c_{an} c_{at} 0]
+body(i).morisonElement.area = [A_{n} A_{t} 0]
+body(i).morisonElement.VME = [V_{me}]
+body(i).morisonElement.rgME = [r_{gx} r_{gy} r_{gz}]
+body(i).morisonElement.z = [z_{x} z_{y} z_{z}]
+
+
+
+

Note

+

For Option 2, the body(i).morisonElement.cd, +body(i).morisonElement.ca, and +body(i).morisonElement.area variables need to be +initialized as [n x3] vector, where n is the number of Morison Elements, with the third column index set to zero. While +body(i).morisonElement.z is a unit normal vector that defines the +orientation of the Morison Element.

+
+

To better represent certain scenarios, an ocean current speed can be defined to +calculate a more accurate fluid velocity and acceleration on the Morison +Element. These can be defined through the wave class parameters +waves.current.option, waves.current.speed, waves.current.direction, +and waves.current.depth. See Ocean Current for more +detail on using these options.

+

The Morison Element time-step may also be defined as +simu.morisonDt = N*simu.dt, where N is number of increment steps. For an +example application of using Morison Elements in WEC-Sim, refer to the WEC-Sim +Applications repository +Free_Decay/1m-ME example.

+
+

Note

+

Morison Elements cannot be used with elevationImport.

+
+
+
+
+

Non-Hydrodynamic Bodies

+

For some simulations, it might be important to model bodies that do not have +hydrodynamic forces acting on them. This could be bodies that are completely +outside of the water but are still connected through a joint to the WEC bodies, +or it could be bodies deeply submerged to the point where the hydrodynamics may +be neglected. WEC-Sim allows for bodies which have no hydrodynamic forces +acting on them and for which no BEM data is provided.

+

To do this, use a Body Block from the WEC-Sim Library and initialize it in the +WEC-Sim input file as any other body but leave the name of the h5 file as +an empty string. Specify body(i).nonHydro = 1; and specify body name, +mass, moments of inertia, center of gravity, center of buoyancy, geometry file, +location, and displaced volume. You can also specify visualization options and +initial displacement.

+

To use non-hydrodynamic bodies, the following body class variable must be +defined in the WEC-Sim input file, for example:

+
body(i).nonHydro = 1
+
+
+

Non-hydrodynamic bodies require the following properties to be defined:

+
body(i).mass
+body(i).inertia
+body(i).centerGravity
+body(i).volume
+
+
+

In the case where only non-hydrodynamic and drag bodies are used, WEC-Sim does +not read an *.h5 file. Users must define these additional parameters to +account for certain wave settings as there is no hydrodynamic body present in +the simulation to define them:

+
waves.bem.range
+waves.waterDepth
+
+
+

For more information, refer to Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the Nonhydro_Body +example on the WEC-Sim Applications repository.

+
+
+

Drag Bodies

+

A body may be subjected to viscous drag or Morison forces, but does not +experience significant wave excitation or radiation. And example may be a +deeply-submerged heave plate of large surface area tethered to a float. In +these instances, the drag body implementation can be utilized by defining the +following body class variable:

+
body(i).nonHydro = 2
+
+
+

Drag bodies have zero wave excitation or radiation forces, but viscous forces +can be applied in the same manner as a hydrodynamic body via the parameters:

+
body(i).quadDrag.drag
+body(i).quadDrag.cd
+body(i).quadDrag.area
+body(i).linearDamping
+
+
+

or if using Morison Elements:

+
body(i).morisonElement.cd
+body(i).morisonElement.ca
+body(i).morisonElement.area
+body(i).morisonElement.VME
+body(i).morisonElement.rgME
+
+
+

which are described in more detail in the forthcoming section. At a minimum, it +is necessary to define:

+
body(i).mass
+body(i).inertia
+body(i).centerGravity
+body(i).volume
+
+
+

to resolve drag body dynamics. One can additionally describe initial body +displacement in the manner of a hydrodynamic body.

+
+
+

Body-To-Body Interactions

+

WEC-Sim allows for body-to-body interactions in the radiation force +calculation, thus allowing the motion of one body to impart a force on all +other bodies. The radiation matrices for each body (radiation wave damping and +added mass) required by WEC-Sim and contained in the *.h5 file. For +body-to-body interactions with N total hydrodynamic bodies, the *h5 +data structure is [(6*N), 6].

+

When body-to-body interactions are used, the augmented [(6*N), 6] matrices are +multiplied by concatenated velocity and acceleration vectors of all +hydrodynamic bodies. For example, the radiation damping force for body(2) in a +3-body system with body-to-body interactions would be calculated as the product +of a [1,18] velocity vector and a [18,6] radiation damping coefficients matrix.

+

To use body-to-body interactions, the following simulation class variable must +be defined in the WEC-Sim input file:

+
simu.b2b = 1
+
+
+

For more information, refer to Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation, and the RM3_B2B example in +the WEC-Sim Applications +repository.

+
+

Note

+

By default, body-to-body interactions are off (simu.b2b = 0), and +only the \([1+6(i-1):6i, 1+6(i-1):6i]\) sub-matrices are used for each +body (where \(i\) is the body number).

+
+
+
+

Generalized Body Modes

+

To use this, select a Flex Body Block from the WEC-Sim Library (under Body +Elements) and initialize it in the WEC-Sim input file as any other body. +Calculating dynamic response of WECs considering structural flexibility using +WEC-Sim should consist of multiple steps, including:

+
    +
  • Modal analysis of the studied WEC to identify a set of system natural +frequencies and corresponding mode shapes

  • +
  • Construct discretized mass and impedance matrices using these structural +modes

  • +
  • Include these additional flexible degrees of freedom in the BEM code to +calculate hydrodynamic coefficients for the WEC device

  • +
  • Import the hydrodynamic coefficients to WEC-Sim and conduct dynamic analysis +of the hybrid rigid and flexible body system

  • +
+

The WEC-Sim Applications repository +contains a working sample of a barge with four additional degrees of freedom to +account for bending and shearing of the body. See this example for details on +how to implement and use generalized body modes in WEC-Sim.

+
+

Note

+

Generalized body modes module has only been tested with WAMIT, where BEMIO +may need to be modified for NEMOH, Aqwa and Capytaine.

+
+
+
+

Passive Yaw Implementation

+

For non-axisymmetric bodies with yaw orientation that changes substantially +with time, WEC-Sim allows a correction to excitation forces for large yaw +displacements. To enable this correction, add the following to your +wecSimInputFile:

+
body(ii).yaw.option = 1
+
+
+

Under the default implementation (body(ii).yaw.option = 0), WEC-Sim uses the +initial yaw orientation of the device relative to the incident waves to +calculate the wave excitation coefficients that will be used for the duration +of the simulation. When the correction is enabled, excitation coefficients are +interpolated from BEM data based upon the instantaneous relative yaw position. +For this to enhance simulation accuracy, BEM data must be available over the +range of observed yaw positions at a sufficiently dense discretization to +capture the significant variations of excitation coefficients with yaw +position. For robust simulation, BEM data should be available from -180 to 170 +degrees of yaw (or equivalent).

+

This can increase simulation time, especially for irregular waves, due to the +large number of interpolations that must occur. To prevent interpolation at +every time-step, body(ii).yaw.threshold (default 1 degree) can be specified in the +wecSimInputFile to specify the minimum yaw displacement (in degrees) that +must occur before another interpolation of excitation coefficients will be +calculated. The minimum threshold for good simulation accuracy will be device +specific: if it is too large, no interpolation will occur and the simulation +will behave as body(ii).yaw.option = 0, but overly small values may not +significantly enhance simulation accuracy while increasing simulation time.

+

When body(ii).yaw.option = 1, hydrostatic and radiation forces are +determined from the local body-fixed coordinate system based upon the +instantaneous relative yaw position of the body, as this may differ +substantially from the global coordinate system for large relative yaw values.

+

A demonstration case of this feature is included in the PassiveYaw example +on the WEC-Sim Applications +repository.

+
+

Note

+

Caution must be exercised when simultaneously using passive yaw and +body-to-body interactions. Passive yaw relies on interpolated BEM solutions +to determine the cross-coupling coefficients used in body-to-body +calculations. Because these BEM solutions are based upon the assumption of +small displacements, they are unlikely to be accurate if a large relative +yaw displacement occurs between the bodies.

+
+
+
+

Large X-Y Displacements

+

By default, the excitation force applied to the modeled body is calculated at the body’s CG position as defined in BEM. +If large lateral displacements (i.e., in the x or y direction by the default WEC-Sim coordinate system) are expected for the modeled device, it may be desirable to adjust the excitation force to account for this displacment.

+

When body(i).largeXYDisplacement.option = 1, the phase of the excitation force exerted on the body is adjusted based upon its displacement as

+

\(\phi_{displacement} = k \omega x(1)*cos(\frac{\theta \pi}{180}) + x(2).*sin(\frac{\theta \pi}{180})\)

+

where k is waves.wavenumber, x(1,2) is displacement in the (x,y) direction, \(\omega\) is waves.omega, and \(\theta\) is waves.direction (in degrees). +This phase is thus the same size as waves.phase, and is then summed with waves.phase to determine excitation force.

+

Note that this adjustment only affects the incident exciting waves, not the total wave field that is the superposition of exciting and radiating waves. +This implies that this adjustment is only valid for cases where the lateral velocity of the body is significantly less than the celerity of its radiated waves, and is thus not appropriate for sudden, rapid displacements.

+
+

Note

+

This feature has not been implemented for a user-defined wave elevation.

+
+
+
+
+

Constraint and PTO Features

+

This section provides an overview of WEC-Sim’s constraint and PTO classes; for +more information about the constraint and PTO classes’ code structure, refer to +Constraint Class and +PTO Class.

+
+

Modifying Constraints and PTOs

+

The default linear and rotational constraints and PTOs allow for heave and +pitch motions of the follower relative to the base. To obtain a linear or +rotational constraint in a different direction you must modify the constraint’s +or PTO’s coordinate orientation. The important thing to remember is that a +linear constraint or PTO will always allow motion along the joint’s Z-axis, and +a rotational constraint or PTO will allow rotation about the joint’s Y-axis. To +obtain translation along or rotation about a different direction relative to +the global frame, you must modify the orientation of the joint’s coordinate +frame. This is done by setting the constraint’s or PTO’s orientation.z +and orientation.y properties which specify the new direction of the Z- +and Y- joint coordinates. The Z- and Y- directions must be perpendicular to +each other.

+

As an example, if you want to constrain body 2 to surge motion relative to body +1 using a linear constraint, you would need the constraint’s Z-axis to point in +the direction of the global surge (X) direction. This would be done by setting +constraint(i).orientation.z=[1,0,0] and the Y-direction to any +perpendicular direction (can be left as the default y=[0 1 0]). In this +example, the Y-direction would only have an effect on the coordinate on which +the constraint forces are reported but not on the dynamics of the system. +Similarly if you want to obtain a yaw constraint you would use a rotational +constraint and align the constraint’s Y-axis with the global Z-axis. This would +be done by setting constraint(i).orientation.y=[0,0,1] and the +z-direction to a perpendicular direction (say [0,-1,0]).

+
+

Note

+

When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, +the loads and displacements are specified in the local (not global) +coordinate system. This is true for both the sensed (measured) and actuated +(commanded) loads and displacements.

+
+

Additionally, by combining constraints and PTOs in series you can obtain +different motion constraints. For example, a massless rigid rod between two +bodies, hinged at each body, can be obtained by using a two rotational +constraints in series, both rotating in pitch, but with different locations. A +roll-pitch constraint can also be obtained with two rotational constraints in +series; one rotating in pitch, and the other in roll, and both at the same +location.

+
+

Incorporating Joint/Actuation Stroke Limits

+

Beginning in MATLAB 2019a, hard-stops can be specified directly for PTOs and +translational or rotational constraints by specifying joint-primitive dialog +options in the wecSimInputFile.m. Limits are modeled as an opposing spring +damper force applied when a certain extents of motion are exceeded. Note that +in this implementation, it is possible that the constraint/PTO will exceed +these limits if an inadequate spring and/or damping coefficient is specified, +acting instead as a soft motion constraint. More detail on this implementation +can be found in the Simscape documentation. +To specify joint or actuation stroke limits for a PTO, the following parameters +must be specified in wecSimInputFile.m

+
+
+
code:
+

pto(i).hardStops.upperLimitSpecify = ‘on’

+
+
code:
+

pto(i).hardStops.lowerLimitSpecify = ‘on’

+
+
+
+

to enable upper and lower stroke limits, respectively. The specifics of the +limit and the acting forces at the upper and lower limits are described in turn +by

+
+

pto(i).hardStops.upperLimitBound +pto(i).hardStops.upperLimitStiffness +pto(i).hardStops.upperLimitDamping +pto(i).hardStops.upperLimitTransitionRegionWidth +pto(i).hardStops.lowerLimitBound +pto(i).hardStops.lowerLimitStiffness +pto(i).hardStops.lowerLimitDamping +pto(i).hardStops.lowerLimitTransitionRegionWidth

+
+

where pto(i) is replaced with constraint(i) on all of the above if the limits +are to be applied to a constraint.

+

In MATLAB versions prior to 2019a, specifying any of the above parameters will +have no effect on the simulation, and may generate warnings. It is instead +recommended that hard-stops are implemented in a similar fashion using an +Actuation Force/Torque PTO block in which the actuation force is specified in a +custom MATLAB Function block.

+
+
+
+

Setting PTO or Constraint Extension

+

The PTO and Constraint classes have an Extension value that +can be specified to define the initial displacement of +the PTO or constraint at the beginning of the simulation, allowing the user to set the +ideal position for maximum wave capture and energy generation. This documentation +will use the PTO as an example, but the proces is applicable to both translational, +rotational, or spherical PTOs and constraints. +Whereas the initial displacement feature only defines this updated position for the PTO, +the PTO Extension feature propagates the change in position to all bodies and joints +on the Follower side of the PTO block. This allows for an accurate reflection of the +initial locations of each component without having to calculate and individually +define each initial displacement or rotation. To set the extension of a PTO, the +following parameter must be specified in wecSimInputFile.m:

+
pto(i).extension.PositionTargetSpecify = '1'
+
+
+

to enable the joint’s target position value to be defined. The specifics of the +extension are described in turn by:

+
pto(i).extension.PositionTargetValue
+pto(i).extension.PositionTargetPriority
+
+
+

PositionTargetValue defines the extension magnitude and PositionTargetPriority +specifies Simulink’s priority in setting the initial target value in regards +to other constraints and PTOs. The priority is automatically set to “High” when +the extension is initialized but can be adjusted to “Low” if required by Simulink.

+

The figure below shows the PTO extension feature on the WECCCOMP model at 0.1 m. +The left image is at equilibrium (pto(i).extension.PositionTargetSpecify=0), +and the right image set as +pto(i).extension.PositionTargetSpecify=1 with the WEC body moving in +accordance with the set PTO Extension value.

+
+../_images/WECCCOMP_PTO_Extension.png + +
+
+

WECCCOMP Model PTO Extension

+
+
+
+

While this method generally fits most WEC models, there are specific +designs such as the RM3 that may have a larger DOF and are dependent on +the particular block orientation in the simulink model in terms of which +body blocks will move in response to a PTO initial extension. These specific +cases require extra setup on the users end if looking to define a +different body’s motion than the one automatically established. For the RM3 +model, a set PTO Extension value results in movement in the float body. +However, if the user would like the movement to be within the spar instead, +extra steps are required. To view examples of how to set the PTO Extension +for both the float as well as the spar view the RM3 PTO Extension examples +on the WEC-Sim Applications repository .

+

For the spherical PTO which can rotate about three axes, +pto(i).extension.PositionTargetValue must be a 1x3 array that specifying +three consecutive rotations about the Base frame’s axes in the X-Y-Z convention.

+
+

Note

+

The PTO extension is not valid for PTO already actuated by user-defined motion +(Translational PTO Actuation Motion, Rotational PTO Actuation Motion).

+
+
+
+

PTO-Sim

+

PTO-Sim is the WEC-Sim module responsible for accurately modeling a WEC’s +conversion of mechanical power to electrical power. While the PTO blocks native +to WEC-Sim are modeled as a simple linear spring-damper systems, PTO-Sim is +capable of modeling many power conversion chains (PCC) such as mechanical +and hydraulic drivetrains. PTO-Sim is made of native Simulink blocks +coupled with WEC-Sim, using WEC-Sim’s user-defined PTO blocks, where the +WEC-Sim response (relative displacement and velocity for linear motion and +angular position and velocity for rotary motion) is the PTO-Sim input. +Similarly, the PTO force or torque is the WEC-Sim input. For more information +on how PTO-Sim works, refer to [So et al., 2015] and Series 3 - Non-hydrodynamic Bodies.

+

The files for the PTO-Sim tutorials described in this section can be found in +the PTO-Sim examples on the WEC-Sim Applications repository . Four PTO examples are +contained in the PTO-Sim application and can be used as a starting point for +users to develop their own. They cover two WEC types and mechanical, hydraulic, +and electrial PTO’s:

+
+
+ + + + + + + + + + + + + + + + + +

PTO-Sim Application

Description

RM3_cHydraulic_PTO

RM3 with compressible hydraulic PTO

RM3_DD_PTO

RM3 with direct drive linear generator

OSWEC_Hydraulic_PTO

OSWEC with hydraulic PTO (adjustable rod)

OSWEC_Hydraulic_Crank_PTO

OSWEC with hydraulic PTO (crank)

+
+
+

Tutorial: RM3 with PTO-Sim

+

This section describes how to use RM3 with PTO-Sim. Two tutorials will be given +in this section: one for the RM3 with a hydraulic PTO and +another for the RM3 with a direct drive PTO.

+
+
RM3 with Hydraulic PTO
+

The hydraulic PTO example used in this section consists of a piston, a +rectifying valve, a high pressure accumulator, a hydraulic motor coupled to a +rotary generator, and a low pressure accumulator.

+
+../_images/HYDPHYMODEL.PNG + +
+

In this section, a step by step tutorial on how to set up and run the RM3 +simulation with PTO-Sim is provided. All the files used in WEC-Sim will remain +the same, but some may need to be added to the working folder. The wecSimInputFile.m must +be modified to add the definition of the different PTO-Sim blocks. The files used to run RM3 with +PTO-Sim case are the following:

+
    +
  • WEC-Sim input file: wecSimInputFile.m (make sure to set the PTO linear +damping to zero)

  • +
  • Simulink model: RM3.slx

  • +
  • Geometry file for each body: float.stl and plate.stl

  • +
  • Hydrodynamic data file(s): rm3.h5

  • +
  • Optional user defined post-processing file: userDefinedFunction.m

  • +
+

Simulink Model

+

The Simulink model can be built as follows:

+
    +
  • Step 1: Navigate to the RM3 example $WECSIM/examples/RM3.

  • +
  • Step 2: Open RM3.slx file and replace Translational PTO with +Translational PTO Actuation Force.

  • +
+
+../_images/translational_pto.PNG + +
+
    +
  • Step 3: Create a subsystem and rename it to PTO-Sim where the input is the response and +output is force.

  • +
+
+../_images/rm3with_pto_sim.PNG + +
+
    +
  • Step 4: Go to Simulink Library Browser to access the PTO-Sim Library.

  • +
+
+../_images/pto_sim_lib.png + +
+
    +
  • Step 5: By looking at the physical hydraulic PTO model as shown above, the user +can simply drag and drop PTO-Sim library blocks. Hydraulic cylinder, rectifying valve, and accumulator +blocks are located under the Hydraulic block. The electric generator equivalent circuit is located under the Electric library.

  • +
  • Step 6: Since multiple PTO-Sim blocks will be used, it is necessary to name each block to identify them +when its variables are defined in the wecSimInputFile.m. To change the name of each block, +double click the block and add the name ptoSim(i) where i +must be different for each block used in the simulation. The name of each block +will be used in the wecSimInputFile.m to define its variables.

  • +
+
+../_images/PTOSimBlock1.png + +
+
    +
  • Step 7: Connect the inputs and outputs of the blocks according to the desired physical layout.

  • +
+
+../_images/RM3withPTOSimBlocks.png + +
+
    +
  • Step 8: Define the input for Rload in the Electric Generator block. The input could be a constant +value or it could be used to control the load of the generator to achieve a desired physical behaviour. +In this example, the value of Rload is used to control the shaft speed of the generator by using a +simple PI controller. The desired shaft speed in this case is 1000 rpm. The Electric Generator +Equivalent Circuit block has two outputs: the electromagnetic torque and the shaft speed. It is +necessary to use a bus selector to choose the desired output, which in this example is the shaft speed.

  • +
+
+../_images/GeneratorSpeedControl.png + +
+

Input File

+

In this section, the WEC-Sim input file (wecSimInputFile.m) is defined and +categorized into sections such as hydraulic cylinder, rectifying check valve, high pressure +accumulator, low pressure accumulator, hydraulic motor, and generator.

+
%% Simulation Data
+simu = simulationClass();               
+simu.simMechanicsFile = 'RM3_cHydraulic_PTO.slx'; %Location of Simulink Model File with PTO-Sim                 
+simu.startTime = 0;                     
+simu.rampTime = 100;                       
+simu.endTime=400;   
+simu.dt = 0.01;                         
+simu.explorer = 'off';                     % Turn SimMechanics Explorer (on/off)
+
+%% Wave Information
+%Irregular Waves using PM Spectrum
+waves = waveClass('irregular');
+waves.height = 2.5;
+waves.period = 8;
+waves.spectrumType = 'PM';
+waves.phaseSeed=1;
+
+%% Body Data
+% Float
+body(1) = bodyClass('../../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(1).geometryFile = '../../../_Common_Input_Files/RM3/geometry/float.stl';
+body(1).mass = 'equilibrium';
+body(1).inertia = [20907301 21306090.66 37085481.11];
+
+% Spar/Plate
+body(2) = bodyClass('../../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(2).geometryFile = '../../../_Common_Input_Files/RM3/geometry/plate.stl';
+body(2).mass = 'equilibrium';
+body(2).inertia = [94419614.57 94407091.24 28542224.82];
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 0];                
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');           	% Initialize PTO Class for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [N/m]
+pto(1).damping = 0;                           % PTO Damping [N/(m/s)]
+pto(1).location = [0 0 0];                   % PTO Location [m]       
+
+%% PTO new blocks
+
+%Hydraulic Cylinder
+ptoSim(1) = ptoSimClass('hydraulicCyl');
+ptoSim(1).hydPistonCompressible.xi_piston = 35;
+ptoSim(1).hydPistonCompressible.Ap_A = 0.0378;
+ptoSim(1).hydPistonCompressible.Ap_B = 0.0378;
+ptoSim(1).hydPistonCompressible.bulkModulus = 1.86e9;
+ptoSim(1).hydPistonCompressible.pistonStroke = 70;
+ptoSim(1).hydPistonCompressible.pAi = 2.1333e7;
+ptoSim(1).hydPistonCompressible.pBi = 2.1333e7;
+
+%Rectifying Check Valve
+ptoSim(2) = ptoSimClass('rectCheckValve');
+ptoSim(2).rectifyingCheckValve.Cd = 0.61;
+ptoSim(2).rectifyingCheckValve.Amax = 0.002;
+ptoSim(2).rectifyingCheckValve.Amin = 1e-8;
+ptoSim(2).rectifyingCheckValve.pMax = 1.5e6;
+ptoSim(2).rectifyingCheckValve.pMin = 0;
+ptoSim(2).rectifyingCheckValve.rho = 850;
+ptoSim(2).rectifyingCheckValve.k1 = 200;
+ptoSim(2).rectifyingCheckValve.k2 = ...
+    atanh((ptoSim(2).rectifyingCheckValve.Amin-(ptoSim(2).rectifyingCheckValve.Amax-ptoSim(2).rectifyingCheckValve.Amin)/2)*...
+    2/(ptoSim(2).rectifyingCheckValve.Amax - ptoSim(2).rectifyingCheckValve.Amin))*...
+    1/(ptoSim(2).rectifyingCheckValve.pMin-(ptoSim(2).rectifyingCheckValve.pMax + ptoSim(2).rectifyingCheckValve.pMin)/2);
+
+%High Pressure Hydraulic Accumulator
+ptoSim(3) = ptoSimClass('hydraulicAcc');
+ptoSim(3).gasHydAccumulator.vI0 = 8.5;
+ptoSim(3).gasHydAccumulator.pIprecharge = 2784.7*6894.75;
+
+%Low Pressure Hydraulic Accumulator
+ptoSim(4) = ptoSimClass('hydraulicAcc');
+ptoSim(4).gasHydAccumulator.vI0 = 8.5;
+ptoSim(4).gasHydAccumulator.pIprecharge = 1392.4*6894.75;
+
+%Hydraulic Motor
+ptoSim(5) = ptoSimClass('hydraulicMotor');
+ptoSim(5).hydraulicMotor.effModel = 2;
+ptoSim(5).hydraulicMotor.displacement = 120;
+ptoSim(5).hydraulicMotor.effTableShaftSpeed = linspace(0,2500,20);
+ptoSim(5).hydraulicMotor.effTableDeltaP = linspace(0,200*1e5,20);
+ptoSim(5).hydraulicMotor.effTableVolEff = ones(20,20)*0.9;
+ptoSim(5).hydraulicMotor.effTableMechEff = ones(20,20)*0.85;
+
+%Electric generator
+ptoSim(6) = ptoSimClass('electricGen');
+ptoSim(6).electricGeneratorEC.Ra = 0.8;
+ptoSim(6).electricGeneratorEC.La = 0.8;
+ptoSim(6).electricGeneratorEC.Ke = 0.8;
+ptoSim(6).electricGeneratorEC.Jem = 0.8;
+ptoSim(6).electricGeneratorEC.bShaft = 0.8;
+
+
+

Simulation and Post-processing

+

Simulation and post-processing are similar process as described in Two-Body Point Absorber (RM3). +There are some specific variable definitions that must be considered when using the output +signals of the PTO-Sim blocks. For example, the hydraulic accumulator has two output signals: flow rate +and pressure, and the time vector. In the RM3 example with hydraulic PTO, the high pressure hydraulic +accumulator was defined as ptoSim(3) in the WEC-Sim input file; then, to use the output +flow rate and pressure of this block, the next line of code must be used:

+

FlowRateAccumulator = output.ptoSim(3).FlowRate +PressureAccumulator = output.ptoSim(3).Pressure

+

In general, the output signal of any PTO-Sim block can be used with this line of code: output.ptoSim(i).VariableName

+
+
+
RM3 with Direct Drive PTO
+

A mechanical PTO is used in this example and is modeled as a direct drive +linear generator. The main components of this example consist of magnets and a +coil where the magnet assembly is attached to the heaving float and the coil is +located inside the spar. As the float moves up and down, the magnet assembly +creates a change in the magnetic field surrounding the spar that contains the +coil: therefore, current is induced in the coil and electricity is generated.

+
+../_images/MECHANICALPTO.PNG + +
+

Simulink Model

+

Steps 1 through 4 are the same as in RM3 with Hydraulic PTO.

+
    +
  • Step 5: Look for the block “Direct Drive Linear Generator” and drag the block into the PTO-Sim subsystem

  • +
  • Step 6: Connect the input “respose” to the input of the PTO-Sim block and the output “Force” to the output of the subsystem.

  • +
+
+../_images/DirectDrivePorts.png + +
+

Input File, Simulation, and Post-processing

+

The same as RM3 with Hydraulic PTO.

+
+
+
+

Tutorial: OSWEC with PTO-Sim

+

This section describes how to use the OSWEC model with PTO-Sim. The same +process as described in RM3 with Hydraulic PTO; however, since the OSWEC is a +rotary device, it takes torque as an input and a rotary to linear motion +conversion block is needed. The tutorials can be found on the +WEC-Sim Applications +repository (both for a crank and for a rod).

+
+
OSWEC with Hydraulic PTO
+

A hydraulic PTO or mechanical PTO can be used with OSWEC but for simplicity a +hydraulic PTO will be used as an example. An schematic representation of the OSWEC device +is shown in the figure below:

+
+../_images/OSWECPHYMODEL.PNG + +
+

Two blocks were developed in the PTO-Sim library to model a system like the OSWEC. +The blocks can be found under the Motion Convertion library.

+
+../_images/MotionConversionLib.png + +
+

The block “Rotary to Linear Adjustable Rod” is used to model a rod with a variable length. For the OSWEC case, +this block can be use when the cylinder rod of the hydraulic PTO is connected to the adjustable rod, +like in the schematic presented in the figure below:

+
+../_images/AdjustableRodHPTO.png + +
+

On the other hand, the block “Rotary to Linear Crank” is used to model a slider-crank mechanism that is used to convert +the rotational motion of the OSWEC device into linear motion for the hydraulic cylinder in the PTO. In this case, the +cylinder rod of the hydraulic PTO is connected to the slider part of the mechanism, as shown in the figure below:

+
+../_images/SliderandCrankMechanism.png + +
+

Modeling of OSWEC with Hydraulic PTO

+

The files needed for the OSWEC case are the same as the ones described in RM3 with Hydraulic PTO.

+

Simulink Model

+

The Simulink model can be built as following:

+
    +
  • Step 1: Copy the OSWEC example folder to get started $WECSIM\examples\OSWEC.

  • +
  • Step 2: Open OSWEC.slx file and replace Rotational PTO with +Rotational PTO Actuation Torque.

  • +
+
+../_images/rotational_pto.PNG + +
+
    +
  • Step 3: Create a subsystem and rename it to PTO-Sim where input is response and +output is torque.

  • +
+
+../_images/oswec_pto_sim.PNG + +
+
    +
  • Step 4: Go to Simulink Library Browser to access the PTO-Sim Library.

  • +
  • Step 5: By looking at the physical hydraulic PTO model as shown above, the user +can simply drag and drop PTO-Sim library blocks. Hydraulic cylinder, rectifying valve, and accumulator +blocks are located under the Hydraulic block. The electric generator equivalent circuit is located under the Electric library. +The “Rotary to Linear Adjustable Rod” is under the Motion Conversion library.

  • +
  • Step 6: Since multiple PTO-Sim blocks will be used, it is necessary to name each block to identify them +when its variables are defined in the wecSimInputFile.m. To change the name of each block, +double click the block and add the name ptoSim(i) where i +must be different for each block used in the simulation. The name of each block +will be used in the wecSimInputFile.m to define its variables. For this example, +the motion conversion block will be called ptoSim(1)

  • +
+
+../_images/PTOSimBlock1OSWEC.png + +
+
    +
  • Step 7: Connect the inputs and outputs of the blocks according to the desired physical layout.

  • +
+
+../_images/OSWECPTOSimExample.png + +
+
    +
  • Step 8: Define the input for Rload in the Electric Generator block. The input could be a constant +value or it could be used to control the load of the generator to achieve a desired physical behaviour. +In this example, the value of Rload is used to control the shaft speed of the generator by using a +simple PI controller. The desired shaft speed in this case is 3000 rpm. The Electric Generator +Equivalent Circuit block has two outputs: the electromagnetic torque and the shaft speed. It is +necessary to use a bus selector to choose the desired output, which in this example is the shaft speed.

  • +
+

Input File, Simulation, and Post-processing

+

The input file for this case is similar to the input file +described in RM3 with Hydraulic PTO. The naming and numbering of the PTO blocks +change in this case, but the way the variables are defined is the same.

+
+
+
+
+
+

Controller Features

+

The power generation performance of a WEC is highly dependent on the control +algorithm used in the system. There are different control strategies that +have been studied for marine energy applications. These control algorithms +can be applied directly to the PTO components to achieve a desired output, or +they can be high-level controllers which are focused on the total PTO force +applied to the WEC. The examples presented in this section are based on high- +level controller applications. WEC-Sim’s controller features support the modeling +of both simple passive and reactive controllers as well as more complex methods +such as model predictive control.

+

The files for the controller tutorials described in this section can be found in +the Controls examples on the WEC-Sim Applications repository . The controller examples +are not comprehensive, but provide a reference for user to implement their +own controls.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + +

Controller Application

Description

Passive (P)

Sphere with proportional control

Reactive (PI)

Sphere with proportional-integral control

Latching

Sphere with latching control

Declutching

Sphere with declutching control

Model Predictive Control

Sphere with model predictive control

Reactive with PTO

Sphere with reactive control and DD PTO

+
+
+

Examples: Sphere Float with Various Controllers

+

First, it is important to understand the concept of complex conjugate control. +Complex conjugate control, as applied to wave energy conversion, +can be used to understand optimal control. For a complex conjugate controller, +the impedance of the controller is designed to match the admittance of the +device (equal to the complex conjugate of device impedance). Hence, it is +also known as impedance matching and is a common practice within electrical +engineering. Complex conjugate control is not a completely realizable control +method due to its acausality, which means it requires exact knowledge of +future wave conditions. Still, a causal transfer function can be used to approximate +complex conjugate control across a limited frequency range [C1]. +Thus, complex conjugate control presents a reference for the implementation of +optimal causal controls. The WEC impedance can be modeled by the following equation +[C2] and can be used to formulate the optimal control implementation:

+
+\[Z_i(\omega) = j\omega (m + A(\omega)) + B(\omega) + \frac{K_{hs}}{j\omega}\]
+

By characterizing the impedance of the WEC, a greater understanding of the +dynamics can be reached. The figure below is a bode plot of the impedance of +the RM3 float body. The natural frequency is defined by the point at which the +phase of impedance is zero. By also plotting the frequency of the incoming +wave, it is simple to see the difference between the natural frequency of +the device and the wave frequency. Complex conjugate control (and some other +control methods) seeks to adjust the natural frequency of the device to match +the wave frequency. Matching the natural frequency to the wave frequency leads +to resonance, which allows for theoretically optimal mechanical power.

+
+../_images/impedance.png + +
+

It is important to note here that although impedance matching can lead to maximum mechanical +power, it does not always lead to maximum electrical power. Resonance due to +impedance matching often creates high peaks of torque and power, which are usually +far from the most efficient operating points of PTO systems used to extract power +and require those systems to be more robust and expensive. +Thus, the added factor of PTO dynamics and efficiency may lead to +complex conjugate control being suboptimal. Furthermore, any constraints or other +nonlinear dynamics may make complex conjugate control unachievable or suboptimal. +Theoretical optimal control using complex conjugates presented here should be +taken as a way to understand WEC controls rather than a method to achieve +optimal electrical power for a realistic system.

+
+
+

Passive Control (Proportional)

+

Passive control is the simplest of WEC controllers and acts as a damping force. +Hence, the damping value (also referred to as a proportional gain) is +multiplied by the WEC velocity to determine the power take-off force:

+
+\[F_{PTO} = K_p \dot{X}\]
+

Although unable to reach optimal power for a regular wave due to its passive +nature, a passive controller can still be tuned to reach its maximum power. +According to complex conjugate control, a passive controller can be +optimized for regular wave conditions using the following formula [C3]:

+
+\[K_{p,opt} = \sqrt{B(\omega)^2 + (\frac{K_{hs}}{\omega} - \omega (m + A(\omega)))^2}\]
+

The optimal proportional gain has been calculated for the float using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file sets +up a sweep of the proportional gains which can be used to show that the results +confirm the theoretical optimal gain in the figure below (negative power corresponding to +power extracted from the system). This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window.

+
+../_images/pGainSweep.png + +
+

This example only shows the optimal proportional gain in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains.

+
+
+

Reactive Control (Proportional-Integral)

+

Reactive control is also a very simple form of WEC control and combines the +damping force of a passive controller with a spring stiffness force. The standard PTO +block can also be used to implement PI control using the damping and stiffness +values but doesn’t allow for negative inputs which is often necessary for +optimal stiffness. This controller is also known as a proportional integral +controller with the proportional gain corresponding to the damping value and +the integral gain corresponding to a spring stiffness value:

+
+\[F_{PTO} = K_p \dot{X} + K_i X\]
+

The addition of the reactive component means the controller can achieve optimal +complex conjugate control by cancelling out the imaginary portion of the device +impedance. Thus, the proportional and integral control gains can be defined by the +following formulas [C4]:

+
+\[K_{p,opt} = B(\omega)\]
+
+\[K_{i,opt} = (m + A(\omega)) \omega^2 - K_hs\]
+

The optimal proportional and integral gains have been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim to achieve optimal power. The mcrBuildGains.m file again sets +up a sweep of the gains which can be used to show that the results +confirm the theoretical optimal gains in the figure below. This MCR run can be +recreated by running the mcrBuildGains.m file then typing wecSimMCR in the command +window.

+
+../_images/piGainSweep.png + +
+

This example only shows the optimal gains in regular wave conditions. +For irregular wave spectrums and nonlinear responses (such as with constraints), +an optimization algorithm can be used to determine optimal control gains.

+
+
+

Latching Control

+

Latching control combines a traditional passive controller with a latching mechanism which applies +a large braking force during a portion of the oscillation. By locking the device for +part of the oscillation, latching control attempts to adjust the phase of the motion to +match the phase of incoming waves. Latching control can slow the device motion to match +wave motion and is therefore most often used when the wave period is longer than the natural +period. Latching control is still considered passive as no energy input is required (assuming velocity +is zero while latched).

+

The braking/latching force is implemented as a very large damping force (\(G\)), which can be +adjusted based on the device’s properties [C5]:

+
+\[G = 80 (m + A(\omega))\]
+

Because latching achieves phase matching between the waves and device, the optimal +damping can be assumed the same as for reactive control. Lastly, the main control +variable, latching time, needs to be determined. For regular waves, it is +desired for the device to move for a time equal to its natural frequency, meaning +the optimal latching time is likely close to half the difference between the wave +period and the natural period [C5] (accounting for 2 latching periods per wave period).

+
+\[t_{latch} = \frac{1}{2} (T_{wave} - T_{nat})\]
+

The optimal latching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. The mcrBuildTimes.m file sets +up a sweep of the latching times, the results for which are shown in the figure below. +This MCR run can be recreated by running the mcrBuildGains.m file then typing wecSimMCR +in the command window. Based on the results, the optimal latching time is slightly +lower than expected which may be due to imperfect latching or complex dynamics which +aren’t taken into account in the theoretical optimal calculation. Regardless, latching results in +much larger power when compared to traditional passive control.

+
+../_images/latchTimeSweep.png + +
+

Further, the figure below shows the excitation force and velocity, which are close to +in phase when a latching time of 2.4 seconds is implemented.

+
+../_images/latching.png + +
+

Although not shown with this example, latching can also be implemented in irregular waves +but often requires different methods including excitation prediction.

+
+
+

Declutching Control

+

Declutching control is essentially the opposite of latching. Instead of locking the device, +it is allowed to move freely (no PTO force) for a portion of the oscillation. Often, +declutching is used when the wave period is smaller than the natural period, allowing the +device motion to “catch up” to the wave motion. Declutching is also considered +a passive control method.

+

The optimal declutching time and damping values are slightly harder to estimate than for +latching. The device’s motion still depends on its impedance during the declutching period, +meaning the device does not really move “freely” during this time. Hence, in opposition to +optimal latching the declutching time was assumed to be near half the difference between +the natural period and the wave period, but is further examined through tests.

+
+\[t_{declutch} = \frac{1}{2} (T_{wave} - T_{nat})\]
+

This optimal declutching time has been calculated using the optimalGainCalc.m file +and implemented in WEC-Sim. Because energy is not harvested during the declutching +period, it is likely that a larger damping is required. Thus, the optimal passive +damping value was used for the following simulations, although a more +optimal damping value likely exists for delclutching.

+

Since declutching is most desired when the wave period is smaller than the natural period, +a wave period of 3.5 seconds was tested with a height of 1 m. For comparison to traditional +passive control, the optimal passive damping value was tested for these conditions, leading +to a power of 5.75 kW. The mcrBuildTimes.m file sets up a sweep of the declutching times, +the results for which are shown in the figure below. It is clear that delcuthing control +can offer an improvement over traditional passive control.

+
+../_images/declutchTimeSweep.png + +
+

Further, the figure below shows the excitation force and velocity with a declutch time +of 0.8 seconds. The excitation and response are not quite in phase, but the device +can be seen “catching up” to the wave motion during the declutching time.

+
+../_images/declutching.png + +
+

Although not shown with this example, declutching can also be implemented in irregular waves +but often requires different methods including excitation prediction.

+
+
+

Model Predictive Control (MPC)

+

Model predictive control is a WEC control method which uses a plant model to predict and +optimize the dynamics. MPC is a complex controller that can be applied in both regular +and irregular waves while also taking into account time-domain constraints such as position, +velocity, and PTO force. For the model predictive controller implemented here, +the plant model is a frequency dependent state-space model [C6]. +The state space model is then converted to a quadratic programming problem to be +solved by quadprog(), MATLAB’s quadratic programming function. Solving this system +leads to a set of PTO forces to optimize the future dynamics for maximum harvested +power, the first of which is applied at the current timestep. The relevant files for +the MPC example in the Controls folder of WEC-Sim Applications are detailed in the +table below (excluding wecSimInputFile.m and userDefinedFunctions.m which are not +unique to MPC). Note: This controller is similar to the NMPC example within the +WECCCOMP Application, but this example includes a method for calculating frequency +dependence and setting up the state space matrices based on boundary element method +data, allows for position, velocity, and force constraints, and is applied to a +single body heaving system.

+
+
+ + + + + + + + + + + + + + + + + + + + +

File

Description

coeff.mat

Coefficients for frequency dependence

fexcPrediction.m

Predicts future excitation forces

sphereMPC.slx

Simulink model including model predictive controller

mpcFcn.m

Creates and solves quadratic programming problem

plotFreqDep.m

Solves for and plots frequency dependence coeffs

+
+

The Simulink diagram is shown in the figure below. The figure shows an overview of +the controller, which primarily consists of the plant model and the optimizer. The plant +model uses the excitation force, applied PTO force, and current states to calculate the +states at the next timestep. Then, the optimizer predicts the future excitation, which +is input into the mpcFcn.m file along with the states to solve for the optimal change in +PTO force (integrated to solve for instantaneous PTO force).

+
+../_images/mpcSimulink.png + +
+

The results of the model predictive controller simulation in irregular waves are shown +below with the dashed lines indicating the applied +constraints. MPC successfully restricts the system to within the constraints (except for +a few, isolated timesteps where the solver couldn’t converge) while also optimizing for maximum +average mechanical power (300 kW). The constraints can be changed to account for +specific WEC and PTO physical limitations, but will limit the average power. +There are also other parameters which can be defined or changed by the user in the +wecSimInputFile.m such as the MPC timestep, prediction horizon, r-scale, etc. to +customize and tune the controller as desired.

+
+../_images/mpcPos.png + +
+
+../_images/mpcVel.png + +
+
+../_images/mpcForce.png + +
+
+../_images/mpcForceChange.png + +
+

The model predictive controller is particularly beneficial because of its ability to +predict future waves and maximize power accordingly as well as the ability to handle constraints. A +comparison to a reactive controller is shown in the table below. The reactive controller +can be tuned to stay within constraint bounds only when future wave conditions are known +and, in doing so, would sacrifice significant power. On the other hand, without knowledge +of future wave, the results from the untuned reactive controller are shown below using +optimal theoretical gains from the complex conjugate method at the peak wave period. +With no ability to recognize constraints, the reactive controller leads to much larger +amplitude and velocity and exhibits large peaks in PTO force and power, both of which +would likely lead to very expensive components and inefficient operation. +It is clear that the model predictive controller significantly outperforms the reactive +controller in terms of mechanical power harvested, constraint inclusions, and peak conditions. +Because of the increased complexity of model predictive control, limitations include longer +computation time and complex setup.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Parameter

Constraint

MPC

Reactive

Max Heave Position (m)

4

4.02

8.06

Max Heave Velocity (m/s)

3

2.95

5.63

Max PTO Force (kN)

2,000

2,180

4,630

Max PTO Force Change (kN/s)

1,500

1,500

3,230

Peak Mechanical Power (kW)

N/A

4,870

13,700

Avg Mechanical Power (kW)

N/A

300

241

+
+
+
+

Reactive Control with Direct Drive Power Take-Off

+

The previous controllers only considered the mechanical power output. Although maximization +of mechanical power allows for the maximum energy transfer from waves to body, it often does +not lead to maximum electrical power. The previous controller examples demonstrate the +controller types and energy transfer from waves to body, but the important consideration of +electrical power requires a PTO model. This example applies a reactive controller to the +sphere body with a simplified direct drive PTO model to maximize electrical power. Within +the Simulink subsystem for determining the PTO force, the controller prescribes the ideal or +desired force which is fed into the direct drive PTO. The current in the generator is then +used to control the applied force.

+
+../_images/piPTOSimulink.png + +
+

The PTO parameters used for this example are defined in the wecSimInputFile.m and correspond to +the Allied Motion Megaflux Frameless Brushless Torque Motors–MF0310 [C7]. The +results in terms of capture width (ratio of absorbed power (W) to wave power (W/m)) and resultant power for the +applied gains from Section Reactive Control (Proportional-Integral) are shown in the figures +below for a regular wave with a period of 9.6664 s and a height of 2.5 m. The “Controller (Ideal)” +power is the ideal power absorbed according to the applied controller gains. +The “Mechanical (Drivetrain)” power is the actual mechanical power absorbed by +the PTO system including the inertial, damping, and shaft torque power. Lastly, the +“Electrical (Generator)” power is the electrical power absorbed by the +generator including the product of induced current and voltage (based on shaft torque and velocity, +respectively) and the resultant generator losses (product of current squared and winding resistance). +Mechanical power maximization requires significant net input electrical power +(signified by red bar) which leads to an extremely negative capture width. Thus, +instead of harvesting electrical power, power would need to be taken from the grid or energy +storage component to achieve mechanical power maximization.

+
+../_images/reactiveWithPTOCCPower.png + +
+
+../_images/reactiveWithPTOCC.png + +
+

On the other hand, by testing different controller gains in the same wave conditions +(regular wave: period = 9.6664 s, height = 2.5 m), the gains which optimize for +maximum electrical power can be found as shown below. Increasing the proportional gain +and decreasing the integral gain magnitude leads to a maximum power of about 84 kW and capture width of about +1.5 m. The resultant motion is almost ten times smaller than for the mechanical power +maximization which leads to a lower current and much lower generator power losses +(product of current squared and winding resistance).

+
+../_images/reactiveWithPTOSweep.png + +
+
+../_images/reactiveWithPTOOptPower.png + +
+
+../_images/reactiveWithPTOOpt.png + +
+
+
+
+

Cable Features

+

Cables or tethers between two bodies apply a force only in tension (when taut or stretched), but not in compression, +can be modeled using the cableClass implementation. A cable block must be added to the +model between the two PTOs or constraints that are to be connected by a cable. Users must initialize the cable +class in the wecSimInputFile.m along with the base and follower connections in that order, by including the following lines:

+
cable(i) = cableClass('cableName','baseConnection','followerConnection');
+
+
+

where baseConnection is a PTO or constraint block that defines the cable connection on the base side, and followerConnection +is a PTO or constraint block that defineds the connection on the follower side.

+

It is necessary to define, at a minimum:

+
cable(i).stiffness = <cableStiffness>;
+cable(i).damping = <cableDamping>;
+
+
+

where cable(i).stiffness is the cable stiffness (N/m), and cable(i).damping is the cable damping (N/(m*s)). Force from the cable stiffness or +damping is applied between the connection points if the current length of the cable exceeds the equilibrium length of the cable. +By default, the cable equilibrium length is defined to be the distance between the locations of the baseConnection and followerConnection, so that initially there is no tension on the cable.

+

If a distinct initial condition is desired, one can define either cable(i).length or cable(i).preTension, where cable(i).length is the equilibrium (i.e., unstretched) length of the cable (m), and cable(i).preTension is the pre-tension applied to the cable at simulation start (N). The unspecified parameter is then calculated from the location of the baseConnection and +followerConnection.

+

To include dynamics applied at the cable-to-body coupling (e.g., a stiffness and damping), a PTO block +can be used instead, and the parameters pto(i).damping and pto(i).stiffness can be used to describe these dynamics.

+

By default, the cable is presumed neutrally buoyant and it is not subjected to fluid drag. To include fluid drag, the user can additionally define these parameters in a style similar to the bodyClass

+
cable(i).quadDrag.cd
+cable(i).quadDrag.area
+cable(i).quadDrag.drag
+cable(i).linearDamping
+
+
+

The cable mass and fluid drag is modeled with a low-order lumped-capacitance method with 2 nodes. +The mass and fluid drag forces are exerted at nodes defined by the 2 drag bodies. +By default, one is co-located with the baseConnection and the other with the followerConnection. +The position of these bodies can be manipulated by changing the locations of the base or follower connections points.

+
+

Note

+

This is not appropriate to resolve the actual kinematics of cable motions, but it is sufficient to model the aggregate forces among the connected bodies.

+
+
+
+

Mooring Features

+

This section provides an overview of WEC-Sim’s mooring class features; for more +information about the mooring class code structure, refer to +Mooring Class.

+

Floating WEC systems are often connected to mooring lines to keep the device in +position. WEC-Sim allows the user to model the mooring dynamics in the +simulation by specifying the mooring matrix, a mooring lookup table, or coupling with MoorDyn. To +include mooring connections, the user can use the mooring block (i.e., Mooring +Matrix block, Mooring Lookup Table block, or MoorDyn Connection block) +given in the WEC-Sim library under Moorings lib +and connect it between the body and the Global reference frame. The Moordyn Connection +block can also be placed between two dynamic bodies or frames. Refer to the +RM3 with MoorDyn, and the Series 8 - Using MoorDyn with WEC-Sim for more information.

+

MoorDyn is hosted on a separate MoorDyn repository. +It must be download separately, and all files and folders should be placed in +the $WECSIM/functions/moorDyn directory.

+
+

Mooring Matrix

+

When the mooring matrix block is used, the user first needs to initiate the +mooring class by setting mooring(i) = mooringClass('mooring name') in +the WEC-Sim input file (wecSimInputFile.m). Typically, the mooring +connection location also needs to be specified, mooring(i).location = [1x3] +(the default connection location is [0 0 0]). The user can also define the +mooring matrix properties in the WEC-Sim input file using:

+
    +
  • Mooring stiffness matrix - mooring(i).matrix.stiffness = [6x6] in [N/m]

  • +
  • Mooring damping matrix - mooring(i).matrix.damping = [6x6] in [Ns/m]

  • +
  • Mooring pretension - mooring(i).matrix.preTension = [1x6] in [N]

  • +
+
+

Note

+

“i” indicates the mooring number. More than one mooring can be specified in +the WEC-Sim model when the mooring matrix block is used.

+
+
+
+

Mooring Lookup Table

+

When the mooring lookup table block is used, the user first needs to initiate the +mooring class by setting mooring(i) = mooringClass('mooring name') in +the WEC-Sim input file (wecSimInputFile.m). Typically, the mooring +connection location also needs to be specified, mooring(i).location = [1x3] +(the default connection location is [0 0 0]). The user must also define the +lookup table file in the WEC-Sim input file with mooring(i).lookupTableFile = 'FILENAME';

+

The lookup table dataset should contain one structure that contains fields for each index and each force table:

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Index Name

Description

Dimensions

X

Surge position [m]

1 x nX

Y

Sway position [m]

1 x nY

Z

Heave position [m]

1 x nZ

RX

Roll position [deg]

1 x nRX

RY

Pitch position [deg]

1 x nRY

RZ

Yaw position [deg]

1 x nRZ

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Force Name

Description

Dimensions

FX

Surge force [N]

nX x nY x nZ x nRX x nRY x nRZ

FY

Sway force [N]

nX x nY x nZ x nRX x nRY x nRZ

FZ

Heave force [N]

nX x nY x nZ x nRX x nRY x nRZ

MX

Roll force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

MY

Pitch force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

MZ

Yaw force [Nm]

nX x nY x nZ x nRX x nRY x nRZ

+
+
+
+

MoorDyn

+

When a MoorDyn block is used, the user first needs to initiate the mooring class by +setting mooring = mooringClass('mooring name') in the WEC-Sim input +file (wecSimInputFile.m), followed by setting mooring(i).moorDyn = 1 to +initialize a MoorDyn connection. Each MoorDyn connection can consist of multiple +lines and each line may have multiple nodes. The number of MoorDyn lines and nodes in +each line should be defined as (mooring(i).moorDynLines = <Number of mooring lines>) +and (mooring(i).moorDynNodes(iLine) = <Number of mooring nodes in line> - only used +for ParaView visualization), respectively and should match the number of lines and nodes +specified in the MoorDyn input file.

+

A mooring folder that includes a MoorDyn input file (lines.txt) is required +in the simulation folder. The body and corresponding mooring attachment points are +defined in the MoorDyn input file. The body location in the MoorDyn input file +should match that of the initial location of the body’s center of gravity (usually +derived from BEM results). MoorDyn handles the kinematic transform to +convert the mooring forces from the attachment points to the 6 degree of freedom +force acting on the current location of the body’s center of gravity. The initial +displacement of the mooring line in WEC-Sim (mooring(i).initial.displacement) +should match the location of the connected body in the MoorDyn input file or the +difference in location between two connected bodies. In the MoorDyn input file, +the location of points/nodes are specified relative to the body location if of +attachment type ‘body#’ and relative to the global frame for any other +attachement type.

+
+

Note

+

WEC-Sim/MoorDyn coupling now allows more than one mooring connnection (i.e., +multiple MoorDyn Connection blocks) in the simulation, but there can only be +one call to MoorDyn (i.e., one MoorDyn Caller block).

+
+
+

RM3 with MoorDyn

+

This section describes how to simulate a mooring connected WEC system in +WEC-Sim using MoorDyn. The RM3 two-body floating point absorber is connected to +a three-point catenary mooring system with an angle of 120 between the lines in +this example case. The RM3 with MoorDyn folder is located under the WEC-Sim +Applications repository.

+
    +
  • WEC-Sim Simulink Model: Start out by following the instructions on how to +model the Two-Body Point Absorber (RM3). To couple WEC-Sim with MoorDyn, the +MoorDyn Connection block is added in parallel to the constraint block and the +MoorDyn Caller block is added to the model (no connecting lines).

  • +
+
+../_images/WECSimMoorDyn.png + +
+
    +
  • WEC-Sim Input File: In the wecSimInputFile.m file, the user needs to +initiate the mooring class and MoorDyn and define the number of mooring lines.

  • +
+
%% Simulation Data
+simu = simulationClass();             
+simu.simMechanicsFile = 'RM3MoorDyn.slx';       % WEC-Sim Model File
+simu.mode = 'accelerator';                
+simu.explorer = 'off';
+simu.rampTime = 40;                        
+simu.endTime = 400;                       
+simu.dt = 0.01;                          
+simu.cicDt = 0.05;
+
+%% Wave Information
+% User-Defined Time-Series
+waves = waveClass('elevationImport');           % Create the Wave Variable and Specify Type
+waves.elevationFile = 'etaData.mat';            % Name of User-Defined Time-Series File [:,2] = [time, eta]
+waves.waterDepth = 70;
+
+%% Body Data
+% Float
+body(1) = bodyClass('../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(1).geometryFile = '../../_Common_Input_Files/RM3/geometry/float.stl';
+body(1).mass = 'equilibrium';
+body(1).inertia = [20907301 21306090.66 37085481.11];
+
+% Spar/Plate
+body(2) = bodyClass('../../_Common_Input_Files/RM3/hydroData/rm3.h5');
+body(2).geometryFile = '../../_Common_Input_Files/RM3/geometry/plate.stl';
+body(2).mass = 'equilibrium';
+body(2).inertia = [94419614.57 94407091.24 28542224.82];
+body(2).initial.displacement = [0 0 -0.21];     % Initial Displacement
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); 
+constraint(1).location = [0 0 0];    
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');              	
+pto(1).stiffness=0;                             	
+pto(1).damping=1200000;                       	
+pto(1).location = [0 0 0];     
+
+%% Mooring
+% Moordyn
+mooring(1) = mooringClass('mooring');           % Initialize mooringClass
+mooring(1).moorDyn = 1;                         % Initialize MoorDyn                                                                    
+mooring(1).moorDynLines = 6;                    % Specify number of lines
+mooring(1).moorDynNodes(1:3) = 16;              % Specify number of nodes per line
+mooring(1).moorDynNodes(4:6) = 6;               % Specify number of nodes per line
+mooring(1).initial.displacement = [0 0 -21.29-.21]; % Initial Displacement (body cg + body initial displacement)
+
+
+
    +
  • MoorDyn Input File: A mooring folder that includes a moorDyn input file +(lines.txt) is created. The moorDyn input file (lines.txt) is shown +in the figure below. More details on how to set up the MooDyn input file are +described in the MoorDyn Documentation. +One specific requirement when using WEC-Sim with MoorDyn is that the Body(s) in which +the mooring lines are attached to should be labeled as “Coupled” in the MoorDyn input +file, which allows for WEC-Sim to control the body dynamics. +Note: WEC-Sim now uses MoorDyn v2.

  • +
+
+../_images/moorDynInput.png + +
+
    +
  • Simulation and Post-processing: Simulation and post-processing are the +same process as described in Tutorial Section.

  • +
+
+

Note

+

You may need to install the MinGW-w64 compiler to run this simulation.

+
+
+
+
+
+

WEC-Sim Post-Processing

+

WEC-Sim contains several built in methods inside the response class and wave +class to assist users in processing WEC-Sim output: output.plotForces, +output.plotResponse, output.saveViz, waves.plotElevation, and +waves.plotSpectrum. This section will demonstrate the use of these methods. +They are fully documented in the WEC-Sim API.

+
+

Plot Forces

+

The responseClass.plotForces() method can be used to plot the time series of +each force component for a body. The first argument takes in a body number, the +second a degree of freedom of the force. For example, output.plotForces(2,3) +will plot the vertical forces that act on the 2nd body. The total force is split +into its components:

+
    +
  • total force

  • +
  • excitation force

  • +
  • radiation damping force

  • +
  • added mass force

  • +
  • restoring force (combination of buoyancy, gravity and hydrostatic stiffness),

  • +
  • Morison element and viscous drag force

  • +
  • linear damping force

  • +
+
+../_images/OSWEC_heaveForces.PNG + +
+

Demonstration of output.plotForces() method for the OSWEC example.

+
+
+
+
+

Plot Response

+

The responseClass.plotResponse() method is very similar to plotForces +except that it will plot the time series of a body’s motion in a given degree +of freedom. For example, output.plotResponse(1,5) will plot the pitch motion +of the 1st body. The position, velocity and acceleration of that body is shown.

+
+../_images/OSWEC_pitchResponse.PNG + +
+

Demonstration of output.plotResponse() method for the OSWEC example.

+
+
+
+
+

Plot Elevation

+

The waveClass.plotElevation() method can be used to plot the wave elevation time +series at the domain origin. The ramp time is also marked. The only required input +is simu.rampTime. Users must manually plot or overlay the wave elevation at a +wave gauge location.

+
+../_images/OSWEC_plotEta.PNG + +
+

Demonstration of waves.plotElevation() method for the OSWEC example.

+
+
+
+
+

Plot Spectrum

+

The waveClass.plotSpectrum() method can be used to plot the frequency spectrum +of an irregular or spectrum import wave. No input parameters are required.

+
+../_images/OSWEC_plotSpectrum.PNG + +
+

Demonstration of waves.plotSpectrum() method for the OSWEC example.

+
+
+
+
+
+

WEC-Sim Visualization

+

WEC-Sim provides visualization in SimScape Mechanics Explorer by default. This section describes some additional options for WEC-Sim visualization

+
+

Wave Markers

+

This section describes how to visualize the wave elevations at various locations using +markers in SimScape Mechanics Explorer. +Users must define an array of [X,Y] coordinates, the marker style (sphere, cube, frames), the marker size in pixels, marker color in RGB format. +The Global Reference Frame block programmatically initiates and adds/deletes the visualization blocks based on the number of markers (0 to N) defined by the user. +Here are the steps to define wave markers representing a wave-spectra, waves(1). Similar steps can be followed for subsequent waves(#) objects.

+
    +
  • Define an array of marker locations: waves(1).marker.location = [X,Y], where the first column defines the X coordinates, and the second column defines the corresponding Y coordinates, Default = []

  • +
  • Define marker style : waves(1).marker.style = 1, where 1: Sphere, 2: Cube, 3: Frame, Default = 1: Sphere

  • +
  • Define marker size : waves(1).marker.size = 10, to specify marker size in Pixels, Default = 10

  • +
  • Define marker color: waves(1).marker.graphicColor = [1,0,0], to specifie marker color in RBG format.

  • +
+

For more information about using ParaView for visualization, refer to the Wave_Markers examples on the WEC-Sim Applications repository.

+
+

Note

+

This feature is not compatible with user-defined waves waves = waveClass('elevationImport')

+
+
+../_images/RM3_vizMarker.jpg + +
+

Demonstration of visualization markers in SimScape Mechanics Explorer.

+
+
+
+
+

Save Visualization

+

The responseClass.saveViz() method can be used to create a complete +animation of the simulation. The animation shows the 3D response of all bodies +over time on top of a surface plot of the entire directional wave field. The +default wave domain is defined by simu.domainSize, waves.waterDepth, and +the maximum height that the STL mesh of any body reaches. Users may optionally +input the axis limits to restrict or widen the field of view, the time steps per +animation frame, and the output file format. Users can choose to save the animation +as either a .gif or .avi file. This function can take significant time to +run depending on simulation time and time step, however it may be faster and easier +than Paraview. Users are still recommended to use the provided Paraview macros for +more complex animations and analysis.

+

For example, in the OSWEC case the command +output.saveViz(simu,body,waves,'timesPerFrame',5,'axisLimits',[-50 50 -50 50 -12 20]) +results in the following figure:

+
+../_images/OSWEC_plotWaves.PNG + +
+

Demonstration of output.saveViz() method for the OSWEC example.

+
+
+
+
+
+

Paraview Visualization

+

This section describes how to use ParaView for visualizing data from a WEC-Sim simulation. +Using ParaView visualization improves on the SimMechanics explorer by:

+
    +
  • Visualizing the wave field

  • +
  • Visualizing the cell-by-cell nonlinear hydrodynamic forces (when using nonlinear buoyancy and Froude-Krylov wave excitation)

  • +
  • Allowing data manipulation and additional visualization options

  • +
+

However, the SimMechanics explorer shows the following information not included in the ParaView visualization:

+
    +
  • Location of center of gravity

  • +
  • Location of different frames (e.g. PTO and Constraint frames)

  • +
+

Visualization with ParaView requires additional output files to be written to a vtk directory. +This makes the WEC-Sim simulation take more time and the case directory larger, so it should only be used when additional visualization is desired. +Users will also need to have some familiarity with using ParaView. +For more information about using ParaView for visualization, refer to the Series 4 - Body-to-Body Interactions, and the Paraview_Visualization examples on the WEC-Sim Applications repository.

+
+

Install ParaView and WEC-Sim Macros

+

First, install ParaView 5.11.1. +Then, add the WEC-Sim specific macros:

+
    +
  • Open ParaView

  • +
  • Click on Macros => Add new macro

  • +
  • Navigate to the WEC-Sim source/functions/paraview directory

  • +
  • Select the first file and click OK

  • +
  • Repeat this for all .py files in the source/functions/paraview directory

  • +
+
+
+

WEC-Sim Visualization in ParaView

+

When simu.paraview.option = 1, a vtk directory is created inside the WEC-Sim $CASE directory. +All files necessary for ParaView visualization are located there. +To view in ParaView:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Select the WEC-Sim model in the pipeline, and run the WEC-Sim macro

  • +
  • Move the camera to desired view

  • +
  • Click the green arrow (play) button

  • +
+

The WEC-Sim macro:

+
    +
  • Extracts each body, sets the color and opacity, and renames them

  • +
  • Extracts the waves, sets color and opacity, and renames

  • +
  • Creates the ground plane

  • +
  • Sets the camera to top view

  • +
+

After opening the .pvd file and running the WEC-Sim macro you can do a number of things to visualize the simulation in different ways. +You can color waves and bodies by any of the available properties and apply any of the ParaView filters. The figures below show some of the visualization possibilities afforded by using ParaView with WEC-Sim.

+
+../_images/rm3_iso_side.png + +
+

Reference Model 3

+
+
+
+../_images/oswec_iso_side.png + +
+

Bottom-fixed Oscillating Surge WEC (OSWEC)

+
+
+
+../_images/sphere_freedecay_iso_side.png + +
+

Sphere

+
+
+
+../_images/ellipsoid_iso_side.png + +
+

Ellipsoid

+
+
+
+../_images/gbm_iso_side.png + +
+

Barge with Four Flexible Body Modes

+
+
+
+../_images/wigley_iso_side.png + +
+

Wigley Ship Hull

+
+
+
+../_images/wecccomp_iso_side.png + +
+

Wave Energy Converter Control Competition (WECCCOMP) Wavestar Device

+
+
+
+../_images/oc6_iso_side.png + +
+

OC6 Phase I DeepCwind Floating Semisubmersible

+
+
+

Two examples using Paraview for visualization of WEC-Sim data are provided in the Paraview_Visualization directory of the WEC-Sim Applications repository. +The RM3_MoorDyn_Viz example uses ParaView for WEC-Sim data visualization of a WEC-Sim model coupled with MoorDyn to simulate a mooring system for the RM3 geometry. +The OSWEC_NonLinear_Viz example uses ParaView for WEC-Sim data visualization of a WEC-Sim model with nonlinear Hydro to simulate nonlinear wave excitation on the flap of the OSWEC geometry.

+
+

MoorDyn Visualization in ParaView

+

The video below shows three different views of the RM3 model with MoorDyn. +The left view uses the WEC-Sim macro. +The top right view uses the slice filter. +The bottom right view shows the free surface colored by wave elevation.

+
+
+

Nonlinear Hydro Visualization in ParaView

+

When using nonlinear buoyancy and Froude-Krylov wave excitation the paraview files also contain cell data for the bodies. +The cell data are:

+
    +
  • Cell areas

  • +
  • Hydrostatic pressures

  • +
  • Linear Froude-Krylov pressures

  • +
  • Nonlinear Froude-Krylov pressures

  • +
+

The pressureGlyphs macro calculates cell normals, and cell centers. It then creates the following glyphs:

+
    +
  • Hydrostatic pressure

  • +
  • Linear Froude-Krylov pressure

  • +
  • Nonlinear Froude-Krylov pressure

  • +
  • Total pressure (hydrostatic plus nonlinear Froude-Krylov)

  • +
  • Froude-Krylov delta (nonlinear minus linear)

  • +
+

To view WEC-Sim nonlinear hydro data in ParaView:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Select the WEC-Sim model in the pipeline, and run the WEC-Sim macro

  • +
  • Move the camera to desired view

  • +
  • Select the WEC-Sim model again in the pipeline, and run the pressureGlyphs macro

  • +
  • Select which features to visualize in the pipeline

  • +
  • Click the green arrow (play) button

  • +
+

The video below shows three different views of the OSWEC model with non-linear hydrodynamics. +The top right shows glyphs of the nonlinear Froude-Krylov pressure acting on the float. +The bottom right shows the device colored by hydrostatic pressure.

+
+
+
+
+
+

Loading a ParaView State File

+

If a previous *.pvsm ParaView state file was saved, the state can be applied to a *.pvd ParaView file. To load a state file:

+
    +
  • Open the $CASE/vtk/<filename>.pvd file in ParaView

  • +
  • Click on File => Load State

  • +
  • Select the desired $CASE/<filename>.pvsm Paraview state file to apply

  • +
  • Select the “Search files under specified directory” option, specify the desired WECS-Sim $CASE/vtk/ directory, and click OK

  • +
+

Paraview state files are provided for both Paraview_Visualization examples provided onthe WEC-Sim Applications repository, one for the RM3 using MoorDyn, and another for the OSWEC with nonlinear hydro.

+
+
+

ParaView Visualization Parameters

+

The following table lists the WEC-Sim simulation parameters that can be specified in the wecSimInputFile to control the ParaView visualization. Note, the body.viz properties are also used for the SimMechanics explorer visualization.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

WEC-Sim Visualization using ParaView

Variable

Description

+
simu.paraview.option
+
+
+
0 to not output ParaView files [default]
+
1 to output ParaView files
+
+

simu.paraview.startTime

time (s) to start ParaView visualization

simu.paraview.endTime

time (s) to end ParaView visualization

simu.paraview.dt

time step between adjacent ParaView frames [default 1]

simu.paraview.path

directory to create ParaView visualization files

+
simu.nonlinearHydro
+
+
+
0 for no nonlinear hydro [default]
+
1 for nonlinear hydro with mean free surface
+
2 for nonlinear hydro with instantaneous free surface
+
+

simu.domainSize

size of ground and water planes in meters [default 200]

simu.dtOut

simulation output sampling time step [default dt]

body(i).viz.color

[RGB] body color [default [1 1 0]]

body(i).viz.opacity

body opacity [default 1]

+
body(i).paraview
+
+
+
0 to exclude body from ParaView visualization
+
1 to include body in ParaView visualization [default]
+
+

waves.viz.numPointsX

wave plane discretization: number of X points [default 50]

waves.viz.numPointsY | wave plane discretization: number of Y points [default 50]

+
+
+
+

Decay Tests

+

When performing simulations of decay tests, you must use one of the no-wave +cases and setup the initial (time = 0) location of each body, constraint, PTO, +and mooring block. The initial location of a body or mooring block is set by +specifying the centerGravity or location at the stability position (as with any WEC-Sim +simulation) and then specifying an initial displacement. To specify an initial +displacement, the body and mooring blocks have a .initial property +with which you can specify a translation and angular rotation about an +arbitrary axis. For the constraint and PTO blocks, the .location property +must be set to the location at time = 0.

+

There are methods available to help setup this initial displacement for all +bodies, constraints, PTOs, and moorings. To do this, you would use the:

+
    +
  • body(i).setInitDisp()

  • +
  • constraint(i).setInitDisp()

  • +
  • pto(i).setInitDisp()

  • +
  • mooring(i).setInitDisp()

  • +
+

methods in the WEC-Sim input file. A description of the required input can be +found in the method’s header comments. The following properties must be +defined prior to using the object’s setInitDisp() method:

+
    +
  • body(i).centerGravity

  • +
  • constraint(i).location

  • +
  • pto(i).location

  • +
  • mooring.location

  • +
+

For more information, refer to the Free Decay example on the WEC-Sim +Applications repository.

+
+
+

Other Features

+

The WEC-Sim Applications repository also includes examples of using WEC-Sim to +model a Desalination plant and a numerical model of the WaveStar device for +control implementation. The WaveStar device was used in the WECCCOMP wave +energy control competition.

+
+
+

References

+
+
+
+[C1] +

Giorgio Bacelli and Ryan G Coe. Comments on control of wave energy converters. IEEE Transactions on Control Systems Technology, 29(1):478–481, 2020.

+
+
+[C2] +

Giorgio Bacelli, Victor Nevarez, Ryan G Coe, and David G Wilson. Feedback resonating control for a wave energy converter. IEEE Transactions on Industry Applications, 56(2):1862–1868, 2019.

+
+
+[C3] +

RPF Gomes, MFP Lopes, JCC Henriques, LMC Gato, and AFO Falcão. The dynamics and power extraction of bottom-hinged plate wave energy converters in regular and irregular waves. Ocean Engineering, 96:86–99, 2015.

+
+
+[C4] +

Ryan G Coe, Giorgio Bacelli, and Dominic Forbush. A practical approach to wave energy modeling and control. Renewable and Sustainable Energy Reviews, 142:110791, 2021.

+
+
+[C5] +(1,2) +

Aurélien Babarit and Alain H Clément. Optimal latching control of a wave energy device in regular and irregular waves. Applied Ocean Research, 28(2):77–91, 2006.

+
+
+[C6] +

Ratanak So, Mike Starrett, Kelley Ruehl, and Ted KA Brekken. Development of control-sim: control strategies for power take-off integrated wave energy converter. In 2017 IEEE Power & Energy Society General Meeting, 1–5. IEEE, 2017.

+
+ +
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/api.html b/main/user/api.html new file mode 100644 index 000000000..eb1388618 --- /dev/null +++ b/main/user/api.html @@ -0,0 +1,1690 @@ + + + + + + + + + API — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

API

+
+

Simulation Class

+
+
+class objects.simulationClass
+
+

The simulationClass creates a simu object saved to the MATLAB +workspace. The simulationClass includes properties and methods used +to define WEC-Sim’s simulation parameters and settings.

+
+
+
+simulationClass
+

This method initializes the simulationClass.

+
+ +
+
+
Constructor Summary
+
Property Summary
+
+b2b
+

WEC-Sim input

+
+ +
+
+cicDt
+

(float) Time step to calculate Convolution Integral. Default = dt

+
+ +
+
+cicEndTime
+

(float) Convolution integral time. Default = 60 s

+
+ +
+
+domainSize
+

(float) Size of free surface and seabed. This variable is only used for visualization. Default = 200 m

+
+ +
+
+dt
+

(float) Simulation time step. Default = 0.1 s

+
+ +
+
+dtOut
+

(float) Output sampling time. Default = dt

+
+ +
+
+endTime
+

(float) Simulation end time. Default = []

+
+ +
+
+explorer
+

(string) SimMechanics Explorer ‘on’ or ‘off’. Default = 'on'

+
+ +
+
+gravity
+

(float) Acceleration due to gravity. Default = 9.81 m/s

+
+ +
+
+mcrMatFile
+

(string) mat file that contain a list of the multiple conditions runs with given conditions. Default = []

+
+ +
+
+mcrExcelFile
+

(string) File name from which to load wave statistics data. Default = []

+
+ +
+
+mode
+

(string) Simulation execution mode, ‘normal’, ‘accelerator’, ‘rapid-accelerator’. Default = 'normal'

+
+ +
+
+morisonDt
+

(float) Sample time to calculate Morison Element forces. Default = dt

+
+ +
+
+nonlinearDt
+

(float) Sample time to calculate nonlinear forces. Default = dt

+
+ +
+
+paraview
+

0 (off) , 1 (on). Default = 0. startTime (float) Start time for the vtk file of Paraview. Default = 0. endTime (float) End time for the vtk file of Paraview. Default = 100. dt (float) Timestep for Paraview. Default = 0.1. path (string) Path of the folder for Paraview vtk files. Default = 'vtk'.

+
+
Type:
+

(structure) Defines the Paraview visualization. option (integer) Flag for paraview visualization, and writing vtp files, Options

+
+
+
+ +
+
+pressure
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save pressure distribution, Options

+
+
+
+ +
+
+rampTime
+

(float) Ramp time for wave forcing. Default = 100 s

+
+ +
+
+rateTransition
+

‘on’, ‘off’. Default = 'on'

+
+
Type:
+

(string) Flag for automatically handling rate transition for data transfer, Opyions

+
+
+
+ +
+
+reloadH5Data
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to re-load hydro data from h5 file between runs, Options

+
+
+
+ +
+
+rho
+

(float) Density of water. Default = 1000 kg/m^3

+
+ +
+
+saveStructure
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save results as a MATLAB structure, Options

+
+
+
+ +
+
+saveText
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag to save results as ASCII files, Options

+
+
+
+ +
+
+saveWorkspace
+

0 (off), 1 (on). Default = 1

+
+
Type:
+

(integer) Flag to save .mat file for each run, Options

+
+
+
+ +
+
+simMechanicsFile
+

(string) Simulink/SimMechanics model file. Default = 'NOT DEFINED'

+
+ +
+
+solver
+

(string) PDE solver used by the Simulink/SimMechanics simulation. Any continuous solver in Simulink possible. Recommended to use ‘ode4, ‘ode45’ for WEC-Sim. Default = 'ode4'

+
+ +
+
+stateSpace
+

0 (convolution integral), 1 (state-space). Default = 0

+
+
Type:
+

(integer) Flag for convolution integral or state-space calculation, Options

+
+
+
+ +
+
+FIR
+

0 (convolution integral), 1 (FIR). Default = 0

+
+
Type:
+

(integer) Flag for FIR calculation, Options

+
+
+
+ +
+
+startTime
+

(float) Simulation start time. Default = 0 s

+
+ +
+
+zeroCross
+

(string) Disable zero cross control. Default = 'DisableAll'

+
+ +
+
+numMoorDyn
+

(integer) Number of moordyn blocks systems in the wec model. Default = 0

+
+ +
+
Method Summary
+
+
+
+ +
+
+

Wave Class

+
+
+class objects.waveClass
+

The waveClass creates a waves object saved to the MATLAB +workspace. The waveClass includes properties and methods used +to define WEC-Sim’s wave input.

+
+
+
Constructor Summary
+
Property Summary
+
+bem
+

input file

+
+ +
+
+current
+

0 for depth-independent model, 1 for 1/7 power law variation with depth, 2 for linear variation with depth, or 3 for no current. Default = 3, depth (float) Current depth [m]. Define the depth over which the sub-surface current is modeled. Must be defined for options 1 and 2. The current is not calculated for any depths greater than the specified current depth. Default = 0, direction (float) Current direction [deg]. Surface current direction defined using WEC-Sim global coordinate system. Default = 0, speed (float) Current seed [m/s]. Surface current speed that is uniform along the water column. Default = 0

+
+
Type:
+

(structure) Defines the current implementation. option (integer) Define the sub-surface current model to be used in WEC-Sim, options include

+
+
+
+ +
+
+direction
+

(float) Incident wave direction(s) [deg]. Incident wave direction defined using WEC-Sim global coordinate system. Should be defined as a row vector for more than one wave direction. Default = 0

+
+ +
+
+elevationFile
+

(string) Data file that contains the times-series data file. Default = 'NOT DEFINED'

+
+ +
+
+gamma
+

(float) Defines gamma, only used for JS wave spectrum type. Default = []

+
+ +
+
+height
+

(float) Wave height [m]. Defined as wave height for regular, or significant wave height for irregular. Default = 'NOT DEFINED'

+
+ +
+
+marker
+

Sphere, 2: Cube, 3: Frame. Default = 1: Sphere

+
+
Type:
+

(structure) Defines the wave marker. loc (nx2 vector) Marker [X,Y] locations [m]. Default = []. size (float) Marker size in Pixels. Default = 10. style Marker style, options include

+
+
Type:
+

1

+
+
+
+ +
+
+period
+

(float) Wave period [s] . Defined as wave period for regular, peak period for irregular, or period of BEM data used for hydrodynamic coefficients for noWave. Default = 'NOT DEFINED'

+
+ +
+
+phaseSeed
+

(integer) Defines the random phase seed, only used for irregular and spectrumImport waves. Default = 0

+
+ +
+
+spectrumFile
+

(string) Data file that contains the spectrum data file. Default = 'NOT DEFINED'

+
+ +
+
+spectrumType
+

PM or JS. Default = 'NOT DEFINED'

+
+
Type:
+

(string) Specifies the wave spectrum type, options include

+
+
+
+ +
+
+viz
+

(structure) Defines visualization options, structure contains the fields numPointsX for the number of visualization points in x direction, and numPointsY for the number of visualization points in y direction.

+
+ +
+
+waterDepth
+

(float) Water depth [m]. Default to BEM water depth if not set.

+
+ +
+
+spread
+

(float) Wave Spread probability associated with wave direction(s). Should be defined as a row vector for more than one wave direction. Default = 1

+
+ +
+
Method Summary
+
+plotElevation(rampTime)
+

This method plots wave elevation time-history.

+
+
Parameters:
+

rampTime (float, optional) – Specify wave ramp time to include in plot

+
+
Returns:
+

figure – Plot of wave elevation versus time

+
+
Return type:
+

fig

+
+
+
+ +
+
+plotSpectrum()
+

This method plots the wave spectrum.

+
+
Returns:
+

figure – Plot of wave spectrum versus wave frequency

+
+
Return type:
+

fig

+
+
+
+ +
+
+
+
+ +
+
+

Body Class

+
+
+class objects.bodyClass
+
+

The bodyClass creates a body object saved to the MATLAB +workspace. The bodyClass includes properties and methods used +to define WEC-Sim’s hydrodynamic and non-hydrodynamic bodies.

+
+
+
+bodyClass
+

This method initializes the bodyClass and creates a +body object.

+
+
Parameters:
+

h5File (string) – String specifying the location of the body h5 file

+
+
Returns:
+

body – bodyClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+adjMassFactor
+

WEC-Sim input

+
+ +
+
+centerBuoyancy
+

(3x1 float vector) Body center of buoyancy [m]. Defined in the following format [x y z]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+centerGravity
+

(3x1 float vector) Body center of gravity [m]. Defined in the following format [x y z]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+dof
+

(integer) Number of degree of freedoms (DOFs). For hydrodynamic bodies this is given in the h5 file. If not defined in the h5 file, Default = 6.

+
+ +
+
+excitationIRF
+

(vector) Defines excitation Impulse Response Function, only used with the waveClass elevationImport type. Default = [].

+
+ +
+
+flex
+

0 (off) or 1 (on). Default = 0.

+
+
Type:
+

(integer) Flag for flexible body, Options

+
+
+
+ +
+
+gbmDOF
+

(integer) Number of degree of freedoms (DOFs) for generalized body mode (GBM). Default = [].

+
+ +
+
+geometryFile
+

(string) Path to the body geometry .stl file.

+
+ +
+
+h5File
+

(char array, string, cell array of char arrays, or cell array or strings) hdf5 file containing the hydrodynamic data

+
+ +
+
+hydroStiffness
+

(6x6 float matrix) Linear hydrostatic stiffness matrix. If the variable is nonzero, the matrix will override the h5 file values. Create a 3D matrix (6x6xn) for variable hydrodynamics. Default = zeros(6).

+
+ +
+
+inertia
+

(1x3 float vector) Rotational inertia or mass moment of inertia [kg*m^{2}]. Defined by the user in the following format [Ixx Iyy Izz]. Default = [].

+
+ +
+
+inertiaProducts
+

(1x3 float vector) Rotational inertia or mass products of inertia [kg*m^{2}]. Defined by the user in the following format [Ixy Ixz Iyz]. Default = [].

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the body. displacement (1x3 float vector) is defined as the initial displacement of the body center of gravity (COG) [m] in the following format [x y z], Default = [0 0 0]. axis (1x3 float vector) is defined as the axis of rotation in the following format [x y z], Default = [0 1 0]. angle (float) is defined as the initial angular displacement of the body COG [rad], Default = 0.

+
+ +
+
+linearDamping
+

(6x6 float matrix) Defines linear damping coefficient matrix. Create a 3D matrix (6x6xn) for variable hydrodynamics. Default = zeros(6).

+
+ +
+
+mass
+

(float) Translational inertia or mass [kg]. Defined by the user or specify ‘equilibrium’ to set the mass equal to the fluid density times displaced volume. Default = [].

+
+ +
+
+meanDrift
+

0 (no), 1 (yes, from control surface) or 2 (yes, from momentum conservation). Default = 0.

+
+
Type:
+

(integer) Flag for mean drift force, Options

+
+
+
+ +
+
+morisonElement
+

0 (off), 1 (on) or 2 (on), Default = 0, Option 1 uses an approach that allows the user to define drag and inertial coefficients along the x-, y-, and z-axes and Option 2 uses an approach that defines the Morison Element with normal and tangential tangential drag and interial coefficients. cd (1x3 float vector) is defined as the viscous normal and tangential drag coefficients in the following format, Option 1 [cd_x cd_y cd_z], Option 2 [cd_N cd_T NaN], Default = [0 0 0]. ca is defined as the added mass coefficent for the Morison Element in the following format, Option 1 [ca_x ca_y ca_z], Option 2 [ca_N ca_T NaN], Default = [0 0 0], area is defined as the characteristic area for the Morison Element [m^2] in the following format, Option 1 [Area_x Area_y Area_z], Option 2 [Area_N Area_T NaN], Default = [0 0 0]. VME is the characteristic volume of the Morison Element [m^3], Default = 0. rgME is defined as the vector from the body COG to point of application for the Morison Element [m] in the following format [x y z], Default = [0 0 0]. z is defined as the unit normal vector center axis of the Morison Element in the following format, Option 1 not used, Option 2 [n_{x} n_{y} n_{z}], Default = [0 0 1].

+
+
Type:
+

(structure) Defines the Morison Element properties connected to the body. option (integer) for Morison Element calculation, Options

+
+
+
+ +
+
+name
+

(string) Specifies the body name. For hydrodynamic bodies this is defined in h5 file. For nonhydrodynamic bodies this is defined by the user, Default = [].

+
+ +
+
+nonHydro
+

0 (hydro body), 1 (non-hydro body), 2 (drag body). Default = 0.

+
+
Type:
+

(integer) Flag for non-hydro body, Options

+
+
+
+ +
+
+nonlinearHydro
+

0 (linear), 1 (nonlinear), 2 (nonlinear). Default = 0

+
+
Type:
+

(integer) Flag for nonlinear hydrohanamics calculation, Options

+
+
+
+ +
+
+quadDrag
+

(structure) Defines the viscous quadratic drag forces. Create an array of structures for variable hydrodynamics. First option define drag, (6x6 float matrix), Default = zeros(6). Second option define cd, (1x6 float vector), Default = [0 0 0 0 0 0], and area, (1x6 float vector), Default = [0 0 0 0 0 0].

+
+ +
+
+QTFs
+

0 (off), 1 (on). Default = 0

+
+
Type:
+

(integer) Flag for QTFs calculation, Options

+
+
+
+ +
+
+paraview
+

0 (no) or 1 (yes). Default = 1, only called in paraview.

+
+
Type:
+

(integer) Flag for visualisation in Paraview either, Options

+
+
+
+ +
+
+variableHydro
+

(structure) Defines the variable hydro implementation. option (float) Flag to turn variable hydrodynamics on or off. hydroForceIndexInitial (float) Defines the initial value of the hydroForceIndex, which should correspond to the hydroForce data (cg, cb, volume, water depth, valid cicEndTime, added mass integrated with the body during runtime) and h5File of the body at equilibrium.

+
+ +
+
+viz
+

(structure) Defines visualization properties in either SimScape or Paraview. color (1x3 float vector) is defined as the body visualization color, Default = [1 1 0]. opacity (integer) is defined as the body opacity, Default = 1.

+
+ +
+
+volume
+

(float) Displaced volume at equilibrium position [m^{3}]. For hydrodynamic bodies this is defined in the h5 file while for nonhydrodynamic bodies this is defined by the user. Default = [].

+
+ +
+
+yaw
+

0 (off), 1 (on). Default = 0. threshold (float) Yaw position threshold (in degrees) above which excitation coefficients will be interpolated in passive yaw. Default = 1 [deg].

+
+
Type:
+

(structure) Defines the passive yaw implementation. option (integer) Flag for passive yaw calculation, Options

+
+
+
+ +
+
Method Summary
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a body’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the +centerGravity or location correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = centerGravity - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+plotStl()
+

Method to plot the body .stl mesh and normal vectors.

+
+ +
+
+calculateForceAddedMass(acc)
+

This method calculates and outputs the real added mass force +time history. This encompasses both the contributions of the +added mass coefficients and applied during simulation, and +the component from added mass that is lumped with the body +mass during simulation.

+

This function must be called after body.restoreMassMatrix() +and body.storeForceAddedMass()

+
+
Parameters:
+
    +
  • obj (bodyClass) – Body whose added mass force is being updated

  • +
  • acc (float array) – Timeseries of the acceleration at each simulation +time step

  • +
+
+
Returns:
+

actualAddedMassForce – Time series of the actual added mass force

+
+
Return type:
+

float array

+
+
+
+ +
+
+
+
+ +
+
+

Constraint Class

+
+
+class objects.constraintClass
+
+

The constraintClass creates a constraint object saved to the MATLAB +workspace. The constraintClass includes properties and methods used +to define constraints between the body motion relative to the global reference +frame or relative to other bodies.

+
+
+
+constraintClass
+

This method initilizes the constraintClass and creates a +constraint object.

+
+
Parameters:
+

filename (string) – String specifying the name of the constraint

+
+
Returns:
+

constraint – contraintClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+hardStops
+

input file

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the constraint. displacement (3x1 float vector) is defined as the initial displacement of the constraint [m] in the following format [x y z], Default = [0 0 0].

+
+ +
+
+extension
+

(string) Specify priority level for extension. `` ‘High’ or ‘Low’ `` Default = High.

+
+ +
+
+location
+

(1x3 float vector) Constraint location [m]. Defined in the following format [x y z]. Default = [999 999 999].

+
+ +
+
+name
+

(string) Specifies the constraint name. For constraints this is defined by the user, Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the constraint. z (1x3 float vector) defines the direciton of the Z-coordinate of the constraint, Default = [0 0 1]. y (1x3 float vector) defines the direciton of the Y-coordinate of the constraint, Default = [0 1 0]. x (3x1 float vector) internally calculated vector defining the direction of the X-coordinate for the constraint, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the constraint coordinate orientation, Default = [].

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a constraints’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+
+
+ +
+
+

PTO Class

+
+
+class objects.ptoClass
+
+

The ptoClass creates a pto object saved to the MATLAB +workspace. The ptoClass includes properties and methods used +to define PTO connections between the body motion relative to the global reference +frame or relative to other bodies.

+
+
+
+ptoClass
+

This method initilizes the ptoClass and creates a +pto object.

+
+
Parameters:
+

filename (string) – String specifying the name of the pto

+
+
Returns:
+

pto – ptoClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+damping
+

input file

+
+ +
+
+equilibriumPosition
+

(float) Linear PTO equilibrium position, m or deg. Default = 0.

+
+ +
+
+hardStops
+

(float) Define lower limit transition region, over which spring and damping values ramp up to full values. Increase for stability. m or deg. Default = 1e-4

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the pto. displacement (3x1 float vector) is defined as the initial displacement of the pto [m] in the following format [x y z], Default = [0 0 0].

+
+ +
+
+extension
+

(string) Specify priority level for extension. `` ‘High’ or ‘Low’ `` Default = High.

+
+ +
+
+location
+

(3x1 float vector) PTO location [m]. Defined in the following format [x y z]. Default = [999 999 999].

+
+ +
+
+name
+

(string) Specifies the pto name. For ptos this is defined by the user, Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the pto. z (1x3 float vector) defines the direction of the Z-coordinate of the pto, Default = [0 0 1]. y (1x3 float vector) defines the direction of the Y-coordinate of the pto, Default = [0 1 0]. x (1x3 float vector) internally calculated vector defining the direction of the X-coordinate for the pto, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the pto coordinate orientation, Default = [].

+
+ +
+
+pretension
+

(float) Linear PTO pretension, N or N-m. Default = 0.

+
+ +
+
+stiffness
+

(float) Linear PTO stiffness coefficient. Default = 0.

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a pto’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+
+
+ +
+
+

Mooring Class

+
+
+class objects.mooringClass
+

The mooringClass creates a mooring object saved to the MATLAB +workspace. The mooringClass includes properties and methods used +to define cable connections relative to other bodies. +It is suggested that the mooringClass be used for connections between +bodies and the global reference frame.

+

This class contains mooring parameters and settings

+
+
+
Constructor Summary
+
Property Summary
+
+initial
+

input file

+
+ +
+
+location
+

(1x3 float vector) Mooring Reference location. Default = [0 0 0]

+
+ +
+
+matrix
+

(structure) Defines the mooring parameters. damping (6x6 float matrix) Matrix of damping coefficients, Default = zeros(6). stiffness (6x6 float matrix) Matrix of stiffness coefficients, Default = zeros(6). preTension (1x6 float vector) Array of pretension force in each dof, Default = [0 0 0 0 0 0].

+
+ +
+
+moorDyn
+

(integer) Flag to indicate and initialize a MoorDyn connection, 0 or 1. Default = 0

+
+ +
+
+moorDynLines
+

(integer) Number of lines in MoorDyn. Default = 0

+
+ +
+
+moorDynNodes
+

(integer) number of nodes for each line. Default = 'NOT DEFINED'

+
+ +
+
+name
+

(string) Name of the mooring. Default = 'NOT DEFINED'

+
+ +
+
+moorDynInputFile
+

(string) Name of the MoorDyn input file path. Outputs will be written to this path. Default = Mooring/lines.txt

+
+ +
+
+lookupTableFlag
+

(integer) Flag to indicate a mooring look-up table, 0 or 1. Default = 0

+
+ +
+
+lookupTableFile
+

(string) Mooring look-up table file name. Default = '';

+
+ +
+
+lookupTable
+

(array) Lookup table data. Force data in 6 DOFs indexed by displacement in 6 DOF

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a mooring’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or orientation +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+loadLookupTable()
+

Method to load the lookup table and assign to the mooringClass

+
+ +
+
+callMoorDynLib()
+

Initialize MoorDyn Lib (Windows:dll or OSX:dylib)

+
+ +
+
+closeMoorDynLib()
+

Close MoorDyn Lib

+
+ +
+
+
+
+ +
+
+

Cable Class

+
+
+class objects.cableClass
+
+

The cableClass creates a cable object saved to the MATLAB +workspace. The cableClass includes properties and methods used +to define cable connections relative to other bodies. +It is suggested that the cableClass be used for connections between +joints or ptos.

+
+
+
+cableClass
+

This method initilizes the cableClass and creates a +cable object.

+
+
Parameters:
+
    +
  • name (string) – String specifying the name of the cable

  • +
  • baseConnection (string) – Variable for the base constraint/pto as a string

  • +
  • followerConnection (string) – Variable for the follower constraint/pto as a string

  • +
+
+
Returns:
+

cable – cableClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+
Constructor Summary
+
Property Summary
+
+damping
+

input file

+
+ +
+
+inertia
+

(1x3 float vector) body moments of inertia kg-m^2, default [1 1 1]

+
+ +
+
+inertiaProducts
+

(1x3 float vector) body products of inertia kg-m^2, default [0 0 0]

+
+ +
+
+initial
+

(structure) Defines the initial displacement of the body. displacement (3x1 float vector) is defined as the initial displacement of the body center of gravity (COG) [m] in the following format [x y z], Default = [0 0 0]. axis (3x1 float vector) is defined as the axis of rotation in the following format [x y z], Default = [0 1 0]. angle (float) is defined as the initial angular displacement of the body COG [rad], Default = 0.

+
+ +
+
+cableLength
+

(float) Cable equilibrium length (m), calculated from rotloc and preTension. Default =`0`.

+
+ +
+
+linearDamping
+

(1x6 float vector) linear damping aplied to body motions

+
+ +
+
+mass
+

(float) mass in kg, default 1

+
+ +
+
+name
+

(string) Defines the Cable name. Default = NOT DEFINED.

+
+ +
+
+orientation
+

(structure) Defines the orientation axis of the pto. z (1x3 float vector) defines the direciton of the Z-coordinate of the pto, Default = [0 0 1]. y (1x3 float vector) defines the direciton of the Y-coordinate of the pto, Default = [0 1 0]. x (1x3 float vector) internally calculated vector defining the direction of the X-coordinate for the pto, Default = []. rotationMatrix (3x3 float matrix) internally calculated rotation matrix to go from standard coordinate orientation to the pto coordinate orientation, Default = [].

+
+ +
+
+paraview
+

(integer) Flag for visualisation in Paraview either 0 (no) or 1 (yes). Default = 1 since only called in paraview.

+
+ +
+
+preTension
+

(float) Cable pretension (N).

+
+ +
+
+quadDrag
+

(structure) Defines the viscous quadratic drag forces. First option define drag, (6x6 float matrix), Default = zeros(6). Second option define cd, (6x1 float vector), Default = zeros(6,1), and area, (6x1 float vector), Default = zeros(6,1).

+
+ +
+
+stiffness
+

(float) Cable stiffness (N/m). Default = 0.

+
+ +
+
+viz
+

(structure) Defines visualization properties in either SimScape or Paraview. color (3x1 float vector) is defined as the body visualization color, Default = [1 1 0]. opacity (integer) is defined as the body opacity, Default = 1.

+
+ +
+
+base
+

internal

+
+ +
+
+follower
+

(structure) Defines the follower connection. centerBuoyancy (1 x 3 float vector) center of buoyancy location of the base drag body, Default = [0 0 0]. centerGravity (1 x 3 float vector) center of gravity location of the base drag body, Default = [0 0 0]. location (3x1 float vector) base location [m], Defined in the following format [x y z], Default = []. name (string) name of the base constraint or PTO, Default = ‘NOT DEFINED’;

+
+ +
+
Method Summary
+
+checkInputs()
+

This method checks WEC-Sim user inputs and generates error messages if parameters are not properly defined.

+
+ +
+
+setInitDisp(relCoord, axisAngleList, addLinDisp)
+

Function to set a body’s initial displacement

+

This function assumes that all rotations are about the same relative coordinate. +If not, the user should input a relative coordinate of 0,0,0 and +use the additional linear displacement parameter to set the cg or location +correctly.

+
+
Parameters:
+
    +
  • relCoord ([1 3] float vector) – Distance from x_rot to the body center of gravity or the constraint +or pto location as defined by: relCoord = cg - x_rot. [m]

  • +
  • axisAngleList ([nAngle 4] float vector) – List of axes and angles of the rotations with the +format: [n_x n_y n_z angle] (angle in rad) +Rotations applied consecutively in order of dimension 1

  • +
  • addLinDisp ([1 3] float vector) – Initial linear displacement (in addition to the +displacement caused by rotation) [m]

  • +
+
+
+
+ +
+
+setCg()
+

This method specifies the Cg of the drag bodies as coincident +with the fixed ends of the cable, if not otherwise specied.

+
+ +
+
+
+
+ +
+
+

Response Class

+
+
+class objects.responseClass
+
+

The responseClass creates an output object saved to the MATLAB workspace +that contains structures for each instance of a WEC-Sim class (e.g. +waveClass, bodyClass, constraintClass, ptoClass, +cableClass, mooringClass, etc).

+
+
+
+responseClass
+

This method initializes the responseClass, reads +output from each instance of a WEC-Sim class (e.g. +waveClass, bodyClass, ptoClass, mooringClass, etc) +and saves the response to an output object.

+
+
Returns:
+

output – responseClass object

+
+
Return type:
+

obj

+
+
+
+ +
+
+wave
+

This property contains a structure for each instance of the waveClass

+
    +
  • type (string) = ‘waveType’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • elevation (array) = [# of time-steps x 1]

  • +
  • waveGauge1Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 1

  • +
  • waveGauge2Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 2

  • +
  • waveGauge3Elevation (array) = [# of time-steps x 1] Wave elevation at the location of wave gauge 3

  • +
+
+ +
+
+bodies
+

This property contains a structure for each instance of the bodyClass (i.e. for each Body block)

+
    +
  • name (string) = ‘bodyName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • acceleration (array) = [# of time-steps x 6]

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of all hydrodynamic forces applied to the body

  • +
  • forceExcitation (array) = [# of time-steps x 6] The sum of the Froude-Krylov excitation force and the mean drift force exerted by the incoming wave on the body

  • +
  • forceRadiationDamping (array) = [# of time-steps x 6] The negative radiation damping force due to body velocity

  • +
  • forceAddedMass (array) = [# of time-steps x 6] The negative added mass force due to body acceleration

  • +
  • forceRestoring (array) = [# of time-steps x 6] The negative sum of the gravity force, buoyant force, the hydrostatic stiffness force, and any moment due to separation between the center of gravity and the center of buoyancy

  • +
  • forceMorisonAndViscous (array) = [# of time-steps x 6] The negative sum of the Morison element force and the viscous drag force

  • +
  • forceLinearDamping (array) = [# of time-steps x 6] The negative force due to linear damping and the body velocity

  • +
+

There are 4 additional output.bodies arrays when using nonlinear hydro and Paraview output:

+
    +
  • cellPressures_time (array) = [# of Paraview time-steps x 1] Nonlinear calculation timeseries

  • +
  • cellPressures_hydrostatic (array) = [# of Paraview time-steps x # of mesh faces] Hydrostatic pressure on each stl facet

  • +
  • cellPressures_waveLinear (array) = [# of Paraview time-steps x # of mesh faces] Excitation pressure on each stl facet given zero displacement and the mean free surface

  • +
  • cellPressures_waveNonLinear (array) = [# of Paraview time-steps x # of mesh faces] Excitation pressure on each stl facet given the instantaneous displacement and instantaneous free surface

  • +
+
+ +
+
+constraints
+

This property contains a structure for each instance of the constraintClass (i.e. for each Constraint block). Constraint motion is relative from frame F to frame B. Constraint forces act on frame F.

+
    +
  • name (string) = ‘constraintName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6] The constraint position relative to the initial condition

  • +
  • velocity (array) = [# of time-steps x 6] The constraint velocity relative to the initial condition

  • +
  • acceleration (array) = [# of time-steps x 6] The constraint acceleration relative to the initial condition

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
+
+ +
+
+ptos
+

This property contains a structure for each instance of the ptoClass (i.e. for each PTO block). PTO motion is relative from frame F to frame B. PTO forces act on frame F.

+
    +
  • name (string) = ‘ptoName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6] The constraint position relative to the initial condition

  • +
  • velocity (array) = [# of time-steps x 6] The constraint velocity relative to the initial condition

  • +
  • acceleration (array) = [# of time-steps x 6] The constraint acceleration relative to the initial condition

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of the actuation, constraint and internal mechanics forces

  • +
  • forceActuation (array) = [# of time-steps x 6] The prescribed force input to the PTO to control its motion

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
  • forceInternalMechanics (array) = [# of time-steps x 6] The net force in the joint DOF due to stiffness and damping

  • +
  • powerInternalMechanics (array) = [# of time-steps x 6] The net power lost in the joint DOF due to stiffness and damping

  • +
+
+ +
+
+cables
+

This property contains a structure for each instance of the cableClass (i.e. for each Cable block)

+
    +
  • name (string) = ‘cableName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • acceleration (array) = [# of time-steps x 6]

  • +
  • forceTotal (array) = [# of time-steps x 6] The sum of the actuation and constraint forces

  • +
  • forceActuation (array) = [# of time-steps x 6] The cable tension

  • +
  • forceConstraint (array) = [# of time-steps x 6] The force required to resist motion in the restricted DOFs

  • +
+
+ +
+
+mooring
+

This property contains a structure for each instance of the mooringClass using the mooring matrix (i.e. for each MooringMatrix block)

+
    +
  • position (array) = [# of time-steps x 6]

  • +
  • velocity (array) = [# of time-steps x 6]

  • +
  • forceMooring (array) = [# of time-steps x 6] The sum of the stiffness, damping and pretension forces applied on the body by the mooring

  • +
+
+ +
+
+moorDyn
+

This property contains a structure for each instance of the mooringClass using MoorDyn (i.e. for each MoorDyn block)

+
    +
  • Lines (struct) = [1 x 1] Contains the time and fairlead tensions

  • +
  • Line# (struct) = [1 x 1] One structure for each mooring line: Line1, Line2, etc. Each line structure contains node positions in x, y, z and segment tensions

  • +
+
+ +
+
+ptoSim
+

This property contains a structure for each instance of the ptoSimClass (i.e. for each PTO-Sim block).

+
+
    +
  • time (struct) = [# of time-steps x 1] Simulation timeseries

  • +
+

There are additional output.ptoSim structs corresponding to the Simulink blocks used:

+
    +
  • pistonCF (struct) = [1 x # of pistons] Structure containing timeseries of compressible fluid piston properties including absolute power, force, position, velocity

  • +
  • pistonNCF (array) = [1 x # of pistons] Structure containing timeseries of non-compressible fluid piston properties including absolute power, force, top pressure and bottom pressure

  • +
  • checkValve (struct) = [1 x # of valves] Structure containing timeseries of check valve properies including volume flow rate

  • +
  • valve (struct) = [1 x # of valves] Structure containing timeseries of valve properties including volume flow rate

  • +
  • accumulator (struct) = [1 x # of accumulators] Structure containing timeseries of accumulator properties including pressure and volume

  • +
  • hydraulicMotor (struct) = [1 x # of motors] Structure containing timeseries of hydraulic motor properties including angular velocity and volume flow rate

  • +
  • rotaryGenerator (struct) = [1 x # of generators] Structure containing timeseries of rotary generator properties including electrical power and generated power

  • +
  • simpleDD (struct) = [1 x # of generators] Structure containing timeseries of direct drive PTO properties including forces and electrical power

  • +
  • pmLinearGenerator (struct) = [1 x # of generators] Structure containing timeseries of permanent magnet linear generator properties including absolute power, force, friction force, current, voltage, velocity and electrical power

  • +
  • pmRotaryGenerator (struct) = [1 x # of generators] Structure containing timeseries of permanent magnet rotary generator properties including absolute power, force, friction force, current, voltage, velocity and electrical power

  • +
  • motionMechanism (struct) = [1 x # of mechanisms] Structure containing timeseries of motion mechanism properties including PTO torque, angular position and angular velocity

  • +
+
+
+
+windTurbine
+

This property contains a structure for each instance of the windTurbineClass

+
    +
  • name (string) = ‘windTurbineName’

  • +
  • time (array) = [# of time-steps x 1]

  • +
  • windSpeed (array) = [# of time-steps x 1]

  • +
  • turbinePower (array) = [# of time-steps x 1]

  • +
  • rotorSpeed (array) = [# of time-steps x 1]

  • +
  • bladePitch (array) = [# of time-steps x 1] Pitch position of blade 1

  • +
  • nacelleAcceleration (array) = [# of time-steps x 1]

  • +
  • towerBaseLoad (array) = [# of time-steps x 6] 6DOF force at the constraint between the floating body and tower base

  • +
  • towerTopLoad (array) = [# of time-steps x 6] 6DOF force at the constraint between the tower base and tower nacelle

  • +
  • bladeRootLoad (array) = [# of time-steps x 1] 6DOF force at the constraint between blade 1 and the hub

  • +
  • genTorque (array) = [# of time-steps x 1] Torque on the generator

  • +
  • azimuth (array) = [# of time-steps x 1] azimuthal angle of the generator

  • +
+
+ +
+ +
+
+
Constructor Summary
+
Property Summary
+
+ptoSim
+

This property contains a structure for each instance of the ptoSimClass (i.e. for each PTO-Sim block).

+
+ +
+
+windTurbine
+

This property contains a structure for each instance of the windTurbineClass

+
+ +
+
Method Summary
+
+plotResponse(bodyNum, comp)
+

This method plots the response of a body for a given DOF.

+
+
Parameters:
+
    +
  • bodyNum (integer) – the body number to plot

  • +
  • comp (integer) – the response component (i.e. dof) to be plotted (e.g. 1-6)

  • +
+
+
+
+ +
+
+plotForces(bodyNum, comp)
+

This method plots the forces on a body for a given DOF.

+
+
Parameters:
+
    +
  • bodyNum (integer) – the body number to plot

  • +
  • comp (integer) – the force component (i.e. dof) to be plotted (e.g. 1-6)

  • +
+
+
+
+ +
+
+saveViz(simu, body, waves, options)
+

This method plots and saves the wave elevation and body +geometry over time to visualize the waves and response

+
+
Parameters:
+
    +
  • simu – simulationClass object

  • +
  • body – bodyClass object

  • +
  • waves – waveClass object

  • +
  • options

    +
    axisLimits1x6 float matrix

    x, y, and z-bounds of figure axes in the format: +[min x, max x, min y, max y, min z, max z] +Default = [-simu.domainSize/2 simu.domainSize/2 +-simu.domainSize/2 simu.domainSize/2 -waves.waterDepth maximumHeight]

    +
    +
    timesPerFramefloat

    number of simulation time steps per video frame +(higher number decreases computation time) +Default = 1

    +
    +
    startEndTime1x2 float matrix

    Array defining the start and end times of the +visualization +Default = [min(t) max(t)]

    +
    +
    saveSettinginteger

    0 = video, 1 = gif. Default = 0

    +
    +
    +

  • +
+
+
+
+ +
+
+writeText()
+

This method writes WEC-Sim outputs to a (ASCII) text file. +This method is executed by specifying simu.outputtxt=1 +in the wecSimInputFile.m.

+
+ +
+
+
+
+ +
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/applications.html b/main/user/applications.html new file mode 100644 index 000000000..0de67cee3 --- /dev/null +++ b/main/user/applications.html @@ -0,0 +1,317 @@ + + + + + + + + + WEC-Sim Applications — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

WEC-Sim Applications

+

The WEC-Sim Applications +repository contains many more applications of the WEC-Sim code that demonstrate +WEC-Sim Advanced Features. This includes +tutorials by the WEC-Sim team as well as user-shared examples and covers topics +such as body interactions, numerical set-up, batch runs, visualization, control +examples, mooring and more. These applications highlight the +versatility of WEC-Sim and can be used as a starting point for users interested +in a given application. +It is highly recommended that users go through an application case along with the +relevant advanced feature section when learning to implement a new WEC-Sim feature. +The WEC-Sim Applications repository is included as a +submodule of the +WEC-Sim repository. The applications are summarized below.

+
+

Body-to-Body Interactions

+

Example using Body-to-Body (B2B) to run WEC-Sim for the RM3 +geometry. The scripts run and plot the RM3 model with B2B on/off and with +Regular/RegularCIC. Execute the runB2B.m script to run this case.

+
+
+

Controls

+

Examples using Controllers. +Examples of WEC-Sim models using various control methods are included for the RM3 +float geometry. These examples include passive, reactive, latching, declutching, and model predictive control methods.

+
+
+

Desalination

+

Example using WEC-Sim for desalination based on the OSWEC +geometry. Note the dependency on SimScape Fluids to run this desalination case.

+
+
+

Free Decay

+

Example using WEC-Sim to simulate free decay +of a sphere in heave, using Multiple Condition Runs. +Execute the runFreeDecay.m script to run this case.

+
+
+

Generalized Body Modes

+

Example using Generalized Body Modes +in WEC-Sim. In this application a barge is allowed four additional flexible +degrees of freedom. Note that this requires the BEM solver also account for +these general degrees of freedom and output the appropriate quantities required +by BEMIO.

+
+
+

Mooring

+

One example using the RM3 +geometry coupled with MoorDyn +to simulate a more realistic mooring system. And another example modeling the +RM3 with a Mooring Matrix. The MoorDyn application consists of 3 catenary +mooring lines attached to floating buoys and then to different points on the +spar and anchored at the sea floor.

+
+
+

Multiple Condition Run

+

Example using Multiple Condition Runs +to run the RM3. +These examples demonstrate each of the 3 different ways to run WEC-Sim with MCR +and generates a power matrix for each PTO damping value. The last example +demonstrates how to use MCR to vary the imported sea state test file and +specify corresponding phase. Execute wecSimMCR.m from the case directory to +run an example.

+
    +
  • MCROPT1: Cases defined using arrays of values for period and height.

  • +
  • MCROPT2: Cases defined with wave statistics in an Excel spreadsheet

  • +
  • MCROPT3: Cases defined in a MATLAB data file (.mat)

  • +
  • MCROPT4: Cases defined using several MATLAB data files (*.mat) of the +wave spectrum

  • +
+
+
+

Nonhydrodynamic Body

+

Example using Non-Hydro Body +to run WEC-Sim for the OSWEC. +This example models the base as a nonhydro body, and the flap as a hydrodynamic +body.

+
+
+

Nonlinear Hydrodynamic Body

+

Example using Nonlinear Hydro +to run WEC-Sim for a heaving ellipsoid. +Includes examples of running nonlinear hydrodynamics with different fixed and +variable time-step solvers +(ode4/ode45), and different regular wave formulations (with/without CIC). +Execute the runNL.m script to run this case.

+
+
+

Paraview Visualization

+

Example using ParaView data visualization for WEC-Sim coupled with MoorDyn +to simulate a more realistic mooring system for the RM3 +geometry. Example consists of 3 catenary mooring lines attached to different +points on the spar and anchored at the sea floor.

+

Example using ParaView data visualization for WEC-Sim with Nonlinear Hydro +for the Flap and a Non-Hydro Body +for the Base to run WEC-Sim for the OSWEC +geometry.

+
+
+

Passive Yaw

+

Example on using Passive Yaw +to run WEC-Sim for the OSWEC geometry. +Execute the runYawCases.m script to run this case.

+
+
+

PTO-Sim

+

Examples using PTO-Sim. +Examples of WEC-Sim models using PTO-Sim are included for the RM3 +geometry and OSWEC +geometry.

+
+
+

RM3 PTO Extension

+

Examples on using the PTO Extension advanced feature to set-up an initial displacement of the RM3 easily. +This geometry is a special case with a large DOF in which different WEC bodies can be identified as the PTO mechanism with a cooresponding position change when setting the PTO Initial Displacement.

+
+
+

Visualization Markers

+

Examples of WEC-Sim with Wave Elevation visualization at User-Defined Locations. +The setup for the visualization can be found at Advanced Features <https://github.com/WEC-Sim/advanced_features>

+
+
+

WECCCOMP

+

Numerical model for the WEC Control Competition (WECCCOMP) using WEC-Sim to +model the WaveStar with various fault implementations can be found in the WECCCOMP repository. +See the project report written by Erica Lindbeck in the “report” folder.

+
+
+

Write HDF5

+

This is an example of how to write your own h5 file using MATLAB. Can be useful +if you want to modify your coefficients, use experimental coefficients, or +coefficients from another BEM code other than WAMIT, NEMOH, AQWA, or CAPYTAINE. For more +details see BEMIO +documentation.

+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/code_structure.html b/main/user/code_structure.html new file mode 100644 index 000000000..228ff69c0 --- /dev/null +++ b/main/user/code_structure.html @@ -0,0 +1,1098 @@ + + + + + + + + + Code Structure — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Code Structure

+

This section provides a description of the WEC-Sim source code and its +structure. For more information about WEC-Sim’s code structure, refer to the +Code Structure webinar.

+
+

WEC-Sim Source Code

+

The directory where the WEC-Sim code is contained is referred to as $WECSIM +(e.g. C:/User/Documents/GitHub/WEC-Sim). The WEC-Sim source code files are +contained within a source directory referred to as $WECSIM/source. The +WEC-Sim source code consists primarily of three components as described in the table:

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File name

Directory

WEC-Sim Executable

wecSim.m

$WECSIM/source

WEC-Sim MATLAB Functions

<functionName>.m

$WECSIM/source/functions

WEC-Sim MATLAB Classes

<objectClass>.m

$WECSIM/source/objects

WEC-Sim Simulink Library

WECSim_Lib.slx

$WECSIM/source/lib

+

The WEC-Sim executable is the wecSim.m file. +Executing wecSim from a case directory parses the user input data, +performs pre-processing calculations in each of the classes, selects and +initializes variant subsystems in the Simulink model, runs the time-domain +simulations in WEC-Sim, and calls post-processing scripts. +When a WEC-Sim case is properly set-up, the user only needs to use the single command wecSim +in the command line to run the simulation.

+

Users can run WEC-Sim from the command line with the command wecSim or from directly from Simulink, +refer to Running from Simulink.

+
+
+

WEC-Sim Classes

+

All information required to run WEC-Sim simulations is contained within the +simu, waves, body(i), constraint(i), pto(i), cable(i), and +mooring(i) objects (instances of the simulationClass, waveClass, bodyClass, +constraintClass, ptoClass, cableClass, and mooringClass). +Users can instantiate and interact with these classes within the WEC-Sim input +file (wecSimInputFile.m). The following Source Details +section describes the role of the WEC-Sim objects, and how to and interact with the +WEC-Sim objects to define input properties.

+

There are two ways to look at the available properties and methods within a +class. The first is to type doc <className> in Matlab Command Window, and +the second is to open the class definitions located in the +$WECSIM/source/objects directory by typing open <className> in MATLAB +Command Window. The latter provides more information since it also defines the +different fields in a structure.

+
+
+

WEC-Sim Library

+

In addition to the wecSimInputFile.m that instantiates classes, a WEC-Sim +simulation requires a simulink model (*.slx) that represents the WEC +system components and their connectivity. Similar to how the input file uses the +WEC-Sim classes, the Simulink model uses WEC-Sim library blocks. There should +be a one-to-one relationship between the objects defined in the input file and +the blocks used in the Simulink model.

+

The WEC-Sim library is divided different types of library blocks. +Users should be able to model their WEC device using the available WEC-Sim +blocks (and possibly other Simulink/Simscape blocks). The image below shows the +WEC-Sim block grouping by type.

+
+../_images/WEC-Sim_Lib.PNG + +
+

The following sections describe the different library types, the related class, and their general +purpose.

+
+
+

Source Details

+

The WEC-Sim Classes and Library Blocks interact with one another during a simulation. +The classes contain functions for initialization, reading input data, pre-processing and post-processing. +The library blocks use these pre-processed parameters during the time-domain simulation in Simulink. +The relationship between WEC-Sim Classes and their corresponding Library Blocks are described in the following sections, and summarized in the table below.

+ + + + + + + + + + + + + + + + + + + + + + + + +

WEC-Sim Classes

Corresponding Library Blocks

Simulation Class and Wave Class

Frames

Body Class

Body Elements

Constraint Class

Constraints

PTO Class

PTOs

Cable Class

Cables

Mooring Class

Moorings

+
+

Simulation Class

+

The simulation class contains the simulation parameters, flags and solver +settings necessary to execute the WEC-Sim code. These simulation parameters +include numerical settings such as the time step, start time, differential +equation solver method, and flags for various output options and nonlinear +hydrodynamics options. At a high level, the simulation class interacts with the +rest of WEC-Sim as shown in the diagram below. The most common flags and +attributes that are passed to other objects are the start, end, and ramp times, +time steps, global variables (gravity, density, etc).

+
+../_images/simulation_diagram.png + +
+
+

Simulation Class Initialization

+

Within the wecSimInputFile.m, users +must initialize the simulation class (simulationClass) and specify the name +of the WEC-Sim (*.slx) model file by including the following lines:

+
simu=simulationClass();
+simu.simMechanicsFile='<modelFile>.slx'
+
+
+

All simulation class properties are specified as variables within the simu +object as members of the simulationClass. +The WEC-Sim code has default values defined for the simulation class +properties. These default values can be overwritten by the user in the input file, +for example, the end time of a simulation can be set by entering the following command: +simu.endTime = <user specified end time>.

+

Users may specify other simulation class properties using the simu object +in the wecSimInputFile.m, such as:

+ + + + + + + + + + + + + + + +

Simulation start time

simu.startTime

End time

simu.endTime

Ramp time

simu.rampTime

Time step

simu.dt

+

Available simulation properties, default values, and functions can be found by +typing doc simulationClass in the MATLAB command window, or by opening the +simulationClass.m file in $WECSIM/source/objects directory by typing open +simulationClass in MATLAB Command Window. +For more information about application of WEC-Sim’s simulation class, refer to +Simulation Features.

+
+
+

Frame Block

+

The simulation class is tied to the Frames library. +The Frames library contains one block that is necessary in every model. The +Global Reference Frame block defines the global coordinates, solver +configuration, seabed and free surface description, simulation time, and other +global settings. It can be useful to think of the Global Reference Frame as +being the seabed when creating a model. Every model requires one instance of +the Global Reference Frame block. The Global Reference Frame block uses the +simulation class variable simu and the wave class variable waves, which +must be defined in the input file.

+
+../_images/WEC-Sim_Lib_frames.PNG + +
+
+
+
+

Wave Class

+

The wave class contains all wave information necessary to define the incident +wave condition for the WEC-Sim time-domain simulation. The wave class contains +the incoming wave information that determines the excitation +force, added mass, radiation damping and other frequency based parameters that +influence a body’s motion.

+

At a high level, the wave class interacts with the rest of WEC-Sim as shown in +the diagram below. The wave primarily interacts with the body class +through the pre-processing of wave forces and in Simulink.

+
+../_images/wave_diagram.PNG + +
+
+

Wave Class Initialization

+

Within the wecSimInputFile.m, users +must initialize the wave class (waveClass) and specify the waveType by +including the following line:

+
waves = waveClass('<waveType>');
+
+
+

Users must specify additional wave class properties using the waves object +depending on which wave type is selected, as shown in the table below. A more +detailed description of the available wave types is given in the following +sections.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Wave Type

Required Properties

noWave

waves.period

noWaveCIC

regular

waves.height, waves.period

regularCIC

waves.height, waves.period

irregular

waves.height, waves.period, waves.spectrumType

spectrumImport

waves.spectrumFile

elevationImport

waves.elevationFile

+

Available wave class properties, default values, and functions can be found by +typing doc waveClass in the MATLAB command window, or by opening the +waveClass.m file in $WECSIM/source/objects directory by typing open +waveClass in the Matlab Command Window. +For more information about application of WEC-Sim’s wave class, refer to +Wave Features.

+
+
+

noWave

+

The noWave case is for running WEC-Sim simulations with no waves and +constant radiation added mass and wave damping coefficients. The noWave +case is typically used to run decay tests. Users must still provide hydro +coefficients from a BEM solver before executing WEC-Sim and specify the period +(wave.T) from which the hydrodynamic coefficients are selected.

+

The noWave case is defined by including the following in the input file:

+
waves = waveClass('noWave');
+waves.period = <wavePeriod>; %[s]
+
+
+
+
+

noWaveCIC

+

The noWaveCIC case is the same as the noWave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass.

+

The noWaveCIC case is defined by including the following in the input file:

+
waves = waveClass('noWaveCIC');
+
+
+
+
+

regular

+

The regular wave case is used for running simulations in regular waves with +constant radiation added mass and wave damping coefficients. Using this option, +WEC-Sim assumes that the system dynamic response is in sinusoidal steady-state +form, where constant added mass and damping coefficients are used (instead of +the convolution integral) to calculate wave radiation forces. Wave period +(wave.T) and wave height (wave.H) must be specified in the input file.

+

The regular case is defined by including the following in the input file:

+
waves = waveClass('regular');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+
+
+
+
+

regularCIC

+

The regularCIC is the same as regular wave case described above, but with +the addition of the convolution integral calculation. The only difference is +that the radiation forces are calculated using the convolution integral and the +infinite frequency added mass. Wave period (wave.T) and wave height +(wave.H) must be specified in the input file.

+

The regularCIC case is defined by including the following in the input file:

+
waves = waveClass('regularCIC');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+
+
+
+
+

irregular

+

The irregular wave case is the wave type for irregular wave simulations +using a Pierson Moskowitz (PM) or JONSWAP (JS) wave spectrum as defined by the +IEC TS 62600-2:2019 standards. Significant wave height (wave.H), peak +period (wave.T), and wave spectrum type (waves.spectrumtype) must be +specified in the input file. The available wave spectra and their corresponding +waves.spectrumType are listed below:

+ + + + + + + + + + + + +

Wave Spectrum

spectrumType

Pierson Moskowitz

PM

JONSWAP

JS

+

The irregular case is defined by including the following in the input file:

+
waves = waveClass('irregular');
+waves.period = <wavePeriod>; %[s]
+waves.height = <waveHeight>; %[m]
+waves.spectrumType = '<waveSpectrum>';
+
+
+

When using the JONSWAP spectrum, users have the option of defining gamma by +specifying waves.gamma = <waveGamma>;. If gamma is not defined, +then gamma is calculated based on a relationship between significant wave +height and peak period defined by IEC TS 62600-2:2019.

+
+
+

spectrumImport

+

The spectrumImport case is the wave type for irregular wave simulations +using an imported wave spectrum (ex: from buoy data). The user-defined spectrum +must be defined with the wave frequency (Hz) in the first column, and the +spectral energy density (m^2/Hz) in the second column. Users have the option to +specify a third column with phase (rad); if phase is not specified by the user +it will be randomly defined. An example file is provided in the +$WECSIM/examples/*/spectrumData.mat directory. The spectrumImport case is defined by including the following +in the input file:

+
waves = waveClass('spectrumImport');
+waves.spectrumFile ='<spectrumFile >.mat';
+
+
+
+

Note

+

When using the spectrumImport option, users must specify a sufficient +number of wave frequencies (typically ~1000) to adequately describe the +wave spectra. These wave frequencies are the same that will be used to +define the wave forces on the WEC, for more information refer to the +Irregular Wave Binning section.

+
+
+
+

elevationImport

+

The elevationImport case is the wave type for wave simulations using user-defined +time-series (ex: from experiments). The user-defined wave surface elevation +must be defined with the time (s) in the first column, and the wave surface +elevation (m) in the second column. An example of this is given in the +elevationData.mat file in the tutorials directory folder of the WEC-Sim source +code. The elevationImport case is defined by including the following in the input +file:

+
waves = waveClass('elevationImport');
+waves.elevationFile ='<elevationFile>.mat';
+
+
+

When using the elevationImport option, excitation forces are calculated via +convolution with the excitation impulse response function. This solution method +is not particularly robust and the quality of the results can depend heavily on +the discretization and range of the BEM data. This is especially true for elevation +data that contains a small number of frequencies (e.g., an approximation of regular +wave). Further, a number of advanced features are not available for this solution +method. Direct multiplication of the frequency components, as performed in the +spectrumImport and irregular methods is a more robust and capable approach, +but requires developing a ‘<spectrumFile>.mat’ that is time-domain equivalent to ‘<elevationFile>.mat’. +For this workflow, the elevationToSpectrum function has been provided in +$WEC-Sim/source/functions/BEMIO.

+
+
+
+

Body Class

+

The body class represents each rigid or flexible body that comprises the WEC +being simulated. It contains the mass and hydrodynamic properties of each body, +defined by hydrodynamic data from the *.h5 file. The corresponding body block +uses the hydrodynamic data and wave class to calculate all relevant forces on +the body and solve for its resultant motion. At a high level, the body class +interacts with the rest of WEC-Sim as shown in the diagram below. +Bodies hold hydrodynamic BEM input data, calculate body forces and pass forces +and motions to other Simulink blocks.

+
+../_images/body_diagram.PNG + +
+
+

Body Class Initialization

+

Within the wecSimInputFile.m, +users must initialize each iteration of the body class (bodyClass), and +specify the location of the hydrodynamic data file (<bemData>.h5) and geometry +file (<geomFile>.stl) for each body. The body class is defined by including the +following lines in the WEC-Sim input file, where i is the body number and +‘<bem_data>.h5’ is the name of the h5 file containing the BEM results:

+
body(i)=bodyClass('<bemData>.h5')
+body(i).geometryFile = '<geomFile>.stl';
+
+
+

WEC-Sim bodies may be one of four types: hydrodynamic, flexible, +drag, or nonhydrodynamic. These types represent varying degrees of complexity +and require various input parameters and BEM data, detailed in the table below. +The Body Features section contains more details on these +important distinctions.

+ + + + + + + + + + + + + + + + + + + + +

Body Type

Description

Hydrodynamic Body

body(i)=bodyClass('<bemData>.h5') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia

Drag Body

body(i)=bodyClass('') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia +body(i).centerGravity +body(i).centerBuoyancy +body(i).volume +body(i).nonHydro=1

Nonhydrodynamic Body

body(i)=bodyClass('') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia +body(i).centerGravity +body(i).centerBuoyancy +body(i).volume +body(i).nonHydro=2

Flexible Body

body(i)=bodyClass('<bemData>.h5') +body(i).geometryFile = '<geomFile>.stl' +body(i).mass +body(i).intertia

+

Users may specify other body class properties using the body object for +each body in the wecSimInputFile.m. +Important body class properties include quantities such as +the mass, moment of inertia, center of gravity and center of buoyancy. +Other parameters are specified as needed. +For example, viscous drag can be specified by entering the viscous drag +coefficient and the characteristic area in vector format the WEC-Sim +input file as follows:

+
body(i).quadDrag.cd = [0 0 1.3 0 0 0]
+body(i).quadDrag.area = [0 0 100 0 0 0]
+
+
+

Available body properties, default values, and functions can be found by typing +doc bodyClass in the MATLAB command window, or opening the bodyClass.m +file in $WECSIM/source/objects directory by typing open bodyClass in +Matlab Command Window. +For more information about application of WEC-Sim’s body class, refer to +Body Features.

+
+

Note

+

The *.h5 file defines the hydrodynamic data for all relevant bodies. It is +required that any drag body or nonhydrodyamic body be numbered after all +hydrodynamic bodies The body index must correspond with the index in the +*.h5 file and the number in the Simulink diagram.

+
+
+
+

Body Blocks

+

The Body Class is most closely associated with the Body Elements library. +The Body Elements library shown below contains four body types in two blocks: +the Rigid Body block and the Flex Body block. The rigid body block is +used to represent hydrodynamic, nonhydrodynamic, and drag bodies. Each type of +rigid body is a Variant Sub-system. +Before simulation, one variant is activated by a flag in the body object +(body.nonHydro=0,1,2). The flex body block is used to represent hydrodynamic +bodies that contain additional flexible degrees of freedom (‘generalized body +modes’). The flex body is determined automatically by the degrees of freedom +contained in the BEM input data. At least one instance of a body +block (rigid or flex) is required in each model. The +Body Features section describes the various types of +WEC-Sim bodies in detail.

+

Both in Simulink and the input file, the user has to name the blocks +body(i) (where i=1,2,…). The mass properties, hydrodynamic data, geometry +file, mooring, and other properties are then specified in the input file. +Within the body block, the wave radiation, wave excitation, hydrostatic +restoring, viscous damping, and mooring forces are calculated.

+
+../_images/WEC-Sim_Lib_bodies.PNG + +
+
+
+
+

Constraint Class

+

The WEC-Sim constraint class and blocks connect WEC bodies to one another (and +possibly to the seabed) by constraining DOFs. Constraint objects do not apply +any force or resistance to body motion outside of the reactive force required +to prevent motion in a given DOF. At a high level, the constraint class +interacts with the rest of WEC-Sim as shown in the diagram below. Constraint +objects largely interact with other blocks through Simscape connections that +pass resistive forces to other bodies, constraints, ptos, etc.

+
+../_images/constraint_diagram.PNG + +
+
+

Constraint Class Initialization

+

The properties of the constraint class (constraintClass) are defined in the +constraint object. Within the wecSimInputFile.m, users must initialize +each iteration the constraint class (constraintClass) and specify the +constraintName, by including the following lines:

+
constraint(i)=constraintClass('<constraintName>');
+
+
+

For rotational constraint (ex: pitch), users may also specify the +location and orientation of the rotational joint with respect to the global +reference frame:

+
constraint(i).location = [<x> <y> <z>];
+constraint(i).orientation.z = [<x> <y> <z>];
+constraint(i).orientation.y = [<x> <y> <z>];
+
+
+

Available constraint properties, default values, and functions can be found by +typing doc constraintClass in the MATLAB command window, or opening the +constraintClass.m file in $WECSIM/source/objects directory by typing +open constraintClass in MATLAB Command Window. +For more information about application of WEC-Sim’s constraint class, refer to +Constraint and PTO Features.

+
+
+

Constraint Blocks

+

The Constraint Class is tied to the blocks within the Constraints library. +These are used to define the DOF of a +specific body. Constraint blocks define only the DOF, but do not otherwise +apply any forcing or resistance to the body motion. Each Constraint block has +two connections: a base (B) and a follower (F). The Constraints block restricts +the motion of the block that is connected to the follower relative to the block +that is connected to the base. For a single body system, the base would be the +Global Reference Frame and the follower is a Rigid Body.

+
+../_images/WEC-Sim_Lib_constraints.PNG + +
+

A brief description of each constraint block is given below. More information +can also be found by double clicking on the library block and viewing the Block +Parameters box.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Constraint Library

Block

DOFs

Description

Fixed

0

Rigid connection. Constrains all motion +between the base and follower

Translational

1

Constrains the motion of the follower +relative to the base to be translation +along the constraint’s Z-axis

Rotational

1

Constrains the motion of the follower +relative to the base to be rotation +about the constraint’s Y-axis

Spherical

3

Contrains the motion of the follower +relative to the base to be rotation about +the X-, Y-, and Z- axis.

Floating (3DOF)

3

Constrains the motion of the follower +relative to the base to planar motion +with translation along the constraint’s +X- and Z- and rotation about the Y- axis

Floating (6DOF)

6

Allows for unconstrained motion of the +follower relative to the base

+
+
+
+

PTO Class

+

WEC-Sim Power Take-Off (PTO) blocks connect WEC bodies to one other (and +possibly to the seabed) by constraining DOFs and applying linear damping and +stiffness. The ability to apply damping, stiffness, or other external forcing +differentiates a ‘PTO’ from a ‘Constraint’. The damping and stiffness allow a +pto to extract power from relative body motion with respect to a fixed reference +frame or another body.

+

At a high level, the PTO class interacts with the rest of WEC-Sim as shown in +the diagram below. PTO objects largely interact with other blocks through +Simscape connections that pass resistive forces to other bodies, constraints, +ptos, etc.

+
+../_images/pto_diagram.PNG + +
+
+

PTO Class Initialization

+

The properties of the PTO class (ptoClass) are +defined in the pto object. Within the wecSimInputFile.m, users must +initialize each iteration the pto class (ptoClass) and specify the +ptoName, by including the following lines:

+
pto(i) = ptoClass('<ptoName>');
+
+
+

For rotational ptos, the user also needs to specify the location of the +rotational joint with respect to the global reference frame in the +pto(i).location variable. In the PTO class, users can also specify +linear damping (pto(i).damping) and stiffness (pto(i).stiffness) values to +represent the PTO system (both have a default value of 0). Users can overwrite +the default values in the input file. For example, users can specify a damping +value by entering the following in the WEC-Sim input file:

+
pto(i).damping = <ptoDamping>;
+pto(i).stiffness = <ptoStiffness>;
+
+
+

Available pto properties, default values, and functions can be found by typing +doc ptoClass in the MATLAB command window, or opening the ptoClass.m file +in $WECSIM/source/objects directory by typing open ptoClass in MATLAB +Command Window. +For more information about application of WEC-Sim’s pto class, refer to +Constraint and PTO Features.

+
+
+

PTO Blocks

+

The PTO Class is tied to the PTOs library. +Similar to the Constraint blocks, the PTO blocks have a base (B) and +a follower (F). Users must name each PTO block pto(i) +(where i=1,2,…) and then define their properties in the input file.

+

The Translational PTO, Spherical PTO, and Rotational PTO are identical to the +Translational, Spherical, and Rotational constraints, but they allow for the +application of linear damping and stiffness forces. Additionally, there are two +other variations of the Translational and Rotational PTOs. The Actuation +Force/Torque PTOs allow the user to define the PTO force/torque at each +time-step and provide the position, velocity and acceleration of the PTO at +each time-step. The user can use the response information to calculate the PTO +force/torque. The Actuation Motion PTOs allow the user to define the motion of +the PTO. These can be useful to simulate forced-oscillation tests.

+
+../_images/WEC-Sim_Lib_pto.PNG + +
+
+

Note

+

When using the Actuation Force/Torque PTO or Actuation Motion PTO blocks, +the loads and displacements are specified in the local (not global) +coordinate system. This is true for both the sensed (measured) and actuated +(commanded) loads and displacements.

+
+
+
+
+

Cable Class

+

WEC-Sim Cable blocks connect WEC bodies to one other by a cable. +They allows users to apply damping and/or stiffness when the cable is in tension, +but allow no forcing in compression. +At a high level, the cable class interacts with the rest of WEC-Sim as shown in the diagram below.

+
+../_images/cable_diagram.PNG + +
+
+

Cable Class Initialization

+

The properties of the cable class (cableClass) are defined in the cable object. +Within the wecSimInputFile.m, users must initialize the cable class and specify the +cableName, in addition to the baseConnection and followerConnection (in that order), by including the following lines:

+
cable(i) = cableClass('cableName','baseConnection','followerConnection');
+cable(i).damping = <cableDamping>;
+cable(i).stiffness = <cableStiffness>;
+
+
+

Available cable properties, default values, and functions +can be found by typing doc cableClass in the MATLAB command window, or +opening the cableClass.m file in $WECSIM/source/objects directory by +typing open cableClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Cable Features.

+
+
+

Cable Block

+

The Cable Class is tied to the Cables library. +The Cable block applies linear damping and stiffness based on +the motion between the base and follower. +Cables can be used between two bodies to apply a coupling force only when taut or stretched. +A cable block must be added to the model between two PTOs or constraints that are to be connected by the cable.

+
+../_images/WEC-Sim_Lib_cable.PNG + +
+
+
+
+

Mooring Class

+

The mooring class (mooringClass) allows for different fidelity simulations +of mooring systems. Three possibilities are available, a lumped mooring matrix, +a mooring lookup table, or MoorDyn. These differences are determined by the Simulink block(s) chosen, and are +described below. At a high level, the Mooring class interacts with the rest of +WEC-Sim as shown in the diagram below. The interaction is similar to a +constraint or PTO, where some resistive forcing is calculated and passed to a +body block through a Simscape connection.

+
+../_images/mooring_diagram.PNG + +
+
+

Mooring Class Initialization

+

The properties of the mooring class (mooringClass) are defined in the +mooring object. Within the wecSimInputFile.m, users must initialize +the mooring class and specify the mooringName, by including the following lines:

+
mooring(i)= mooringClass('<mooringName>');
+
+
+

Available mooring properties, default values, and functions +can be found by typing doc mooringClass in the MATLAB command window, or +opening the mooringClass.m file in $WECSIM/source/objects directory by +typing open mooringClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Mooring Features.

+
+
+

Mooring Blocks

+

The Mooring Class is tied to the Moorings library. +Four types of blocks may be used: a ‘Mooring Matrix’, a ‘Mooring Lookup Table’, +a ‘MoorDyn Connection’ block, or a ‘MoorDyn Caller’ block. +The MooringMatrix block applies linear damping and stiffness based on +the motion of the follower relative to the base. +Damping and stiffness can be specified between all DOFs in a 6x6 matrix. +The MooringLookupTable block searches a user-supplied 6DOF force lookup table. +The lookup table should contain six parameters: the resultant mooring force in each degree of freedom. +Each force is indexed by position in all six degrees of freedom. +The mooring force is interpolated between indexed positions based on the instantaneous position of the mooring system. +There are no restrictions on the number of MooringMatrix or MooringLookupTable blocks.

+

The MoorDynConnection block is used to detect the relative motion between +two connection points (i.e., a body and the global reference frame or between +two bodies). The block uses Simulink’s ‘Goto’ and ‘From’ blocks to feed the +relative response to the MoorDynCaller block, which then calls MoorDyn to +calculate the 6 degree of freedom mooring forces based on the instantaneous displacement, +velocity, a MoorDyn input file, and the compiled MoorDyn libraries to simulate a realistic +mooring system. The mooring forces are then sent back to the MoorDyn Connection +block to be applied at the body’s center of gravity. Multiple MoorDyn Connection +blocks can be used to specify mooring lines between different bodies/frames, +but there can only be one MoorDyn Caller block per Simulink model. Each +MoorDyn Connection block should be initialized as a mooring object in +the wecSimInputFile.m with mooring(i).moorDyn set equal to 1. The +MoorDynCaller block should not have an accompanying mooring object. +If set up correctly in the wecSimInputFile.m, the signals will be +automatically sent between the MoorDyn Connection and MoorDyn Caller blocks.

+
+../_images/WEC-Sim_Lib_mooring.PNG + +
+
+
+
+

PTO-Sim Class

+

The PTO-Sim class contains all the information for the PTO-Sim blocks, which can be used to simulate PTO systems. +The difference beetween the PTO-Sim class and the PTO class is that the PTO-Sim class have detailed models of different components +that are used in PTO systems such as hydraulic cylinders, hydraulic accumulators, hydraulic motors, electric generators, etc., +while the PTO class have a linear parametric model that summarizes the PTO dynamics with a stiffness and a damping term. +At a high level, the PTO-Sim class interacts with the rest of +WEC-Sim as shown in the diagram below:

+
+../_images/PTOSimClass_diagram.png + +
+

The PTO-Sim blocks receive the linear or angular response from the PTO blocks and give either the torque or the force depending on the PTO dynamics.

+
+

PTO-Sim Class Initialization

+

The properties of the PTO-Sim class (ptoSimClass) are defined in the ptoSim object. The PTO-Sim class must be +initialized in the wecSimInputFile.m script. There are three properties that must be initialized for all the PTO-Sim blocks, +those are the name, the block number, and the type:

+
ptoSim(i) = ptoSimClass('ptoSimName');
+ptoSim(i).ptoSimNum = i;
+ptoSim(i).ptoSimType = <TypeNumber>;
+
+
+

The type value must be defined depending on the type of block used in the simulation as follows:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

PTO-Sim Library

Block

Type

Electric Generator

1

Hydraulic cylinder

2

Hydraulic accumulator

3

Rectifying check +valve

4

Hydraulic motor

5

Linear crank

6

Adjustable rod

7

Check valve

8

Direct drive +linear generator

9

Direct drive +rotary generator

10

+

Available PTO-Sim blocks properties, default values, and functions +can be found by typing doc ptoSimClass in the MATLAB command window, or +opening the ptoSimClass.m file in $WECSIM/source/objects directory by +typing open ptoSimClass in MATLAB Command Window. +For more information about application of WEC-Sim’s mooring class, refer to +Constraint and PTO Features.

+
+
+

PTO-Sim Blocks

+

There are eight different types of blocks in the PTO-Sim class divided +in three sub-categories: Hydraulic, Electric, and Motion Conversion. In the hydraulic sub-category +there are five blocks: Check Valve, Compressible Fluid Piston, +Gas-Charged Hydraulic Accumulator, Hydraulic Motor, and Rectifying Check Valve. +In the Electric sub-category there is a block call Electric Generator Equivalent Circuit which models an electric generator +with an equivalent circuit. The motion conversion blocks (Rotary to Linear Adjustable Rod, and +Rotary to Linear Crank) can be used to to convert rotational motion into linear motion to add a hydraulic cylinder +to the PTO model. There are no restrictions on the number of PTO-Sim blocks.

+
+../_images/WEC-Sim_Lib_PTOSim.png + +
+
+
+
+

Response Class

+

The response class contains all the output time-series and methods to plot and +interact with the results. It is not initialized by the user, and there is no +related Simulink block. Instead, it is +created automatically at the end of a WEC-Sim simulation. The response class +does not input any parameter back to WEC-Sim, only taking output data from the +various objects and blocks.

+

After WEC-Sim is done running, there will be a new variable called output +saved to the MATLAB workspace. The output object is an instance of the +responseClass. It contains all the relevant time-series results of the +simulation. Time-series are given as [# of time-steps x 6] arrays, where 6 is the degrees of freedom. +Refer to the WEC-Sim API documentation for the Response Class for +information about the structure of the output object, .

+
+
+
+

Functions & External Codes

+

While the bulk of the WEC-Sim code consists of the WEC-Sim classes and the +WEC-Sim library, the source code also includes supporting functions and +external codes. These include third party Matlab functions to read *.h5 and +*.stl files, WEC-Sim Matlab functions to write *.h5 files and run +WEC-Sim in batch mode, MoorDyn compiled libraries, python macros for ParaView +visualization, and the PTO-Sim class and library. Additionally, BEMIO can be +used to create the hydrodynamic *.h5 file required by WEC-Sim. MoorDyn is +an open source code that must be downloaded separately. Users may also obtain, +modify, and recompile the code as desired.

+
+ +
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/getting_started.html b/main/user/getting_started.html new file mode 100644 index 000000000..db470ce50 --- /dev/null +++ b/main/user/getting_started.html @@ -0,0 +1,321 @@ + + + + + + + + + Getting Started — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Getting Started

+

This section provides instructions on how to download and install WEC-Sim.

+
+

MATLAB Requirements

+

WEC-Sim is developed in MATLAB/Simulink, and requires the following toolboxes:

+ + + + + + + + + + + + + + + + + + +

Required Toolbox

Oldest Compatible Version

MATLAB

Version 9.9 (R2020b)

Simulink

Version 10.2 (R2020b)

Simscape

Version 5.0 (R2020b)

Simscape Multibody

Version 7.2 (R2020b)

+

WEC-Sim’s Simulink Library is saved in MATLAB R2020b, and WEC-Sim tests are run on the last four releases of MATLAB. +Any version of MATLAB newer than R2020b should be compatible with WEC-Sim, however we do not test all MATLAB releases. +The stability of each MATLAB release is available via WEC-Sim’s GitHub Actions. +Certain advanced features rely on external functions (such as MoorDyn), and additional MATLAB Toolboxes (such as Parallel Computing Toolbox (PCT)).

+

Verify that the MATLAB required toolboxes are installed by typing ver in the MATLAB Command Window:

+
>> ver
+-----------------------------------------------------------------------------------------------------
+MATLAB Version: 9.9.0.1592791 (R2020b)
+-----------------------------------------------------------------------------------------------------
+MATLAB                                                Version 9.9         (R2020b)
+Simulink                                              Version 10.2        (R2020b)
+Simscape                                              Version 5.0         (R2020b)
+Simscape Multibody                                    Version 7.2         (R2020b)
+
+
+
+
+

Download WEC-Sim

+

The WEC-Sim source code is hosted on WEC-Sim’s GitHub repository. +WEC-Sim users should clone WEC-Sim’s Github repository. +Cloning the repository allows users to easily pull the latest updates to the WEC-Sim source code. +The WEC-Sim source code can be cloned by installing Git Large File Storage (git lfs) to access large files (e.g. *.h5 files), and cloning the WEC-Sim GitHub repository.

+

To install WEC-Sim using git:

+
>> git lfs install
+>> git clone https://github.com/WEC-Sim/WEC-Sim
+
+
+

The local copy of WEC-Sim can easily be updated to include updates from the main version of the WEC-Sim source code hosted on the GitHub by using the git pull command:

+
>> git pull origin main
+
+
+

For users who are new to git, it is recommended to go through examples on GitHub or other sources while getting started. +If you have problems downloading or installing please see the Troubleshooting page.

+

For developers who wish to contribute to WEC-Sim, refer to the Developer Getting Started section.

+
+

Note

+

Users may also download a static version of WEC-Sim from the latest tagged +WEC-Sim Release. This is +the easiest way to obtain the WEC-Sim code, however users must manually +download new releases for updates.

+
+
+
+

Install WEC-Sim

+

Once you have downloaded the WEC-Sim source code, take the following steps to install WEC-Sim. +The directory where the WEC-Sim source code is saved is referred to as $WECSIM (e.g. C:/User/Documents/GitHub/WEC-Sim).

+
+

Step 1. Add WEC-Sim to the MATLAB Path

+

To run WEC-Sim, the source directory must be on the MATLAB path. +Users have two options to do this:

+

Option 1. Automatically add the WEC-Sim source on MATLAB startup.

+

Open $WECSIM/source/addWecSimSource.m and copy contents to a new file called startup.m. +Set the WEC-Sim path to the local $WECSIM/source directory, e.g. wecSimSource = 'C:/User/Documents/GitHub/WEC-Sim/source. +Save startup.m to the MATLAB Startup Folder. +Restart MATLAB, and the $WECSIM/source directory will automatically be added to the MATLAB path.

+
% This script adds the WEC-Sim source to the MATLAB path. 
+
+% Define WEC-Sim source and add to MATLAB path
+wecSimSource = fullfile(pwd,'source');
+addpath(genpath(wecSimSource));
+
+% Allow opening of Simulink models saved in a newer version
+set_param(0, 'ErrorIfLoadNewModel', 'off')
+
+clear wecSimSource
+
+
+

Option 2. Manually add and remove the WEC-Sim source from the MATLAB path.

+

This option requires users to run a script each time MATLAB is opened to add the WEC-Sim source directory to the path. +Navigate to the $WECSIM directory and run addWecSimSource. +The $WECSIM/source directory will then be added to the MATLAB path for this instance of MATLAB. +To remove WEC-Sim from the path, run removeWecSimSource.

+
+
+

Step 2. Verify the Path

+

Verify the path was set up correctly by checking that the WEC-Sim source directory is listed in the MATLAB search path. +The WEC-Sim source directory, $WECSIM/source, and its subfolders should be listed. +To view the MATLAB path, type path in the MATLAB Command Window:

+
>> path
+
+        MATLABPATH
+
+C:/User/Documents/GitHub/WEC-Sim/source
+
+
+
+ +
+

Step 4. Test the Installation

+

Both users and contributors can test the installation using the following steps. +In the MATLAB Command Window type:

+
>> cd $WECSIM/examples/RM3
+>> wecSim
+
+
+

This should run an example case using the Reference Model 3 (RM3) point absorber. +A Mechanics Explorer window will open within the MATLAB window, and figures will be generated displaying simulation outputs. +Both the RM3 and the OSWEC examples ($WECSIM/examples/OSWEC) come ready-to-run and can be used once WEC-Sim is installed.

+
+

Note

+

If a git lfs error is produced, there was a problem with git-lfs +installation. You may need to manually install Git Large File +Storage , or run +$WECSIM/examples/RM3/hydroData/bemio.m to generate the correct +rm3.h5 file.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/index.html b/main/user/index.html new file mode 100644 index 000000000..9ad745552 --- /dev/null +++ b/main/user/index.html @@ -0,0 +1,255 @@ + + + + + + + + + User Manual — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ +
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/troubleshooting.html b/main/user/troubleshooting.html new file mode 100644 index 000000000..0bad6fc4d --- /dev/null +++ b/main/user/troubleshooting.html @@ -0,0 +1,407 @@ + + + + + + + + + Troubleshooting — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Troubleshooting

+
+

WEC-Sim Issues

+

The WEC-Sim development team actively maintains the WEC-Sim Issues page on GitHub. +This issue page is maintained to assist users and past issues. +In this way, it serves as a significant resource for users in solving WEC-Sim problems or clarifying its implementation.

+

If you have problems downloading, installing, or using WEC-Sim please follow the debugging steps on this page. +Completing these steps will help users address their own questions and aid the development team in maintaining the issue board effectively. +Please take the time to follow these steps before opening an issue on GitHub.

+
+

Note on the Issue Board

+

Unfortunately, the WEC-Sim development team does not have the time and funding to address issues outside of WEC-Sim. +The following topics cannot be addressed when there is not a direct relation to WEC-Sim code, theory, or implementation:

+
    +
  • MATLAB/Simulink/Simscape-based issues

  • +
  • general hydrodynamics questions

  • +
  • performing tasks for a user’s case, i.e. supplying nonlinear meshes, *.h5 files, BEM results

  • +
  • running BEM software

  • +
  • use or development of BEM software

  • +
+

The issue board is provided as a convenience to users and the development team makes every effort to respond to issues in a timely manner. +However, users should not expect nor request an immediate response from the developers.

+
+
+
+

Debugging

+

Before opening an issue on GitHub, it is expected that users do a fair share of debugging. +WEC-Sim is intentionally easy to use and utilizes convenient MATLAB/Simulink interfaces. +However, this ease of use does not detract from the difficulty and time required to create an accurate and robust simulation. +Users should spend time carefully setting up and debugging their WEC-Sim cases. For example:

+
    +
  • Follow all error codes to the root cause of the error

  • +
  • Confirm that all user-defined inputs are set correctly

  • +
  • Confirm that WEC-Sim is called in the intended way (wecSim, wecSimMCR, wecSimPCT, from Simulink, etc)

  • +
  • When running a WEC-Sim example (e.g. OSWEC, RM3) carefully compare to the working examples before opening an issue

  • +
  • Check BEM input data for expected results, referring to the notes in the BEMIO figures

  • +
  • If creating your own WEC-Sim case, go through the wave test cases below. Check the common issues and solutions for each test.

  • +
+
+

Identify Root Cause

+

Identify if MATLAB and Simulink, or WEC-Sim is the root cause of the problem. +Does the problem occur in a WEC-Sim class, function, or Simulink model? If so, it may be a WEC-Sim error. +Carefully check input file paths, especially when copying previously working WEC-Sim examples. +Please do not submit issues for errors related to using MATLAB. +The development team cannot provide support for MATLAB errors outside of WEC-Sim.

+
+
+

Review Relevant Documentation

+

Read the appropriate documentation section for solutions or clarification on use of a particular feature. +The documentation is thorough but requires careful reading of relevant sections. +If documentation in an area is lacking, please identify this in a GitHub issue so that we may improve WEC-Sim.

+
+
+

Search WEC-Sim Issues

+

In many cases, another user has had a similar issue before. +Search the issues page (both open and closed) and the below FAQ for topics that relate to your current problem. +If these are related but insufficient, tag them in your GitHub issue for as references for the development team and future users.

+
+
+

Open an Issue

+

If the above steps do not solve your problem, please open an issue using one of the provided templates: bug report, feature request, theory or implementation, or WEC-Sim application. +Issue templates serve to layout the information required to solve an issue in a consistent, up front manner. +Templates are new to the WEC-Sim workflow, and input on their use is welcome. +The development team hopes this will help address questions as quickly and thoroughly as possible for users.

+

Users may remove all italic descriptive text in a template, but must keep the bold headers that organize the issue. +Users who do not use a template will be asked to reopen their issue with the appropriate layout. +If the provided templates do not fit an issue, users may open a blank issue with an initial statement explaining why there is no template and providing sufficient information.

+

When opening an issue, please provide all relevant information. +Link to the relevant documentation section and past issues, and upload a case file whenever possible.

+
+
+
+

Numerical Test Cases

+

This section describe a series of numerical test cases that should be performed when creating a novel WEC-Sim case. +These various wave cases are necessary to ensure a robust, accurate solution and speed the debugging process for users. +When opening a support question for case development, users will be asked to supply information on which test cases are functioning or not. +Note that this workflow is not foolproof, but can be used as a guide to create a more robust WEC-Sim case.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Number

Purpose

Input parameters utilized

1A

Hydrostatic stability

noWave

1B

Hydrostatic stability

noWaveCIC

2A

Free Decay, hydrostatic stiffness

noWave, initial

2B

Free Decay, hydrostatic stiffness

noWaveCIC, initial

3A

Viscous drag

regular

3B

Viscous drag

regularCIC

4A

Full functionality

irregular, initial

+

Various problems may occur while progressing through these test cases. +Users should not advance to the next test unless the previous tests run without error and result in a physical response.

+
+

Hydrostatic Stability

+

Issues with Test 1A-B indicate there is an imbalance between the gravity and buoyant forces. +This may cause the “solution singularity” as described in the FAQ, or result in a body rising or falling indefinitely. +To solve this problem, recalculate the mass that will balance the displaced volume from the BEM data. +Alternatively utilize the body(#).mass = equilibrium option.

+
+
+

Free Decay

+

Failure in Test 2 but not Test 1 indicates an inaccurate hydrostatic stiffness. +The hydrostatic stiffness returns a device to equilibrium after some displacement. +If the stiffness is too large, the simulation may require a very small time step. +If too small, an initial displacement may cause infinite motion. +Reevaluate the BEM input or tune the stiffness with body(#).hydroStiffness in the input file.

+
+
+

Viscous Drag

+

A hydrostatically stable device that has an unphysical response to a regular wave requires improved drag and damping. +BEM codes inherently assume inviscid flow. Recreating the effects of viscous drag in WEC-Sim is essential to obtaining a physical response. +Tune the parameters body(#).quadDrag or body(#).linearDamping to create a realistic response to a regular wave.

+
+
+

Irregular Waves

+

If Test 4 fails, users should check that the IRF decays to zero in BEMIO as done for the other CIC waves. Users may also investigate +different body drag, or change the mooring and PTO stiffness or damping. The state space or other numerical options may be helpful to stabilize the irregular wave case. +Once a simulation is stable and realistic in Test 4 and all previous test cases, it can likely be used in additional cases as desired. +Passing these test cases does not necessarily indicate accuracy, but it should result in a simulation without numerical errors. +It is up to each user to tune body, PTO and mooring parameters appropriately to model a device accurately.

+
+
+

Other Tests

+

Tests A vs B: +CIC waves are one way to evaluate if “good” BEM data is being used. +If a non-CIC wave has unphysical behavior at a specific frequency but not others, there are likely irregular frequency (IRR) spikes in the BEM data. +The CIC wave decreases the impact of these spikes in radiation damping.

+

If a CIC wave continues to oscillate without decaying to a steady state, the convolution integral time is not long enough. +Increase simu.cicEndTime to a greater value or use the state space option (simu.stateSpace=1). +In BEMIO, check that the convolution integral time is long enough for all oscillations to decay.

+

Nonlinear Hydrodynamics: +If a user wishes to use the nonlinear hydro options, they should first follow this same workflow with simu.nonlinearHydro=0 and again with simu.nonlinearHydro=1,2 +The nonlinear hydro options are difficult to set-up and must be used with care. +A highly refined mesh is required to get an accurate displaced volume and wetted surface area at each time step.

+
+
+
+

FAQs

+

This section highlights some of the Frequently Asked Questions from WEC-Sim issues. +All FAQ information is available in closed GitHub issues, but is repeated here for convenience.

+
+

Solution Singularity

+

Problem: +The simulation is numerically unstable. Bodies may rise or fall indefinitely and have unphysical responses. +This occurs because there is an imbalance between the gravity and hydrostatic forces. +If the gravity force is much larger than the hydrostatic force, bodies may fall indefinitely. +The opposite may occur when gravity is small compared to the hydrostatic force. +An extremely large or small stiffness can also cause this problem. +A small stiffness may not restore a body to an equilibrium position. +A large stiffness may require a very small time step to be effective.

+

Possible error messages:

+
Derivative of state ... in block ... at time ... is not finite.
+The simulation will be stopped. There may be a singularity in the solution
+
+
+

Solution: +Re-evaluate the hydrostatic stability of the device. +Compare the mass and displaced volume of the device to evaluate if it will float properly. +Calculate an approximate stiffness that will restore the body to equilibrium in still water. +Compare the mass, volume, and stiffness to those results in the BEM data.

+
+
+

Degenerate Mass Distribution

+

Problem: +When two PTOs or Constraints are connected in series with no mass between them, Simulink attempts to connect two joint blocks directly together. +Simulink cannot reconcile the forcing and motion between these series joints without a mass between them.

+

Possible error messages:

+
... Joint has a degenerate mass distribution on its base/follower side.
+
+
+

Solution: +Add an insignificantly small mass between the two joints (e.g. Simulink Library/Simscape/Multibody/Body Elements/Inertia) . +Alternatively, create a new PTO or constraint with one of the many joints available in the +Simscape Multibody Joints library if special degrees of freedom are required.

+
+
+

Hydrodynamic Data File

+

Problem: +The path to the *.h5 file does not exist or it is incomplete (size < 1kB).

+

Possible error messages:

+
The hdf5 file hydroData/*.h5 does not exist
+
+
+
This is not the correct *.h5 file. Please install git-lfs to access the correct *.h5 file,
+or run \hydroData\bemio.m to generate a new *.h5 file
+
+
+

Solution: +Check the path to the *.h5 file in the wecSimInputFile.m or run BEMIO to generate a new *.h5 file.

+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/tutorials.html b/main/user/tutorials.html new file mode 100644 index 000000000..969ac2800 --- /dev/null +++ b/main/user/tutorials.html @@ -0,0 +1,722 @@ + + + + + + + + + Tutorials — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Tutorials

+

This section provides step-by-step instructions on how to set-up and run the WEC-Sim code +using the provided Tutorials (located in the WEC-Sim $WECSIM/tutorials +directory). Two WEC-Sim tutorials are provided: the Two-Body Point Absorber +(RM3), and the Oscillating Surge WEC (OSWEC). +For cases that are already set-up and ready to run, see Step 3 of Install WEC-Sim.

+

For information about the implementation of the WEC-Sim code refer to the +Code Structure section. +For information about additional WEC-Sim +features, refer to Advanced Features.

+
+

Two-Body Point Absorber (RM3)

+

This section describes the application of the WEC-Sim code to model the +Reference Model 3 (RM3) two-body point absorber WEC. This tutorial is provided +in the WEC-Sim code release in the $WECSIM/tutorials directory.

+
+

Device Geometry

+

The RM3 two-body point absorber WEC has been characterized both numerically and +experimentally as a result of the DOE-funded Reference Model Project. The RM3 is a two-body point absorber +consisting of a float and a reaction plate. Full-scale dimensions and mass +properties of the RM3 are shown below.

+
+../_images/RM3_Geom.png + +
+ + + + + + + + + + + + + + +

Body

Mass (tonne)

Float

727.01

Plate

878.30

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Body

Direction

Center of Gravity* (m)

Inertia Tensor (kg m^2)

Float

x

0

20,907,301

0

0

y

0

0

21,306,091

0

z

-0.72

0

0

37,085,481

Plate

x

0

94,419,615

0

0

y

0

0

94,407,091

0

z

-21.29

0

0

28,542,225

+

* The origin lies at the undisturbed free surface (SWL)

+
+
+

Model Files

+

Below is an overview of the files required to run the RM3 simulation in +WEC-Sim. For the RM3 WEC, there are two corresponding geometry files: +float.stl and plate.stl. In addition to the required files listed +below, users may supply a userDefinedFunctions.m file for post-processing +results once the WEC-Sim run is complete.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Input File

wecSimInputFile.m

$WECSIM/tutorials/rm3/

Simulink Model

rm3.slx

$WECSIM/tutorials/rm3/

Hydrodynamic Data

rm3.h5

$WECSIM/tutorials/rm3/hydroData/

Geometry Files

float.stl & plate.stl

$WECSIM/tutorials/rm3/geometry/

+
+
+

RM3 Tutorial

+
+

Step 1: Run BEMIO

+

Hydrodynamic data for each RM3 body must be parsed into a HDF5 file using +BEMIO. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, *.h5 that is then read by WEC-Sim. +The RM3 tutorial includes data from a WAMIT run, rm3.out, of the RM3 +geometry in the $WECSIM/tutorials/rm3/hydroData/ directory. The RM3 WAMIT +rm3.out file and the BEMIO bemio.m script are then used to generate the +rm3.h5 file.

+

This is done by navigating to the $WECSIM/tutorials/rm3/hydroData/ +directory, and typing``bemio`` in the MATLAB Command Window:

+
>> bemio
+
+
+
+ +
+

Step 3: Write wecSimInputFile.m

+

The WEC-Sim input file defines simulation parameters, body properties, joints, +and mooring for the RM3 model. The wecSimInputFile.m for the RM3 is +provided in the RM3 case directory, and shown below.

+

New users should manually write the wecSimInputFile.m to become familiar with +the set-up parameters and the files being called in a basic WEC-Sim run. First, +define the simulation parameters. Initialize an instance of the +simulationClass. Define the simulink file to use, the start, ramp and end +times, and the time step required. The simulation class also controls all +relevant numerical options and simulation-wide parameters in a single +convenient class.

+

Next set-up the type of incoming wave by instantiating the waveClass. ‘Regular’ +is a sinusoidal wave and the easiest to start with. Define an appropriate wave +height and period. Waves can also be an irregular spectrum, imported by +elevation or spectrum, or multidirectional.

+

Third, define all bodies, PTOs and constraints present in the simulink file. +There are distinct classes for bodies, PTOs and constraints that contain +different properties and function differently. Bodies are hydrodynamic and +contain mass and geometry properties. Initialize bodies by calling the +bodyClass and the path to the relevant h5 file. Set the path to the geometry +file, and define the body’s mass properties. PTOs and constraints are more +simple and contain forces and power dissipation (in the constraint) that limit +the WEC’s motion. PTOs and constraints can be set by calling the appropriate +class with the Simulink block name. Set the location and any PTO damping or +stiffness desired.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'RM3.slx';              % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                         	% Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]
+simu.dt = 0.1;                                  % Simulation time-step [s]
+
+%% Wave Information  
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Float
+body(1) = bodyClass('hydroData/rm3.h5');        % Initialize bodyClass for Float
+body(1).geometryFile = 'geometry/float.stl';    % Geometry File
+body(1).mass = 'equilibrium';                   % Mass [kg]
+body(1).inertia = [20907301 21306090.66 37085481.11];  % Moment of Inertia [kg*m^2]     
+
+% Spar/Plate
+body(2) = bodyClass('hydroData/rm3.h5');        % Initialize bodyClass for Spar
+body(2).geometryFile = 'geometry/plate.stl';    % Geometry File
+body(2).mass = 'equilibrium';                   % Mass [kg]
+body(2).inertia = [94419614.57 94407091.24 28542224.82]; % Moment of Inertia [kg*m^2]
+
+%% PTO and Constraint Parameters
+% Floating (3DOF) Joint
+constraint(1) = constraintClass('Constraint1'); % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 0];                    % Constraint Location [m]
+
+% Translational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                                   % PTO Stiffness [N/m]
+pto(1).damping = 1200000;                             % PTO Damping [N/(m/s)]
+pto(1).location = [0 0 0];                           % PTO Location [m]
+
+
+
+
+

Step 4: Run WEC-Sim

+

To execute the WEC-Sim code for the RM3 tutorial, type wecSim into the +MATLAB Command Window. Below is a figure showing the final RM3 Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the RM3 device, refer to [A1].

+
+../_images/RM3_WECSim_GUI.JPG + +
+
+
+

Step 5: Post-processing

+

The RM3 tutorial includes a userDefinedFunctions.m which plots RM3 +forces and responses. This file can be modified by users for +post-processing. Additionally, once the WEC-Sim run is complete, the +WEC-Sim results are saved to the output variable in the MATLAB +workspace.

+
+
+
+
+

Oscillating Surge WEC (OSWEC)

+

This section describes the application of the WEC-Sim code to model the +Oscillating Surge WEC (OSWEC). This tutorial is provided in the WEC-Sim +code release in the $WECSIM/tutorials directory.

+
+

Device Geometry

+

The OSWEC was selected because its design is fundamentally different from the +RM3. This is critical because WECs span an extensive design space, and it is +important to model devices in WEC-Sim that operate under different principles. +The OSWEC is fixed to the ground and has a flap that is connected through a +hinge to the base that restricts the flap in order to pitch about the hinge. +The full-scale dimensions and mass properties of the OSWEC are shown below.

+
+../_images/OSWEC_Geom.png + +
+ + + + + + + + + + + +

Body

Mass (tonne)

Flap

127

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Body

Direction

Center of Gravity* (m)

Moment of Inertia Tensor (kg m^2)

Flap

x

0

0

0

0

y

0

0

1,850,000

0

z

-3.9

0

0

0

+
+

Note

+

The global frame lies at the undisturbed free surface. The body-fixed frame is at the center of gravity. Since the OSWEC is modeled as a pitch device, only the Iyy Moment of Inertia has been defined.

+
+
+
+

Model Files

+

Below is an overview of the files required to run the OSWEC simulation in +WEC-Sim. For the OSWEC, there are two corresponding geometry files: +flap.stl and base.stl. In addition to the required files listed below, +users may supply a userDefinedFunctions.m file for post-processing results +once the WEC-Sim run is complete.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Input File

wecSimInputFile.m

$WECSIM/tutorials/oswec/

Simulink Model

oswec.slx

$WECSIM/tutorials/oswec/

Hydrodynamic Data

oswec.h5

$WECSIM/tutorials/oswec/hydroData/

Geometry Files

flap.stl & base.stl

$WECSIM/tutorials/oswec/geometry/

+
+
+

OSWEC Tutorial

+
+

Step 1: Run BEMIO

+

Hydrodynamic data for each OSWEC body must be parsed into a HDF5 file using +BEMIO. BEMIO converts hydrodynamic data from +WAMIT, NEMOH, Aqwa, or Capytaine into a HDF5 file, *.h5 that is then read by WEC-Sim. +The OSWEC tutorial includes data from a WAMIT run, oswec.out, of the OSWEC +geometry in the $WECSIM/tutorials/rm3/hydroData/ directory. The OSWEC WAMIT +oswec.out file and the BEMIO bemio.m script are then used to generate +the oswec.h5 file.

+

This is done by navigating to the $WECSIM/tutorials/oswec/hydroData/ +directory, and typing``bemio`` in the MATLAB Command Window:

+
>> bemio
+
+
+
+
+

Step 2: Build Simulink Model

+

The WEC-Sim Simulink model is created by dragging and dropping blocks from the +WEC-Sim Library into the oswec.slx file.

+
    +
  • Place two Rigid Body blocks from the WEC-Sim Library in the Simulink +model file, one for each OSWEC rigid body.

  • +
  • Double click on the Rigid Body block, and rename each instance of the +body. The first body must be called body(1), and the second body should be +called body(2).

  • +
+
+../_images/OSWEC_WECSim_Body.jpg + +
+
    +
  • Place the Global Reference Frame from Frames in the WEC-Sim Library +in the Simulink model file. The global reference frame acts as the seabed.

  • +
+
+../_images/OSWEC_WECSim_GlobalRef.jpg + +
+
    +
  • Place the Fixed block from Constraints to connect the base to the +seabed. This constrains the base to be fixed relative to the Global Reference +Frame.

  • +
  • Place a Rotational PTO block to connect the base to the flap. This +constrains the flap to move in pitch relative to the base, and allows for the +definition of PTO damping.

  • +
+
+../_images/OSWEC_WECSim.JPG + +
+
+

Note

+

When setting up a WEC-Sim model, it is very important to note the base and +follower frames.

+
+
+
+

Step 3: Write wecSimInputFile.m

+

The WEC-Sim input file defines simulation parameters, body properties, and +joints for the OSWEC model. Writing the OSWEC input file is similar to writing +the RM3 input. Try writing it on your own. Define the simulation class, wave +class, bodies, constraints and PTOs. The wecSimInputFile.m for the OSWEC is +provided in the OSWEC case directory, and shown below.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'OSWEC.slx';            % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                            % Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]   
+simu.dt = 0.1;                                  % Simulation Time-Step [s]
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass                                 
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Flap
+body(1) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Flap 
+body(1).geometryFile = 'geometry/flap.stl';     % Geometry File
+body(1).mass = 127000;                          % Mass [kg]
+body(1).inertia = [1.85e6 1.85e6 1.85e6];  % Moment of Inertia [kg-m^2]
+
+% Base
+body(2) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Base
+body(2).geometryFile = 'geometry/base.stl';     % Geometry File
+body(2).mass = 999;                             % Fixed Body Mass
+body(2).inertia = [999 999 999];                % Fixed Body Inertia
+
+%% PTO and Constraint Parameters
+% Fixed
+constraint(1)= constraintClass('Constraint1');  % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 -10];                  % Constraint Location [m]
+
+% Rotational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [Nm/rad]
+pto(1).damping = 0;                                   % PTO Damping [Nsm/rad]
+pto(1).location = [0 0 -8.9];                        % PTO Location [m]
+
+
+
+
+

Step 4: Run WEC-Sim

+

To execute the WEC-Sim code for the OSWEC tutorial, type wecSim into the +MATLAB Command Window. Below is a figure showing the final OSWEC Simulink model +and the WEC-Sim GUI during the simulation. For more information on using +WEC-Sim to model the OSWEC device, refer to [A2, A3].

+
+../_images/OSWEC_WECSim_GUI.jpg + +
+
+
+

Step 5: Post-processing

+

The OSWEC tutorial includes a userDefinedFunctions.m which plots OSWEC +forces and responses. This file can be modified by users for post-processing. +Additionally, once the WEC-Sim run is complete, the WEC-Sim results are saved +to the output variable in the MATLAB workspace.

+
+
+
+
+

WEC-Sim Examples

+

Working examples of using WEC-Sim to model the RM3, OSWEC, and RM3FromSimulink are provided in +the $WECSIM/examples/ directory. For each example the wecSimInputFile.m +provided includes examples of how to run different wave cases:

+
    +
  • noWaveCIC - no wave with convolution integral calculation

  • +
  • regularCIC - regular waves with convolution integral calculation

  • +
  • irregular - irregular waves using a Pierson-Moskowitz spectrum with convolution integral calculation

  • +
  • irregular - irregular waves using a Bretschneider Spectrum with state space calculation

  • +
  • spectrumImport - irregular waves using a user-defined spectrum

  • +
  • elevationImport - user-defined time-series

  • +
  • +
    Run from MATLAB Command Window (for RM3 and OSWEC examples)
      +
    • Type wecSim in the Command Window

    • +
    +
    +
    +
  • +
  • +
    Run from Simulink (for RM3FromSimulink example)
      +
    • Open the relevant WEC-Sim Simulink file

    • +
    • Type initializeWecSim in the Command Window

    • +
    • Hit Play in Simulink model to run

    • +
    +
    +
    +
  • +
+

To customize or develop a new WEC-Sim model that runs from Simulink (e.g. for Hardware-in-the-Loop, HIL, applications) refer to Running from Simulink for more information. +Users may also use wecSimMCR, wecSimPCT, wecSimFcn and as described in the advanced features +sections Multiple Condition Runs (MCR) and Parallel Computing Toolbox (PCT). +These options are only available through the MATLAB Command Window.

+
+
+

References

+
+
+
+[A1] +

K. Ruehl, C. Michelen, S. Kanner, M. Lawson, and Y. Yu. Preliminary Verification and Validation of WEC-Sim, an Open-Source Wave Energy Converter Design Tool. In Proceedings of OMAE 2014. San Francisco, CA, 2014.

+
+
+[A2] +

Y. Yu, M. Lawson, K. Ruehl, and C. Michelen. Development and Demonstration of the WEC-Sim Wave Energy Converter Simulation Tool. In Proceedings of the 2nd Marine Energy Technology Symposium. Seattle, WA, USA, 2014.

+
+
+[A3] +

Y. Yu, Y. Li, K. Hallett, and C. Hotimsky. Design and Analysis for a Floating Oscillating Surge Wave Energy Converter. In Proceedings of OMAE 2014. San Francisco, CA, 2014.

+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/webinars.html b/main/user/webinars.html new file mode 100644 index 000000000..b9e3c135f --- /dev/null +++ b/main/user/webinars.html @@ -0,0 +1,430 @@ + + + + + + + + + Training Materials — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Training Materials

+

The WEC-Sim team developed an online training course, and hosted advanced features webinars. +Recordings of each course are available below, along with the presentations.

+
+

Online Training Course

+

The WEC-Sim team developed an online training course. +This course provides an overview of what that WEC-Sim software does, and how to use it. +Recordings of each course are available below, along with the presentations.

+
+

Overview

+

The section provides a big-picture overview of the WEC-Sim software. +The WEC-Sim Overview presentation is available for download here (WEC-Sim +Overview Slides), and the +recording is available below.

+
+
+
+
+

Theory & Workflow

+

This section discusses the WEC-Sim theory and workflow. +The WEC-Sim Theory & Workflow presentation is available +for download here (Theory & Workflow Slides), and the recording is available below.

+
+
+
+
+

Installation

+

This section described how to install WEC-Sim. +The WEC-Sim Installation presentation is available to download here (Theory & Workflow Slides), and the recording is available below.

+
+
+
+
+

Code Structure

+

This section provides an overview of how the WEC-Sim code is +structured by describing the WEC-Sim Source Code (e.g. +WEC-Sim Classes and WEC-Sim Library, and +how they are defined in the WEC-Sim Case Files (i.e. +wecSimInputFile.m and <Simulink_model_name>.slx). +The Code Structure Overview presentation is available to download here (WEC-Sim Code +Structure Slides), and the +recording is available below.

+
+
+
+
+

BEMIO

+

This section of the course discusses how BEMIO is used to extract the hydrodynamic coefficients generated by a BEM software, +and post-process themfor use by WEC-Sim. +The BEMIO routines also help calculate impulse response functions, and plot data. +The BEMIO presentation can be donloaded here (BEMIO Slides), and the +recording is available below.

+
+
+
+
+

Wave Class

+

This section of the course provides an overview of how waves are implemented in +the WEC-Sim code, both in the Wave Class, and in the +WEC-Sim Library. +The Wave Class presentation is +available for download here (Wave Implementation Slides), and the recording +is available below.

+
+
+
+
+

Body Class

+

This section of the course provides an overview of how bodies are implemented +in the WEC-Sim code, both in the Body Class, and in +the WEC-Sim Library. The Body Class presentation is +available for download here (Body Implementation Slides), and the recording +is available below.

+
+
+
+
+

Tutorial

+

This section shows users how to set up an run a the WEC-Sim tutorial. +The Tutorial presentation is available to download here (WEC-Sim Tutorial), and the recording +is available below.

+
+
+
+
+
+

Advanced Features Series

+

The WEC-Sim team hosted a series of Advanced Features Series. The +topics are listed below. Recordings of each are available below, along with the +presentations.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Series

Topic

1

Multiple Condition Runs (MCR)

2

Nonlinear Hydrodynamics

3

Non-hydrodynamic Bodies

4

Body-to-Body Interactions

5

PTO-Sim

6

WEC-Sim Controls

7

Modeling Cables

8

Using Moordyn with WEC-Sim

9

Modeling OWC Devices

10

Desalination

11

WEC-Sim Visualization

+
+
+

Series 1 - Multiple Condition Runs (MCR)

+

The series presents an overview of how to run multiple cases in WEC-Sim. The +presentation is available for download here ( Series 1 Slides ), and the recording is +available below.

+

Series 1 - Multiple Condition Runs (MCR)

+
+
+
+
+

Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+

This section is focused on how to implement Nonlinear Buoyancy and Froude-Krylov Wave Excitation forces in WEC-Sim. +The presentation is available +for download here ( Series 2 Slides ), +and the recordings are available below.

+

Series 2 - Nonlinear Buoyancy and Froude-Krylov Wave Excitation

+
+
+
+
+

Series 3 - Non-hydrodynamic Bodies

+

This webinar presents an overview of the non-hydrodynamic body implementation in WEC-Sim. The +presentation is available for download here ( Series 3 Slides ), and the recordings are +available below.

+

Series 3 - Non-hydrodynamic Bodies

+
+
+
+
+

Series 4 - Body-to-Body Interactions

+

This is section of the Advanced Features Series presents some examples of how body-to-body interactions are modeled in WEC-Sim. +The presentation is available for download here ( Series 4 Slides ), and the recordings are +available below.

+

Series 4 - Body-to-Body Interactions

+
+
+
+
+

Series 5 - PTO-Sim

+

This section is focused on PTO-Sim. +The presentation is available for download here ( Series 5 Slides ), and the recordings are +available below.

+

Series 5 - PTO-Sim

+
+
+
+
+

Series 6 - WEC-Sim Controls

+

This section presents some examples of how to implement control algorithms for WECs using WEC-Sim. +The presentation is available for download here ( Series 6 Slides ), and the recordings are +available below.

+

Series 6 - WEC-Sim Controls

+
+
+
+
+

Series 7 - Modeling Cables

+

This section is focused on the Cable Block from WEC-Sim. +The presentation is available for download here ( Series 7 Slides ), and the recordings are +available below.

+

Series 7 - Modeling Cables

+
+
+
+
+

Series 8 - Using MoorDyn with WEC-Sim

+

This section presents an overview of how to use MoorDyn with WEC-Sim. +The presentation is available for download here ( Series 8 Slides ), and the recordings are +available below.

+

Series 8 - Using MoorDyn with WEC-Sim

+
+
+
+

Note

+

The above MoorDyn webinar is based on MoorDyn v1 and is in the process of being updated +for MoorDyn v2. Please refer to Mooring Features for instruction on +using WEC-Sim with MoorDyn v2.

+
+
+
+

Series 9 - Modeling OWC Devices

+

This section presents an overview of how to use model OWC devices using WEC-Sim. +The presentation is available for download here ( Series 9 Slides ), and the recordings are +available below.

+

Series 9 - Modeling OWC Devices

+
+
+
+
+

Series 10 - Desalination

+

This section presents an overview of how to use WEC-Sim to model a desalination application. +The presentation is available for download here ( Series 10 Slides ), and the recordings are +available below.

+

Series 10 - Desalination

+
+
+
+
+

Series 11 - WEC-Sim Visualization

+

This section presents an overview of how to post-process results in WEC-Sim. +The presentation is available for download here ( Series 11 Slides ), and the recordings are +available below.

+

Series 11 - WEC-Sim Visualization

+
+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/main/user/workflow.html b/main/user/workflow.html new file mode 100644 index 000000000..db7d3a395 --- /dev/null +++ b/main/user/workflow.html @@ -0,0 +1,482 @@ + + + + + + + + + Workflow — WEC-Sim documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + +
+

Workflow

+

The WEC-Sim workflow diagram below shows a high level view of WEC-Sim’s functionality. +As a precursor, a WEC design must be defined in an input file and the Simulink model file. +This input file is read by WEC-Sim which instantiates objects based on parameters defined in the input file. +The objects are used in conjunction with WEC-Sim’s Simulink library during the time-domain simulation. +User defined functions serve for easy post-processing and visualization of WEC-Sim’s output. +A detailed description of this workflow is provided in the following sections. +For information about the implementation and structure of the WEC-Sim source code, refer to the Code Structure section.

+
+../_images/WEC-Sim_flowChart.png + +
+
+

WEC-Sim Workflow Diagram

+
+
+
+
+

WEC-Sim Case Files

+

All files required for a WEC-Sim simulation must be contained within a case directory referred to as $CASE. +The case directory can be located anywhere on your computer. +It must include: geometry file(s), hydrodynamic data saved to a *.h5 data structure, a WEC-Sim input file, and a Simulink model of the device. +The table below lists the WEC-Sim case directory structure and required files.

+ + + + + + + + + + + + + + + + + + + + + + + +

File Type

File Name

Directory

Geometry File(s)

*.stl

$CASE/geometry

Hydrodynamic Data

*.h5

$CASE/hydroData

Input File

wecSimInputFile.m

$CASE

Simulink Model

*.slx

$CASE

+
+

Note

+

Where * denotes a user-specified file name.

+
+
+

Geometry File

+

WEC-Sim requires geometry file(s) (*.stl) that define each body. +The origin of the geometry file(s) must be at the body’s center of gravity. +When running WEC-Sim with linear hydrodynamics, the *.stl is only used for the Simscape Mechanics Explorer visualization. +However, when running WEC-Sim with nonlinear buoyancy and Froude-Krylov forces the STL mesh determines the instantaneous wetted surface at each time step. +In this nonlinear case, the quality of the STL mesh is critical, refer to the Nonlinear Buoyancy and Froude-Krylov Excitation section for more information.

+
+
+

Hydrodynamic Data

+

Hydrodynamic data for each body may be generated using a boundary element method (BEM) software. +WEC-Sim requires hydrodynamic data from a BEM solution in the form of a HDF5 file (*.h5). +This *.h5 hydrodynamic data file can be generated using the BEMIO pre-processor. +BEMIO (Boundary Element Method Input/Output) is a pre-processing software developed by the WEC-Sim team to parse BEM output files from WAMIT, NEMOH, Aqwa, and Capytaine into a data structure, saved as a *.h5 file, that can be read by WEC-Sim. +For more information about the BEMIO pre-processor, refer to the BEMIO section.

+
+
+

Input File

+

A WEC-Sim input file (wecSimInputFile.m) is required. +The input file MUST be named wecSimInputFile.m and placed within the case directory. +WEC-Sim uses object orientated programming to describe components of the WEC model; +the main structure of the input file consists of initializing the WEC-Sim objects and defining properties for each object. +The input file requires initialization and definition of the simulation and wave classes, at least one instance of the body class, and at least one instance of the constraint or PTO classes. +For details about WEC-Sim’s classes and available properties for each, refer to the WEC-Sim Classes section.

+

The WEC-Sim input file (wecSimInputFile.m) for the OSWEC example (WEC-Sim/examples/OSWEC/) is shown below. +WEC-Sim is an object oriented code and the input file reflects this by instantiating the WEC-Sim classes to create objects that are tied to the Simulink library. +The OSWEC input file initializes and defines properties for the simulation, body, constraint and pto classes.

+
%% Simulation Data
+simu = simulationClass();                       % Initialize simulationClass
+simu.simMechanicsFile = 'OSWEC.slx';            % Simulink Model File
+simu.startTime = 0;                             % Simulation Start Time [s]
+simu.rampTime = 100;                            % Wave Ramp Time [s]
+simu.endTime=400;                               % Simulation End Time [s]   
+simu.dt = 0.1;                                  % Simulation Time-Step [s]
+
+%% Wave Information
+% Regular Waves 
+waves = waveClass('regular');                   % Initialize waveClass                                 
+waves.height = 2.5;                                  % Wave Height [m]
+waves.period = 8;                                    % Wave Period [s]
+
+%% Body Data
+% Flap
+body(1) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Flap 
+body(1).geometryFile = 'geometry/flap.stl';     % Geometry File
+body(1).mass = 127000;                          % Mass [kg]
+body(1).inertia = [1.85e6 1.85e6 1.85e6];  % Moment of Inertia [kg-m^2]
+
+% Base
+body(2) = bodyClass('hydroData/oswec.h5');      % Initialize bodyClass for Base
+body(2).geometryFile = 'geometry/base.stl';     % Geometry File
+body(2).mass = 999;                             % Fixed Body Mass
+body(2).inertia = [999 999 999];                % Fixed Body Inertia
+
+%% PTO and Constraint Parameters
+% Fixed
+constraint(1)= constraintClass('Constraint1');  % Initialize constraintClass for Constraint1
+constraint(1).location = [0 0 -10];                  % Constraint Location [m]
+
+% Rotational PTO
+pto(1) = ptoClass('PTO1');                      % Initialize ptoClass for PTO1
+pto(1).stiffness = 0;                           % PTO Stiffness [Nm/rad]
+pto(1).damping = 0;                                   % PTO Damping [Nsm/rad]
+pto(1).location = [0 0 -8.9];                        % PTO Location [m]
+
+
+

Additional examples are provided in the Tutorials section.

+
+ +
+
+

Running WEC-Sim

+

This section provides a description of the steps to run the WEC-Sim code. Refer +to the WEC-Sim Workflow Diagram while following +the steps to run WEC-Sim.

+
+

Step 1: Pre-Processing

+

In the pre-processing step, users need to create the WEC geometry, and run a +BEM code to calculate the hydrodynamic coefficients.

+
    +
  • Create WEC Geometry:

    +
    +
      +
    • Create CAD models of the WEC geometry and export it to a *.stl format.

    • +
    • The *.stl files are used to visualize the WEC response in Simscape +Explorer

    • +
    • They are also used for Nonlinear Buoyancy and Froude-Krylov Excitation forces if +the option is enabled.

    • +
    +
    +
  • +
  • Compute Hydrodynamic Coefficients: WEC-Sim requires frequency-domain +hydrodynamic coefficients (e.g. added mass, radiation damping, and wave +excitation).

    +
    +
      +
    • The coefficients for each body may be generated using a boundary element +method (BEM) code (e.g., WAMIT, NEMOH, Aqwa, or Capytaine).

    • +
    • WEC-Sim requires that all hydrodynamic coefficients must be specified at +the center of gravity for each body.

    • +
    +
    +
  • +
+
+
+

Step 2: Generate Hydrodata File

+

In this step, users run BEMIO to convert +the hydrodynamic coefficients from their BEM solution into the *.h5 format +for WEC-Sim to read:

+
    +
  • Run BEMIO: to generate *.h5 Hydrodynamic Coefficients for WEC-Sim

    +
    +
      +
    • The hydrodynamic coefficients for each body generated from the BEM code +can be parsed into a *.h5 data structure using +BEMIO, which was developed by the +WEC-Sim team.

    • +
    • BEMIO currently supports WAMIT, NEMOH, Aqwa, and Capytaine.

    • +
    +
    +
  • +
+
+

Note

+
    +
  • If WAMIT is used:

    +
    +
      +
    • The origin of the body coordinate system (XBODY, defined in *.pot) +as well as the mesh for each body must be at the center of gravity.

    • +
    • The WAMIT mesh (*.gdf) can be generated using +Rhino or +MultiSurf.

    • +
    • More details on WAMIT setup are given in the +WAMIT User Manual.

    • +
    +
    +
  • +
  • If NEMOH is used:

    +
    +
      +
    • The origin of the mesh for each body (*.dat) is located at the mean +water surface.

    • +
    • The location to output the hydrodynamic coefficients for each degree of +freedom is defined in the Nemoh.cal file.

    • +
    • Please refer to NEMOH-Mesh +webpage for more mesh generation details.

    • +
    • The NEMOH Mesh.exe code creates the Hydrostatics.dat and KH.dat +files (among other files) for one input body at a time. For the +readNEMOH function to work correctly in the case of a multiple body +system, the user must manually rename Hydrostatics.dat and +KH.dat files to Hydrostatics_0.dat, Hydrostatics_1.dat, …, +and KH_0.dat, KH_1.dat,…, corresponding to the body order +specified in the Nemoh.cal file.

    • +
    • More details on NEMOH setup are given in the +Nemoh Homepage.

    • +
    +
    +
  • +
  • If Aqwa is used:

    +
    +
      +
    • The origin of the global coordinate system is at the mean water +surface, and the origin of the body coordinate system for each body +must be at the center of gravity (defined using the Aqwa GUI or in +the *.dat input file).

    • +
    • In order to run BEMIO, Aqwa users must output both the default +*.LIS file and output the *.AH1 hydrodynamic database file. +Both of these files are reacquired to run BEMIO.

    • +
    • More details on Aqwa setup are given in the Aqwa Reference Manual.

    • +
    +
    +
  • +
  • If Capytaine is used:

    +
    +
      +
    • The origin of the mesh for each body (*.dat) is located at the mean +water surface.

    • +
    • More details on Capytaine setup are given in the Capytaine webpage.

    • +
    +
    +
  • +
+
+
+

Note

+

Users are also able to specify their own hydrodynamic coefficients by +creating their own *.h5 file with customized hydrodynamic coefficients +following the *.h5 format created by BEMIO.

+
+
+

Note

+

We recommend installing HDFview https://www.hdfgroup.org/downloads/hdfview/ +to view the *.h5 files generated by BEMIO.

+
+
+ +
+

Step 4: Write wecSimInputFile.m

+

The WEC-Sim input file must be located in the $CASE directory, and named +wecSimInputFile.m. The figure below shows an example of a WEC-Sim input +file. The input file specifies the simulation settings, body mass properties, +wave conditions, joints, and mooring. Additionally, the WEC-Sim input file must +specify the location of the WEC-Sim Simulink model (*.slx) file, the +geometry file(s) *.stl, and the hydrodynamic data file (*.h5) .

+
+
+

Step 5: Run WEC-Sim

+

Lastly, WEC-Sim can be executed from the $CASE directory by typing wecSim from the Command Window:

+
>> wecSim
+
+
+

Refer to WEC-Sim Examples for more details on how to run the examples. +Users may also run WEC-Sim from Simulink, or use the commands wecSimMCR, +wecSimPCT, and wecSimFcn as described in the advanced features +sections Running from Simulink, +Multiple Condition Runs (MCR), Parallel Computing Toolbox (PCT), +and Running as Function.

+
+

Note

+

The WEC-Sim source code is located in the $WECSIM directory, but +WEC-Sim must be executed from the $CASE directory. +The MATLAB path must include the WEC-Sim source directory.

+
+
+
+
+ + + +
+
+
+ +
+ +
+

© Copyright 2022, National Renewable Energy Laboratory and National Technology & Engineering Solutions of Sandia, LLC (NTESS).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ +
+ + Other Versions + v: main + + +
+
+
Branches
+
dev
+
main
+
+
+
+ + + + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 000000000..3bbdcc128 --- /dev/null +++ b/master/index.html @@ -0,0 +1,10 @@ + + + + Redirecting to main branch + + + + +