In the Scalar Transport: 2D Advection Diffusion example, I am confused with how the integral continuity planes have been implemented.
# integral continuity
integral_continuity = IntegralBoundaryConstraint(
nodes=nodes,
geometry=integral_line,
outvar={"normal_dot_vel": 1},
batch_size=cfg.batch_size.num_integral_continuity,
integral_batch_size=cfg.batch_size.integral_continuity,
lambda_weighting={"normal_dot_vel": 0.1},
criteria=geo.sdf > 0,
param_ranges=x_pos_range,
)
domain.add_constraint(integral_continuity, "integral_continuity")
Here, I understand that batch_size
denotes the number of integral continuity planes and integral_batch_size
denotes the number of points to be sampled in each integral continuity plane. These things can be changed in the config file.
I also understand that a very low priority has been given to the targeted mass flow rate with a lambda_weighting
of 0.1
.
However, I am confused with what criteria=geo.sdf > 0
is doing.
Here geo = channel section - 3 rectangular fins
Is there a way to plot the sdf values, as an example plt.scatter(x,y,c=geo.sdf)
to see where it goes negative.
I pulled out the definition of Line
as integral continuity planes are Line
object, but could not get any strong conclusion.
class Line(ConstructiveSolidGeometry):
"""
2D Line parallel to y-axis
Parameters
==========
point_1 : tuple with 2 ints or floats
lower bound point of line segment
point_2 : tuple with 2 ints or floats
upper bound point of line segment
normal : int or float
normal direction of line (+1 or -1)
"""
def __init__(self, point_1, point_2, normal):
assert point_1[0] == point_2[0], "Points must have same x-coordinate"
# make sympy symbols to use
l = Symbol(csg_curve_naming(0))
x = Symbol("x")
# curves for each side
ranges = {l: (0, 1)}
dist_y = point_2[1] - point_1[1]
line_1 = Curve(
functions={
"x": point_1[0],
"y": point_1[1] + l * dist_y,
"normal_x": 1e-10 + normal, # TODO rm 1e-10
"normal_y": 0,
},
ranges=ranges,
area=dist_y,
)
curves = [line_1]
# calculate SDF
sdf = normal * (point_1[0] - x)
# initialize Line
super(Line, self).__init__(curves, sdf)