Skip to content
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

read beamdyn? #328

Closed
rdamiani opened this issue Mar 21, 2024 · 8 comments
Closed

read beamdyn? #328

rdamiani opened this issue Mar 21, 2024 · 8 comments
Assignees

Comments

@rdamiani
Copy link

It seems to me that the main load_from_fast does not allow to have a beamdyn only model, is that correct?

@dzalkind
Copy link
Collaborator

I'm not sure what you mean by a beamdyn only model. ROSCO is looking for some data from ElastoDyn, but not much:

self.TipRad = fast.fst_vt['ElastoDyn']['TipRad']

@rdamiani
Copy link
Author

Apologies, I was too fast hitting submit :). It seems to me that the analogous of the following is missing from turbine.py for reading beamdyn blade properties:

# file ed_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['EDFile']) fast.read_ElastoDyn(ed_file) ed_blade_file = os.path.join(os.path.dirname(ed_file), fast.fst_vt['ElastoDyn']['BldFile1']) fast.read_ElastoDynBlade(ed_blade_file)

I think a check on whether a ED blade file is used vs. BD blade file is used should be done and then select the correct blade file, or am i wrong?

@dzalkind
Copy link
Collaborator

Yeah, that's a reasonable suggestion. The only thing that ROSCO wants from an ED blade is the damping, which is only used to tune the trailing edge flap control.

If you have an example and a fix, I'd be happy to help merge it in. Otherwise, I'll leave this open until we get to it.

@rdamiani
Copy link
Author

Hi Dan, sorry for the delay, I have modified it like this, but I am still testing it out, as I am getting some issues with the read of AD data now, but I will let you know how it goes.

  ` if fast.fst_vt['Fst']['CompElast'] ==1:
        ed_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['EDFile'])
        fast.read_ElastoDyn(ed_file)
        ed_blade_file = os.path.join(os.path.dirname(ed_file), fast.fst_vt['ElastoDyn']['BldFile1'])
        fast.read_ElastoDynBlade(ed_blade_file)
    elif fast.fst_vt['Fst']['CompElast'] ==2:
        bd_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['BDBldFile(1)'])
        fast.read_BeamDyn(bd_file)
        bd_blade_file = os.path.join(os.path.dirname(bd_file), fast.fst_vt['BeamDyn']['BldFile'])
        fast.read_BeamDynBlade(bd_blade_file)
    else:
        Warning('No ElastoDyn or BeamDyn files were provided')`

@rdamiani
Copy link
Author

rdamiani commented Mar 22, 2024

ok
this is the approximation I am using :
line 172

# RRD changed the following to include ED vs. BD
      if fast.fst_vt['Fst']['CompElast'] >=1:
            ed_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['EDFile'])
             fast.read_ElastoDyn(ed_file)
        if fast.fst_vt['Fst']['CompElast'] ==1:
             ed_blade_file = os.path.join(os.path.dirname(ed_file), fast.fst_vt['ElastoDyn']['BldFile1'])
             fast.read_ElastoDynBlade(ed_blade_file)
        elif fast.fst_vt['Fst']['CompElast'] ==2:
             bd_file = os.path.join(fast.FAST_directory, fast.fst_vt['Fst']['BDBldFile(1)'])
             fast.read_BeamDyn(bd_file)
             bd_blade_file = os.path.join(os.path.dirname(bd_file), fast.fst_vt['BeamDyn']['BldFile'])
             fast.read_BeamDynBlade(bd_blade_file)
        else:
            Warning('No ElastoDyn or BeamDyn blade files were provided')

line 600

        self.bld_flapwise_damp = 0.        
        if self.fast.fst_vt['Fst']['CompElast'] ==1:
           self.bld_flapwise_damp = self.fast.fst_vt['ElastoDynBlade']['BldFlDmp1']/100
        elif self.fast.fst_vt['BeamDynBlade']['damp_type']:
           self.bld_flapwise_damp = self.fast.fst_vt['BeamDynBlade']['mu5']*0.5*self.bld_flapwise_freq 

Hope this helps develop something for BD-blade cases.

@dzalkind
Copy link
Collaborator

This is helpful...thanks!

@rdamiani
Copy link
Author

A couple of other questions (for fixed pitch cases); it seems as if ROSCO wants to change pitch even if IPC_ControlMode=PC_ControlMode=0 ; I resorted to setting min_pitch= max_pitch=0, however there are two issues with that:

  1. controller.py checks if not isinstance(self.min_pitch, float) and would not take the set values if they are not specified as 0. in the yaml, which is a bit annoying
  2. ROSCO checks min '>=' max and bombs, i think this could work with '>' which is what I did for my version, but perhaps there are other reason why you want the check to be more stringent

abhineet-gupta added a commit to abhineet-gupta/AG_ROSCO that referenced this issue May 17, 2024
dzalkind added a commit that referenced this issue Jun 14, 2024
* Set types on wrap functions

* Update IEA-15 inputs

* Update installation instructions -- draft

* Change to new AF Coords

* Fix IEA15 airfoils again

* Try latest setup_fortran action

* Add UAStart/End location writing

* Try intel-classic compiler

* Add developer docs about api changes

* Try macos-latest in CI

* Add support for reading daming from beamdyn blade files (#328)

---------

Co-authored-by: dzalkind <[email protected]>
Co-authored-by: dzalkind <[email protected]>
@abhineet-gupta
Copy link
Collaborator

Issue with reading beamdyn resolved in #349. I'll create another issue for the question with fixed pitch case after some testing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants