@@ -177,7 +177,7 @@ def __init__(self):
177177 self .fst_vt ['outlist' ] = copy .deepcopy (FstOutput )
178178 self .fst_vt ['ElastoDyn' ] = {}
179179 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
181181 self .fst_vt ['ElastoDynTower' ] = {}
182182 self .fst_vt ['InflowWind' ] = {}
183183 self .fst_vt ['AeroDyn' ] = {}
@@ -654,7 +654,7 @@ def read_SimpleElastoDyn(self, sed_file):
654654
655655
656656
657- def read_ElastoDynBlade (self , blade_file ):
657+ def read_ElastoDynBlade (self , blade_file , BladeNumber = 0 ):
658658 # ElastoDyn v1.00 Blade Input File
659659 # Currently no differences between FASTv8.16 and OpenFAST.
660660
@@ -665,49 +665,49 @@ def read_ElastoDynBlade(self, blade_file):
665665 f .readline ()
666666
667667 # 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 ])
672672
673673 # Blade Adjustment Factors
674674 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 ])
680680
681681 # Distrilbuted Blade Properties
682682 f .readline ()
683683 f .readline ()
684684 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' ]
691691
692- for i in range (self .fst_vt ['ElastoDynBlade' ]['NBlInpSt' ]):
692+ for i in range (self .fst_vt ['ElastoDynBlade' ][BladeNumber ][ 'NBlInpSt' ]):
693693 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 ])
700700
701701 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
705705 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 ])
707707 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 ])
709709 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 ])
711711
712712 f .close ()
713713
@@ -3163,10 +3163,46 @@ def execute(self):
31633163 self .read_SimpleElastoDyn (ed_file )
31643164 else :
31653165 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+
31703206 if not os .path .isabs (self .fst_vt ['ElastoDyn' ]['TwrFile' ]):
31713207 ed_tower_file = os .path .join (os .path .dirname (ed_file ), self .fst_vt ['ElastoDyn' ]['TwrFile' ])
31723208 self .read_ElastoDynTower (ed_tower_file )
0 commit comments