/ proof-of-concept / plate-dynamics-lab
Sign in
proof-of-concept / plate-dynamics-lab
plate-dynamics-lab / packages / core / src / fields / field.ts
49 lines · 1.2 KBBlameHistoryRaw
1/**
2 * Column-major 2-D fields matching numbl's layout: rows index y, columns index x,
3 * element (i, j) at data[i + j*ny].
4 */
5export interface Field2D {
6 nx: number;
7 ny: number;
8 data: Float64Array;
9}
11/** A stack of frames: element (i, j, k) at data[i + j*ny + k*ny*nx]. */
12export interface FieldFrames {
13 nx: number;
14 ny: number;
15 nf: number;
16 data: Float64Array;
19export function frameOf(frames: FieldFrames, k: number): Field2D {
20 const n = frames.nx * frames.ny;
21 return { nx: frames.nx, ny: frames.ny, data: frames.data.subarray(k * n, (k + 1) * n) };
24export function fieldAt(f: Field2D, i: number, j: number): number {
25 return f.data[i + j * f.ny];
28export interface Range {
29 min: number;
30 max: number;
33export function rangeOf(data: ArrayLike<number>): Range {
34 let min = Infinity;
35 let max = -Infinity;
36 for (let k = 0; k < data.length; k++) {
37 const v = data[k];
38 if (v < min) min = v;
39 if (v > max) max = v;
40 }
41 if (!Number.isFinite(min)) return { min: 0, max: 0 };
42 return { min, max };
45/** Symmetric range about zero, for signed fields drawn with a diverging colormap. */
46export function symmetricRange(r: Range): Range {
47 const a = Math.max(Math.abs(r.min), Math.abs(r.max));
48 return { min: -a, max: a };
↑↓ move↵openescclose