Skip to content

Commit 7ae37b2

Browse files
committed
fix surface vectors
1 parent 75d4817 commit 7ae37b2

4 files changed

Lines changed: 30 additions & 34 deletions

File tree

ngsolve_webgpu/shaders/surface_vectors.wgsl

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
1717
let p = loadTriangle(trigId).p;
1818

1919
let gridsize = u_gridsize;
20-
let pmin = vec3f(-1, -1, -1);
21-
let rad = 1.0;
2220

2321
var dir: u32 =0;
2422
var dir1: u32 =0;
@@ -43,8 +41,7 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
4341

4442
for (var k: u32 = 0; k < 3; k++)
4543
{
46-
p2d[k] = vec2f((p[k][dir1] - pmin[dir1]) / (2*rad),
47-
(p[k][dir2] - pmin[dir2]) / (2*rad));
44+
p2d[k] = vec2f(p[k][dir1], p[k][dir2]);
4845
}
4946

5047
var min2d = min(min(p2d[0], p2d[1]), p2d[2]);
@@ -57,20 +54,20 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
5754
let mdet = determinant(m);
5855

5956
let minv = 1.0/mdet * mat2x2f( m[1][1], -m[0][1], -m[1][0], m[0][0] );
60-
61-
for (var s = 0.0; s <= 1.; s += 1.0 * gridsize) {
62-
if (s >= min2d.x && s <= max2d.x)
63-
{
64-
for (var t = 0.; t <= 1.; t += 1.0 * gridsize) {
65-
if (t >= min2d.y && t <= max2d.y)
66-
{
57+
58+
let s_start = ceil(min2d.x / gridsize) * gridsize;
59+
let t_start = ceil(min2d.y / gridsize) * gridsize;
60+
61+
for (var s = s_start; s <= max2d.x; s += gridsize) {
62+
for (var t = t_start; t <= max2d.y; t += gridsize) {
6763
let lam = minv * (vec2f(s, t) - p2d[0]);
6864

6965
if (lam.x >= 0 && lam.y >= 0 && lam.x+lam.y <= 1)
7066
{
71-
var cp = lam.x*p[0] + lam.y * p[1] + (1.0 - lam.x - lam.y) * p[2];
67+
var cp = p[0] + lam.x * (p[1] - p[0]) + lam.y * (p[2] - p[0]);
68+
let eval_lam = vec2f(1.0 - lam.x - lam.y, lam.x);
7269

73-
let v_ri = evalTrigVec3ReIm(&u_function_values_2d, trigId, lam, 0u);
70+
let v_ri = evalTrigVec3ReIm(&u_function_values_2d, trigId, eval_lam, 0u);
7471
let val = sqrt(dot(v_ri.re, v_ri.re) + dot(v_ri.im, v_ri.im));
7572

7673
#ifdef SCALE_BY_VALUE
@@ -82,7 +79,7 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
8279
#endif SCALE_BY_VALUE
8380
let index = atomicAdd(&count_vectors, 1);
8481
if (mesh.is_curved == 1u) {
85-
cp = evalTrigVec3(&mesh.data, trigId, lam, mesh.offset_curvature_2d);
82+
cp = evalTrigVec3(&mesh.data, trigId, eval_lam, mesh.offset_curvature_2d);
8683
}
8784
cp += 0.5 * gridsize * normalize(n);
8885

@@ -99,9 +96,7 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
9996
directions_imag[index*3+2] = dir_im[2];
10097
#endif IS_COMPLEX
10198
}
102-
}
103-
}
104-
}
99+
}
105100
}
106101
}
107102
}

ngsolve_webgpu/shaders/surface_vectors_count.wgsl

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
1010
let p = loadTriangle(trigId).p;
1111

1212
let gridsize = u_gridsize;
13-
let pmin = vec3f(-1, -1, -1);
14-
let rad = 1.0;
1513

1614
var dir: u32 =0;
1715
var dir1: u32 =0;
@@ -36,8 +34,7 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
3634

