Skip to content

Commit

Permalink
Fixed default boundary conditions for inlet, outlet
Browse files Browse the repository at this point in the history
This commit closes #21. also resolved #29 and #34
  • Loading branch information
mostaphaRoudsari committed Jul 12, 2016
1 parent 596590a commit 56235b7
Show file tree
Hide file tree
Showing 10 changed files with 143 additions and 52 deletions.
4 changes: 2 additions & 2 deletions butterfly/U.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class U(ZeroFolderFoamFile):
__defaultValues = OrderedDict()
__defaultValues['dimensions'] = '[0 1 -1 0 0 0 0]'
__defaultValues['#include'] = None
__defaultValues['internalField'] = None
__defaultValues['internalField'] = 'uniform (0 0 0)'
__defaultValues['boundaryField'] = {}

def __init__(self, values=None):
"""Init class."""
ZeroFolderFoamFile.__init__(self, name='U', cls='volVectorField',
location='0',
defaultValues=self.__defaultValues,
values=values)
values=values)
4 changes: 2 additions & 2 deletions butterfly/boundarycondition.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def __init__(self, refLevels=None, temperature=None,
"""Init bounday condition."""
# set default values for an inlet
u = FixedValue('(0 0 0)') if not u else u
p = FixedValue('0') if not p else p
p = ZeroGradient() if not p else p
k = FixedValue('0.1') if not k else k
epsilon = FixedValue('0.01') if not epsilon else epsilon
nut = Calculated()
Expand Down Expand Up @@ -142,7 +142,7 @@ def __init__(self, refLevels=None, temperature=None,
"""Init bounday condition."""
# set default values for an inlet
u = ZeroGradient() if not u else u
p = ZeroGradient() if not p else p
p = FixedValue('0') if not p else p
k = ZeroGradient() if not k else k
epsilon = ZeroGradient() if not epsilon else epsilon
nut = Calculated()
Expand Down
127 changes: 91 additions & 36 deletions butterfly/core.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""Butterfly core library."""
import os
from shutil import rmtree
from distutils.dir_util import copy_tree

from version import Version
from helper import mkdir, wfile, runbatchfile
# constant folder objects
Expand Down Expand Up @@ -160,14 +162,17 @@ def ABLConditions(self, value):

def loadMesh(self):
"""Return OpenFOAM mesh as a Rhino mesh."""
# This is a abstract property which should be implemented in subclasses
raise NotImplementedError()

def loadPoints(self):
"""Return OpenFOAM mesh as a Rhino mesh."""
# This is a abstract property which should be implemented in subclasses
raise NotImplementedError()

def loadVelocity(self, timestep=None):
"""Return OpenFOAM mesh as a Rhino mesh."""
# This is a abstract property which should be implemented in subclasses
raise NotImplementedError()

def createCaseFolders(self, workingDir=None):
Expand All @@ -193,7 +198,7 @@ def createCaseFolders(self, workingDir=None):
outf.close()

self._isInit = True
print "Folders are created at: %s" % os.path.normpath(self.projectDir)
print "OpenFOAM Case is successfully exported to: %s" % os.path.normpath(self.projectDir)

def __createCaseFolder(self, projectName, workingDir=None):
"""Create root folder for butterfly projects."""
Expand Down Expand Up @@ -289,39 +294,76 @@ def populateSystemContents(self):

# ************************* START ************************* #
# ************************* OpenFOAM Commands ************************* #
def blockMesh(self, run=True, log=True):
"""Run meshBlock command for this case."""
self.__writeAndRunCommands('blockMesh', ('blockMesh',), run)
def blockMesh(self, run=True, log=True, removeContent=True):
"""Run meshBlock command for this case.
Args:
removeContent: Remove current content of the folder except for
blockMeshDict
Returns:
A tuple as (success, err). success is a boolen. err is None in case
of success otherwise the error message as a string.
"""
if removeContent:
self.removePolyMeshContent()

return self.__writeAndRunCommands('blockMesh', ('blockMesh',), run, log)

def snappyHexMesh(self, run=True, log=True):
"""Run snappyHexMesh command for this case."""
self.__writeAndRunCommands('snappyHexMesh', ('snappyHexMesh',), run)
return self.__writeAndRunCommands('snappyHexMesh', ('snappyHexMesh',),
run, log)

def meshCombo(self, run=True, log=True):
"""Run meshBlock and snappyHexMesh."""
self.__writeAndRunCommands('meshCombo',
('meshBlock', 'snappyHexMesh'),
run)
"""Run meshBlock and snappyHexMesh.
Returns:
A tuple as (success, err). success is a boolen. err is None in case
of success otherwise the error message as a string.
"""
return self.__writeAndRunCommands('meshCombo',
('blockMesh', 'snappyHexMesh'),
run, log)

def checkMesh(self, run=True, log=True):
"""Run simpleFoam command for this case.
Returns:
A tuple as (success, err). success is a boolen. err is None in case
of success otherwise the error message as a string.
"""
return self.__writeAndRunCommands('checkMesh', ('checkMesh',), run, log)

def simpleFoam(self, run=True, log=True):
"""Run simpleFoam command for this case."""
self.__writeAndRunCommands('simpleFoam', ('simpleFoam',), run)
"""Run simpleFoam command for this case.
Returns:
A tuple as (success, err). success is a boolen. err is None in case
of success otherwise the error message as a string.
"""
return self.__writeAndRunCommands('simpleFoam', ('simpleFoam',), run, log)

# ************************* OpenFOAM Commands ************************* #
# ************************* END ************************* #

def __writeAndRunCommands(self, name, commands, run=True, log=True):
"""Write batch files for commands and run them."""
"""Write batch files for commands and run them.
Returns:
A tuple as (success, err). success is a boolen. err is None in case
of success otherwise the error message as a string.
"""
_batchString = self.runmanager.command(commands,
includeHeader=True,
log=log)
_fpath = os.path.join(self.etcDir, '%s.bat' % name)
wfile(_fpath, _batchString)

if run:
runbatchfile(_fpath, printLog=log)
return runbatchfile(_fpath, printLog=log)

def getSnappyHexMeshSubfolders(self):
def getSnappyHexMeshFolders(self):
"""Return sorted list of numerical folders."""
_f = [int(name) for name in os.listdir(self.projectDir)
if (name.isdigit() and
Expand All @@ -334,10 +376,10 @@ def getSnappyHexMeshSubfolders(self):

return tuple(str(f) for f in _f)

def getResultsSubfolders(self):
def getResultFolders(self):
"""Return sorted list of numerical folders."""
_f = [int(name) for name in os.listdir(self.projectDir)
if (name.isdigit() and
if (name != '0' and name.isdigit() and
os.path.isdir(os.path.join(self.projectDir, name)) and
not os.path.isdir(os.path.join(self.projectDir, name, 'polyMesh'))
)
Expand All @@ -350,12 +392,15 @@ def getResultsSubfolders(self):
def copySnappyHexMesh(self, folderNumber=None):
"""Copy the results of snappyHexMesh to constant/polyMesh."""
# pick the last numerical folder
_folders = self.getSnappyHexMeshSubfolders()
if len(_folders) < 2:
# it is only o folder
return
if folderNumber:
_s = os.path.join(self.projectDir, str(folderNumber), 'polyMesh')
assert os.path.isdir(_s), "Can't find {}.".format(_s)
else:
_folders = self.getSnappyHexMeshFolders()
if not _folders:
return
_s = os.path.join(self.projectDir, _folders[-1], 'polyMesh')

_s = os.path.join(self.projectDir, _folders[-1], 'polyMesh')
_t = os.path.join(self.constantDir, "polyMesh")

# copy files to constant/polyMesh
Expand All @@ -375,15 +420,10 @@ def renameSnappyHexMeshFolders(self):

self._isSnappyHexMeshFoldersRenamed = False
else:
_folders = self.getSnappyHexMeshSubfolders()
if len(_folders) < 2:
# it is only o folder
return
_folders = self.getSnappyHexMeshFolders()

# rename them starting from 1
for f in _folders:
if f == '0':
continue
os.rename(os.path.join(self.projectDir, f),
os.path.join(self.projectDir, '%s.org' % f))

Expand All @@ -399,26 +439,41 @@ def removeSnappyHexMeshFolders(self):
if (name.endswith('.org') and
os.path.isdir(os.path.join(self.workingDir, name))))
else:
_folders = self.getSnappyHexMeshSubfolders()[1:]
_folders = self.getSnappyHexMeshFolders()

for f in _folders:
try:
os.remove(f)
except:
print "Failed to remove %s." % f
rmtree(os.path.join(self.projectDir, f))

self._isSnappyHexMeshFoldersRenamed = False

def removeResultFolders(self):
pass

def purge(self, removePolyMeshFolder=True, removeSnappyHexMeshFolders=True,
"""Remove results folder."""
_folders = self.getResultFolders()
for _f in _folders:
rmtree(os.path.join(self.projectDir, _f))

def removePolyMeshContent(self):
"""Remove results folder."""
folder = os.path.join(self.constantDir, 'polyMesh')
for _f in os.listdir(folder):
if _f != 'blockMeshDict':
os.remove(os.path.join(folder, _f))

def purge(self, removePolyMeshContent=True,
removeSnappyHexMeshFolders=True,
removeResultFolders=False):
"""Purge case folder."""
pass
if removePolyMeshContent:
self.removePolyMeshContent()
if removeSnappyHexMeshFolders:
self.removeSnappyHexMeshFolders()
if removeResultFolders:
self.removeResultFolders()

def ToString(self):
"""Overwrite .NET ToString method."""
return self.__repr__()

def __repr__(self):
"""OpenFOAM CASE."""
return "OpenFOAM CASE: %s" % self.projectName
4 changes: 2 additions & 2 deletions butterfly/epsilon.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class Epsilon(ZeroFolderFoamFile):
__defaultValues = OrderedDict()
__defaultValues['dimensions'] = '[0 2 -3 0 0 0 0]'
__defaultValues['#include'] = None
__defaultValues['internalField'] = None
__defaultValues['internalField'] = 'uniform 0.01'
__defaultValues['boundaryField'] = {}

def __init__(self, values=None):
"""Init class."""
ZeroFolderFoamFile.__init__(self, name='epsilon', cls='volScalarField',
location='0',
defaultValues=self.__defaultValues,
values=values)
values=values)
2 changes: 1 addition & 1 deletion butterfly/gh/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def loadPoints(self):
def loadVelocity(self, timestep=None):
"""Return OpenFOAM mesh as a Rhino mesh."""
# find results folders
_folders = self.getResultsSubfolders()
_folders = self.getResultFolders()

# if there is no timestep pick the last one
_folder = _folders[-1]
Expand Down
27 changes: 24 additions & 3 deletions butterfly/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,41 @@ def wfile(fullPath, content):


def runbatchfile(filepath, printLog=True):
"""run an executable .bat file."""
"""run an executable .bat file.
returns:
A tuple as (success, err). success is a boolen. err is None in case of
success otherwise the error message as a string.
"""
if not os.path.isfile(filepath):
raise ValueError('Cannot find %s' % filepath)

_success = True
_err = None
sys.stdout.flush()
p = Popen(filepath, shell=False, stdin=PIPE)
p.communicate(input='\n')

if printLog:
try:
logfile = ".".join(filepath.split(".")[:-1]) + ".log"
errfile = ".".join(filepath.split(".")[:-1]) + ".err"

with open(logfile, 'rb') as log:
print(' '.join(log.readlines()))
_lines = ' '.join(log.readlines())
print(_lines)

with open(errfile, 'rb') as log:
_err = ' '.join(log.readlines())
if len(_err) > 0:
_success = False
print(_err)

except Exception as e:
print('Failed to read {}:\n{}'.format(logfile, e))
print('Failed to read {} and {}:\n{}'.format(logfile, errfile, e))

return _success, _err


def getSnappyHexMeshGeometryFeild(projectName, BFSurfaces,
meshingType='triSurfaceMesh',
Expand Down
2 changes: 1 addition & 1 deletion butterfly/k.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class K(ZeroFolderFoamFile):
__defaultValues = OrderedDict()
__defaultValues['dimensions'] = '[0 2 -2 0 0 0 0]'
__defaultValues['#include'] = None
__defaultValues['internalField'] = None
__defaultValues['internalField'] = 'uniform 0.1'
__defaultValues['boundaryField'] = {}

def __init__(self, values=None):
Expand Down
4 changes: 2 additions & 2 deletions butterfly/p.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class P(ZeroFolderFoamFile):
__defaultValues = OrderedDict()
__defaultValues['dimensions'] = '[0 2 -2 0 0 0 0]'
__defaultValues['#include'] = None
__defaultValues['internalField'] = None
__defaultValues['internalField'] = 'uniform 0'
__defaultValues['boundaryField'] = {}

def __init__(self, values=None):
"""Init class."""
ZeroFolderFoamFile.__init__(self, name='p', cls='volScalarField',
location='0',
defaultValues=self.__defaultValues,
values=values)
values=values)
Loading

0 comments on commit 56235b7

Please sign in to comment.