Skip to content
Snippets Groups Projects
Verified Commit 4b427c18 authored by Paul Dechamps's avatar Paul Dechamps :speech_balloon:
Browse files

(docs) Added docs

parent 3b938a72
No related branches found
No related tags found
1 merge request!1BLASTER v1.0
Pipeline #50931 passed
......@@ -5,7 +5,41 @@ import tbox
from blast.interfaces.DDataStructure import Group
class SolversInterface:
"""
Interface for solvers.
Attributes:
----------
vSolver : object
Viscous solver object.
cfg : dict
Configuration dictionary.
iBnd : list
Inviscid boundary groups.
vBnd : list
Viscous boundary groups.
interpolator : object
Interpolator object.
deltaStarExt : list
Displacement thickness for the quasi-simultaneous interaction law.
xxExt : list
Surface local coordinates for the quasi-simultaneous interaction law.
vtExt : list
Velocity at the edge of the boundary layer for the quasi-simultaneous interaction law.
vinit : bool
Flag used to check if the viscous solver has been initialized.
"""
def __init__(self, _vSolver, _cfg):
"""
Initialize the SolversInterface.
Parameters:
----------
_vSolver : object
Viscous solver object.
_cfg : dict
Configuration dictionary.
"""
self.vSolver = _vSolver
self.cfg = _cfg
......@@ -89,6 +123,14 @@ class SolversInterface:
self.vtExt[iSec][i] = np.asarray(self.sec[iSec][i].vt)
def interpolate(self, dir):
"""Interpolate solution between inviscid and viscous meshes.
args:
----
dir: str
Direction of interpolation.
'i2v': inviscid to viscous.
'v2i': viscous to inviscid.
"""
if dir == 'i2v':
self.interpolator.inviscidToViscous(self.iBnd, self.vBnd)
elif dir == 'v2i':
......
......@@ -25,7 +25,31 @@ from fwk.coloring import ccolors
from blast.interfaces.DSolversInterface import SolversInterface
class DartInterface(SolversInterface):
"""Interface to the Dart solver.
Attributes
----------
iobj : dict
Dart objects defined in core api of dart.
solver : object
Solver object.
blw : list
Blowing boundaries.
adjointSolver : object
Adjoint solver object.
"""
def __init__(self, dartCfg, vSolver, _cfg):
"""Constructor.
Parameters
----------
dartCfg : dict
Dart core api configuration.
vSolver : object
Viscous solver object.
_cfg : dict
Configuration parameters of the VII interface.
"""
try:
from modules.dartflo.dart.api.core import init_dart
self.iobj = init_dart(dartCfg, task=dartCfg['task'], viscous=True)
......@@ -37,8 +61,7 @@ class DartInterface(SolversInterface):
else:
print('Dart successfully loaded for analysis.')
except:
print(ccolors.ANSI_RED, 'Could not load DART. Make sure it is installed.', ccolors.ANSI_RESET)
raise RuntimeError('Import error')
raise ImportError(ccolors.ANSI_RED, 'Could not load DART.', ccolors.ANSI_RESET)
_cfg['Format'] = dartCfg['Format']
if 'iMsh' not in _cfg:
......@@ -46,10 +69,17 @@ class DartInterface(SolversInterface):
SolversInterface.__init__(self, vSolver, _cfg)
def run(self):
"""Run the solver.
"""
return self.solver.run()
def writeCp(self, sfx=''):
""" Write Cp distribution around the airfoil on file.
"""Write Cp distribution around the airfoil on file.
Parameters
----------
sfx : str, optional
Suffix to be added to the file name. The default is ''.
"""
# Extract Cp on elements
self.save(sfx=sfx)
......@@ -96,40 +126,67 @@ class DartInterface(SolversInterface):
invUtils.write_slices(self.iobj['msh'].name, self.cfg['writeSections'], self.cfg['saveTag'], sfx=sfx)
def save(self, sfx='inviscid'):
"""Save the solution.
Parameters
----------
sfx : str, optional
Suffix to be added to the file name. The default is 'inviscid'.
"""
self.solver.save(self.iobj['wrt'], sfx)
def getAoA(self):
"""Return the angle of attack.
"""
return self.solver.pbl.alpha
def setAoA(self, aoa):
"""Set the angle of attack.
"""
self.solver.pbl.update(aoa)
def getMinf(self):
"""Return the Mach number.
"""
return self.solver.pbl.M_inf
def getCl(self):
"""Return the lift coefficient.
"""
return self.solver.Cl
def getCd(self):
"""Return the drag coefficient.
"""
return self.solver.Cd
def getCm(self):
"""Return the moment coefficient.
"""
return self.solver.Cm
def getVerbose(self):
"""Return the verbosity level.
"""
return self.solver.verbose
def getnDim(self):
"""Return the number of dimensions.
"""
return self.iobj['pbl'].nDim
def getnNodesDomain(self):
"""Return the number of nodes in the domain.
"""
return self.solver.pbl.msh.nodes.size()
def reset(self):
"""Reset the solution.
"""
self.solver.reset()
def getInviscidBC(self):
""" Extract the inviscid paramaters at the edge of the boundary layer
"""Extract the inviscid paramaters at the edge of the boundary layer
and use it as a boundary condition in the viscous solver.
Params
......@@ -146,7 +203,7 @@ class DartInterface(SolversInterface):
self.iBnd[n].Rho[iRow] = self.solver.rho[row]
def setBlowingVelocity(self):
""" Extract the solution of the viscous calculation (blowing velocity)
"""Extract the solution of the viscous calculation (blowing velocity)
and use it as a boundary condition in the inviscid solver.
"""
# Impose blowing velocities.
......@@ -157,6 +214,8 @@ class DartInterface(SolversInterface):
self.blw[n].setU(i, blw)
def getWing(self):
"""Extract the wing mesh.
"""
if self.getnDim() == 2:
self.__getWing2D()
elif self.getnDim() == 3:
......
import numpy as np
class MatchingInterpolator:
def __init__(self, _cfg, _nDim):
self.cfg = _cfg
self.nDim = _nDim
"""
Matching Interpolator for inviscid and viscous data.
Attributes:
----------
cfg : dict
Configuration dictionary.
nDim : int
Number of dimensions.
"""
def __init__(self, cfg, ndim):
"""
Initialize the MatchingInterpolator.
Parameters:
----------
_cfg : dict
Configuration dictionary.
_nDim : int
Number of dimensions.
"""
self._cfg = cfg
self._ndim = ndim
def inviscidToViscous(self, iDict, vDict):
if self.nDim == 2:
"""
Interpolate inviscid data to viscous data.
Parameters:
----------
iDict : dict
Inviscid data dictionary.
vDict : dict
Viscous data dictionary.
"""
if self._ndim == 2:
for iReg in range(len(iDict)):
vDict[0][iReg].updateVars(iDict[iReg].V, iDict[iReg].M, iDict[iReg].Rho)
elif self.nDim == 3:
for iSec, ysec in enumerate(self.cfg['sections']):
elif self._ndim == 3:
for iSec, ysec in enumerate(self._cfg['sections']):
for iReg in range(2):
print(iDict[iReg].nodesCoord[iDict[iReg].nodesCoord[:,1] == ysec])
print(iDict[iReg].V[iDict[iReg].nodesCoord[:,1] == ysec])
vDict[iSec][iReg].updateVars(iDict[iReg].V[iDict[iReg].nodesCoord[:,1] == ysec], iDict[iReg].Rho[iDict[iReg].nodesCoord[:,1] == ysec])
def viscousToInviscid(self, iDict, vDict):
if self.nDim == 2:
"""
Interpolate viscous data to inviscid data.
Parameters:
----------
iDict : dict
Inviscid data dictionary.
vDict : dict
Viscous data dictionary.
"""
if self._ndim == 2:
for iReg in range(2):
iDict[iReg].blowingVel = vDict[0][iReg].blowingVel
else:
raise RuntimeError('Incorrect number of dimensions', self.nDim)
\ No newline at end of file
raise RuntimeError('Incorrect number of dimensions', self._ndim)
\ No newline at end of file
......@@ -3,13 +3,43 @@
import numpy as np
from scipy.interpolate import RBFInterpolator
class RbfInterpolator:
"""
Radial Basis Function (RBF) Interpolator for inviscid and viscous data.
Attributes:
----------
_cfg : dict
Configuration dictionary.
_ndim : int
Number of dimensions (2 or 3).
"""
def __init__(self, cfg, ndim):
"""
Initialize the RbfInterpolator.
Parameters:
----------
cfg : dict
Configuration dictionary.
ndim : int
Number of dimensions (must be 2 or 3).
"""
self._cfg = cfg
if ndim != 2 and ndim != 3:
raise ValueError('Number of dimensions must be 2 or 3 but {} was given'.format(ndim))
self._ndim = ndim
def inviscidToViscous(self, iDict, vDict):
"""
Interpolate inviscid data to viscous data.
Parameters:
----------
iDict : dict
Inviscid data dictionary.
vDict : dict
Viscous data dictionary.
"""
## Airfoil
# Find stagnation point
for iSec in range(len(vDict)):
......@@ -24,6 +54,16 @@ class RbfInterpolator:
vDict[iSec][iReg].updateVars(v, M, rho)
def viscousToInviscid(self, iDict, vDict):
"""
Interpolate viscous data to inviscid data.
Parameters:
----------
iDict : dict
Inviscid data dictionary.
vDict : dict
Viscous data dictionary.
"""
if self._ndim == 2:
for iReg, reg in enumerate(iDict):
iDict[iReg].blowingVel = self.__rbfToSection(vDict[0][iReg].elemsCoordTr[:,:(self._ndim-1 if 'vAirfoil' in reg.name else 1)], vDict[0][iReg].blowingVel, reg.elemsCoordTr[:,:(self._ndim-1 if reg.name == 'iWing' else 1)])
......@@ -43,6 +83,23 @@ class RbfInterpolator:
reg.blowingVel = self.__rbfToSection(viscElemsCoord, viscBlowing, reg.elemsCoord[:,:3])
def __rbfToSection(self, x, var, xs):
"""
Perform RBF interpolation.
Parameters:
----------
x : array_like
Input coordinates.
var : array_like
Variable values at input coordinates.
xs : array_like
Output coordinates.
Returns:
-------
array_like
Interpolated variable values at output coordinates.
"""
if np.all(var == var[0]):
varOut = RBFInterpolator(x, var, neighbors=1, kernel='linear', smoothing=0.0, degree=0)(xs)
else:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment