awatif-fem
Version:
Awatif Finite Element Method (FEM) Solver
224 lines (207 loc) • 6.38 kB
text/typescript
import { Node, Element, NodeInputs, ElementInputs } from "./data-model";
import { analyze } from "./analyze";
import { deform } from "./deform";
describe("analyze", () => {
test("Bars from Logan's book example 3.9", () => {
const nodes: Node[] = [
[],
[],
[],
[],
];
const elements: Element[] = [
[],
[],
[],
];
const nodeInputs: NodeInputs = {
supports: new Map(),
loads: new Map(),
};
const elementInputs: ElementInputs = {
elasticities: new Map(),
areas: new Map(),
};
nodeInputs.supports?.set(1, [true, true, true, false, false, false]);
nodeInputs.supports?.set(2, [true, true, true, false, false, false]);
nodeInputs.supports?.set(3, [true, true, true, false, false, false]);
nodeInputs.loads?.set(0, [20, 0, 0, 0, 0, 0]);
elements.forEach((_, i) => {
elementInputs.elasticities?.set(i, 210e6);
elementInputs.areas?.set(i, 10e-4);
});
const deformOutputs = deform(nodes, elements, nodeInputs, elementInputs);
const analyzeOutputs = analyze(
nodes,
elements,
elementInputs,
deformOutputs
);
expect(analyzeOutputs).toEqual({
normals: new Map([
[]],
[]],
[]],
]),
shearsY: new Map([
[]],
[]],
[]],
]),
shearsZ: new Map([
[]],
[]],
[]],
]),
torsions: new Map([
[]],
[]],
[]],
]),
bendingsY: new Map([
[]],
[]],
[]],
]),
bendingsZ: new Map([
[]],
[]],
[]],
]),
bendingXX: new Map(),
bendingYY: new Map(),
bendingXY: new Map(),
});
});
test("Frames from Logan's book example 5.8", () => {
const nodes: Node[] = [
[],
[],
[],
[],
];
const elements: Element[] = [
[],
[],
[],
];
const nodeInputs: NodeInputs = {
supports: new Map(),
loads: new Map(),
};
const elementInputs: ElementInputs = {
elasticities: new Map(),
shearModuli: new Map(),
torsionalConstants: new Map(),
areas: new Map(),
momentsOfInertiaY: new Map(),
momentsOfInertiaZ: new Map(),
};
nodeInputs.supports?.set(1, [true, true, true, true, true, true]);
nodeInputs.supports?.set(2, [true, true, true, true, true, true]);
nodeInputs.supports?.set(3, [true, true, true, true, true, true]);
nodeInputs.loads?.set(0, [0, -200e3, 0, -100e3, 0, 0]);
elements.forEach((_, i) => {
elementInputs.elasticities?.set(i, 200e9);
elementInputs.shearModuli?.set(i, 60e9);
elementInputs.momentsOfInertiaZ?.set(i, 40e-6);
elementInputs.momentsOfInertiaY?.set(i, 40e-6);
elementInputs.torsionalConstants?.set(i, 20e-6);
elementInputs.areas?.set(i, 6.25e-3);
});
const deformOutputs = deform(nodes, elements, nodeInputs, elementInputs);
const analyzeOutputs = analyze(
nodes,
elements,
elementInputs,
deformOutputs
);
expect(analyzeOutputs).toEqual({
normals: new Map([
[]],
[]],
[]],
]),
shearsY: new Map([
[]],
[]],
[]],
]),
shearsZ: new Map([
[]],
[]],
[]],
]),
torsions: new Map([
[]],
[]],
[]],
]),
bendingsY: new Map([
[]],
[]],
[]],
]),
bendingsZ: new Map([
[]],
[]],
[]],
]),
bendingXX: new Map(),
bendingYY: new Map(),
bendingXY: new Map(),
});
});
test("Plate", () => {
const nodes: Node[] = [
[],
[],
[],
[],
[],
];
const elements: Element[] = [
[],
[],
];
const fixedSupport = [true, true, true, true, true, true] as any;
const nodeInputs: NodeInputs = {
supports: new Map([
[],
[],
[],
[],
]),
loads: new Map([[2, [0, 0, -1, 0, 0, 0]]]),
};
const elementInputs: ElementInputs = {
elasticities: new Map(elements.map((_, i) => [i, 10])),
thicknesses: new Map(elements.map((_, i) => [i, 1])),
poissonsRatios: new Map(elements.map((_, i) => [i, 0.3])),
};
const deformOutputs = deform(nodes, elements, nodeInputs, elementInputs);
const analyzeOutputs = analyze(
nodes,
elements,
elementInputs,
deformOutputs
);
expect(analyzeOutputs).toEqual({
normals: new Map(),
shearsY: new Map(),
shearsZ: new Map(),
torsions: new Map(),
bendingsY: new Map(),
bendingsZ: new Map(),
bendingXX: new Map([
[]],
[]],
]),
bendingYY: new Map(),
bendingXY: new Map([
[]],
[]],
]),
});
});
});