Skip to content

Commit 74662f0

Browse files
committed
ED can handle unique blades
1 parent 9998918 commit 74662f0

File tree

2 files changed

+119
-70
lines changed

2 files changed

+119
-70
lines changed

openfast_io/openfast_io/FAST_reader.py

+70-34
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)