16TEST(PressureJumpInterface, OrthogonalIsotropic)
18 const RealVectorValue normal(1.0, 0.0, 0.0);
19 const Point half_cell(0.5, 0.0, 0.0);
20 const RealVectorValue diffusion(2.0, 2.0, 2.0);
21 const RealVectorValue gradient(3.0, -4.0, 0.0);
36 ASSERT_TRUE(data.valid);
37 EXPECT_TRUE(data.is_baffle);
38 EXPECT_DOUBLE_EQ(data.elem_conductance, 12.0);
39 EXPECT_DOUBLE_EQ(data.neighbor_conductance, 12.0);
40 EXPECT_DOUBLE_EQ(data.transmissibility, 6.0);
41 EXPECT_DOUBLE_EQ(data.elem_correction, 0.0);
42 EXPECT_DOUBLE_EQ(data.neighbor_correction, 0.0);
43 EXPECT_DOUBLE_EQ(data.correction, 0.0);
46TEST(PressureJumpInterface, ConservesFluxAndPreservesJump)
48 const RealVectorValue normal(0.8, 0.6, 0.0);
49 const Point elem_to_face(0.5, 0.1, 0.0);
50 const Point face_to_neighbor(0.35, 0.3, 0.0);
51 const RealVectorValue elem_diffusion(2.0, 5.0, 1.0);
52 const RealVectorValue neighbor_diffusion(7.0, 3.0, 1.0);
53 const RealVectorValue elem_gradient(1.2, -0.4, 0.0);
54 const RealVectorValue neighbor_gradient(-0.3, 2.1, 0.0);
55 const Real elem_pressure = 11.0;
56 const Real neighbor_pressure = 4.0;
57 const Real jump = 2.5;
71 ASSERT_TRUE(data.valid);
72 EXPECT_DOUBLE_EQ(data.elem_jump, jump);
75 const Real assembled_flux = data.transmissibility * elem_pressure -
76 data.transmissibility * neighbor_pressure -
77 (data.correction + data.transmissibility * data.elem_jump);
78 const Real elem_face_pressure =
79 elem_pressure - (flux + data.elem_correction) / data.elem_conductance;
80 const Real neighbor_face_pressure =
81 neighbor_pressure + (flux + data.neighbor_correction) / data.neighbor_conductance;
82 const Real elem_half_flux =
83 data.elem_conductance * (elem_pressure - elem_face_pressure) - data.elem_correction;
84 const Real neighbor_half_flux =
85 data.neighbor_conductance * (neighbor_face_pressure - neighbor_pressure) -
86 data.neighbor_correction;
87 const Real recovered_elem_face_pressure =
89 const Real recovered_neighbor_face_pressure =
92 EXPECT_NEAR(elem_face_pressure - neighbor_face_pressure, jump, 1e-13);
93 EXPECT_NEAR(assembled_flux, flux, 1e-13);
94 EXPECT_NEAR(elem_half_flux, flux, 1e-13);
95 EXPECT_NEAR(neighbor_half_flux, flux, 1e-13);
96 EXPECT_NEAR(recovered_elem_face_pressure, elem_face_pressure, 1e-13);
97 EXPECT_NEAR(recovered_neighbor_face_pressure, neighbor_face_pressure, 1e-13);
100TEST(PressureJumpInterface, ManufacturedPiecewiseLinearPressure)
102 const RealVectorValue normal(0.8, 0.6, 0.0);
103 const Point elem_to_face(0.5, 0.1, 0.0);
104 const Point face_to_neighbor(0.35, 0.3, 0.0);
105 const RealVectorValue elem_diffusion(2.0, 5.0, 1.0);
106 const RealVectorValue neighbor_diffusion(7.0, 3.0, 1.0);
107 const RealVectorValue elem_gradient(1.2, -0.4, 0.0);
108 const RealVectorValue neighbor_gradient(-0.3, 4.0 / 3.0, 0.0);
109 const Real face_area = 1.7;
110 const Real elem_face_pressure = 11.0;
111 const Real jump = 2.5;
112 const Real neighbor_face_pressure = elem_face_pressure - jump;
113 const Real elem_pressure = elem_face_pressure - elem_gradient * elem_to_face;
114 const Real neighbor_pressure = neighbor_face_pressure + neighbor_gradient * face_to_neighbor;
115 const Real expected_flux = -face_area * normal *
116 RealVectorValue(elem_diffusion(0) * elem_gradient(0),
117 elem_diffusion(1) * elem_gradient(1),
118 elem_diffusion(2) * elem_gradient(2));
132 ASSERT_TRUE(data.valid);
135 const Real recovered_elem_face_pressure =
137 const Real recovered_neighbor_face_pressure =
140 EXPECT_NEAR(flux, expected_flux, 1e-13);
141 EXPECT_NEAR(recovered_elem_face_pressure, elem_face_pressure, 1e-13);
142 EXPECT_NEAR(recovered_neighbor_face_pressure, neighbor_face_pressure, 1e-13);
145TEST(PressureJumpInterface, HydrostaticBalanceAcrossJump)
152 const RealVectorValue normal(0.8, 0.6, 0.0);
153 const Point elem_to_face(0.5, 0.1, 0.0);
154 const Point face_to_neighbor(0.35, 0.3, 0.0);
155 const RealVectorValue elem_diffusion(2.0, 5.0, 1.0);
156 const RealVectorValue neighbor_diffusion(7.0, 3.0, 1.0);
157 const RealVectorValue elem_gradient(1.2, -0.4, 0.0);
158 const RealVectorValue neighbor_gradient(-0.3, 2.1, 0.0);
159 const Real face_area = 1.7;
160 const Real elem_face_pressure = 11.0;
161 const Real jump = 2.5;
162 const Real neighbor_face_pressure = elem_face_pressure - jump;
163 const Real elem_pressure = elem_face_pressure - elem_gradient * elem_to_face;
164 const Real neighbor_pressure = neighbor_face_pressure + neighbor_gradient * face_to_neighbor;
166 RealVectorValue elem_rho_hbya;
167 RealVectorValue neighbor_rho_hbya;
170 elem_rho_hbya(i) = -elem_diffusion(i) * elem_gradient(i);
171 neighbor_rho_hbya(i) = -neighbor_diffusion(i) * neighbor_gradient(i);
186 ASSERT_TRUE(data.valid);
189 ASSERT_GT(std::abs(data.elem_hbya_flux - data.neighbor_hbya_flux), 1.0);
194 EXPECT_NEAR(mass_flux, 0.0, 1e-13);
200 data, neighbor_pressure, mass_flux,
false),
201 neighbor_face_pressure,
205TEST(PressureJumpInterface, OrientationReversal)
207 const RealVectorValue normal(0.8, 0.6, 0.0);
208 const Point elem_to_face(0.5, 0.1, 0.0);
209 const Point face_to_neighbor(0.35, 0.3, 0.0);
210 const RealVectorValue elem_diffusion(2.0, 5.0, 1.0);
211 const RealVectorValue neighbor_diffusion(7.0, 3.0, 1.0);
212 const RealVectorValue elem_gradient(1.2, -0.4, 0.0);
213 const RealVectorValue neighbor_gradient(-0.3, 2.1, 0.0);
239 ASSERT_TRUE(forward.valid);
240 ASSERT_TRUE(reverse.valid);
245 EXPECT_NEAR(reverse.elem_conductance, forward.neighbor_conductance, 1e-13);
246 EXPECT_NEAR(reverse.neighbor_conductance, forward.elem_conductance, 1e-13);
247 EXPECT_NEAR(reverse.correction, -forward.correction, 1e-13);
248 EXPECT_NEAR(reverse_flux, -forward_flux, 1e-13);
251TEST(PressureJumpInterface, RejectsInvalidGeometryAndCoefficients)
253 const auto build_operator =
254 [](
const Point & elem_to_face,
const RealVectorValue & elem_diffusion,
const Real face_area)
258 Point(0.5, 0.0, 0.0),
260 RealVectorValue(1.0, 1.0, 1.0),
270 EXPECT_FALSE(build_operator(Point(0.0, 1.0, 0.0), RealVectorValue(1.0, 1.0, 1.0), 1.0).valid);
271 EXPECT_FALSE(build_operator(Point(0.5, 0.0, 0.0), RealVectorValue(0.0, 1.0, 1.0), 1.0).valid);
272 EXPECT_FALSE(build_operator(Point(0.5, 0.0, 0.0),
273 RealVectorValue(std::numeric_limits<Real>::infinity(), 1.0, 1.0),
276 EXPECT_FALSE(build_operator(Point(0.5, 0.0, 0.0), RealVectorValue(1.0, 1.0, 1.0), 0.0).valid);
PressureJumpInterfaceData pressureJumpInterfaceData(const RealVectorValue &normal, const Point &elem_to_face, const Point &face_to_neighbor, const RealVectorValue &elem_diffusion, const RealVectorValue &neighbor_diffusion, const RealVectorValue &elem_gradient, const RealVectorValue &neighbor_gradient, const RealVectorValue &elem_rho_hbya, const RealVectorValue &neighbor_rho_hbya, const Real face_area, const bool use_nonorthogonal_correction, const Real elem_jump)
Construct the conservative half-cell interface coefficients for a diagonal diffusion tensor.