Skip to content
This repository was archived by the owner on Nov 27, 2023. It is now read-only.

Commit 96f93ee

Browse files
committed
IO: update of deck for BD driver, fast tabDimVar, yaml, and tests
1 parent 83d85e5 commit 96f93ee

File tree

7 files changed

+408
-128
lines changed

7 files changed

+408
-128
lines changed

pyFAST/input_output/fast_input_deck.py

+107-68
Original file line numberDiff line numberDiff line change
@@ -212,15 +212,17 @@ def read(self, filename=None):
212212
if filename is not None:
213213
self.filename = filename
214214

215-
# Read OpenFAST files
215+
# Read main file (.fst, or .drv) and store into key "Fst"
216216
self.fst_vt['Fst'] = self._read(self.FAST_InputFile, 'Fst')
217217
if self.fst_vt['Fst'] is None:
218218
raise Exception('Error reading main file {}'.format(self.filename))
219219
keys = self.fst_vt['Fst'].keys()
220220

221-
221+
# Detect driver or OpenFAST version
222222
if 'NumTurbines' in keys:
223223
self.version='AD_driver'
224+
elif 'DynamicSolve' in keys:
225+
self.version='BD_driver'
224226
elif 'InterpOrder' in self.fst_vt['Fst'].keys():
225227
self.version='OF2'
226228
else:
@@ -235,6 +237,18 @@ def read(self, filename=None):
235237

236238
self.readAD(key='AeroDyn15')
237239

240+
elif self.version=='BD_driver':
241+
# --- BD driver
242+
self.fst_vt['BeamDyn'] = self._read(self.fst_vt['Fst']['InputFile'],'BD')
243+
if self.fst_vt['BeamDyn'] is not None:
244+
# Blades
245+
bld_file = os.path.join(os.path.dirname(self.fst_vt['Fst']['InputFile']), self.fst_vt['BeamDyn']['BldFile'])
246+
print('bld_file', bld_file)
247+
self.fst_vt['BeamDynBlade']= self._read(bld_file,'BDbld')
248+
249+
del self.fst_vt['af_data']
250+
del self.fst_vt['ac_data']
251+
238252
elif self.version=='OF2':
239253
# ---- Regular OpenFAST file
240254
# ElastoDyn
@@ -336,85 +350,110 @@ def write(self, filename=None, prefix='', suffix='', directory=None):
336350
self.filename=filename
337351
if directory is None:
338352
directory = os.path.dirname(filename)
353+
else:
354+
# Making sure filename is within directory
355+
filename = os.path.join(directory, os.path.basename(filename))
356+
if not os.path.exists(directory):
357+
os.makedirs(directory)
358+
339359
basename = os.path.splitext(os.path.basename(filename))[0]
340360

341361

342362
fst = self.fst_vt['Fst']
343363

