-
Notifications
You must be signed in to change notification settings - Fork 463
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implementation of external forces in BeamDyn #1003
Comments
Hi @LaurenceWETI, Overall the approach sounds OK. Just a few comments:
Best regards, |
Hello @jjonkman, Thank you for the quick reply.
Best regards |
Hi @jjonkman and @LaurenceWETI, I wonder if it might make sense to look at modifying the blade mounted structural controls to include Coriolis forces as needed? Those currently allow for full control by the DLL and could be extended to control through Simulink. It might be relatively straightforward to include the Coriolis force directly in those equations if it doesn't automatically fall out of the formulation and coupling. Right now there is an assumption that blade mounted StCs are identical masses between blades, though they can be individually controlled. So this would take a little reworking of the StC interfacing if the masses need to be different. Some modifications would also need to be made if we prescribe displacement position rather than force (controller has access to the displacement along the blade, so it can control position in a closed loop manner). One advantage of modifying the StC is that the coupling and most of the controller interfacing is already there. This would then work with both BeamDyn and ElastoDyn, and would require no modifications to BeamDyn. I think the only modifications needed would be within ServoDyn (for Simulink interface since that isn't complete) and the StC submodule (flag to indicate it is blade mounted, a distance vector from hub rotation axis, and rotor speed -- all of which ServoDyn already has). Regards, |
Hi @andrew-platt and @LaurenceWETI, Thanks for bringing up the structural control (StC) capability of OpenFAST. I should have brought this up yesterday as a different approach. The Coriolis force should already be included in this implementation, and as Andy mentioned, the motion of the mass can be controlled. Best regards, |
Hello @andrew-platt and @jjonkman, Thank you for pointing out the additional approach of the StCs. May I ask you some general questions regarding these controllers?
Best regards, |
The StCs are essentially tuned mass dampers with the ability to control stiffness and damping through a controller. These are implemented through the ServoDyn module and may be mounted to blade, nacelle, substructure, or tower. The StC itself does not know where it is mounted as that is handled through the glue code. It is worth double checking the equations to verify that the Coriolis term is already included -- if it wasn't, some additional info may need to be passed along with a flag indicating it is blade mounted and needs the term. The values for the blade StC are all stored within its input file. Documentation for it is here: https://openfast.readthedocs.io/en/dev/source/user/servodyn-stc/StC_index.html. There is also an update that includes updated controls interfacing for the StCs (this will be merged in shortly): #664. At present, all blade StCs are assumed to be the same constant mass, but may be motion controlled individually. Right now there is no provision for changing the mass during the simulation (this would take some reworking of the equations, but wouldn't be too difficult to do). Adding a mass change to the Simulink interface would be relatively straightforward -- there are two channels set aside in each StC channel group that could be used for mass changing (one for current mass value, and the other for the requested mass delta for the current timestep). Regards, |
I'll just add that the Coriolis force is already included in the StC module, as mentioned in the theory documentation: https://openfast.readthedocs.io/en/dev/source/user/servodyn-stc/StC_Theory.html. Best regards, |
Hello @andrew-platt and @jjonkman, Thank you for the quick feedback and for your help.
Can you give me please a feedback if these modifications are feasible in the source code of the StCs? Best regards, |
A few thoughts on this:
Regards, |
Hello @andrew-platt, Thank you for your support. I'm not sure that I could follow all the changes that you mentioned above to get the effects that I need in the StCs. I'm planning to control the dynamic behavior of the WT using the hydro-pneumatic flywheel system. the concept of such system is based on the change of the rotor inertia by moving a fluid mass between two accumulators in blade root and in blade tip, more details about this system can you find in our publications on ResearchGate. I would do first the approach via BD, since I already did some modifications to pass the control variables through the Simulink interface. Best regards, |
Hello everyone, @jjonkman I have two questions regarding adding forces to the applied distributed load The forces I want to add are the Coriolis forces resulting from shifting a fluid mass along the blade, see discussion above. This equation is implanted in BD source code to compute the x, y and z components of the distributed Coriolis force Where, The 5MW_Land_BD_DLL_WTurb.fst test is run without Aerodyn and ServoDy in order to exclude the effect of the additional forces. The I see that in FAT_Solver_ .f90/SUBROUTINE BD_InputSolve, the applied distributed forces and moments are set to zero when AeroDyn is deactivated. could be that the reason why the Coriolis forces are not added to
I would appreciate any help. Best regards |
Dear @LaurenceWETI, Where did you add the following equation: FYI: I see that you declared the Coriolis force as a parameter ( Best regards, |
Dear @jjonkman , Thank you very much for your quick reply. That equation is implemented in Best regards |
Dear @LaurenceWETI, Yes, I agree that you'd have to add the Coriolis force to the input in both the If the Coriolis force were an input to BeamDyn, the force should be set in the glue code rather than in BeamDyn. I'm guessing the Coriolis force should be a local variable. If the array size is large, it may make sense to make it a misc/optimization variable ( Best regards, |
Dear @jjonkman, As you suggested I made the Coriolis force a misc/optimization variable As before there are no changes in the distributed applied forces recognized. I think that this condition in FAT_Solver_ .f90/SUBROUTINE BD_InputSolve must be changed, to enable additional forces to be added to the distributed force, even when AerodDyn is deactivated: I would set the calculation of the additional masses and the Coriolis forces in the glue code rather than BeamDyn, but the point is that this calculation is based on the mass matrix in BeamDyn, which is not accessible from the glue code. Best regards, |
Dear @LaurenceWETI, I'm not sure why your model is going numerically unstable, but I would not think that moving the calculation of summing the Coriolis force with the aerodynamic force from BeamDyn to the glue code would eliminate the instability if the final resulting input used by BeamDyn is the same. Regarding the instability, is the Coriolis force you are adding to the distributed load input smooth over time? Best regards, |
Dear @jjonkman, Thank you for your reply. This is how the Coriolis force looks over the time. It depends on the angular velocity and the varied fluid mass. The transitional velocity of the fluid is constant. Best regards, |
Dear @LaurenceWETI, Is this just the Coriolis force at one node? Presumably you have additional forces at other nodes? I'm a bit concerned that the non-smoothness of the force would cause numerical issues with the BeamDyn solver. Best regards, |
Dear @jjonkman, This is the distributed Coriolis force only at node 40. In this simulation the Coriolis force is applied from node 40 to node 48. See figure below. FYI: As I called Best regards, |
Dear @LaurenceWETI, You should not change the Regardless, I'm guessing that is not the cause the instability. Again, I would be concerned that the instability is caused by the non-smoothness of the Coriolis force you've added. Can you implement a smoother form of your added force to verify that? Perhaps apply a simple function (like a sine wave) rather than the Coriolis force calculation you are implementing to verify that way you are applying additional forces works as expected. Best regards, |
Dear @jinkman, Thank you very much for support. Your concerns were as you expected! After I implanted the Coriolis force in a smoother from (sine wave) my model goes numerically stable. However, I still can’t see the Coriolis forces added to the distributed applied load signal (NDFl). Regarding the change of the mass parameters, I’ll check all subroutines where the mass parameter is needed and do the same loop to add the fluid mass to each beam/blade node. Which effect would you expect when this is done? And which effect has the change of the parameter Best regards, |
Dear @LaurenceWETI, If you are not seeing your Coriolis force included in the BeamDyn output file, you are probably not adding it to the input early enough within Variables in the framework are given specific INTENTs to prevent errors in programming. Again, a parameter is meant to be fully definable at initialization and should not be changed at each time step. I'm not sure this applies to the specific parameter you want to change, but one problem I could see is that if other parameters depend on the parameter you change, you'll miss the propagation to those other parameters. Best regards, |
Dear @jjonkman, Thank you very much for your support. I found a gap in my code that also contributed to the instability. The
Is this due to the disabled AeroDyn and ServoDyn that the solver prevent any changes in the applied distributed force? Is that related to this condition in Best regards, |
Dear @LaurenceWETI, This code snippet from Best regards, |
Dear @jjonkman , Thank you for your reply. It was not very clear to me whether this code snapped from Below I shared snap shots form BD of how I add the Coriolis force and the line(s) of the BD source coder where this addition takes place. The line numbers next to the subroutine name below refer to the place in the origin BD code. This is due to the additions that I did in
Where Best regards, |
Dear @LaurenceWETI, Can you share the full contents of Best regards, |
Dear @jjonkman Thank you for your quick reply. Below is the full contenst of
Best regards, |
Dear @LaurenceWETI, It looks like you are changing This shouldn't effect the write outputs, but one issue I see in Best regards, |
Dear @jjonkman, Thank you for your help and your tips, I just cloned the original OpenFAST code and wrote a very simple example in BD source code to add loads to the applied distributed force in the way that we discussed before.
The figure below shows that the distributed applied load components at blade 1 station 1 change between the given time from 2 to 3 s. However, the changes are not in the same amplitude as it is given in the example of 1000 N/m! This simulation was run with disabled AeroDyn and ServoDyn. I will add the modifications that I did in the source code before step by step and see which one causes the problem. I have tow questions:
Best regards, |
Dear @jjonkman, Thank you for your clarification. As you suggested I applied just one force of 100 kN/m in yl at the blade tip and executed the test #26: NREL 5.0 MW Baseline Wind Turbine (Onshore); with the following settings in NRELOffshrBsline5MW_Onshore_ElastoDyn_BDoutputs.dat:
The figure below shows the resulting tip translation deflections and root reaction force components.
Best regards, |
Dear @LaurenceWETI, Overall, the results make sense to me. but the story is not fully clear because you are only showing results during the start-up transient. (The oscillations result because the blade is initialized with zero deflection, but the equilibrium condition with the applied load has deflection, resulting in a strong start-up transient. The oscillations should decay over time due to structural damping, but the mean value of the response is likely representative of the final static-equilibrium value.) The tip force in the y-direction results in deflection in the y-direction, which also leads to some deflection and reaction load in the axial direction. Do the results make sense to you? A few clarifying questions:
Best regards, |
Dear @jjonkman, Thank you for pointing that out. After your explanation and trying to answer your questions the results make more since to me. Regarding your questions:
Best regards, |
Dear @LaurenceWETI, The signs of the root reaction loads are as I expect them. The reaction loads are computed as the load applied to the hub through the blade at the root. So, other than the small curvature and tip deflection, which changes the orientation of the "l" system relative to the "r" system, I would expect the signs of the forces in the "l" and "r" system to generally match. Certainly conservation of momentum is preservered in the original BeamDyn code, but I don't believe that the total momentum is calculated directly within BeamDyn. Best regards, |
Dear @jjonkman, Thank for your help and your valuable tips.
To verify the implementation is correct, I plotted the root reaction forces as response for a 100,000 N force applied between 100 and 200s at beam tip. The amplitude of the y-component of the root reaction force match the tip applied force.
Best regards, |
Dear @LaurenceWETI, Regarding (1-2), I haven't reviewed your source code in detail (again, I'm not an expert on the BeamDyn source code), but what you describe makes sense to me. I'm not sure I understand your verification test. If you apply the load between 100-200s, what is happening at 50 s? Regarding (3), there are a maximum of 9 output nodes (not 6) that can be set via the Regarding (4), NREL has not developed a Simulink interface for any of the standalone module-level drivers, including BeamDyn. I'm sure it is possible to create these, but you'd have to mimic features of the existing OpenFAST-Simulink interface and update the driver source code. Best regards, |
Dear @jjonkman, Thank you very much for your quick reply. This error message comes from this check in BeamDyn_IO.f90:
Where
Do I have to change this check also as described in BeamDyn coupled to FAST? Best regards, |
Dear @LaurenceWETI, I'm not following. I don't see the first block of code you show included in BeamDyn_IO.f90, where the calculation of Best regards, |
Dear @jjonkman, In the input file of BD stand-alone the root angular velocity, Similarly to the initial rotor speed, I tried to couple my beam with OpenFAST, but when I run the simulation the solution does not converge after the maximum number of iterations. I’m not sure if this is because the beam properties that I’m using for the simulation in OpenFAST. Although, the simulation completed in BD stand-alone without any errors with the same beam properties. I can upload the input file if necessary? Best regards, |
Dear @LaurenceWETI, Correct, the standalone BeamDyn driver is only set up to define a constant angular rotation of the root node about a hub axis. If you want more complicated root motions, you must change the source code. You would have to fully define the root motion (position, orientation, velocity, acceleration) as a function of time within the source code. See the BeamDyn documentation for more information: https://openfast.readthedocs.io/en/main/source/user/beamdyn/input_files.html#blade-floating-reference-frame-parameters. If your BeamDyn model solves as expected in the BeamDyn driver, but not in OpenFAST, this would suggest to me that you need to change the solver settings in OpenFAST, e.g., dropping the time step. Due to the implicit loose coupling approach used by OpenFAST, models with ElastoDyn-BeamDyn coupling require smaller time steps than standalone BeamDyn models. Best regards, |
Dear @jjonkman, Thank you for your quick response. I would try first with BeamDyn coupled to OpenFAST bofore geting lost by the fully definition of the root motion :) Yes, using smaller time steps did help. I set DT to 0.5 ms as suggested in this issue #1300. But I still can't use the same beam properties that I used in the BeamDyn driver in OpenFAST. The beam that I solved in BeamDyn driver is very light and very stiff, e.g. Best regards, |
Dear @LaurenceWETI, Those sectional properties do not sound physically correct. And I would not recommend using BeamDyn for a very stiff blade. OpenFAST should still be able to solve it, but would likely require a minuscule time step (too small to be practical). Best regards, |
Dear @jjonkman, Since, the BeamDyn driver is only set up to define a constant angular rotation of the root node about a hub axis, I’m trying to solve my stiff beam in OpenFAST/BeamDyn. I set the following simulation parameters in ElastoDyn_BDoutputs.dat in order to solve my model for free rotational speed.
The problem is that when only the Best regards, |
Dear everyone, is it possible to attaches the beam to the hub as pinned support, without the effect of the attached inertia of the drivetrain and the generator? Best regards, |
Dear @LaurenceWETI, In your OpenFAST model, the rigid-body rotational DOF of the drivetrain is included in ElastoDyn, and because the blades are not included in the ElastoDyn model when BeamDyn is enabled, ElastoDyn needs some nonzero-inertia associated with the with this rotational DOF. You'll need to specify some physically realistic drivetrain rotational inertia via HubIner and/or GenIner. Best regards, |
Dear @jjonkman, Thank you very much for your reply. It looks now much better as I used the drivetrain rotational inertia of the NREL 5MW. But I still have a problem with the support between the beam and the hub. I would simulate a pinned support between the beam and the hub. In the figure bellows I plotted the reaction forces and moments at the blade root. I would expect that the root reaction moment should be almost by zero for a pinned support, which can’t be seen in my results.
Best regards, |
Dear @LaurenceWETI, The ElastoDyn-BeamDyn coupling available in OpenFAST only supports a cantilevered connection between the blade (in BeamDyn) and hub (in ElastoDyn). Best regards, |
Dear everyone, I have a question regarding the calculation of the element length in BeamDyn.
Regarding my hand calculation the distance along the local axis between keypoints (kp) 1-5, 6-9 and 10-15 should be 5.007241985, 5.05747081 and 5.156729137, respectively. However, BeamDyn results different distances between the aforementioned kps.
The code that I used to calculate and display the distances in MATLAB is as follow:
Best regards |
Dear @LaurenceWETI, The keypoint line does not explicitly define the location of the quadrature points. Rather the keypoint line defines the line that the quadrature points fall on. The actual locations of the quadrature points is from the Eta values for each blade input station in the blade definition file (the single values preceding each stiffness and mass matrix set). These Eta values are placed along the curve of the keypoint line so the distance between quadrature points is along the curve. Andy |
Dear @andrew-platt, Thank you for your quick reply. Hand calculation:
BeamDyn calculation:
Best regards, |
Dear everyone, Dear @jjonkman and @andrew-platt I added external force at several nodes of the blades as distributed forces. In the figure below you can see the additional loads and the corresponding applied distributed forces expressed in the local coordinates. As you see, the applied distributed forces Here is how I transformed the forces from local to global coordinates.
Do you have any idea why the NDFl are deviating from the NADDFL for blades 2 and 3? Best regards, |
I can't spot the error. |
@LaurenceWETI, can you plot the values in |
Dear @jjonkman and @andrew-platt thank you very much for your replies. The figures below compare the x, y, and z components of the external applied distributed forces,
Best regards |
Dear @LaurenceWETI, Where are you adding the calculations you shared in your post from 3 days ago within the BeamDyn source code? Are you running BeamDyn within OpenFAST? Are there other loads being applied to the blades? Is the rotor spinning? Best regards, |
Dear @jjonkman, Thank you for your reply.
Best regards |
Dear @LaurenceWETI, I'm not sure what is going on. I would suggest stepping through with the debugger. The sine wave seems to have the period equivalent of the rotor speed, but I'm not sure why the output in local coordinates is not the same as you are specifying. Best regards, |
Dear @jjonkman Thank you for your help By tracking the values of
Below I run the simulation with only 2 blades. It is obvious that the transformation for blade 2 uses the same initial position of blade 1. But I don't know how to update Best regards, |
Dear @LaurenceWETI, The values for During initialization, the root reference orientation is passed into BeamDyn (this is the root orientation of a given with no initial azimuth rotation for the rotor). The blade reference frame defined by It is possible that this is causing issues with the orientations of your applied loads on blades 2 and 3. I don't know exactly what you've changed in the code to apply the loads, but I am suspicious that you need to include the root reference orientation in your load application. This is stored in the variable On the plots in the above comment, I am unsure what the x-axis is. Do I assume correctly that it is time? Hopefully this is helpful in finding the issue. Regards, |
Hello everyone
@jjonkman
@bjonkman
In a previous issue #548 we discussed how to implement the new loads resulting from shifting a mass along the blade in OpenFAST/ElastoDyn. The new loads are added in terms of external torque applied at the hub (
HubPtLoad
). This implementation allows to simulate the dynamic response of the wind turbine to changes in the direction of the shifted mass in- and outboard. However, the impact of the resulting Coriolis forces on the blade elements are not considered in that implementation. Therefore, the next step is to implement these forces in the source code of OpenFAST/BeamDyn. I started to get familiar with the theory manual and the source code of BeamDyn, and I would ask some questions relating to the procedure that I would go through to implement the resulting Coriolis forces.The resulting Coriolis forces will be implanted as a distributed force vector in a separate Subroutine in BeamDyn.f90. The new distributed force will look like this
u%DistrLoad%Force = u%DistrLoad%Force + u%DistrLoad%Coriolis
The Coriolis force will be add only when the mass moved along the blade, else it equals zero
u%DistrLoad%Coriolis = 0.0_ReKi
The subroutine used to add the Coriolis force will be called in every subroutine uses the
u%DistrLoad%Force
i.e. in subroutinesBD_GenerateDynamicElementAcc()
;BD_GenerateDynamicElementForce()
;BD_Static()
;BD_GenerateStaticElement()
;BD_GenerateStaticElementForce();``BD_GenerateDynamicElementGA2()
andBD_InputGlobalLocal()
The parameters needed to compute the Coriolis force will be imported from a Simulink model through the S-Function as introduced in issue #548 and this work [1].
Is it possible to consider the resulting Coriolis force as an external distributed force?
Is the presented procedure feasible to be implemented in the source code of OpenFAST/BeamDyn?
After an internally proof of the modified code, I would pull a request in GitHub to get the changes in the source code reviewed from the OpenFAST developer.
I would appreciate any help.
Best regards
Laurence
The text was updated successfully, but these errors were encountered: