################################################################################
# CLASS DEFINITIONS OF GEOMETRIC OBJECTS USED WITHIN THE RVE CLASS #
################################################################################
# Within this file, classes for different geometric objects used in the GmshModel
# are defined. The geometric objects are used within the geometry generation to
# create Gmsh model from basic geometry entities.
###########################
# Load required libraries #
###########################
# Standard Python libraries
import numpy as np # numpy for fast array computations
################################################################################
# Define generic GeometricObject #
################################################################################
# This class provides general properties that all geometrical objects within the
# RVE will have. Its child-classes inherit those properties and provide additional,
# more specific properties.
[docs]
class GeometricObject:
"""Definition of a generic geometric object
This class is the parent class of all geometric objects and provides general
information that all objects should have
Attributes:
-----------
dimension: int
dimension of the RVE
group: string
string defining which group the geometric object belongs to
"""
#########################
# Initialization method #
#########################
def __init__(self,dimension=None,group="default"):
"""Initialization method for geometric objects
Parameters:
----------
dimension: int
dimension of the geometric object
group: string
group the geometric object belongs to
"""
# error checking for dimension
if dimension is None:
raise TypeError("Variable \"dimension\" not defined. For a geometric object of type {}, the dimension must be specified. Check your input data.".format(self.__class__))
# initialize relevant variables
self.dimension=dimension # dimension of the geometrical object
self.group=group # group tag of the geometrical object (to distinguish different groups of objects)
################################################################
# Method to add the geometric object to a specified Gmsh model #
################################################################
[docs]
def addToGmshModel(self,gmshModel):
"""Add a representation of the geometric object to the Gmsh model
Parameters:
-----------
gmshModel: class object
model class of the Gmsh-Python-API that holds the Gmsh-specific
current model information
"""
return (self.dimension,self._getGmshRepresentation(gmshModel))
############################################################################
# Internal placeholder method to determine the objects Gmsh representation #
############################################################################
def _getGmshRepresentation(self,gmshModel):
"""Placeholder method to be specified by child classes in order to return
the correct Gmsh representation of the geometric object under investigation
"""
pass
################################################################################
# Define Box as a child of GeometricObject #
################################################################################
# This class provides more specified attributes and methods for geometrical
# objects of type "Box". It inherits basic properties from its parent class
# "GeometricObject".
[docs]
class Box(GeometricObject):
"""Definition of a Box object
This class is a child class of geometricObject and provides additional
information for objetcs of type Box
Attributes:
-----------
dimension: int
dimension of the box object
origin: array/list
origin of the domain object -> origin=[Ox, Oy, (Oz)]
size: array/list
size of the domain object -> size=[Lx, Ly, (Lz)]
group: string
group the box object belongs to
"""
##########################
# Initialization method #
##########################
def __init__(self,size=None,origin=[0,0,0],group="default"):
"""Initialization method for Box objects
Parameters:
-----------
size: array/list
size of the domain object -> size=[Lx, Ly, Lz]
origin: array/list
origin of the domain object -> origin=[Ox, Oy, Oz]
group: string
group the box object belongs to
"""
# initialize parent classes attributes and methods
super().__init__(dimension=3,group=group)
# plausibility checks for input variables:
for varName, varValue in {"size": size, "origin": origin}.items():
if varValue is None: # check if variable has a value
raise TypeError("Variable \"{0}\" not set! For a geometric object of type \"{1}\", the {0} must be specified. Check your input data.".format(varName,self.__class__))
elif len(np.shape(varValue)) > 1: # check for right amount of array dimensions
raise ValueError("Wrong amount of array dimensions for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" can only be one-dimensional. Check your input data.".format(varName,self.__class__))
elif len(varValue) != 3: # check for right amount of values
raise ValueError("Wrong number of (non-zero) values for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" has to have 3 values. Check your input data.".format(varName,self.__class__))
elif varName is "size" and np.count_nonzero(varValue) != 3: # check for right amount of non-zero values (size only)
raise ValueError("Wrong number of non-zero values for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" has to have 3 non-zero values. Check your input data.".format(varName,self.__class__))
# set object attributes
self.origin=np.asarray(origin) # set origin of the domain object
self.size=np.asarray(size) # set size of the domain object
################################################################
# Internal method to determine the objects Gmsh representation #
################################################################
def _getGmshRepresentation(self,gmshModel):
"""Return a Gmsh OCC entity of type Box"""
return gmshModel.occ.addBox(*np.r_[self.origin, self.size])
################################################################################
# Define Rectangle as a child of GeometricObject #
################################################################################
# This class provides more specified attributes and methods for geometrical
# objects of type "Rectangle". It inherits basic properties from its parent
# class "GeometricObject".
[docs]
class Rectangle(GeometricObject):
"""Definition of a Rectangle object
This class is a child class of geometricObject and provides additional
information for objetcs of type Rectangle
Attributes:
-----------
dimension: int
dimension of the box object
origin: array/list
origin of the domain object -> origin=[Ox, Oy, (Oz)]
size: array/list
size of the domain object -> size=[Lx, Ly, (Lz)]
group: string
group the box object belongs to
"""
##########################
# Initialization method #
##########################
def __init__(self,size=None,origin=[0,0,0],group="default"):
"""Initialization method for Rectangle objects
Parameters:
-----------
size: array/list
size of the domain object -> size=[Lx, Ly, (Lz)]
origin: array/list
origin of the domain object -> origin=[Ox, Oy, (Oz)]
group: string
group the domain object belongs to
"""
# initialize parent classes attributes and methods
super().__init__(dimension=2,group=group)
# plausibility checks for input variables:
for varName, varValue in {"size": size, "origin": origin}.items():
if varValue is None: # check if variable has a value
raise TypeError("Variable \"{0}\" not set! For a geometric object of type \"{1}\", the {0} must be specified. Check your input data.".format(varName,self.__class__))
elif len(np.shape(varValue)) > 1: # check for right amount of array dimensions
raise ValueError("Wrong amount of array dimensions for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" can only be one-dimensional. Check your input data.".format(varName,self.__class__))
elif not len(varValue) in [2,3]: # check for right amount of values
raise ValueError("Wrong number of (non-zero) values for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" has to have 2 or 3 values. Check your input data.".format(varName,self.__class__))
elif varName is "size" and np.count_nonzero(varValue) != 2: # check for right amount of non-zero values (size only)
raise ValueError("Wrong number of non-zero values for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" has to have 2 non-zero values. Check your input data.".format(varName,self.__class__))
# Correct potentially two-dimensional arrays
if len(size) != 3: # check if size is not a three-dimensional array
size=np.r_[size,0] # -> append 0
if len(origin) != 3: # check if origin is not a three-dimensional array
newOrigin=np.zeros(3) # -> create new three-dimensional array
newOrigin[size != 0]=origin # -> assign values of origin to non-zero dimensions of new array
origin=newOrigin # -> overwrite origin with new array
# set object attributes
self.origin=np.asarray(origin) # set origin of the domain object
self.size=np.asarray(size) # set size of the domain object
################################################################
# Internal method to determine the objects Gmsh representation #
################################################################
def _getGmshRepresentation(self,gmshModel):
"""Return a Gmsh entity of type Rectangle"""
return gmshModel.occ.addRectangle(*np.r_[self.origin, self.size[0:self.dimension]])
################################################################################
# Define Sphere as child of GeometricObject #
################################################################################
# This class provides more specified attributes and methods for geometrical
# objects of type "Sphere". It inherits basic properties from its parent class
# "GeometricObject".
[docs]
class Sphere(GeometricObject):
"""Definition of a Sphere object
This class is a child class of geometricObject and provides additional
information for objetcs of type Sphere
Attributes:
-----------
center: array/list
array that defines the center of the Sphere object
-> center=[Cx, Cy, (Cz)]
radius: float
radius of the Sphere object
"""
#########################
# Initialization method #
#########################
def __init__(self,center=None,radius=None,group="default"):
"""Initialization method for Sphere objects
Parameters:
-----------
center: array/list
center of the Sphere object -> center=[Cx, Cy, Cz]
radius: float
radius of the Sphere object
group: string
group the Sphere object belongs to
"""
# initialize parent classes attributes and methods
super().__init__(dimension=3,group=group)
# error checking
if radius is None: # no radius defined -> error
raise TypeError("Variable \"radius\" not set! For a geometric object of type \"{}\", the radius must be specified. Check your input data.".format(self.__class__))
if center is None: # no center defined -> error
raise TypeError("Variable \"center\" not set! For a geometric object of type \"{}\", the center must be specified. Check your input data.".format(self.__class__))
elif len(np.shape(center)) > 1: # check if center has the right number of array dimensions
raise ValueError("Wrong amount of array dimensions for variable \"center\"! For a geometric object of type \"{}\", the variable center can only be one-dimensional. Check your input data.".format(self.__class__))
elif len(center) != 3: # check if center has 3 values
raise ValueError("Wrong number of values for variable \"center\"! For a geometric object of type \"{}\", the variable \"center\" has to have 3 values. Check your input data.".format(self.__class__))
# set object attributes
self.radius=radius
self.center=np.asarray(center)
################################################################
# Internal method to determine the objects Gmsh representation #
################################################################
def _getGmshRepresentation(self,gmshModel):
"""Return a Gmsh entity of type Sphere"""
return gmshModel.occ.addSphere(*np.r_[self.center, self.radius])
################################################################################
# Define Cylinder as child of GeometricObject #
################################################################################
# This class provides more specified attributes and methods for geometrical
# objects of type "Cylinder". It inherits basic properties from its parent class
# "GeometricObject".
[docs]
class Cylinder(GeometricObject):
"""Definition of a Cylinder object
This class is a child class of geometricObject and provides additional
information for objetcs of type Cylinder
Attributes:
-----------
center: array/list
array that defines the center of the Cylinder object
-> center=[Cx, Cy, Cz]
axis: array/list
array that defines the axis (direction and length) of the Cylinder object
-> axis=[Ax, Ay, Az]
radius: float
radius of the Cylinder object
"""
#########################
# Initialization method #
#########################
def __init__(self,center=None,radius=None,axis=None,group="default"):
"""Initialization method for Cylinder objects
Parameters:
-----------
center: array/list
center of the Cylinder object -> center=[Cx, Cy, Cz]
radius: float
radius of the Cylinder object
group: string
group the Cylinder object belongs to
"""
# initialize parent classes attributes and methods
super().__init__(dimension=3,group=group)
# error checking
if radius is None: # no radius defined -> error
raise TypeError("Variable \"radius\" not set! For a geometric object of type \"{}\", the radius must be specified. Check your input data.".format(self.__class__))
for varName, varValue in {"center": center, "axis": axis}.items():
if varValue is None: # check if variable is defined
raise TypeError("Variable \"{0}\" not set! For a geometric object of type \"{1}\", the variable {0} must be specified. Check your input data.".format(varName,self.__class__))
elif len(np.shape(varValue)) > 1: # check for correct amount of array dimensions
raise ValueError("Wrong amount of array dimensions for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" can only be one-dimensional. Check your input data.".format(varName,self.__class__))
elif len(varValue) != 3: # check for correct amount of variable values
raise ValueError("Wrong number of values for variable \"{0}\"! For a geometric object of type \"{1}\", the variable \"{0}\" has to have 3 values. Check your input data.".format(center,self.__class__))
# set object attributes
self.radius=radius
self.center=np.asarray(center)
self.axis=np.asarray(axis)
################################################################
# Internal method to determine the objects Gmsh representation #
################################################################
def _getGmshRepresentation(self,gmshModel):
"""Return a Gmsh entity of type Cylinder"""
return gmshModel.occ.addCylinder(*np.r_[self.center, self.axis, self.radius])
################################################################################
# Define Circle as child of GeometricObject #
################################################################################
# This class provides more specified attributes and methods for geometrical
# objects of type "Sphere". It inherits basic properties from its parent class
# "GeometricObject".
[docs]
class Circle(GeometricObject):
"""Definition of an Circle object
This class is a child class of geometricObject and provides additional
information for objetcs of type Circle
Attributes:
-----------
center: array/list
array that defines the center of the Circle object
-> center=[Cx, Cy, (Cz)]
radius: float
radius of the Circle object
"""
#########################
# Initialization method #
#########################
def __init__(self,center=None,radius=None,group="default"):
"""Initialization method for Circle objects
Parameters:
-----------
center: array/list
center of the Circle object
-> center=[Cx, Cy, (Cz)]
radius: float
radius of the Circle object
group: string
group the Circle object belongs to
"""
# initialize parent classes attributes and methods
super().__init__(dimension=2,group=group)
# error checking
if radius is None: # radius not defined -> error
raise TypeError("Variable \"radius\" not set! For a geometric object of type \"{}\", the radius must be specified. Check your input data.".format(self.__class__))
if center is None: # no center defined -> error
raise TypeError("Variable \"center\" not set! For a geometric object of type \"{}\", the center must be specified. Check your input data.".format(self.__class__))
elif len(np.shape(center)) > 1: # check for correct amount of array dimensions
raise ValueError("Wrong amount of array dimensions for variable \"center\"! For a geometric object of type \"{}\", the variable \"center\" can only be one-dimensional. Check your input data.".format(self.__class__))
elif not len(center) in [2,3]: # check for correct amount of variable values
raise ValueError("Wrong number of values for variable \"center\"! For a geometric object of type \"{}\", the center has to have 2 or 3 values. Check your input data.".format(self.__class__))
# Correct potentially two-dimensional arrays
if len(center) != 3: # check if center is not a three-dimensional array
center=np.r_[center,0] # -> append 0
# set object attributes
self.radius=radius
self.center=np.asarray(center)
################################################################
# Internal method to determine the objects Gmsh representation #
################################################################
def _getGmshRepresentation(self,gmshModel):
"""Return a Gmsh entity of type Disk"""
return gmshModel.occ.addDisk(*np.r_[self.center, self.radius, self.radius])