"""IJKRegion class definition"""
from typing import Any, Tuple
import os
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
from cupy import ndarray
else:
import numpy as np
from numpy import ndarray
from g3d.mesh.geo import Coord
from g3d.defs import FunctionByPass
from g3d.mesh.geo.region import Region
[docs]
class IJKRegion(Region):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self._it = 0
self._im = 0
self._i1 = 0
self._i2 = 0
self._j1 = 0
self._j2 = 0
self._k1 = 0
self._k2 = 0
self.__update_counts()
def _set_default(self) -> None:
super()._set_default()
self.__reset_def()
self._tag = 'mesh_region'
def _set_from_args(self, *args: Any, **kwargs: Any) -> ndarray:
bps = self._get_function_evaluate_status(**kwargs)
if bps is FunctionByPass.SELF:
args_stat = np.ones(len(args))
else:
args_stat = super()._set_from_args(*args)
if bps in [FunctionByPass.EVALUATE, FunctionByPass.SELF]:
if np.sum(args_stat) > 0:
r_def = []
for i in range(len(args)):
if args_stat[i] == 1:
arg = args[i]
if type(arg) is int:
args_stat[i] = 0
r_def.append(arg)
elif type(arg) is IJKRegion:
# if caught by a super class, the child class instance of copy will be used
args_stat[i] = 0
self.copy(arg)
elif type(arg) is Region:
args_stat[i] = 0
super().copy(arg)
elif type(arg) is list:
args_stat[i] = 0
if len(arg) >= 7:
if len(arg) == 7:
self._im, self._i1, self._i2, self._j1, self._j2, self._k1, self._k2 = arg
self.__update_counts()
elif len(arg) == 8:
self._im, self._i1, self._i2, self._j1, self._j2, self._k1, self._k2, self._it = arg
self.__update_counts()
if len(r_def) >= 7:
# will be caught by the for-loop below in a sub call to _set_from_args
self._set_from_args(r_def, bps=FunctionByPass.SELF)
return args_stat
[docs]
def set_from_key_value(self, key: str, value: Any) -> bool:
if super().set_from_key_value(key, value):
return True
elif key == 'it':
self._it = value
return True
elif key == 'im':
self._im = value
return True
elif key == 'i1':
self._i1 = value
self.__update_counts()
return True
elif key == 'i2':
self._i2 = value
self.__update_counts()
return True
elif key == 'j1':
self._j1 = value
self.__update_counts()
return True
elif key == 'j2':
self._j2 = value
self.__update_counts()
return True
elif key == 'k1':
self._j1 = value
self.__update_counts()
return True
elif key == 'k2':
self._j2 = value
self.__update_counts()
return True
return False
def __reset_def(self) -> None:
self._it = 0
self._im = 0
self._i1 = 0
self._i2 = 0
self._j1 = 0
self._j2 = 0
self._k1 = 0
self._k2 = 0
self.__update_counts()
def __update_counts(self) -> None:
self._nk = self._k2 - self._k1
self._nj = self._j2 - self._j1
self._ni = self._i2 - self._i1
self._np = self._ni * self._nj * self._nk
self._nc = (self._ni - 1) * (self._nj - 1) * (self._nk - 1)
@property
def ni(self) -> int:
"""
:return:
"""
return self._ni
@property
def nj(self) -> int:
"""
:return:
"""
return self._nj
@property
def nk(self) -> int:
"""
:return:
"""
return self._nk
@property
def np(self) -> int:
"""
:return:
"""
return self._np
@property
def nc(self) -> int:
"""
:return:
"""
return self._nc
@property
def it(self) -> int:
"""
:return:
"""
return self._it
@it.setter
def it(self, i: int) -> None:
self._it = i
@property
def im(self) -> int:
"""
:return:
"""
return self._im
@im.setter
def im(self, i: int) -> None:
self._im = i
@property
def i1(self) -> int:
"""
:return:
"""
return self._i1
@i1.setter
def i1(self, i: int) -> None:
self._i1 = i
self.__update_counts()
@property
def i2(self) -> int:
"""
:return:
"""
return self._i2
@i2.setter
def i2(self, i: int) -> None:
self._i2 = i
self.__update_counts()
@property
def j1(self) -> int:
"""
:return:
"""
return self._j1
@j1.setter
def j1(self, j: int) -> None:
self._j1 = j
self.__update_counts()
@property
def j2(self) -> int:
"""
:return:
"""
return self._j2
@j2.setter
def j2(self, j: int) -> None:
self._j2 = j
self.__update_counts()
@property
def k1(self) -> int:
"""
:return:
"""
return self._k1
@k1.setter
def k1(self, k: int) -> None:
self._k1 = k
self.__update_counts()
@property
def k2(self) -> int:
"""
:return:
"""
return self._k2
@k2.setter
def k2(self, k: int) -> None:
self._k2 = k
self.__update_counts()
[docs]
def copy(self, r: 'IJKRegion') -> None:
super().copy(r)
self._it = r.it
self._im = r.im
self._i1 = r.i1
self._i2 = r.i2
self._j1 = r.j1
self._j2 = r.j2
self._k1 = r.k1
self._k2 = r.k2
self.__update_counts()
[docs]
def get_def(self) -> Tuple[int, ...]:
"""
:return:
"""
return self._im, self._i1, self._i2, self._j1, self._j2, self._k1, self._k2
[docs]
def set_def(self, im, i1, i2, j1, j2, k1, k2, it=0):
"""
:param im:
:param i1:
:param i2:
:param j1:
:param j2:
:param k1:
:param k2:
:param it:
"""
self.set(im, i1, i2, j1, j2, k1, k2, it)
[docs]
def coord_is_in_region(self, c: Coord) -> bool:
"""
:param c:
:return:
"""
return False