@@ -177,7 +177,7 @@ def __init__(self):
177
177
self .fst_vt ['outlist' ] = copy .deepcopy (FstOutput )
178
178
self .fst_vt ['ElastoDyn' ] = {}
179
179
self .fst_vt ['SimpleElastoDyn' ] = {}
180
- self .fst_vt ['ElastoDynBlade' ] = {}
180
+ self .fst_vt ['ElastoDynBlade' ] = [{}, {}, {}] # One dict per blade, We will reduce this down to one, if all the files are the same
181
181
self .fst_vt ['ElastoDynTower' ] = {}
182
182
self .fst_vt ['InflowWind' ] = {}
183
183
self .fst_vt ['AeroDyn' ] = {}
@@ -654,7 +654,7 @@ def read_SimpleElastoDyn(self, sed_file):
654
654
655
655
656
656
657
- def read_ElastoDynBlade (self , blade_file ):
657
+ def read_ElastoDynBlade (self , blade_file , BladeNumber = 0 ):
658
658
# ElastoDyn v1.00 Blade Input File
659
659
# Currently no differences between FASTv8.16 and OpenFAST.
660
660
@@ -665,49 +665,49 @@ def read_ElastoDynBlade(self, blade_file):
665
665
f .readline ()
666
666
667
667
# Blade Parameters
668
- self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ] = int (f .readline ().split ()[0 ])
669
- self .fst_vt ['ElastoDynBlade' ]['BldFlDmp1' ] = float_read (f .readline ().split ()[0 ])
670
- self .fst_vt ['ElastoDynBlade' ]['BldFlDmp2' ] = float_read (f .readline ().split ()[0 ])
671
- self .fst_vt ['ElastoDynBlade' ]['BldEdDmp1' ] = float_read (f .readline ().split ()[0 ])
668
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'NBlInpSt' ] = int (f .readline ().split ()[0 ])
669
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFlDmp1' ] = float_read (f .readline ().split ()[0 ])
670
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFlDmp2' ] = float_read (f .readline ().split ()[0 ])
671
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldEdDmp1' ] = float_read (f .readline ().split ()[0 ])
672
672
673
673
# Blade Adjustment Factors
674
674
f .readline ()
675
- self .fst_vt ['ElastoDynBlade' ]['FlStTunr1' ] = float_read (f .readline ().split ()[0 ])
676
- self .fst_vt ['ElastoDynBlade' ]['FlStTunr2' ] = float_read (f .readline ().split ()[0 ])
677
- self .fst_vt ['ElastoDynBlade' ]['AdjBlMs' ] = float_read (f .readline ().split ()[0 ])
678
- self .fst_vt ['ElastoDynBlade' ]['AdjFlSt' ] = float_read (f .readline ().split ()[0 ])
679
- self .fst_vt ['ElastoDynBlade' ]['AdjEdSt' ] = float_read (f .readline ().split ()[0 ])
675
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'FlStTunr1' ] = float_read (f .readline ().split ()[0 ])
676
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'FlStTunr2' ] = float_read (f .readline ().split ()[0 ])
677
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'AdjBlMs' ] = float_read (f .readline ().split ()[0 ])
678
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'AdjFlSt' ] = float_read (f .readline ().split ()[0 ])
679
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'AdjEdSt' ] = float_read (f .readline ().split ()[0 ])
680
680
681
681
# Distrilbuted Blade Properties
682
682
f .readline ()
683
683
f .readline ()
684
684
f .readline ()
685
- self .fst_vt ['ElastoDynBlade' ]['BlFract' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
686
- self .fst_vt ['ElastoDynBlade' ]['PitchAxis' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
687
- self .fst_vt ['ElastoDynBlade' ]['StrcTwst' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
688
- self .fst_vt ['ElastoDynBlade' ]['BMassDen' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
689
- self .fst_vt ['ElastoDynBlade' ]['FlpStff' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
690
- self .fst_vt ['ElastoDynBlade' ]['EdgStff' ] = [None ] * self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]
685
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BlFract' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
686
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'PitchAxis' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
687
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'StrcTwst' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
688
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BMassDen' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
689
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'FlpStff' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
690
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'EdgStff' ] = [None ] * self .fst_vt ['ElastoDynBlade' ][ BladeNumber ]['NBlInpSt' ]
691
691
692
- for i in range (self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]):
692
+ for i in range (self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'NBlInpSt' ]):
693
693
data = f .readline ().split ()
694
- self .fst_vt ['ElastoDynBlade' ]['BlFract' ][i ] = float_read (data [0 ])
695
- self .fst_vt ['ElastoDynBlade' ]['PitchAxis' ][i ] = float_read (data [1 ])
696
- self .fst_vt ['ElastoDynBlade' ]['StrcTwst' ][i ] = float_read (data [2 ])
697
- self .fst_vt ['ElastoDynBlade' ]['BMassDen' ][i ] = float_read (data [3 ])
698
- self .fst_vt ['ElastoDynBlade' ]['FlpStff' ][i ] = float_read (data [4 ])
699
- self .fst_vt ['ElastoDynBlade' ]['EdgStff' ][i ] = float_read (data [5 ])
694
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BlFract' ][i ] = float_read (data [0 ])
695
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'PitchAxis' ][i ] = float_read (data [1 ])
696
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'StrcTwst' ][i ] = float_read (data [2 ])
697
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BMassDen' ][i ] = float_read (data [3 ])
698
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'FlpStff' ][i ] = float_read (data [4 ])
699
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'EdgStff' ][i ] = float_read (data [5 ])
700
700
701
701
f .readline ()
702
- self .fst_vt ['ElastoDynBlade' ]['BldFl1Sh' ] = [None ] * 5
703
- self .fst_vt ['ElastoDynBlade' ]['BldFl2Sh' ] = [None ] * 5
704
- self .fst_vt ['ElastoDynBlade' ]['BldEdgSh' ] = [None ] * 5
702
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFl1Sh' ] = [None ] * 5
703
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFl2Sh' ] = [None ] * 5
704
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldEdgSh' ] = [None ] * 5
705
705
for i in range (5 ):
706
- self .fst_vt ['ElastoDynBlade' ]['BldFl1Sh' ][i ] = float_read (f .readline ().split ()[0 ])
706
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFl1Sh' ][i ] = float_read (f .readline ().split ()[0 ])
707
707
for i in range (5 ):
708
- self .fst_vt ['ElastoDynBlade' ]['BldFl2Sh' ][i ] = float_read (f .readline ().split ()[0 ])
708
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldFl2Sh' ][i ] = float_read (f .readline ().split ()[0 ])
709
709
for i in range (5 ):
710
- self .fst_vt ['ElastoDynBlade' ]['BldEdgSh' ][i ] = float_read (f .readline ().split ()[0 ])
710
+ self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'BldEdgSh' ][i ] = float_read (f .readline ().split ()[0 ])
711
711
712
712
f .close ()
713
713
@@ -3163,10 +3163,46 @@ def execute(self):
3163
3163
self .read_SimpleElastoDyn (ed_file )
3164
3164
else :
3165
3165
self .read_ElastoDyn (ed_file )
3166
- if not os .path .isabs (self .fst_vt ['ElastoDyn' ]['BldFile1' ]):
3167
- ed_blade_file = os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['BldFile1' ])
3168
- if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (ed_blade_file ): # If elastodyn blade is being used OR if the blade file exists
3169
- self .read_ElastoDynBlade (ed_blade_file )
3166
+ # keeping the previous logic to read in the files if self.fst_vt['Fst']['CompElast'] == 1 OR
3167
+ # if the blade file exists, but include the possibility of having three unique blade files
3168
+
3169
+ # Making sure the blade files pointing to the correct location
3170
+ bldFile1 = self .fst_vt ['ElastoDyn' ]['BldFile1' ] if os .path .isabs (self .fst_vt ['ElastoDyn' ]['BldFile1' ]) else os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['BldFile1' ])
3171
+ bldFile2 = self .fst_vt ['ElastoDyn' ]['BldFile2' ] if os .path .isabs (self .fst_vt ['ElastoDyn' ]['BldFile2' ]) else os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['BldFile2' ])
3172
+ bldFile3 = self .fst_vt ['ElastoDyn' ]['BldFile3' ] if os .path .isabs (self .fst_vt ['ElastoDyn' ]['BldFile3' ]) else os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['BldFile3' ])
3173
+
3174
+ if bldFile1 == bldFile2 and bldFile1 == bldFile3 :
3175
+ # All blades are identical - verify if the file exists and self.fst_vt['Fst']['CompElast'] == 1
3176
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (bldFile1 ):
3177
+ self .read_ElastoDynBlade (bldFile1 , BladeNumber = 0 )
3178
+ # Copy data to other blade slots
3179
+ self .fst_vt ['ElastoDynBlade' ] = self .fst_vt ['ElastoDynBlade' ][0 ]
3180
+
3181
+ elif self .fst_vt ['ElastoDyn' ]['NumBl' ] == 2 and bldFile1 == bldFile2 :
3182
+ # two bladed with identical blades
3183
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (bldFile1 ):
3184
+ self .read_ElastoDynBlade (bldFile1 , BladeNumber = 0 )
3185
+ self .fst_vt ['ElastoDynBlade' ] = self .fst_vt ['ElastoDynBlade' ][0 ]
3186
+
3187
+ elif self .fst_vt ['ElastoDyn' ]['NumBl' ] == 1 and os .path .isfile (bldFile1 ):
3188
+ # one bladed rotor
3189
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 : # we rarely have this case
3190
+ self .read_ElastoDynBlade (bldFile1 , BladeNumber = 0 )
3191
+ self .fst_vt ['ElastoDynBlade' ] = self .fst_vt ['ElastoDynBlade' ][0 ]
3192
+ else :
3193
+ # we have three unique blades
3194
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (bldFile1 ):
3195
+ self .read_ElastoDynBlade (bldFile1 , BladeNumber = 0 )
3196
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (bldFile2 ):
3197
+ self .read_ElastoDynBlade (bldFile2 , BladeNumber = 1 )
3198
+ if self .fst_vt ['Fst' ]['CompElast' ] == 1 or os .path .isfile (bldFile3 ):
3199
+ self .read_ElastoDynBlade (bldFile3 , BladeNumber = 2 )
3200
+
3201
+ # if not os.path.isabs(self.fst_vt['ElastoDyn']['BldFile1']):
3202
+ # ed_blade_file = os.path.join(os.path.dirname(ed_file), self.fst_vt['ElastoDyn']['BldFile1'])
3203
+ # if self.fst_vt['Fst']['CompElast'] == 1 or os.path.isfile(ed_blade_file): # If elastodyn blade is being used OR if the blade file exists
3204
+ # self.read_ElastoDynBlade(ed_blade_file)
3205
+
3170
3206
if not os .path .isabs (self .fst_vt ['ElastoDyn' ]['TwrFile' ]):
3171
3207
ed_tower_file = os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['TwrFile' ])
3172
3208
self .read_ElastoDynTower (ed_tower_file )
0 commit comments