63 """name -> thunk; each thunk runs one gate case of the gates module `g`."""
65 for Rh
in (8, 16, 32):
66 r[f
"g1_{Rh}"] =
lambda Rh=Rh: g.g1_case(Rh, g.OFFSETS[0])
68 r[f
"g6c1_{Rh}"] =
lambda Rh=Rh: g.g6_case(Rh, g.OFFSETS[0], g.G6_CASES[0])
70 for sch
in (
"fou",
"koren"):
72 r[f
"g9_{sch}_{Rh}" + (
"" if cr == 0.5
else "_c09")] = (
73 lambda Rh=Rh, sch=sch, cr=cr: g.g9_case(Rh, g.g9_offsets(Rh)[0], sch, cr))
74 for pe
in (1.0, 10.0):
75 r[f
"gadva_{pe:g}"] =
lambda pe=pe: g.gadv_a_case(16, pe)
76 for wall
in (
"neumann",
"dirichlet"):
77 r[f
"gadvb_{wall}_{pe:g}"] =
lambda pe=pe, wall=wall: g.gadv_b_case(32, pe, wall)
85 print(
"SKIP: peclet.flow not importable")
87 sys.path.insert(0, HERE)
88 import test_scalar_cutcell_gates
as g
92 class Recording(pf.Solver):
93 """The gates' Solver, logging every cut-cell solve's BiCGStab count (scalar 'c')."""
95 def __init__(self, *a, **k):
96 super().__init__(*a, **k)
100 its.append(int(self.diagnostics.scalar_census(
"c")[
"krylov_iterations"]))
102 def solve_scalar_steady(self, *a, **k):
103 r = super().solve_scalar_steady(*a, **k)
107 def advance_scalars(self, *a, **k):
108 r = super().advance_scalars(*a, **k)
112 g.pf.Solver = Recording
114 for name, run
in rows(g).items():
115 if only
and name
not in only:
121 dt = time.time() - t0
123 geo = s.diagnostics.scalar_geometry(
"c")
124 for k
in GEOM_CELL + EXACT_CELL:
126 out[f
"{name}/geo/{k}"] = np.asarray(geo[k])
127 fac = s.diagnostics.scalar_facets(
"c")
128 for k
in GEOM_FACET + EXACT_FACET + SOL_FACET:
129 out[f
"{name}/fac/{k}"] = np.asarray(fac[k])
130 out[f
"{name}/sol/c"] = np.asarray(s.get_field(
"c"))
131 if "solid_unknown" in geo
and np.any(np.asarray(geo[
"solid_unknown"]) > 0.5):
132 out[f
"{name}/sol/c_solid"] = np.asarray(s.get_field(
"c_solid"))
133 out[f
"{name}/its"] = np.asarray(its, dtype=np.int64)
134 cen = s.diagnostics.scalar_census(
"c")
135 pr = cen[
"probe_rungs"]
136 out[f
"{name}/rungs"] = np.asarray([*pr[
"fluid"], *pr.get(
"solid", ())], dtype=np.int64)
137 out[f
"{name}/time"] = np.asarray(dt)
138 if name.startswith(
"g9_"):
140 out[f
"{name}/g9/{k}"] = np.asarray(float(st[k]))
141 print(f
"{name:20s} {dt:7.1f} s solves {len(its):4d} iterations {sum(its):6d} "
142 f
"rungs {out[f'{name}/rungs'].tolist()}", flush=
True)
143 np.savez_compressed(path, **out)
144 print(f
"wrote {path} ({len(out)} arrays)")
148 a, b = np.asarray(a, dtype=float), np.asarray(b, dtype=float)
150 a, b = a[mask], b[mask]
152 if not np.array_equal(fin, np.isfinite(b)):
154 a, b = a[fin], b[fin]
157 sc = float(np.max(np.abs(a)))
158 d = float(np.max(np.abs(a - b)))
159 return d / sc
if sc > 0.0
else d
163 A, B = np.load(pa), np.load(pb)
164 C = np.load(pc)
if pc
else None
165 names = sorted({k.split(
"/")[0]
for k
in A.files})
167 print(f
"{'row':20s} {'geom':>9s} {'exact':>5s} {'solution':>9s} {'its diff':>8s} "
168 f
"{'solves':>6s} {'t_ref':>7s} {'t_new':>7s}")
170 if f
"{n}/its" not in B.files:
171 print(f
"{n:20s} missing in {pb}")
174 g = max([
rel(A[k], B[k])
for k
in A.files
175 if k.startswith(f
"{n}/")
and k.split(
"/")[-1]
in GEOM_CELL + GEOM_FACET]
or [0.0])
176 ex = all(np.array_equal(A[k], B[k])
for k
in A.files
177 if k.startswith(f
"{n}/")
and k.split(
"/")[-1]
in EXACT_CELL + EXACT_FACET)
178 ex = ex
and np.array_equal(A[f
"{n}/rungs"], B[f
"{n}/rungs"])
179 unk = A[f
"{n}/geo/unknown"] > 0.5
180 sol =
rel(A[f
"{n}/sol/c"], B[f
"{n}/sol/c"], unk)
181 if f
"{n}/sol/c_solid" in A.files:
182 sol = max(sol,
rel(A[f
"{n}/sol/c_solid"], B[f
"{n}/sol/c_solid"],
183 A[f
"{n}/geo/solid_unknown"] > 0.5))
184 sol = max(sol, max(
rel(A[f
"{n}/fac/{k}"], B[f
"{n}/fac/{k}"])
for k
in SOL_FACET))
186 if C
is not None and f
"{n}/sol/c" in C.files:
187 floor = f
" floor {rel(A[f'{n}/sol/c'], C[f'{n}/sol/c'], unk):9.2e}"
188 ia, ib = A[f
"{n}/its"], B[f
"{n}/its"]
189 di = int(np.max(np.abs(ia - ib)))
if ia.shape == ib.shape
else 10**9
190 koren = n.startswith(
"g9_koren_")
191 ok = g <= 1e-12
and ex
and sol <= (1e-7
if koren
else 1e-9)
and di <= 1
192 if n.startswith(
"g9_"):
193 if f
"{n}/g9/ident" in A.files
and f
"{n}/g9/ident" in B.files:
197 print(f
"{n:20s} {g:9.2e} {'yes' if ex else 'NO':>5s} {sol:9.2e} {di:8d} {ia.size:6d} "
198 f
"{float(A[f'{n}/time']):7.1f} {float(B[f'{n}/time']):7.1f} {'ok' if ok else 'FAIL'}{floor}")
201 print(
"G11:",
"PASS" if not bad
else f
"FAIL {bad}")
202 return 0
if not bad
else 1