@triforge/fluid-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ /**
2
+ * MACGrid — Marker-And-Cell staggered velocity grid.
3
+ *
4
+ * Velocity components are stored at face centres (staggered):
5
+ * u[i][j][k] — X-velocity at face (i-½, j, k)
6
+ * v[i][j][k] — Y-velocity at face (i, j-½, k)
7
+ * w[i][j][k] — Z-velocity at face (i, j, k-½)
8
+ * Pressure p[i][j][k] is at cell centres.
9
+ *
10
+ * Grid cell (i,j,k) covers world-space region:
11
+ * [ox + i*h, ox + (i+1)*h] × [oy + j*h, ...] × [oz + k*h, ...]
12
+ */
13
+ export declare class MACGrid {
14
+ readonly nx: number;
15
+ readonly ny: number;
16
+ readonly nz: number;
17
+ readonly h: number;
18
+ readonly ox: number;
19
+ readonly oy: number;
20
+ readonly oz: number;
21
+ u: Float64Array;
22
+ v: Float64Array;
23
+ w: Float64Array;
24
+ uOld: Float64Array;
25
+ vOld: Float64Array;
26
+ wOld: Float64Array;
27
+ uW: Float64Array;
28
+ vW: Float64Array;
29
+ wW: Float64Array;
30
+ pressure: Float64Array;
31
+ cellType: Uint8Array;
32
+ constructor(nx: number, ny: number, nz: number, h: number, ox?: number, oy?: number, oz?: number);
33
+ /** Flat index for cell (i,j,k). */
34
+ idx(i: number, j: number, k: number): number;
35
+ /** Flat index for u-face (i,j,k) — grid is (nx+1)*ny*nz. */
36
+ uIdx(i: number, j: number, k: number): number;
37
+ /** Flat index for v-face (i,j,k) — grid is nx*(ny+1)*nz. */
38
+ vIdx(i: number, j: number, k: number): number;
39
+ /** Flat index for w-face (i,j,k) — grid is nx*ny*(nz+1). */
40
+ wIdx(i: number, j: number, k: number): number;
41
+ /** Trilinear interpolation of u-velocity at world position (wx,wy,wz). */
42
+ interpU(wx: number, wy: number, wz: number): number;
43
+ /** Trilinear interpolation of v-velocity at world position. */
44
+ interpV(wx: number, wy: number, wz: number): number;
45
+ /** Trilinear interpolation of w-velocity at world position. */
46
+ interpW(wx: number, wy: number, wz: number): number;
47
+ private _interp;
48
+ clearVelocities(): void;
49
+ saveVelocities(): void;
50
+ normalizeWeights(): void;
51
+ /** Mark border cells as solid, fluid cells from a predicate. */
52
+ markCells(isFluid: (i: number, j: number, k: number) => boolean): void;
53
+ /** Enforce solid (no-through) boundary: zero normal velocity at solid faces. */
54
+ enforceBoundary(): void;
55
+ /** Apply gravity to grid v velocities over timestep dt. */
56
+ applyGravity(gx: number, gy: number, gz: number, dt: number): void;
57
+ }
58
+ //# sourceMappingURL=MACGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MACGrid.d.ts","sourceRoot":"","sources":["../src/MACGrid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,qBAAa,OAAO;IAClB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,CAAC,EAAG,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAGnB,CAAC,EAAE,YAAY,CAAA;IACf,CAAC,EAAE,YAAY,CAAA;IACf,CAAC,EAAE,YAAY,CAAA;IAGf,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,YAAY,CAAA;IAClB,IAAI,EAAE,YAAY,CAAA;IAGlB,EAAE,EAAE,YAAY,CAAA;IAChB,EAAE,EAAE,YAAY,CAAA;IAChB,EAAE,EAAE,YAAY,CAAA;IAGhB,QAAQ,EAAE,YAAY,CAAA;IAGtB,QAAQ,EAAE,UAAU,CAAA;gBAER,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,SAAI,EAAE,EAAE,SAAI,EAAE,EAAE,SAAI;IAoBjF,mCAAmC;IACnC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAI5C,4DAA4D;IAC5D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAI7C,4DAA4D;IAC5D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAI7C,4DAA4D;IAC5D,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAM7C,0EAA0E;IAC1E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAKnD,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAKnD,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAKnD,OAAO,CAAC,OAAO;IAuBf,eAAe,IAAI,IAAI;IAKvB,cAAc,IAAI,IAAI;IAMtB,gBAAgB,IAAI,IAAI;IAMxB,gEAAgE;IAChE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAUtE,gFAAgF;IAChF,eAAe,IAAI,IAAI;IAmBvB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;CASnE"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * MACGrid — Marker-And-Cell staggered velocity grid.
3
+ *
4
+ * Velocity components are stored at face centres (staggered):
5
+ * u[i][j][k] — X-velocity at face (i-½, j, k)
6
+ * v[i][j][k] — Y-velocity at face (i, j-½, k)
7
+ * w[i][j][k] — Z-velocity at face (i, j, k-½)
8
+ * Pressure p[i][j][k] is at cell centres.
9
+ *
10
+ * Grid cell (i,j,k) covers world-space region:
11
+ * [ox + i*h, ox + (i+1)*h] × [oy + j*h, ...] × [oz + k*h, ...]
12
+ */
13
+ export class MACGrid {
14
+ constructor(nx, ny, nz, h, ox = 0, oy = 0, oz = 0) {
15
+ this.nx = nx;
16
+ this.ny = ny;
17
+ this.nz = nz;
18
+ this.h = h;
19
+ this.ox = ox;
20
+ this.oy = oy;
21
+ this.oz = oz;
22
+ this.u = new Float64Array((nx + 1) * ny * nz);
23
+ this.v = new Float64Array(nx * (ny + 1) * nz);
24
+ this.w = new Float64Array(nx * ny * (nz + 1));
25
+ this.uOld = new Float64Array(this.u.length);
26
+ this.vOld = new Float64Array(this.v.length);
27
+ this.wOld = new Float64Array(this.w.length);
28
+ this.uW = new Float64Array(this.u.length);
29
+ this.vW = new Float64Array(this.v.length);
30
+ this.wW = new Float64Array(this.w.length);
31
+ this.pressure = new Float64Array(nx * ny * nz);
32
+ this.cellType = new Uint8Array(nx * ny * nz);
33
+ }
34
+ // ── Index helpers ─────────────────────────────────────────────────────────
35
+ /** Flat index for cell (i,j,k). */
36
+ idx(i, j, k) {
37
+ return i + this.nx * (j + this.ny * k);
38
+ }
39
+ /** Flat index for u-face (i,j,k) — grid is (nx+1)*ny*nz. */
40
+ uIdx(i, j, k) {
41
+ return i + (this.nx + 1) * (j + this.ny * k);
42
+ }
43
+ /** Flat index for v-face (i,j,k) — grid is nx*(ny+1)*nz. */
44
+ vIdx(i, j, k) {
45
+ return i + this.nx * (j + (this.ny + 1) * k);
46
+ }
47
+ /** Flat index for w-face (i,j,k) — grid is nx*ny*(nz+1). */
48
+ wIdx(i, j, k) {
49
+ return i + this.nx * (j + this.ny * k);
50
+ }
51
+ // ── Interpolation ─────────────────────────────────────────────────────────
52
+ /** Trilinear interpolation of u-velocity at world position (wx,wy,wz). */
53
+ interpU(wx, wy, wz) {
54
+ return this._interp(this.u, wx - this.ox, wy - this.oy - 0.5 * this.h, wz - this.oz - 0.5 * this.h, this.nx + 1, this.ny, this.nz);
55
+ }
56
+ /** Trilinear interpolation of v-velocity at world position. */
57
+ interpV(wx, wy, wz) {
58
+ return this._interp(this.v, wx - this.ox - 0.5 * this.h, wy - this.oy, wz - this.oz - 0.5 * this.h, this.nx, this.ny + 1, this.nz);
59
+ }
60
+ /** Trilinear interpolation of w-velocity at world position. */
61
+ interpW(wx, wy, wz) {
62
+ return this._interp(this.w, wx - this.ox - 0.5 * this.h, wy - this.oy - 0.5 * this.h, wz - this.oz, this.nx, this.ny, this.nz + 1);
63
+ }
64
+ _interp(arr, lx, ly, lz, Nx, Ny, Nz) {
65
+ const h = this.h;
66
+ let fi = lx / h, fj = ly / h, fk = lz / h;
67
+ fi = Math.max(0, Math.min(Nx - 1.0001, fi));
68
+ fj = Math.max(0, Math.min(Ny - 1.0001, fj));
69
+ fk = Math.max(0, Math.min(Nz - 1.0001, fk));
70
+ const i0 = Math.floor(fi), i1 = i0 + 1;
71
+ const j0 = Math.floor(fj), j1 = j0 + 1;
72
+ const k0 = Math.floor(fk), k1 = k0 + 1;
73
+ const tx = fi - i0, ty = fj - j0, tz = fk - k0;
74
+ const idx = (i, j, k) => i + Nx * (j + Ny * k);
75
+ return (1 - tz) * ((1 - ty) * ((1 - tx) * arr[idx(i0, j0, k0)] + tx * arr[idx(i1, j0, k0)]) +
76
+ ty * ((1 - tx) * arr[idx(i0, j1, k0)] + tx * arr[idx(i1, j1, k0)])) +
77
+ tz * ((1 - ty) * ((1 - tx) * arr[idx(i0, j0, k1)] + tx * arr[idx(i1, j0, k1)]) +
78
+ ty * ((1 - tx) * arr[idx(i0, j1, k1)] + tx * arr[idx(i1, j1, k1)]));
79
+ }
80
+ // ── Utilities ─────────────────────────────────────────────────────────────
81
+ clearVelocities() {
82
+ this.u.fill(0);
83
+ this.v.fill(0);
84
+ this.w.fill(0);
85
+ this.uW.fill(0);
86
+ this.vW.fill(0);
87
+ this.wW.fill(0);
88
+ }
89
+ saveVelocities() {
90
+ this.uOld.set(this.u);
91
+ this.vOld.set(this.v);
92
+ this.wOld.set(this.w);
93
+ }
94
+ normalizeWeights() {
95
+ for (let i = 0; i < this.u.length; i++)
96
+ if (this.uW[i] > 0)
97
+ this.u[i] /= this.uW[i];
98
+ for (let i = 0; i < this.v.length; i++)
99
+ if (this.vW[i] > 0)
100
+ this.v[i] /= this.vW[i];
101
+ for (let i = 0; i < this.w.length; i++)
102
+ if (this.wW[i] > 0)
103
+ this.w[i] /= this.wW[i];
104
+ }
105
+ /** Mark border cells as solid, fluid cells from a predicate. */
106
+ markCells(isFluid) {
107
+ const { nx, ny, nz } = this;
108
+ for (let k = 0; k < nz; k++)
109
+ for (let j = 0; j < ny; j++)
110
+ for (let i = 0; i < nx; i++) {
111
+ const solid = i === 0 || i === nx - 1 || j === 0 || j === ny - 1 || k === 0 || k === nz - 1;
112
+ this.cellType[this.idx(i, j, k)] = solid ? 2 : (isFluid(i, j, k) ? 1 : 0);
113
+ }
114
+ }
115
+ /** Enforce solid (no-through) boundary: zero normal velocity at solid faces. */
116
+ enforceBoundary() {
117
+ const { nx, ny, nz } = this;
118
+ // Left/right walls (i=0 and i=nx)
119
+ for (let k = 0; k < nz; k++)
120
+ for (let j = 0; j < ny; j++) {
121
+ this.u[this.uIdx(0, j, k)] = 0;
122
+ this.u[this.uIdx(nx, j, k)] = 0;
123
+ }
124
+ // Bottom/top walls
125
+ for (let k = 0; k < nz; k++)
126
+ for (let i = 0; i < nx; i++) {
127
+ this.v[this.vIdx(i, 0, k)] = 0;
128
+ this.v[this.vIdx(i, ny, k)] = 0;
129
+ }
130
+ // Front/back walls
131
+ for (let j = 0; j < ny; j++)
132
+ for (let i = 0; i < nx; i++) {
133
+ this.w[this.wIdx(i, j, 0)] = 0;
134
+ this.w[this.wIdx(i, j, nz)] = 0;
135
+ }
136
+ }
137
+ /** Apply gravity to grid v velocities over timestep dt. */
138
+ applyGravity(gx, gy, gz, dt) {
139
+ const { nx, ny, nz } = this;
140
+ for (let k = 0; k < nz; k++)
141
+ for (let j = 0; j <= ny; j++)
142
+ for (let i = 0; i < nx; i++)
143
+ this.v[this.vIdx(i, j, k)] += gy * dt;
144
+ for (let k = 0; k < nz; k++)
145
+ for (let j = 0; j < ny; j++)
146
+ for (let i = 0; i <= nx; i++)
147
+ this.u[this.uIdx(i, j, k)] += gx * dt;
148
+ for (let k = 0; k <= nz; k++)
149
+ for (let j = 0; j < ny; j++)
150
+ for (let i = 0; i < nx; i++)
151
+ this.w[this.wIdx(i, j, k)] += gz * dt;
152
+ }
153
+ }
154
+ //# sourceMappingURL=MACGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MACGrid.js","sourceRoot":"","sources":["../src/MACGrid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { BufferGeometry } from 'three';
2
+ export interface MarchingCubesOptions {
3
+ /** Grid resolution per side. Higher = more detail. Default 32. */
4
+ resolution?: number;
5
+ /** Iso-surface threshold. Default 0.5. */
6
+ isoLevel?: number;
7
+ }
8
+ /**
9
+ * MarchingCubes — extracts an iso-surface from a scalar field.
10
+ * Used to turn SPH particle density fields into a mesh.
11
+ * Blender: Fluid > Surface.
12
+ *
13
+ * Usage:
14
+ * const mc = new MarchingCubes({ resolution: 32 })
15
+ * mc.setField(myDensityFn) // (x,y,z) => density
16
+ * const geo = mc.extract()
17
+ */
18
+ export declare class MarchingCubes {
19
+ parameters: {
20
+ resolution: number;
21
+ isoLevel: number;
22
+ };
23
+ private _field;
24
+ private _boundsMin;
25
+ private _boundsMax;
26
+ constructor(opts?: MarchingCubesOptions);
27
+ /**
28
+ * Set the scalar field function: (x,y,z) → density.
29
+ * For SPH, use a metaball kernel summed over nearby particles.
30
+ */
31
+ setField(fn: (x: number, y: number, z: number) => number): void;
32
+ /** Set world-space bounds of the sampling volume. */
33
+ setBounds(min: [number, number, number], max: [number, number, number]): void;
34
+ /**
35
+ * Sample the field and extract the iso-surface as a BufferGeometry.
36
+ * Returns null if no field is set.
37
+ */
38
+ extract(): BufferGeometry | null;
39
+ }
40
+ //# sourceMappingURL=MarchingCubes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarchingCubes.d.ts","sourceRoot":"","sources":["../src/MarchingCubes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmB,MAAM,OAAO,CAAA;AAyTvD,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,aAAa;IACxB,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAEpD,OAAO,CAAC,MAAM,CAA6D;IAC3E,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,UAAU,CAAqC;gBAE3C,IAAI,GAAE,oBAAyB;IAO3C;;;OAGG;IACH,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI;IAI/D,qDAAqD;IACrD,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,CAAC,GAAG,IAAI;IAKzE;;;OAGG;IACH,OAAO,IAAI,cAAc,GAAG,IAAI;CA8EjC"}