import os
import numpy as np
from sharpy.utils.solver_interface import solver, BaseSolver
import sharpy.utils.settings as settings
[docs]@solver
class WriteVariablesTime(BaseSolver):
r"""
Write variables with time
``WriteVariablesTime`` is a class inherited from ``BaseSolver``
It is a postprocessor that outputs the value of variables with time onto a text file.
Attributes:
settings_types (dict): Acceptable data types of the input data
settings_default (dict): Default values for input data should the user not provide them
See the list of arguments
dir (str): directory to output the information
"""
solver_id = 'WriteVariablesTime'
solver_classification = 'post-processor'
settings_types = dict()
settings_default = dict()
settings_description = dict()
settings_types['folder'] = 'str'
settings_default['folder'] = './output/'
settings_description['folder'] = 'Output folder directory'
settings_types['delimiter'] = 'str'
settings_default['delimiter'] = ' '
settings_description['delimiter'] = 'Delimiter to be used in the output file'
settings_types['FoR_variables'] = 'list(str)'
settings_default['FoR_variables'] = ['']
settings_description['FoR_variables'] = 'Variables of ``StructTimeStepInfo`` associated to the frame of reference to be writen'
settings_types['FoR_number'] = 'list(int)'
settings_default['FoR_number'] = np.array([0], dtype=int)
settings_description['FoR_number'] = 'Number of the A frame of reference to output (for multibody configurations)'
settings_types['structure_variables'] = 'list(str)'
settings_default['structure_variables'] = ['']
settings_description['structure_variables'] = 'Variables of ``StructTimeStepInfo`` associated to the frame of reference to be writen'
settings_types['structure_nodes'] = 'list(int)'
settings_default['structure_nodes'] = np.array([-1])
settings_description['structure_nodes'] = 'Number of the nodes to be writen'
settings_types['aero_panels_variables'] = 'list(str)'
settings_default['aero_panels_variables'] = ['']
settings_description['aero_panels_variables'] = 'Variables of ``AeroTimeStepInfo`` associated to panels to be writen'
settings_types['aero_panels_isurf'] = 'list(int)'
settings_default['aero_panels_isurf'] = np.array([0])
settings_description['aero_panels_isurf'] = "Number of the panels' surface to be output"
settings_types['aero_panels_im'] = 'list(int)'
settings_default['aero_panels_im'] = np.array([0])
settings_description['aero_panels_im'] = 'Chordwise index of the panels to be output'
settings_types['aero_panels_in'] = 'list(int)'
settings_default['aero_panels_in'] = np.array([0])
settings_description['aero_panels_in'] = 'Spanwise index of the panels to be output'
settings_types['aero_nodes_variables'] = 'list(str)'
settings_default['aero_nodes_variables'] = ['']
settings_description['aero_nodes_variables'] = 'Variables of ``AeroTimeStepInfo`` associated to nodes to be writen'
settings_types['aero_nodes_isurf'] = 'list(int)'
settings_default['aero_nodes_isurf'] = np.array([0])
settings_description['aero_nodes_isurf'] = "Number of the nodes' surface to be output"
settings_types['aero_nodes_im'] = 'list(int)'
settings_default['aero_nodes_im'] = np.array([0])
settings_description['aero_nodes_im'] = 'Chordwise index of the nodes to be output'
settings_types['aero_nodes_in'] = 'list(int)'
settings_default['aero_nodes_in'] = np.array([0])
settings_description['aero_nodes_in'] = 'Spanwise index of the nodes to be output'
settings_types['cleanup_old_solution'] = 'bool'
settings_default['cleanup_old_solution'] = 'false'
settings_description['cleanup_old_solution'] = 'Remove the existing files'
settings_table = settings.SettingsTable()
__doc__ += settings_table.generate(settings_types, settings_default, settings_description)
def __init__(self):
self.settings = None
self.data = None
self.dir = 'output/'
def initialise(self, data, custom_settings=None):
self.data = data
if custom_settings is None:
self.settings = data.settings[self.solver_id]
else:
self.settings = custom_settings
settings.to_custom_types(self.settings, self.settings_types, self.settings_default)
self.dir = self.settings['folder'] + '/' + self.data.settings['SHARPy']['case'] + '/WriteVariablesTime/'
if not os.path.isdir(self.dir):
os.makedirs(self.dir)
# Check inputs
if not ((len(self.settings['aero_panels_isurf']) == len(self.settings['aero_panels_im'])) and (len(self.settings['aero_panels_isurf']) == len(self.settings['aero_panels_in']))):
print("ERROR: aero_panels should be defined as [i_surf,i_m,i_n]")
if not ((len(self.settings['aero_nodes_isurf']) == len(self.settings['aero_nodes_im'])) and (len(self.settings['aero_nodes_isurf']) == len(self.settings['aero_nodes_in']))):
print("ERROR: aero_nodes should be defined as [i_surf,i_m,i_n]")
if self.settings['cleanup_old_solution']:
for ivariable in range(len(self.settings['FoR_variables'])):
if self.settings['FoR_variables'][ivariable] == '':
continue
for ifor in range(len(self.settings['FoR_number'])):
filename = self.dir + "FoR_" + '%02d' % self.settings['FoR_number'][ifor] + "_" + self.settings['FoR_variables'][ivariable] + ".dat"
try:
os.remove(filename)
except FileNotFoundError:
pass
# Structure variables at nodes
for ivariable in range(len(self.settings['structure_variables'])):
if self.settings['structure_variables'][ivariable] == '':
continue
for inode in range(len(self.settings['structure_nodes'])):
node = self.settings['structure_nodes'][inode]
filename = self.dir + "struct_" + self.settings['structure_variables'][ivariable] + "_node" + str(node) + ".dat"
try:
os.remove(filename)
except FileNotFoundError:
pass
# Aerodynamic variables at panels
for ivariable in range(len(self.settings['aero_panels_variables'])):
if self.settings['aero_panels_variables'][ivariable] == '':
continue
for ipanel in range(len(self.settings['aero_panels_isurf'])):
i_surf = self.settings['aero_panels_isurf'][ipanel]
i_m = self.settings['aero_panels_im'][ipanel]
i_n = self.settings['aero_panels_in'][ipanel]
filename = self.dir + "aero_" + self.settings['aero_panels_variables'][ivariable] + "_panel" + "_isurf" + str(i_surf) + "_im"+ str(i_m) + "_in"+ str(i_n) + ".dat"
try:
os.remove(filename)
except FileNotFoundError:
pass
# Aerodynamic variables at nodes
for ivariable in range(len(self.settings['aero_nodes_variables'])):
if self.settings['aero_nodes_variables'][ivariable] == '':
continue
for inode in range(len(self.settings['aero_nodes_isurf'])):
i_surf = self.settings['aero_nodes_isurf'][inode]
i_m = self.settings['aero_nodes_im'][inode]
i_n = self.settings['aero_nodes_in'][inode]
filename = self.dir + "aero_" + self.settings['aero_nodes_variables'][ivariable] + "_node" + "_isurf" + str(i_surf) + "_im"+ str(i_m) + "_in"+ str(i_n) + ".dat"
try:
os.remove(filename)
except FileNotFoundError:
pass
def run(self, online=False):
# FoR variables
if 'FoR_number' in self.settings:
pass
else:
self.settings['FoR_number'] = np.array([0], dtype=int)
for ivariable in range(len(self.settings['FoR_variables'])):
if self.settings['FoR_variables'][ivariable] == '':
continue
for ifor in range(len(self.settings['FoR_number'])):
filename = self.dir + "FoR_" + '%02d' % self.settings['FoR_number'][ifor] + "_" + self.settings['FoR_variables'][ivariable] + ".dat"
with open(filename, 'a') as fid:
var = np.atleast_2d(getattr(self.data.structure.timestep_info[-1], self.settings['FoR_variables'][ivariable]))
rows, cols = var.shape
if ((cols == 1) and (rows == 1)):
self.write_value_to_file(fid, self.data.ts, var, self.settings['delimiter'])
elif ((cols > 1) and (rows == 1)):
self.write_nparray_to_file(fid, self.data.ts, var, self.settings['delimiter'])
elif ((cols == 1) and (rows >= 1)):
self.write_value_to_file(fid, self.data.ts, var[ifor], self.settings['delimiter'])
else:
self.write_nparray_to_file(fid, self.data.ts, var[ifor,:], self.settings['delimiter'])
# Structure variables at nodes
for ivariable in range(len(self.settings['structure_variables'])):
if self.settings['structure_variables'][ivariable] == '':
continue
var = getattr(self.data.structure.timestep_info[-1], self.settings['structure_variables'][ivariable])
num_indices = len(var.shape)
if num_indices == 1:
# Beam global variables (i.e. not node dependant)
filename = self.dir + "struct_" + self.settings['structure_variables'][ivariable] + ".dat"
with open(filename, 'a') as fid:
self.write_nparray_to_file(fid, self.data.ts, var, self.settings['delimiter'])
else: # These variables have nodal values (i.e the number of indices is either 2 or 3)
for inode in range(len(self.settings['structure_nodes'])):
node = self.settings['structure_nodes'][inode]
filename = self.dir + "struct_" + self.settings['structure_variables'][ivariable] + "_node" + str(node) + ".dat"
with open(filename, 'a') as fid:
if num_indices == 2:
self.write_nparray_to_file(fid, self.data.ts, var[node,:], self.settings['delimiter'])
elif num_indices == 3:
ielem, inode_in_elem = self.data.structure.node_master_elem[node]
self.write_nparray_to_file(fid, self.data.ts, var[ielem,inode_in_elem,:], self.settings['delimiter'])
# Aerodynamic variables at panels
for ivariable in range(len(self.settings['aero_panels_variables'])):
if self.settings['aero_panels_variables'][ivariable] == '':
continue
for ipanel in range(len(self.settings['aero_panels_isurf'])):
i_surf = self.settings['aero_panels_isurf'][ipanel]
i_m = self.settings['aero_panels_im'][ipanel]
i_n = self.settings['aero_panels_in'][ipanel]
filename = self.dir + "aero_" + self.settings['aero_panels_variables'][ivariable] + "_panel" + "_isurf" + str(i_surf) + "_im"+ str(i_m) + "_in"+ str(i_n) + ".dat"
with open(filename, 'a') as fid:
var = getattr(self.data.aero.timestep_info[-1], self.settings['aero_panels_variables'][ivariable])
self.write_value_to_file(fid, self.data.ts, var.gamma[i_surf][i_m,i_n], self.settings['delimiter'])
# Aerodynamic variables at nodes
for ivariable in range(len(self.settings['aero_nodes_variables'])):
if self.settings['aero_nodes_variables'][ivariable] == '':
continue
for inode in range(len(self.settings['aero_nodes_isurf'])):
i_surf = self.settings['aero_nodes_isurf'][inode]
i_m = self.settings['aero_nodes_im'][inode]
i_n = self.settings['aero_nodes_in'][inode]
filename = self.dir + "aero_" + self.settings['aero_nodes_variables'][ivariable] + "_node" + "_isurf" + str(i_surf) + "_im"+ str(i_m) + "_in"+ str(i_n) + ".dat"
with open(filename, 'a') as fid:
var = getattr(self.data.aero.timestep_info[-1], self.settings['aero_nodes_variables'][ivariable])
self.write_nparray_to_file(fid, self.data.ts, var[i_surf][:,i_m,i_n], self.settings['delimiter'])
return self.data
def write_nparray_to_file(self, fid, ts, nparray, delimiter):
fid.write("%d%s" % (ts,delimiter))
for idim in range(np.shape(nparray)[0]):
try:
for jdim in range(np.shape(nparray)[1]):
fid.write("%e%s" % (nparray[idim, jdim],delimiter))
except IndexError:
fid.write("%e%s" % (nparray[idim],delimiter))
fid.write("\n")
def write_value_to_file(self, fid, ts, value, delimiter):
fid.write("%d%s%e\n" % (ts,delimiter,value))