3735
for (var k: u32 = 0; k < 3; k++)
3836
{
39-
p2d[k] = vec2f((p[k][dir1] - pmin[dir1]) / (2*rad),
40-
(p[k][dir2] - pmin[dir2]) / (2*rad));
37+
p2d[k] = vec2f(p[k][dir1], p[k][dir2]);
4138
}
4239

4340
var min2d = min(min(p2d[0], p2d[1]), p2d[2]);
@@ -50,22 +47,19 @@ fn compute_surface_vectors(@builtin(global_invocation_id) id: vec3<u32>) {
5047
let mdet = determinant(m);
5148

5249
let minv = 1.0/mdet * mat2x2f( m[1][1], -m[0][1], -m[1][0], m[0][0] );
53-
54-
for (var s = 0.0; s <= 1.; s += 1.0 * gridsize) {
55-
if (s >= min2d.x && s <= max2d.x)
56-
{
57-
for (var t = 0.; t <= 1.; t += 1.0 * gridsize) {
58-
if (t >= min2d.y && t <= max2d.y)
59-
{
50+
51+
let s_start = ceil(min2d.x / gridsize) * gridsize;
52+
let t_start = ceil(min2d.y / gridsize) * gridsize;
53+
54+
for (var s = s_start; s <= max2d.x; s += gridsize) {
55+
for (var t = t_start; t <= max2d.y; t += gridsize) {
6056
let lam = minv * (vec2f(s, t) - p2d[0]);
6157

6258
if (lam.x >= 0 && lam.y >= 0 && lam.x+lam.y <= 1)
6359
{
6460
atomicAdd(&count_vectors, 1);
6561
}
66-
}
67-
}
68-
}
62+
}
6963
}
7064
}
7165
}

ngsolve_webgpu/vectors.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ def __init__(
7676
self.scale_by_value = scale_by_value
7777
mesh = function_data.mesh_data
7878
bbox = mesh.get_bounding_box()
79-
self.box_size = np.linalg.norm(np.array(bbox[1]) - np.array(bbox[0]))
79+
# Use the longest side of the bounding box (not its diagonal) so that
80+
# thin slabs and cubes of similar lateral extent get a similar sampling
81+
# density. The diagonal would couple the spacing to the aspect ratio.
82+
sides = np.array(bbox[1]) - np.array(bbox[0])
83+
self.box_size = float(np.max(sides))
8084
self.set_grid_size(grid_size)
8185
self.__buffers = {}
8286
self.symmetry = symmetry
@@ -177,6 +181,7 @@ def compute_vectors(self):
177181
label="n_vectors",
178182
usage=BufferUsage.STORAGE | BufferUsage.COPY_DST | BufferUsage.COPY_SRC,
179183
reuse=self.u_nvectors,
184+
use_cache=False,
180185
)
181186
self.n_vectors = 1
182187
self.allocate_buffers()
@@ -396,6 +401,7 @@ def __init__(self, function_data: FunctionData, grid_size: float = 20, clipping:
396401
self.compute_entry_point = "compute_surface_vectors"
397402
self.u_ntrigs = None
398403
super().__init__(function_data=function_data, grid_size=grid_size, clipping=clipping, colormap=colormap, symmetry=symmetry, vector_symmetry=vector_symmetry, scale_by_value=scale_by_value)
404+
self.gpu_objects.clipping = self.clipping
399405

400406
def update(self, options):
401407
self.n_search_els = self.function_data.mesh_data.ngs_mesh.GetNE(ngs.BND)
@@ -463,6 +469,7 @@ def compute_vectors(self):
463469
label="n_vectors",
464470
usage=BufferUsage.STORAGE | BufferUsage.COPY_DST | BufferUsage.COPY_SRC,
465471
reuse=self.u_nvectors,
472+
use_cache=False,
466473
)
467474
self.n_vectors = 1
468475
self.allocate_buffers()
Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)