174 lines
4.9 KiB
Plaintext
174 lines
4.9 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "7e3ade70",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 00 Beam2D FEM Dataset\n",
|
|
"\n",
|
|
"BeamExamples ?? ??? ?? ??? ? LHS sample? ???, repository solver? FEM surrogate ??? dataset? ????."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "71929240",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import json\n",
|
|
"from pathlib import Path\n",
|
|
"\n",
|
|
"import numpy as np\n",
|
|
"\n",
|
|
"from femsurrogate.data.bounds import DEFAULT_PARAMETER_BOUNDS\n",
|
|
"from femsurrogate.data.dataset import build_dataset\n",
|
|
"from femsurrogate.data.sampling import generate_lhs_samples\n",
|
|
"from femsurrogate.data.schema import DEFAULT_RANDOM_SEED, TARGET_COLUMNS\n",
|
|
"from femsurrogate.fea.io import read_beam_example, read_expected_displacements\n",
|
|
"from femsurrogate.fea.solver import solve_linear_static\n",
|
|
"\n",
|
|
"ROOT = Path.cwd().resolve()\n",
|
|
"if not (ROOT / \"pyproject.toml\").exists():\n",
|
|
" ROOT = ROOT.parent\n",
|
|
"assert (ROOT / \"pyproject.toml\").exists(), ROOT\n",
|
|
"REFERENCE_DIR = ROOT / \"data\" / \"reference\"\n",
|
|
"REFERENCE_DIR.mkdir(parents=True, exist_ok=True)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "df256ebc",
|
|
"metadata": {},
|
|
"source": [
|
|
"## BeamExamples ?? ??\n",
|
|
"\n",
|
|
"Fixture? ?? node? ?? `Ux`, `Uy`, `Rz`? ???? ???? ?? ????? ????."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "0a8c947c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"model = read_beam_example(ROOT / \"BeamExamples\" / \"CantileverBeam.txt\")\n",
|
|
"expected = read_expected_displacements(ROOT / \"BeamExamples\" / \"CantileverBeam_Displacements.txt\")\n",
|
|
"actual = solve_linear_static(model)\n",
|
|
"\n",
|
|
"max_abs_error = 0.0\n",
|
|
"for node_id, expected_displacement in expected.items():\n",
|
|
" actual_displacement = actual[node_id]\n",
|
|
" actual_values = np.array(\n",
|
|
" [actual_displacement.ux, actual_displacement.uy, actual_displacement.rz]\n",
|
|
" )\n",
|
|
" expected_values = np.array(\n",
|
|
" [expected_displacement.ux, expected_displacement.uy, expected_displacement.rz]\n",
|
|
" )\n",
|
|
" error = float(np.max(np.abs(actual_values - expected_values)))\n",
|
|
" max_abs_error = max(max_abs_error, error)\n",
|
|
"\n",
|
|
"assert max_abs_error <= 5e-7\n",
|
|
"max_abs_error"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "6620d0ee",
|
|
"metadata": {},
|
|
"source": [
|
|
"## LHS sampling? FEM batch ??"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "9923fd04",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"N_SAMPLES = 300\n",
|
|
"\n",
|
|
"samples = generate_lhs_samples(DEFAULT_PARAMETER_BOUNDS, n=N_SAMPLES, seed=DEFAULT_RANDOM_SEED)\n",
|
|
"dataset = build_dataset(samples)\n",
|
|
"\n",
|
|
"assert len(dataset) == N_SAMPLES\n",
|
|
"assert set(TARGET_COLUMNS).issubset(dataset.columns)\n",
|
|
"dataset.head()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c0efee15",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Dataset ??\n",
|
|
"\n",
|
|
"?? notebook? ?? CSV? metadata? ??? `data/reference/`? ????."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "d80890bd",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dataset_path = REFERENCE_DIR / \"beam2d_lhs_300.csv\"\n",
|
|
"metadata_path = REFERENCE_DIR / \"beam2d_lhs_300_metadata.json\"\n",
|
|
"\n",
|
|
"dataset.to_csv(dataset_path, index=False)\n",
|
|
"metadata = {\n",
|
|
" \"dataset_name\": \"beam2d_lhs_300\",\n",
|
|
" \"sample_count\": N_SAMPLES,\n",
|
|
" \"random_seed\": DEFAULT_RANDOM_SEED,\n",
|
|
" \"unit_system\": \"SI\",\n",
|
|
" \"fea_model\": \"2D Euler-Bernoulli beam/frame, linear static\",\n",
|
|
" \"target_columns\": list(TARGET_COLUMNS),\n",
|
|
" \"parameter_bounds\": {\n",
|
|
" name: {\"lower\": bound.lower, \"upper\": bound.upper}\n",
|
|
" for name, bound in DEFAULT_PARAMETER_BOUNDS.items()\n",
|
|
" },\n",
|
|
" \"notes\": \"Generated by notebooks/00_beam2d_fea_dataset.ipynb using src/femsurrogate.\",\n",
|
|
"}\n",
|
|
"metadata_path.write_text(json.dumps(metadata, indent=2), encoding=\"utf-8\")\n",
|
|
"\n",
|
|
"{\"dataset_path\": str(dataset_path), \"metadata_path\": str(metadata_path)}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d56bcddb",
|
|
"metadata": {},
|
|
"source": [
|
|
"## ?? sanity check"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "e560e50c",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"dataset.describe().T.loc[[\"L_m\", \"b_m\", \"h_m\", \"E_pa\", \"P_n\", *TARGET_COLUMNS]]"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"name": "python",
|
|
"pygments_lexer": "ipython3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|