344-
# Filenames
345-
filename_ED = os.path.join(directory,prefix+'ED'+suffix+'.dat') if fst['CompElast']>0 else 'none'
346-
filename_IW = os.path.join(directory,prefix+'IW'+suffix+'.dat') if fst['CompInflow']>0 else 'none'
347-
filename_BD = os.path.join(directory,prefix+'BD'+suffix+'.dat') if fst['CompElast']==2 else 'none'
348-
filename_AD = os.path.join(directory,prefix+'AD'+suffix+'.dat') if fst['CompAero']>0 else 'none'
349-
filename_HD = os.path.join(directory,prefix+'HD'+suffix+'.dat') if fst['CompHydro']>0 else 'none'
350-
filename_SD = os.path.join(directory,prefix+'SD'+suffix+'.dat') if fst['CompSub']>0 else 'none'
351-
filename_MD = os.path.join(directory,prefix+'MD'+suffix+'.dat') if fst['CompMooring']>0 else 'none'
352-
filename_SvD = os.path.join(directory,prefix+'SvD'+suffix+'.dat') if fst['CompServo']>0 else 'none'
353-
filename_Ice = os.path.join(directory,prefix+'Ice'+suffix+'.dat') if fst['CompIce']>0 else 'none'
354-
filename_ED_bld = os.path.join(directory,prefix+'ED_bld'+suffix+'.dat') if fst['CompElast']>0 else 'none'
355-
filename_ED_twr = os.path.join(directory,prefix+'ED_twr'+suffix+'.dat') if fst['CompElast']>0 else 'none'
356-
filename_BD_bld = os.path.join(directory,prefix+'BD_bld'+suffix+'.dat') if fst['CompElast']>0 else 'none'
357-
# TODO AD Profiles and OLAF
358-
359-
fst['EDFile'] = '"' + os.path.basename(filename_ED) + '"'
360-
fst['BDBldFile(1)'] = '"' + os.path.basename(filename_BD) + '"'
361-
fst['BDBldFile(2)'] = '"' + os.path.basename(filename_BD) + '"'
362-
fst['BDBldFile(3)'] = '"' + os.path.basename(filename_BD) + '"'
363-
fst['InflowFile'] = '"' + os.path.basename(filename_IW) + '"'
364-
fst['AeroFile'] = '"' + os.path.basename(filename_AD) + '"'
365-
fst['ServoFile'] = '"' + os.path.basename(filename_AD) + '"'
366-
fst['HydroFile'] = '"' + os.path.basename(filename_HD) + '"'
367-
fst['SubFile'] = '"' + os.path.basename(filename_SD) + '"'
368-
fst['MooringFile'] = '"' + os.path.basename(filename_MD) + '"'
369-
fst['IceFile'] = '"' + os.path.basename(filename_Ice)+ '"'
370-
fst.write(filename)
371-
372-
373-
ED = self.fst_vt['ElastoDyn']
374-
if fst['CompElast']>0:
375-
ED['TwrFile'] = '"' + os.path.basename(filename_ED_twr)+ '"'
376-
self.fst_vt['ElastoDynTower'].write(filename_ED_twr)
377-
if fst['CompElast']==1:
378-
if 'BldFile1' in ED.keys():
379-
ED['BldFile1'] = '"' + os.path.basename(filename_ED_bld)+ '"'
380-
ED['BldFile2'] = '"' + os.path.basename(filename_ED_bld)+ '"'
381-
ED['BldFile3'] = '"' + os.path.basename(filename_ED_bld)+ '"'
382-
else:
383-
ED['BldFile(1)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
384-
ED['BldFile(2)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
385-
ED['BldFile(3)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
386-
self.fst_vt['ElastoDynBlade'].write(filename_ED_bld)
387364

388-
elif fst['CompElast']==2:
365+
if self.version=='AD_driver':
366+
raise NotImplementedError()
367+
368+
elif self.version=='BD_driver':
369+
# --- BD driver
370+
filename_BD = os.path.join(directory, prefix+'BD'+suffix+'.dat')
371+
filename_BD_bld = os.path.join(directory, prefix+'BD_bld'+suffix+'.dat')
372+
fst['InputFile'] = '"' + os.path.basename(filename_BD) + '"'
373+
fst.write(filename)
389374
BD = self.fst_vt['BeamDyn']
390375
BD['BldFile'] = '"'+os.path.basename(filename_BD_bld)+'"'
391376
self.fst_vt['BeamDynBlade'].write(filename_BD_bld) # TODO TODO pick up the proper blade file!
392377
BD.write(filename_BD)
393-
ED.write(filename_ED)
394378

379+
elif self.version=='OF2':
395380

396-
if fst['CompInflow']>0:
397-
self.fst_vt['InflowWind'].write(filename_IW)
398-
399-
if fst['CompAero']>0:
400-
self.fst_vt['AeroDyn15'].write(filename_AD)
401-
# TODO other files
402-
403-
if fst['CompServo']>0:
404-
self.fst_vt['ServoDyn'].write(filename_SvD)
405-
406-
if fst['CompHydro']==1:
407-
self.fst_vt['HydroDyn'].write(filename_HD)
408-
409-
if fst['CompSub']==1:
410-
self.fst_vt['SubDyn'].write(filename_SD)
411-
elif fst['CompSub']==2:
412-
raise NotImplementedError()
381+
# Filenames
382+
filename_ED = os.path.join(directory,prefix+'ED'+suffix+'.dat') if fst['CompElast']>0 else 'none'
383+
filename_IW = os.path.join(directory,prefix+'IW'+suffix+'.dat') if fst['CompInflow']>0 else 'none'
384+
filename_BD = os.path.join(directory,prefix+'BD'+suffix+'.dat') if fst['CompElast']==2 else 'none'
385+
filename_AD = os.path.join(directory,prefix+'AD'+suffix+'.dat') if fst['CompAero']>0 else 'none'
386+
filename_HD = os.path.join(directory,prefix+'HD'+suffix+'.dat') if fst['CompHydro']>0 else 'none'
387+
filename_SD = os.path.join(directory,prefix+'SD'+suffix+'.dat') if fst['CompSub']>0 else 'none'
388+
filename_MD = os.path.join(directory,prefix+'MD'+suffix+'.dat') if fst['CompMooring']>0 else 'none'
389+
filename_SvD = os.path.join(directory,prefix+'SvD'+suffix+'.dat') if fst['CompServo']>0 else 'none'
390+
filename_Ice = os.path.join(directory,prefix+'Ice'+suffix+'.dat') if fst['CompIce']>0 else 'none'
391+
filename_ED_bld = os.path.join(directory,prefix+'ED_bld'+suffix+'.dat') if fst['CompElast']>0 else 'none'
392+
filename_ED_twr = os.path.join(directory,prefix+'ED_twr'+suffix+'.dat') if fst['CompElast']>0 else 'none'
393+
filename_BD_bld = os.path.join(directory,prefix+'BD_bld'+suffix+'.dat') if fst['CompElast']>0 else 'none'
394+
# TODO AD Profiles and OLAF
395+
396+
fst['EDFile'] = '"' + os.path.basename(filename_ED) + '"'
397+
fst['BDBldFile(1)'] = '"' + os.path.basename(filename_BD) + '"'
398+
fst['BDBldFile(2)'] = '"' + os.path.basename(filename_BD) + '"'
399+
fst['BDBldFile(3)'] = '"' + os.path.basename(filename_BD) + '"'
400+
fst['InflowFile'] = '"' + os.path.basename(filename_IW) + '"'
401+
fst['AeroFile'] = '"' + os.path.basename(filename_AD) + '"'
402+
fst['ServoFile'] = '"' + os.path.basename(filename_AD) + '"'
403+
fst['HydroFile'] = '"' + os.path.basename(filename_HD) + '"'
404+
fst['SubFile'] = '"' + os.path.basename(filename_SD) + '"'
405+
fst['MooringFile'] = '"' + os.path.basename(filename_MD) + '"'
406+
fst['IceFile'] = '"' + os.path.basename(filename_Ice)+ '"'
407+
fst.write(filename)
408+
409+
410+
ED = self.fst_vt['ElastoDyn']
411+
if fst['CompElast']>0:
412+
ED['TwrFile'] = '"' + os.path.basename(filename_ED_twr)+ '"'
413+
self.fst_vt['ElastoDynTower'].write(filename_ED_twr)
414+
if fst['CompElast']==1:
415+
if 'BldFile1' in ED.keys():
416+
ED['BldFile1'] = '"' + os.path.basename(filename_ED_bld)+ '"'
417+
ED['BldFile2'] = '"' + os.path.basename(filename_ED_bld)+ '"'
418+
ED['BldFile3'] = '"' + os.path.basename(filename_ED_bld)+ '"'
419+
else:
420+
ED['BldFile(1)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
421+
ED['BldFile(2)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
422+
ED['BldFile(3)'] = '"' + os.path.basename(filename_ED_bld)+ '"'
423+
self.fst_vt['ElastoDynBlade'].write(filename_ED_bld)
424+
425+
elif fst['CompElast']==2:
426+
BD = self.fst_vt['BeamDyn']
427+
BD['BldFile'] = '"'+os.path.basename(filename_BD_bld)+'"'
428+
self.fst_vt['BeamDynBlade'].write(filename_BD_bld) # TODO TODO pick up the proper blade file!
429+
BD.write(filename_BD)
430+
ED.write(filename_ED)
431+
432+
433+
if fst['CompInflow']>0:
434+
self.fst_vt['InflowWind'].write(filename_IW)
435+
436+
if fst['CompAero']>0:
437+
self.fst_vt['AeroDyn15'].write(filename_AD)
438+
# TODO other files
439+
440+
if fst['CompServo']>0:
441+
self.fst_vt['ServoDyn'].write(filename_SvD)
442+
443+
if fst['CompHydro']==1:
444+
self.fst_vt['HydroDyn'].write(filename_HD)
445+
446+
if fst['CompSub']==1:
447+
self.fst_vt['SubDyn'].write(filename_SD)
448+
elif fst['CompSub']==2:
449+
raise NotImplementedError()
450+
451+
if fst['CompMooring']==1:
452+
self.fst_vt['MAP'].write(filename_MD)
453+
if self.fst_vt['Fst']['CompMooring']==2:
454+
self.fst_vt['MoorDyn'].write(filename_MD)
413455

414-
if fst['CompMooring']==1:
415-
self.fst_vt['MAP'].write(filename_MD)
416-
if self.fst_vt['Fst']['CompMooring']==2:
417-
self.fst_vt['MoorDyn'].write(filename_MD)
456+
return filename
418457

419458

420459

pyFAST/input_output/fast_input_file.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ class FASTInputFileBase(File):
173173
f.write('AeroDyn_Changed.dat')
174174
175175
"""
176+
@staticmethod
177+
def defaultExtensions():
178+
return ['.dat','.fst','.txt','.fstf','.dvr']
179+
180+
@staticmethod
181+
def formatName():
182+
return 'FAST input file Base'
176183

177184
def __init__(self, filename=None, **kwargs):
178185
self._size=None
@@ -241,9 +248,12 @@ def __setitem__(self, key, item):
241248
if self.data[i]['tabType'] != TABTYPE_NOT_A_TAB:
242249
# For tables, we automatically update variable that stores the dimension
243250
nRows = len(item)
244-
dimVar = self.data[i]['tabDimVar']
245-
iDimVar = self.getID(dimVar)
246-
self.data[iDimVar]['value'] = nRows # Avoiding a recursive call to __setitem__ here
251+
if 'tabDimVar' in self.data[i].keys():
252+
dimVar = self.data[i]['tabDimVar']
253+
iDimVar = self.getID(dimVar)
254+
self.data[iDimVar]['value'] = nRows # Avoiding a recursive call to __setitem__ here
255+
else:
256+
pass
247257
self.data[i]['value'] = item
248258

249259
def __getitem__(self,key):
@@ -1513,6 +1523,10 @@ def _IComment(self): return [1]
15131523
# --- AeroDyn Polar
15141524
# --------------------------------------------------------------------------------{
15151525
class ADPolarFile(FASTInputFileBase):
1526+
@staticmethod
1527+
def formatName():
1528+
return 'FAST AeroDyn polar file'
1529+
15161530
@classmethod
15171531
def from_fast_input_file(cls, parent):
15181532
self = cls()

0 commit comments

Comments
 (0)