diff --git a/.gitignore b/.gitignore index 501cb56..38cbc9d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ docs/source/examples/.ipynb_checkpoints/ test_examples_output.log *.log test_examples.log +/examples/.vscode diff --git a/TYPE_HINTS.md b/TYPE_HINTS.md deleted file mode 100644 index f6ed12e..0000000 --- a/TYPE_HINTS.md +++ /dev/null @@ -1,118 +0,0 @@ -# Type Hints Guide for CALFEM Python - -## Overview -Type hints have been added to CALFEM Python to improve code documentation, IDE support, and catch potential type-related bugs early. This is done in a backward-compatible way that doesn't affect runtime behavior. - -## Benefits -1. **Better IDE Support**: IDEs can provide better autocomplete, error detection, and refactoring -2. **Documentation**: Function signatures are self-documenting -3. **Error Prevention**: Static type checkers can catch type-related bugs before runtime -4. **Backward Compatibility**: All existing code continues to work unchanged - -## Type Hint Patterns - -### Basic Types -```python -def func(param: int) -> str: - return str(param) -``` - -### Array Types -```python -from numpy.typing import ArrayLike, NDArray -import numpy as np - -# Input arrays (can be lists, tuples, numpy arrays) -def func(arr: ArrayLike) -> NDArray[np.floating]: - return np.array(arr, dtype=float) -``` - -### Optional Parameters -```python -from typing import Optional - -def func(required: ArrayLike, optional: Optional[ArrayLike] = None) -> NDArray[np.floating]: - if optional is None: - return np.array(required) - return np.array(required) + np.array(optional) -``` - -### Functions with Conditional Returns -```python -from typing import Union, Tuple - -# Returns either Ke alone or (Ke, fe) tuple -def element_func(ep: ArrayLike, eq: Optional[ArrayLike] = None) -> Union[NDArray[np.floating], Tuple[NDArray[np.floating], NDArray[np.floating]]]: - Ke = compute_stiffness(ep) - if eq is None: - return Ke - else: - fe = compute_load(eq) - return Ke, fe -``` - -### Sparse Matrix Support -```python -from scipy.sparse import csr_matrix, csc_matrix, lil_matrix - -def assem_func(K: Union[NDArray[np.floating], csr_matrix, csc_matrix, lil_matrix], - Ke: ArrayLike) -> Union[NDArray[np.floating], csr_matrix, csc_matrix, lil_matrix]: - # Function body - pass -``` - -## Common CALFEM Type Patterns - -### Element Stiffness Functions -- Input: `ex: ArrayLike, ey: ArrayLike, ep: ArrayLike, eq: Optional[ArrayLike] = None` -- Return: `Union[NDArray[np.floating], Tuple[NDArray[np.floating], NDArray[np.floating]]]` - -### Element Stress/Force Functions -- Input: `ex: ArrayLike, ey: ArrayLike, ep: ArrayLike, ed: ArrayLike` -- Return: `NDArray[np.floating]` or specific types like `float` - -### Utility Functions -- Coordinate functions: `(int, int) -> NDArray[np.integer]` -- Warning/Error functions: `str -> None` - -## Type Checking -Install mypy for static type checking: -```bash -pip install mypy -``` - -Run type checking: -```bash -mypy src/calfem/core.py -``` - -The mypy.ini configuration allows gradual typing adoption without breaking existing code. - -## Implementation Strategy -1. Start with the most commonly used functions -2. Add type hints to new functions as they're written -3. Gradually add hints to existing functions during maintenance -4. Focus on public API functions first -5. Use `# type: ignore` comments for complex cases that mypy can't handle - -## Examples in Core Module -The following functions already have type hints as examples: -- `spring1e`: Simple function with array input/output -- `spring1s`: Function returning scalar -- `bar1e`: Function with optional parameters and conditional return -- `beam2e`: Complex element function pattern -- `eigen`: Functions with multiple array inputs/outputs -- `assem`: Functions supporting both dense and sparse matrices -- `create_dofs`: Utility function with integer types - -## Future Enhancements -- Add type hints to other modules (mesh, vis, etc.) -- Use Protocol types for more complex interfaces -- Add runtime type checking with libraries like pydantic -- Integration with documentation generation tools - -## Compatibility -- Minimum Python version: 3.8 (supports all required typing features) -- No runtime impact: Type hints are ignored at runtime -- All existing code continues to work without modification -- Optional adoption: Teams can choose their level of type hint usage diff --git a/build-package.py b/build-package.py deleted file mode 100644 index 46d712e..0000000 --- a/build-package.py +++ /dev/null @@ -1,26 +0,0 @@ - -import os, sys - -def update_setup(package_name, package_version, package_deps): - - with open("setup-template.py", "r") as f: - setup_template = f.read() - - with open("setup.py", "w") as f: - f.write(setup_template.format(package_name=package_name, package_version=package_version, package_depends=package_deps)) - -def build_package(): - os.system("C:\Users\Miniconda3\envs\calfem-dev\python.exe -m build --wheel") - -if __name__ == "__main__": - - package_version = "3.6.6" - - update_setup("calfem-python", package_version, "'numpy', 'visvis', 'pyvtk', 'matplotlib', 'scipy', 'gmsh', 'qtpy', 'vedo', 'tabulate'") - - build_package() - - update_setup("calfem-python-small", package_version, "'numpy', 'visvis', 'matplotlib', 'scipy', 'gmsh', 'tabulate'") - - build_package() - diff --git a/example_outputs.py b/example_outputs.py index 000b50f..b696e49 100644 --- a/example_outputs.py +++ b/example_outputs.py @@ -1,15 +1,15 @@ # Example outputs examples = { - 'exs_bar2.py': [75000000.0, 0.0, 0.0, 0.0, -75000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 64000000.0, -48000000.0, -64000000.0, 48000000.0, 0.0, 0.0, 0.0, 0.0, -48000000.0, 36000000.0, 48000000.0, -36000000.0, 0.0, 0.0, -75000000.0, 0.0, -64000000.0, 48000000.0, 139000000.0, -48000000.0, 0.0, 0.0, 0.0, 0.0, 48000000.0, -36000000.0, -48000000.0, 86000000.0, 0.0, -50000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -50000000.0, 0.0, 50000000.0, 0.0, 0.0, 0.0, 0.0, -0.00039793, -0.0011523, 0.0, 0.0, 29845.0, 0.0, -29845.0, 22383.0, 0.0, 0.0, 0.0, 57617.0, -29844.55958549, -29844.55958549, 57616.58031088, 57616.58031088, 37305.69948187, 37305.69948187, 138.8489208633094], - 'exs_bar2_la.py': [355310000.0, -92808000.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 355310000.0, 92808000.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, 92808000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 710620000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, -92808000.0, -92808000.0, 0.0, 448120000.0, 0.0, -262500000.0, 0.0, 0.0, 92808000.0, -92808000.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 710620000.0, 0.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, 448120000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 355310000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, -92808000.0, 92808000.0, 355310000.0, 0.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 355310000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, -92808000.0, 355310000.0, 0.0, 0.0, 0.0, 0.0, 0.0023845, -0.0044633, -0.0016118, -0.0041987, 0.0030346, -0.010684, -0.0016589, -0.011334, -866030.0, 240090.0, 616030.0, 192930.0, 0.0, 8.7311e-11, 0.0, -5.2387e-10, 0.0, 6.9849e-10, 2.9104e-11, 2.3283e-10, -12372.8], - 'exs_bar2_lb.py': [355310000.0, -92808000.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 355310000.0, 92808000.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, 92808000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 710620000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, -92808000.0, -92808000.0, 0.0, 448120000.0, 0.0, -262500000.0, 0.0, 0.0, 92808000.0, -92808000.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 710620000.0, 0.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, 448120000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 355310000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, -92808000.0, 92808000.0, 355310000.0, 0.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 355310000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, -92808000.0, 355310000.0, 0.0, 0.0, 0.0, 0.0, 0.0023845, -0.0044633, -0.0016118, -0.0041987, 0.0030346, -0.010684, -0.0016589, -0.011334, -866030.0, 240090.0, 616030.0, 192930.0, 0.0, 8.7311e-11, 0.0, -5.2387e-10, 0.0, 6.9849e-10, 2.9104e-11, 2.3283e-10, -12372.8], - 'exs_beam1.py': [0.0, -0.0094859, -0.022766, -0.0037943, 0.0, 0.0075887, 6666.7, 0.0, 3.638e-12, -9.0949e-12, 3333.3, 3.638e-12, -6666.7, 0.0, -6666.7, 6666.7, -6666.7, 13333.0, -6666.7, 20000.0, 0.0, -0.0092751, -0.017285, -0.022766, 0.0, 1.0, 2.0, 3.0, 3333.3, 20000.0, 3333.3, 16667.0, 3333.3, 13333.0, 3333.3, 10000.0, 3333.3, 6666.7, 3333.3, 3333.3, 3333.3, 0.0, -0.022766, -0.024769, -0.023609, -0.01992, -0.014334, -0.0074833, 6.9389e-18, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0], - 'exs_beam2.py': [0.0, 0.0, 0.0, 0.0075357, -0.00028741, -0.0053735, 0.0075161, -0.00031259, 0.0046656, 0.0, 0.0, -0.0051513, 1926.8, 28741.0, 445.27, 0.0, -7.276e-12, 3.638e-12, 0.0, 0.0, 7.276e-12, -3926.8, 31259.0, 0.0, -28741.0, 1926.8, 8152.3, -28741.0, 1926.8, 7767.0, -28741.0, 1926.8, 7381.6, -28741.0, 1926.8, 6996.3, -28741.0, 1926.8, 6610.9, -28741.0, 1926.8, 6225.6, -28741.0, 1926.8, 5840.2, -28741.0, 1926.8, 5454.8, -28741.0, 1926.8, 5069.5, -28741.0, 1926.8, 4684.1, -28741.0, 1926.8, 4298.8, -28741.0, 1926.8, 3913.4, -28741.0, 1926.8, 3528.1, -28741.0, 1926.8, 3142.7, -28741.0, 1926.8, 2757.4, -28741.0, 1926.8, 2372.0, -28741.0, 1926.8, 1986.7, -28741.0, 1926.8, 1601.3, -28741.0, 1926.8, 1216.0, -28741.0, 1926.8, 830.62, -28741.0, 1926.8, 445.27, 0.00028741, 0.0075357, 0.00027304, 0.0065112, 0.00025867, 0.0055837, 0.0002443, 0.0047485, 0.00022993, 0.0040008, 0.00021556, 0.0033357, 0.00020119, 0.0027484, 0.00018682, 0.0022341, 0.00017245, 0.001788, 0.00015807, 0.0014053, 0.0001437, 0.0010811, 0.00012933, 0.00081067, 0.00011496, 0.00058915, 0.00010059, 0.00041173, 8.6223e-05, 0.00027359, 7.1852e-05, 0.00016993, 5.7482e-05, 9.5907e-05, 4.3111e-05, 4.6722e-05, 2.8741e-05, 1.7554e-05, 1.437e-05, 3.5858e-06, 0.0, 0.0, -31259.0, -3926.8, -15707.0, -31259.0, -3926.8, -14922.0, -31259.0, -3926.8, -14136.0, -31259.0, -3926.8, -13351.0, -31259.0, -3926.8, -12566.0, -31259.0, -3926.8, -11780.0, -31259.0, -3926.8, -10995.0, -31259.0, -3926.8, -10210.0, -31259.0, -3926.8, -9424.2, -31259.0, -3926.8, -8638.9, -31259.0, -3926.8, -7853.5, -31259.0, -3926.8, -7068.2, -31259.0, -3926.8, -6282.8, -31259.0, -3926.8, -5497.5, -31259.0, -3926.8, -4712.1, -31259.0, -3926.8, -3926.8, -31259.0, -3926.8, -3141.4, -31259.0, -3926.8, -2356.1, -31259.0, -3926.8, -1570.7, -31259.0, -3926.8, -785.35, -31259.0, -3926.8, 2.7756e-12, 0.00031259, 0.0075161, 0.00029696, 0.0083527, 0.00028133, 0.0090027, 0.0002657, 0.0094761, 0.00025007, 0.0097825, 0.00023444, 0.0099319, 0.00021881, 0.0099341, 0.00020318, 0.0097988, 0.00018755, 0.0095359, 0.00017193, 0.0091552, 0.0001563, 0.0086665, 0.00014067, 0.0080796, 0.00012504, 0.0074044, 0.00010941, 0.0066506, 9.3777e-05, 0.0058282, 7.8148e-05, 0.0049468, 6.2518e-05, 0.0040163, 4.6889e-05, 0.0030466, 3.1259e-05, 0.0020474, 1.563e-05, 0.0010286, 0.0, 0.0, -3926.8, -28741.0, -8152.3, -3926.8, -25741.0, 19.953, -3926.8, -22741.0, 7292.2, -3926.8, -19741.0, 13664.0, -3926.8, -16741.0, 19137.0, -3926.8, -13741.0, 23709.0, -3926.8, -10741.0, 27381.0, -3926.8, -7740.9, 30154.0, -3926.8, -4740.9, 32026.0, -3926.8, -1740.9, 32998.0, -3926.8, 1259.1, 33070.0, -3926.8, 4259.1, 32243.0, -3926.8, 7259.1, 30515.0, -3926.8, 10259.0, 27887.0, -3926.8, 13259.0, 24359.0, -3926.8, 16259.0, 19932.0, -3926.8, 19259.0, 14604.0, -3926.8, 22259.0, 8376.2, -3926.8, 25259.0, 1248.4, -3926.8, 28259.0, -6779.3, -3926.8, 31259.0, -15707.0, 0.0075357, -0.00028741, 0.0075347, -0.0019218, 0.0075337, -0.0035566, 0.0075328, -0.0051312, 0.0075318, -0.0065927, 0.0075308, -0.0078952, 0.0075298, -0.0090009, 0.0075288, -0.0098789, 0.0075279, -0.010506, 0.0075269, -0.010868, 0.0075259, -0.010954, 0.0075249, -0.010766, 0.0075239, -0.01031, 0.0075229, -0.0096, 0.007522, -0.0086584, 0.007521, -0.0075143, 0.00752, -0.0062048, 0.007519, -0.0047743, 0.007518, -0.0032745, 0.0075171, -0.001765, 0.0075161, -0.00031259, 54.77300198398879, 3.628630851048567e-05], - 'exs_beambar2.py': [0.0, 0.0, 0.0, 0.00020175, -0.00055551, -0.00096319, 0.00037224, -0.0045567, -0.0032909, 0.00037224, -0.01299, -0.0045254, 0.0, 0.0, -80702.0, -6604.4, -1403.2, 0.0, -1.4552e-11, -2.2737e-12, 0.0, 0.0, -7.276e-12, 0.0, 0.0, 3.8654e-11, 80702.0, 46604.0, 80702.0, 6604.4, 1403.2, 80702.0, 6604.4, 82.292, 80702.0, 6604.4, -1238.6, 80702.0, 6604.4, -2559.5, 80702.0, 6604.4, -3880.3, 80702.0, 6604.4, -5201.2, 80702.0, 6604.4, -6522.1, 80702.0, 6604.4, -7843.0, 80702.0, 6604.4, -9163.9, 80702.0, 6604.4, -10485.0, 80702.0, 6604.4, -11806.0, 68194.0, -5902.8, -11806.0, 68194.0, -3902.8, -10825.0, 68194.0, -1902.8, -10245.0, 68194.0, 97.186, -10064.0, 68194.0, 2097.2, -10283.0, 68194.0, 4097.2, -10903.0, 68194.0, 6097.2, -11922.0, 68194.0, 8097.2, -13342.0, 68194.0, 10097.0, -15161.0, 68194.0, 12097.0, -17381.0, 68194.0, 14097.0, -20000.0, 0.0, -20000.0, -20000.0, 0.0, -18000.0, -16200.0, 0.0, -16000.0, -12800.0, 0.0, -14000.0, -9800.0, 0.0, -12000.0, -7200.0, 0.0, -10000.0, -5000.0, 0.0, -8000.0, -3200.0, 0.0, -6000.0, -1800.0, 0.0, -4000.0, -800.0, 0.0, -2000.0, -200.0, 0.0, -4.6838e-12, 4.8594e-11, -17688.0, -17688.0, -76244.0, -76244.0], - 'exs_flw_diff2.py': [0.0, 0.025, 0.025, 0.0, 0.025, 0.05, 0.05, 0.025, 0.0, 0.025, 0.025, 0.0, 0.025, 0.05, 0.05, 0.025, 0.0, 0.025, 0.025, 0.0, 0.025, 0.05, 0.05, 0.025, 0.0, 0.025, 0.025, 0.0, 0.025, 0.05, 0.05, 0.025, 0.0, 0.0, 0.025, 0.025, 0.0, 0.0, 0.025, 0.025, 0.025, 0.025, 0.05, 0.05, 0.025, 0.025, 0.05, 0.05, 0.05, 0.05, 0.075, 0.075, 0.05, 0.05, 0.075, 0.075, 0.075, 0.075, 0.1, 0.1, 0.075, 0.075, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 6.6176e-05, 9.3487e-05, 0.0, 0.00017857, 0.00025, 0.0, 0.00043382, 0.00054937, 0.0005, 0.001, 0.001, 0.0, 0.0, 6.6176e-05, 0.0, 0.0, 0.0, 9.3487e-05, 6.6176e-05, 0.0, 6.6176e-05, 0.00017857, 0.0, 6.6176e-05, 9.3487e-05, 0.00025, 0.00017857, 0.0, 0.00017857, 0.00043382, 0.0, 0.00017857, 0.00025, 0.00054937, 0.00043382, 0.0, 0.00043382, 0.001, 0.0005, 0.00043382, 0.00054937, 0.001, 0.001], - 'exs_flw_temp1.py': [-17.0, -16.438, -15.861, 19.238, 19.475, 20.0, -14.039, 0.0, 0.0, 0.0, 5.6843e-14, 4.0394, 14.039386189223357, 14.039386189223451, 14.039386189223485, 4.039386189223492, 4.03938618922342], - 'exs_flw_temp2.py': [25.0, -25.0, 0.0, 0.0, 0.0, 0.0, -25.0, 49.3, -24.3, 0.0, 0.0, 0.0, 0.0, -24.3, 24.7, -0.4, 0.0, 0.0, 0.0, 0.0, -0.4, 17.4, -17.0, 0.0, 0.0, 0.0, 0.0, -17.0, 24.7, -7.7, 0.0, 0.0, 0.0, 0.0, -7.7, 7.7, -17.0, -16.438, -15.861, 19.238, 19.475, 20.0, -14.039, 0.0, 0.0, 0.0, 5.6843e-14, 4.0394, 14.039386189223357, 14.039386189223451, 14.039386189223485, 4.039386189223492, 4.03938618922342], - 'exs_spring.py': [3000.0, -3000.0, 0.0, -3000.0, 7500.0, -4500.0, 0.0, -4500.0, 4500.0, 0.0, 0.013333, 0.0, -40.0, 0.0, -60.0, 40.0, -20.0, -40.0], + 'exs_bar2.py': [75000000.0, 0.0, -75000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, -75000000.0, 0.0, 75000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 50000000.0, 0.0, -50000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, -50000000.0, 0.0, 50000000.0, 64000000.0, -48000000.0, -64000000.0, 48000000.0, -48000000.0, 36000000.0, 48000000.0, -36000000.0, -64000000.0, 48000000.0, 64000000.0, -48000000.0, 48000000.0, -36000000.0, -48000000.0, 36000000.0, 75000000.0, 0.0, 0.0, 0.0, -75000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 64000000.0, -48000000.0, -64000000.0, 48000000.0, 0.0, 0.0, 0.0, 0.0, -48000000.0, 36000000.0, 48000000.0, -36000000.0, 0.0, 0.0, -75000000.0, 0.0, -64000000.0, 48000000.0, 139000000.0, -48000000.0, 0.0, 0.0, 0.0, 0.0, 48000000.0, -36000000.0, -48000000.0, 86000000.0, 0.0, -50000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -50000000.0, 0.0, 50000000.0, 0.0, 0.0, 0.0, 0.0, -0.00039793, -0.0011523, 0.0, 0.0, 29845.0, 0.0, -29845.0, 22383.0, 0.0, 0.0, 0.0, 57617.0, -29845.0, -29845.0, 57617.0, 57617.0, 37306.0, 37306.0, 138.8489208633094], + 'exs_bar2_la.py': [355310000.0, -92808000.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 355310000.0, 92808000.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, 92808000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 710620000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, -92808000.0, -92808000.0, 0.0, 448120000.0, 0.0, -262500000.0, 0.0, 0.0, 92808000.0, -92808000.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 710620000.0, 0.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, 448120000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 355310000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, -92808000.0, 92808000.0, 355310000.0, 0.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 355310000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, -92808000.0, 355310000.0, 0.0, 0.0, 0.0, 0.0, 0.0023845, -0.0044633, -0.0016118, -0.0041987, 0.0030346, -0.010684, -0.0016589, -0.011334, -866030.0, 240090.0, 616030.0, 192930.0, 0.0, -1.4552e-10, -1.1642e-10, 5.8208e-11, -1.1642e-10, 2.3283e-10, 2.9104e-11, 2.9104e-10, -12372.8], + 'exs_bar2_lb.py': [355310000.0, -92808000.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 355310000.0, 92808000.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, 92808000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 710620000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, 92808000.0, 0.0, 0.0, -92808000.0, -92808000.0, 0.0, 448120000.0, 0.0, -262500000.0, 0.0, 0.0, 92808000.0, -92808000.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 710620000.0, 0.0, -92808000.0, -92808000.0, -262500000.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, 448120000.0, -92808000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -262500000.0, 0.0, -92808000.0, -92808000.0, 355310000.0, 92808000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, -92808000.0, 92808000.0, 355310000.0, 0.0, -262500000.0, 0.0, 0.0, 0.0, 0.0, -92808000.0, 92808000.0, -262500000.0, 0.0, 0.0, 0.0, 355310000.0, -92808000.0, 0.0, 0.0, 0.0, 0.0, 92808000.0, -92808000.0, 0.0, 0.0, 0.0, -262500000.0, -92808000.0, 355310000.0, 0.0, 0.0, 0.0, 0.0, 0.0023845, -0.0044633, -0.0016118, -0.0041987, 0.0030346, -0.010684, -0.0016589, -0.011334, -866030.0, 240090.0, 616030.0, 192930.0, 0.0, -1.4552e-10, -1.1642e-10, 5.8208e-11, -1.1642e-10, 2.3283e-10, 2.9104e-11, 2.9104e-10, -12372.8], + 'exs_beam1.py': [2342700.0, 3514000.0, -2342700.0, 3514000.0, 3514000.0, 7028000.0, -3514000.0, 3514000.0, -2342700.0, -3514000.0, 2342700.0, -3514000.0, 3514000.0, 3514000.0, -3514000.0, 7028000.0, 292830.0, 878500.0, -292830.0, 878500.0, 878500.0, 3514000.0, -878500.0, 1757000.0, -292830.0, -878500.0, 292830.0, -878500.0, 878500.0, 1757000.0, -878500.0, 3514000.0, 0.0, -0.0094859, -0.022766, -0.0037943, 0.0, 0.0075887, 6666.7, -1.819e-11, 7.276e-12, -1.0914e-11, 3333.3, -7.276e-12, -6666.7, 1.8287e-11, -6666.7, 6666.7, -6666.7, 13333.0, -6666.7, 20000.0, 0.0, -0.0092751, -0.017285, -0.022766, 0.0, 1.0, 2.0, 3.0, 3333.3, 20000.0, 3333.3, 16667.0, 3333.3, 13333.0, 3333.3, 10000.0, 3333.3, 6666.7, 3333.3, 3333.3, 3333.3, 0.0, -0.022766, -0.024769, -0.023609, -0.01992, -0.014334, -0.0074833, -3.4694e-18, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0], + 'exs_beam2.py': [0.0, 0.0, 0.0, 2000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0075357, -0.00028741, -0.0053735, 0.0075161, -0.00031259, 0.0046656, 0.0, 0.0, -0.0051513, 1926.8, 28741.0, 445.27, 0.0, 3.638e-12, -7.276e-12, -2.3283e-10, 3.638e-12, 0.0, -3926.8, 31259.0, 0.0, -28741.0, 1926.8, 8152.3, -28741.0, 1926.8, 7767.0, -28741.0, 1926.8, 7381.6, -28741.0, 1926.8, 6996.3, -28741.0, 1926.8, 6610.9, -28741.0, 1926.8, 6225.6, -28741.0, 1926.8, 5840.2, -28741.0, 1926.8, 5454.8, -28741.0, 1926.8, 5069.5, -28741.0, 1926.8, 4684.1, -28741.0, 1926.8, 4298.8, -28741.0, 1926.8, 3913.4, -28741.0, 1926.8, 3528.1, -28741.0, 1926.8, 3142.7, -28741.0, 1926.8, 2757.4, -28741.0, 1926.8, 2372.0, -28741.0, 1926.8, 1986.7, -28741.0, 1926.8, 1601.3, -28741.0, 1926.8, 1216.0, -28741.0, 1926.8, 830.62, -28741.0, 1926.8, 445.27, 0.00028741, 0.0075357, 0.00027304, 0.0065112, 0.00025867, 0.0055837, 0.0002443, 0.0047485, 0.00022993, 0.0040008, 0.00021556, 0.0033357, 0.00020119, 0.0027484, 0.00018682, 0.0022341, 0.00017245, 0.001788, 0.00015807, 0.0014053, 0.0001437, 0.0010811, 0.00012933, 0.00081067, 0.00011496, 0.00058915, 0.00010059, 0.00041173, 8.6223e-05, 0.00027359, 7.1852e-05, 0.00016993, 5.7482e-05, 9.5907e-05, 4.3111e-05, 4.6722e-05, 2.8741e-05, 1.7554e-05, 1.437e-05, 3.5858e-06, 0.0, 1.7347e-18, -31259.0, -3926.8, -15707.0, -31259.0, -3926.8, -14922.0, -31259.0, -3926.8, -14136.0, -31259.0, -3926.8, -13351.0, -31259.0, -3926.8, -12566.0, -31259.0, -3926.8, -11780.0, -31259.0, -3926.8, -10995.0, -31259.0, -3926.8, -10210.0, -31259.0, -3926.8, -9424.2, -31259.0, -3926.8, -8638.9, -31259.0, -3926.8, -7853.5, -31259.0, -3926.8, -7068.2, -31259.0, -3926.8, -6282.8, -31259.0, -3926.8, -5497.5, -31259.0, -3926.8, -4712.1, -31259.0, -3926.8, -3926.8, -31259.0, -3926.8, -3141.4, -31259.0, -3926.8, -2356.1, -31259.0, -3926.8, -1570.7, -31259.0, -3926.8, -785.35, -31259.0, -3926.8, 5.5511e-12, 0.00031259, 0.0075161, 0.00029696, 0.0083527, 0.00028133, 0.0090027, 0.0002657, 0.0094761, 0.00025007, 0.0097825, 0.00023444, 0.0099319, 0.00021881, 0.0099341, 0.00020318, 0.0097988, 0.00018755, 0.0095359, 0.00017193, 0.0091552, 0.0001563, 0.0086665, 0.00014067, 0.0080796, 0.00012504, 0.0074044, 0.00010941, 0.0066506, 9.3777e-05, 0.0058282, 7.8148e-05, 0.0049468, 6.2518e-05, 0.0040163, 4.6889e-05, 0.0030466, 3.1259e-05, 0.0020474, 1.563e-05, 0.0010286, 0.0, 3.4694e-18, -3926.8, -28741.0, -8152.3, -3926.8, -25741.0, 19.953, -3926.8, -22741.0, 7292.2, -3926.8, -19741.0, 13664.0, -3926.8, -16741.0, 19137.0, -3926.8, -13741.0, 23709.0, -3926.8, -10741.0, 27381.0, -3926.8, -7740.9, 30154.0, -3926.8, -4740.9, 32026.0, -3926.8, -1740.9, 32998.0, -3926.8, 1259.1, 33070.0, -3926.8, 4259.1, 32243.0, -3926.8, 7259.1, 30515.0, -3926.8, 10259.0, 27887.0, -3926.8, 13259.0, 24359.0, -3926.8, 16259.0, 19932.0, -3926.8, 19259.0, 14604.0, -3926.8, 22259.0, 8376.2, -3926.8, 25259.0, 1248.4, -3926.8, 28259.0, -6779.3, -3926.8, 31259.0, -15707.0, 0.0075357, -0.00028741, 0.0075347, -0.0019218, 0.0075337, -0.0035566, 0.0075328, -0.0051312, 0.0075318, -0.0065927, 0.0075308, -0.0078952, 0.0075298, -0.0090009, 0.0075288, -0.0098789, 0.0075279, -0.010506, 0.0075269, -0.010868, 0.0075259, -0.010954, 0.0075249, -0.010766, 0.0075239, -0.01031, 0.0075229, -0.0096, 0.007522, -0.0086584, 0.007521, -0.0075143, 0.00752, -0.0062048, 0.007519, -0.0047743, 0.007518, -0.0032745, 0.0075171, -0.001765, 0.0075161, -0.00031259, 54.77300198398879, 3.628630851048566e-05], + 'exs_beambar2.py': [0.0, 0.0, 0.0, 0.00020175, -0.00055551, -0.00096319, 0.00037224, -0.0045567, -0.0032909, 0.00037224, -0.01299, -0.0045254, 0.0, 0.0, -80702.0, -6604.4, -1403.2, 0.0, 1.4552e-11, 5.0022e-12, 0.0, 0.0, 2.1828e-11, 0.0, -2.9104e-11, 3.8654e-11, 80702.0, 46604.0, 80702.0, 6604.4, 1403.2, 80702.0, 6604.4, 82.292, 80702.0, 6604.4, -1238.6, 80702.0, 6604.4, -2559.5, 80702.0, 6604.4, -3880.3, 80702.0, 6604.4, -5201.2, 80702.0, 6604.4, -6522.1, 80702.0, 6604.4, -7843.0, 80702.0, 6604.4, -9163.9, 80702.0, 6604.4, -10485.0, 80702.0, 6604.4, -11806.0, 68194.0, -5902.8, -11806.0, 68194.0, -3902.8, -10825.0, 68194.0, -1902.8, -10245.0, 68194.0, 97.186, -10064.0, 68194.0, 2097.2, -10283.0, 68194.0, 4097.2, -10903.0, 68194.0, 6097.2, -11922.0, 68194.0, 8097.2, -13342.0, 68194.0, 10097.0, -15161.0, 68194.0, 12097.0, -17381.0, 68194.0, 14097.0, -20000.0, 2.1684e-11, -20000.0, -20000.0, 2.1684e-11, -18000.0, -16200.0, 2.1684e-11, -16000.0, -12800.0, 2.1684e-11, -14000.0, -9800.0, 2.1684e-11, -12000.0, -7200.0, 2.1684e-11, -10000.0, -5000.0, 2.1684e-11, -8000.0, -3200.0, 2.1684e-11, -6000.0, -1800.0, 2.1684e-11, -4000.0, -800.0, 2.1684e-11, -2000.0, -200.0, 2.1684e-11, 9.3675e-12, -7.6111e-12, -17688.0, -17688.0, -76244.0, -76244.0], + 'exs_flw_diff2.py': [0.0, 0.0, 0.0, 0.0, 6.6176e-05, 9.3487e-05, 0.0, 0.00017857, 0.00025, 0.0, 0.00043382, 0.00054937, 0.0005, 0.001, 0.001, -1.6544e-05, -5.646e-05, -3.9916e-05, -7.7731e-05, 0.0, 1.3553e-20, -0.00021429, -1.0842e-19, 0.0, -0.00063655, -1.0842e-19, -1.0842e-19, 1.6544e-05, 0.00077075, 0.0002542, -0.0013235, -0.0013235, -0.00054622, -0.0031933, -0.004895, -0.0022479, -0.0019748, -0.0053782, -0.012248, -0.005105, -0.0037395, -0.011092, -0.018676, -0.021324, -0.0023109, -0.020336, 0.0, 5.0, 6.6176e-05, 6.0, 9.3487e-05, 8.0, 0.00017857, 9.0, 0.00025, 11.0, 0.00043382, 12.0, 0.00054937, 1.0], + 'exs_flw_temp1.py': [-17.0, -16.438, -15.861, 19.238, 19.475, 20.0, -14.039, -5.6843e-14, -1.1546e-14, 0.0, 5.6843e-14, 4.0394, 14.039386189223357, 14.039386189223451, 14.039386189223485, 4.039386189223492, 4.03938618922342], + 'exs_flw_temp2.py': [25.0, -25.0, 0.0, 0.0, 0.0, 0.0, -25.0, 49.3, -24.3, 0.0, 0.0, 0.0, 0.0, -24.3, 24.7, -0.4, 0.0, 0.0, 0.0, 0.0, -0.4, 17.4, -17.0, 0.0, 0.0, 0.0, 0.0, -17.0, 24.7, -7.7, 0.0, 0.0, 0.0, 0.0, -7.7, 7.7, -17.0, -16.438, -15.861, 19.238, 19.475, 20.0, -14.039, -5.6843e-14, -1.1546e-14, 0.0, 5.6843e-14, 4.0394, 14.039386189223357, 14.039386189223451, 14.039386189223485, 4.039386189223492, 4.03938618922342], + 'exs_spring.py': [3000.0, -3000.0, -3000.0, 3000.0, 1500.0, -1500.0, -1500.0, 1500.0, 3000.0, -3000.0, -3000.0, 3000.0, 3000.0, -3000.0, 0.0, -3000.0, 7500.0, -4500.0, 0.0, -4500.0, 4500.0, 0.0, 0.013333, 0.0, -40.0, 0.0, -60.0, 40.0, -20.0, -40.0], 'exm_stress_2d_materials.py': [273490.0, -5532400.0, 101240.0, 245560.0, -5590800.0, -70991.0, -468160.0, -5674900.0, 2337900.0, 105260.0, -10057000.0, -901480.0, -1060000.0, -4782700.0, 74361.0, 67254.0, -10216000.0, 777330.0, -518130.0, -1470300.0, -201990.0, -417880.0, -5925200.0, -315360.0, -149290.0, -6583000.0, 389150.0, -317670.0, -5646400.0, -2229100.0, -59615.0, -5628500.0, 3657600.0, -1044900.0, -8832400.0, -636340.0, -825010.0, -9306900.0, 733710.0, 1308900.0, -3378600.0, -1218200.0, -44273.0, -10828000.0, -741730.0, 96894.0, -11136000.0, 827990.0, 93515.0, -11406000.0, 941070.0, -888720.0, -2187800.0, 82097.0, -4146200.0, -4262800.0, 1478600.0, -71141.0, -6966600.0, -702040.0, 83398.0, -1359100.0, 312310.0, 926180.0, -3071000.0, -2046900.0, -266410.0, -10251000.0, -727510.0, -100170.0, -9538800.0, 803480.0, 128050.0, -10560000.0, 720840.0, -523810.0, -7231400.0, 498090.0, -3242700.0, -4428800.0, 2052200.0, -152510.0, -6554500.0, -569200.0, -989280.0, -3085700.0, 53213.0, -178290.0, -1230300.0, -106040.0, -300900.0, -1278500.0, -188410.0, -1066000.0, -6836500.0, -197300.0, -775680.0, -1989800.0, -110810.0, -63287.0, -9193000.0, 701510.0, -64253.0, -11456000.0, 1001400.0, -106610.0, -10606000.0, -715670.0, 32941.0, -7410400.0, -705150.0, -4631000.0, -4386000.0, 917600.0, 73962.0, -11253000.0, 875020.0, 44237.0, -10993000.0, -784780.0, 2090700.0, -3405000.0, -665320.0, -392930.0, -6091800.0, -117430.0, -26522.0, -4304500.0, 219100.0, 74657.0, -11278000.0, -940300.0, 1998100.0, -3355100.0, 943110.0, 1525800.0, -1675300.0, 542180.0, -278310.0, -11355000.0, -1117100.0, 835230.0, -3190900.0, 2167500.0, -13865.0, -4917200.0, 300310.0, 3803500.0, -2745300.0, 1148200.0, -113590.0, -13849000.0, -952710.0, 1211300.0, -1611600.0, -431030.0, -1046100.0, -4884800.0, -1135900.0, -139260.0, -10583000.0, 716670.0, 48340.0, -10294000.0, -413180.0, -46928.0, -9184700.0, -705020.0, 26683.0, -7868000.0, 700760.0, 127260.0, -13177000.0, -749850.0, 5667600.0, -3005700.0, 524580.0, -1081100.0, -11125000.0, -1311800.0, 448830.0, -1601500.0, 586780.0, -8953500.0, -4674800.0, -71338.0, -2681.7, -6808500.0, -269220.0, 1810400.0, -1610700.0, 562050.0, -8895700.0, -4698500.0, 152090.0, 14010.0, -6206400.0, -276420.0, 92721.0, -2183300.0, 319280.0, -175920.0, -1468500.0, -417560.0, -3289300.0, -4172800.0, -1986700.0, 5429.0, -8526400.0, -640910.0, -4678000.0, -4408700.0, -593650.0, -90686.0, -9506000.0, -802330.0, -3390900.0, -4571700.0, -1747300.0, -39612.0, -9290500.0, -407630.0, -408650.0, -14317000.0, 1366800.0, -180630.0, -10183000.0, 797400.0, -1647200.0, -6340700.0, -19874.0, -2257800.0, -15109000.0, 2618100.0, -2179400.0, -8297800.0, 462630.0, -8350.5, -11765000.0, 501430.0, -3005600.0, -4793300.0, -1457600.0, 1248.0, -7995500.0, -274090.0, -7211100.0, -4644200.0, -583190.0, 968040.0, -1651900.0, -267090.0, -2210200.0, -15164000.0, -2615900.0, 21016.0, -6254300.0, 291050.0, 95335.0, -9943600.0, 1018600.0, -381060.0, -14320000.0, -1345600.0, 438000.0, -9310900.0, 823320.0, 25829.0, -8225800.0, 664580.0, 1663300.0, -4272500.0, 493440.0, -81737.0, -11367000.0, 438350.0, -5744000.0, -4585900.0, -1053500.0, -28334.0, -8609400.0, -319010.0, -72189.0, -4482900.0, 413880.0, 10547.0, -6853900.0, 278100.0, -2263.1, -7399300.0, -265770.0, -8461800.0, -4617700.0, -301010.0, 530300.0, -4987400.0, 686300.0, -481390.0, -9615400.0, 1895500.0, 39865.0, -9688400.0, 1007100.0, 473820.0, -1530600.0, -545780.0, -384270.0, -1216400.0, 70292.0, -1426700.0, -4517700.0, -170650.0, -152510.0, -10240000.0, 247570.0, -241610.0, -10873000.0, 353810.0, 4953800.0, -2870200.0, 826320.0, 68222.0, -13509000.0, -825090.0, 5263.3, -5592500.0, 307710.0, 543740.0, -4976000.0, -673910.0, 40651.0, -10986000.0, -339990.0, 1311000.0, -4937700.0, -213130.0, -91015.0, -5402300.0, -602310.0, -518780.0, -1398900.0, 52881.0, 270060.0, -8528400.0, 424160.0, -9199.8, -11615000.0, -244740.0, 1536700.0, -3221400.0, 1517600.0, -33335.0, -11341000.0, -1004600.0, -21692.0, -9818200.0, -596750.0, -1108900.0, -4994000.0, -2879600.0, 810100.0, -1647500.0, 60849.0, 366650.0, -1622400.0, -560310.0, 1264900.0, -1644900.0, 414370.0, 12160.0, -7486500.0, 729040.0, 148350.0, -12846000.0, -688310.0, 6068900.0, -3083900.0, 196540.0, 917370.0, -1635700.0, 209160.0, -1097900.0, -4796100.0, 1206700.0, -98090.0, -3934000.0, 177350.0, -577130.0, -9665500.0, -1876200.0, -7816.6, -7997900.0, 274790.0, -1379200.0, -9679200.0, 711630.0, 6812.7, -7429100.0, 268580.0, -567140.0, -8766900.0, 196530.0, -845960.0, -7689700.0, -76617.0, 1510100.0, -1659100.0, -550510.0, -4008000.0, -4153600.0, -1313400.0, -29444.0, -8864000.0, -654200.0, -446730.0, -5072200.0, 153580.0, 105150.0, -2629500.0, -80869.0, 368670.0, -5012300.0, 433200.0, 848170.0, -1650800.0, -106870.0, 1822000.0, -1526300.0, -460360.0, 483610.0, -1492200.0, -7096.9, 492740.0, -1486900.0, -385190.0, -55034.0, -7073200.0, 712950.0, 124830.0, -12509000.0, -623710.0, 6112100.0, -3091100.0, -122650.0, 485590.0, -1499100.0, -189410.0, -286100.0, -11468000.0, 1133000.0, -124470.0, -1247700.0, 13404.0, -124490.0, -6546600.0, -338140.0, -646390.0, -4404800.0, -144030.0, -375480.0, -6159600.0, -245210.0, -11651.0, -1412400.0, 398380.0, 23146.0, -10964000.0, 777530.0, 37209.0, -10844000.0, 645560.0, -324710.0, -6182100.0, 196230.0, -297920.0, -5933000.0, -742300.0, -898550.0, -7755700.0, -11262.0, -649630.0, -1678100.0, 174800.0, -1959800.0, -4450600.0, 2608800.0, 210990.0, -5798500.0, 1180200.0, 45836.0, -10676000.0, -666470.0, -9929.5, -11639000.0, 222530.0, -81947.0, -5392000.0, 595860.0, 1334700.0, -4938100.0, 215970.0, -2152400.0, -8135300.0, -402350.0, 307880.0, -7169600.0, -2426700.0, -79732.0, -9282500.0, 957430.0, -62445.0, -9140600.0, -945130.0, -1345300.0, -3791100.0, 1793100.0, 6151.1, -1363400.0, -331070.0, 221640.0, -3412800.0, -1754700.0, -1346800.0, -3872600.0, -1322300.0, -34290.0, -9836800.0, -803460.0, -157370.0, -9854400.0, 888500.0, 62714.0, -9571900.0, 889940.0, 75093.0, -12151000.0, 561830.0, -51873.0, -9762800.0, 945140.0, 462090.0, -1473200.0, 258530.0, -997820.0, -3683800.0, -2369300.0, -129790.0, -9778900.0, -912190.0, -307370.0, -1156000.0, 32154.0, 252420.0, -9969000.0, 929510.0, -901580.0, -2575100.0, -105720.0, -1043100.0, -2907700.0, 209720.0, 149630.0, -12876000.0, 682000.0, -89930.0, -3891800.0, 62392.0, 6842.2, -11771000.0, -497250.0, 4949200.0, -2923500.0, -754530.0, -30913.0, -9318300.0, 401730.0, -681110.0, -8816600.0, -172060.0, -10497.0, -9909500.0, 556570.0, 2639100.0, -2874600.0, -1280800.0, -414560.0, -1229700.0, -69063.0, -5720000.0, -4613000.0, 911450.0, -8413500.0, -4653900.0, 359890.0, -8114.2, -5549800.0, -297590.0, -47700.0, -4273700.0, -234040.0, 75138.0, -13570000.0, 826000.0, -191100.0, -10948000.0, -312300.0, 40804.0, -9667800.0, 844190.0, -589700.0, -3073400.0, 2911.1, 526580.0, -1513600.0, 531510.0, -2643100.0, -13476000.0, 1809500.0, -673080.0, -6245500.0, 3984000.0, -139640.0, -3923400.0, 3148400.0, -2641600.0, -13468000.0, -1811300.0, 505730.0, -7353000.0, 928850.0, 513650.0, -7359600.0, -924380.0, -1194000.0, -3533400.0, -275960.0, 243580.0, -1440900.0, 107390.0, 696980.0, -8227800.0, -57446.0, -652590.0, -6218100.0, -3972000.0, 238460.0, -5817000.0, -1122100.0, -1215500.0, -6358600.0, 143540.0, 122900.0, -10369000.0, -814930.0, -457020.0, -7953000.0, 299470.0, 149510.0, -7319000.0, -775140.0, -4908000.0, -4374700.0, 384040.0, 24082.0, -7802700.0, -683960.0, -20378.0, -8867700.0, 649190.0, 2323700.0, -3437800.0, -136970.0, 82150.0, -11109000.0, -826480.0, -199380.0, -3895200.0, -3097500.0, -176090.0, -9704800.0, -904290.0, 319810.0, -7176000.0, 2474700.0, -814440.0, -5017400.0, 2996100.0, -1084300.0, -4339800.0, 3154700.0, 1336400.0, -4687800.0, -51028.0, -157890.0, -6460700.0, 856890.0, -2453100.0, -10159000.0, -1064000.0, -12940.0, -12204000.0, 358960.0, 29999.0, -9334400.0, -922550.0, -1325100.0, -3842200.0, 1117200.0, -1295300.0, -3836100.0, 2555800.0, -366760.0, -8863200.0, -914640.0, -2206200.0, -4066500.0, -1562000.0, -124100.0, -9868200.0, -818310.0, -267840.0, -9887200.0, 881200.0, -96243.0, -9836500.0, 831720.0, 110360.0, -12509000.0, 615410.0, -346160.0, -1166600.0, -38014.0, 808110.0, -1594100.0, 354240.0, -233510.0, -1263700.0, 184370.0, 53450.0, -12163000.0, -568520.0, 5748200.0, -3048200.0, -430100.0, 115180.0, -13218000.0, 740510.0, -699790.0, -1824800.0, -31328.0, 16068.0, -9760400.0, -812380.0, -1240900.0, -3850600.0, -730050.0, 35831.0, -11047000.0, 291870.0, -135380.0, -9723600.0, -898380.0, -1490000.0, -4311400.0, -2880800.0, 14637.0, -9446700.0, 933620.0, -585050.0, -2180100.0, 139960.0, -303210.0, -5935600.0, 722570.0, -3426300.0, -4748400.0, 1267900.0, -59414.0, -3901600.0, -67330.0, -113920.0, -13899000.0, 956770.0, -22663.0, -8623400.0, 312770.0, -1404600.0, -9786900.0, -783860.0, 4109000.0, -2699900.0, -1182900.0, -110520.0, -11365000.0, -422400.0, 44762.0, -10314000.0, 375160.0, -7331200.0, -4684200.0, 631050.0, 10036.0, -4897900.0, -284400.0, -1379600.0, -4370300.0, 238840.0, -1749900.0, -6184400.0, 43025.0, -83905.0, -4492100.0, -420920.0, -450150.0, -1929900.0, -303620.0, 110010.0, -1344000.0, -183250.0, -86895.0, -3940500.0, -187070.0, -546240.0, -1438900.0, -35695.0, -765530.0, -1946400.0, 76293.0, 2341800.0, -2595300.0, -1660400.0, -200430.0, -10549000.0, -176660.0, -2440700.0, -10226000.0, 1080900.0, 2253300.0, -2606800.0, 1654600.0, 1318900.0, -4707900.0, 61827.0, -35312.0, -12192000.0, -380030.0, -159730.0, -6462700.0, -861310.0, -1159200.0, -11134000.0, 1317900.0, -772810.0, -8308100.0, 587260.0, -483670.0, -7203100.0, -503300.0, -281150.0, -1617800.0, 397990.0, -391380.0, -5945500.0, 271740.0, -21021.0, -10805000.0, 746080.0, 1552600.0, -3591100.0, -483610.0, 867670.0, -7342800.0, -127940.0, -410840.0, -8952400.0, 924490.0, 155680.0, -1350200.0, -40892.0, -403360.0, -1374900.0, 219140.0, -232480.0, -6580400.0, 569270.0, -721650.0, -8320500.0, -620150.0, 8359.9, -8557200.0, 642130.0, 2253300.0, -3422700.0, 398730.0, 95693.0, -11197000.0, -882480.0, -1087200.0, -4888600.0, -84901.0, -203190.0, -5934200.0, -908530.0, -4917400.0, -4378300.0, -113110.0, 18014.0, -8175000.0, -656520.0, 20844.0, -9753600.0, 810510.0, 361240.0, -6507800.0, -243850.0, 166380.0, -7274600.0, 867040.0, 628790.0, -7758600.0, -79378.0, -130500.0, -5566900.0, -761450.0, -153120.0, -5583100.0, 784380.0, -893470.0, -10898000.0, -957570.0, -207030.0, -5940800.0, 906760.0, -784290.0, -11046000.0, 954530.0, 446000.0, -9517300.0, -810700.0, -42749.0, -9854300.0, -1007000.0, 53978.0, -9855500.0, 760110.0, -115270.0, -5560100.0, -3648100.0, 75191.0, -9585400.0, -1049800.0, -192440.0, -7340700.0, -170800.0, -90067.0, -9292500.0, -635180.0, 9883.7, -1276500.0, 147650.0, -851460.0, -2865500.0, 86214.0, -40240.0, -9809500.0, 803110.0, 56577.0, -9497900.0, -884150.0, -1300800.0, -3903200.0, 477790.0, -1246600.0, -3944100.0, -121640.0, 54786.0, -9648000.0, -842200.0, 24725.0, -3802400.0, -307890.0, 87967.0, -2031600.0, 563340.0, 161590.0, -1739700.0, -259020.0, -51061.0, -2388200.0, -472860.0, -148870.0, -1839000.0, 77803.0, 188850.0, -1888600.0, 523180.0, -113090.0, -1325100.0, -156480.0, 189880.0, -2594500.0, 87028.0, -108510.0, -1759300.0, 204960.0, 235820.0, -1775700.0, 478270.0, -80308.0, -1672700.0, 225970.0, -33.612, -2538200.0, -363240.0, 72638.0, -1556300.0, -262470.0, 129820.0, -1592600.0, -291200.0, -58813.0, -2884700.0, 56753.0, 110960.0, -1350500.0, -349840.0, 168090.0, -1393600.0, 428630.0, 70505.0, -2630800.0, 239510.0, 39963.0, -1319600.0, 307730.0, 188460.0, -1509400.0, 549890.0, -344430.0, -1763400.0, -32588.0, -321120.0, -1748800.0, 152670.0, 31900.0, -1702800.0, -696450.0, -298890.0, -1745100.0, -197200.0, -105490.0, -2712200.0, 347810.0, 195420.0, -1444600.0, 488360.0, 270550.0, -2494800.0, -31178.0, -340170.0, -1760800.0, 62063.0, 80744.0, -2035400.0, -567020.0, 181950.0, -1389000.0, -433830.0, 113280.0, -1353800.0, 368920.0, -329840.0, -1754800.0, -123750.0, -106030.0, -1832000.0, -134010.0, 36107.0, -1702800.0, 693660.0, 134820.0, -1594000.0, -618420.0, -74097.0, -2828400.0, 207400.0, 198280.0, -1450600.0, -489770.0, 187740.0, -1513800.0, -551790.0, 158780.0, -1519500.0, -374590.0, -99477.0, -1683800.0, -241040.0, -168050.0, -1711700.0, -242110.0, -246390.0, -1692000.0, -261190.0, 66772.0, -1897000.0, -142730.0, 336440.0, -2271600.0, 44385.0, 322830.0, -2383400.0, -35903.0, 295400.0, -2138000.0, 309850.0, -47117.0, -1801300.0, -181190.0, 302310.0, -2036200.0, 286510.0, 260640.0, -2470600.0, -129780.0, 319820.0, -2148700.0, 207650.0, 138920.0, -1977800.0, 95308.0, 312190.0, -2251100.0, 223130.0, -142540.0, -2686300.0, -389950.0, 315510.0, -2356800.0, -126690.0, 310170.0, -2177200.0, 36330.0, 331660.0, -2251200.0, -122460.0, 337420.0, -2279600.0, -37695.0, 312200.0, -2185300.0, -40328.0, 313560.0, -2152300.0, -119160.0, 322390.0, -2184900.0, -208680.0, 229310.0, -1672400.0, -398880.0, 290590.0, -2058400.0, 190270.0, 235610.0, -2089100.0, 21835.0, 172270.0, -2592500.0, -129510.0, 236920.0, -2048900.0, 103950.0, 300530.0, -2081900.0, -199790.0, 144340.0, -1994200.0, 16076.0, 301630.0, -2134200.0, 114860.0, 263030.0, -2089200.0, -55817.0, 14092.0, -1710400.0, -217720.0, 260690.0, -1806800.0, -339020.0, 229480.0, -1981800.0, 172530.0, 275360.0, -2077400.0, -120810.0, 293690.0, -1979200.0, -275220.0, 137330.0, -1592600.0, 616380.0, 245150.0, -2402800.0, -228050.0, 272240.0, -2434200.0, 152110.0, 274810.0, -2481500.0, 63346.0, 247910.0, -1836400.0, -287090.0, 152360.0, -2522900.0, -236480.0, 182390.0, -1681500.0, -300720.0, 303080.0, -2290200.0, -218570.0, 138050.0, -1917400.0, 158730.0, 273690.0, -1949500.0, 260300.0, 302760.0, -2072300.0, -289570.0, 26546.0, -1786500.0, 199510.0, 133490.0, -1823000.0, 210000.0, 330750.0, -2227700.0, 126420.0, -68123.0, -2553200.0, 407050.0, 320980.0, -2329000.0, 137260.0, 263540.0, -2360600.0, 236830.0, 227720.0, -2290900.0, -325630.0, 324680.0, -2373600.0, 51782.0, 215340.0, -1878800.0, 233270.0, 246440.0, -1713300.0, -439400.0, 286600.0, -2177200.0, -309730.0, 279030.0, -1913900.0, -372960.0, 233500.0, -1793800.0, -484430.0, 264820.0, -2013900.0, -400520.0, 181620.0, -1899600.0, -528210.0, 209220.0, -2128000.0, -425680.0, -44786.0, -2380700.0, 465910.0, 117080.0, -1691500.0, 251070.0, 73153.0, -2709100.0, 132650.0, -147430.0, -1842800.0, -76088.0, 74254.0, -2746500.0, 6843.8, 2026.2, -1921700.0, 15768.0, -206400.0, -2492600.0, 539710.0, -192020.0, -2518900.0, -532690.0, 218710.0, -1993100.0, -143330.0, 25648.0, -1652200.0, 220290.0, 270580.0, -1982600.0, 395250.0, 276850.0, -1884600.0, 362120.0, 248420.0, -1803700.0, 325090.0, 158830.0, -1562700.0, 333040.0, 87214.0, -1522400.0, 283860.0, 241600.0, -1688200.0, 431460.0, 213260.0, -1618400.0, 382790.0, 192880.0, -1739500.0, 287050.0, -32094.0, -1279900.0, 248450.0, 12213.0, -1906800.0, 86866.0, -77899.0, -1397400.0, 200560.0, 30022.0, -1330700.0, -298480.0, -286410.0, -1724600.0, 225110.0, 102670.0, -2255600.0, -444970.0, -132220.0, -1811700.0, 150440.0, 91265.0, -1747200.0, -221260.0, -68109.0, -1560500.0, -202170.0, -517610.0, -2181700.0, -891050.0, -123400.0, -1373200.0, -75474.0, -517810.0, -2180500.0, 889710.0, -135520.0, -1368300.0, 70281.0, 35256.0, -2653800.0, -244310.0, 16856.0, -1507200.0, 243960.0, 215330.0, -1894800.0, -228480.0, 221220.0, -2099200.0, 420470.0, 189630.0, -2535200.0, 182400.0, 176870.0, -2010400.0, -85235.0, 185390.0, -2614700.0, -19090.0, -153400.0, -1846200.0, -1497.3, 247410.0, -2250600.0, 329500.0, 270580.0, -1998900.0, -190990.0, -62290.0, -2876100.0, -98859.0, 18612.0, -1864000.0, 151380.0, -87349.0, -2802000.0, -253540.0, 148230.0, -1881100.0, -184620.0, -44541.0, -1317000.0, -233360.0, -1186.5, -1545200.0, -225690.0, -233290.0, -1690100.0, 262710.0, 127200.0, -2411300.0, -339840.0, 3750.8, -1914800.0, -52263.0, 62559.0, -2724900.0, -120670.0, 4247.1, -1900300.0, -104770.0, -310490.0, -2374500.0, 658090.0, -307000.0, -2373100.0, -660400.0, 190470.0, -2461900.0, 258630.0, -180740.0, -1649000.0, 239100.0, -139370.0, -1868200.0, -784950.0, -182830.0, -1649500.0, -242140.0, -135770.0, -1869100.0, 783100.0, 110700.0, -2245500.0, 441130.0, 155330.0, -2375000.0, 333730.0, 106660.0, -1994100.0, -50823.0, 80010.0, -2521900.0, 328550.0, -90734.0, -2195300.0, 591720.0, -96722.0, -2205200.0, -592840.0, -122980.0, -1285300.0, 141340.0, -75999.0, -1537100.0, 182070.0, 110040.0, -1934200.0, -111600.0], 'exm_stress_2d.py': [447920000.0, 85761000.0, -78055000.0, 356730000.0, -3390300.0, -11434000.0, 328120000.0, 1513300.0, -4026000.0, 314480000.0, -202790.0, -2496700.0, 303370000.0, -250360.0, -3249100.0, 288590000.0, -492100.0, -5398300.0, 266060000.0, -676450.0, -8740800.0, 232420000.0, -863910.0, -13152000.0, 185340000.0, -607490.0, -18051000.0, 125090000.0, -1200200.0, -21752000.0, 376230000.0, 87586000.0, -74986000.0, 370880000.0, 27249000.0, -41603000.0, 343770000.0, 4514000.0, -16401000.0, 327550000.0, 726910.0, -10416000.0, 314400000.0, -1741100.0, -11117000.0, 299850000.0, -3384200.0, -15941000.0, 280540000.0, -4834100.0, -23922000.0, 254050000.0, -5909800.0, -34444000.0, 218580000.0, -5813600.0, -46342000.0, 173220000.0, -2853100.0, -56500000.0, 351480000.0, 91950000.0, -64207000.0, 359080000.0, 43558000.0, -47604000.0, 350770000.0, 14496000.0, -27578000.0, 337960000.0, 2312900.0, -18461000.0, 326530000.0, -3673300.0, -18713000.0, 314580000.0, -8014300.0, -24878000.0, 300230000.0, -11573000.0, -35597000.0, 281890000.0, -14206000.0, -49910000.0, 258180000.0, -14484000.0, -66446000.0, 227130000.0, -8937300.0, -82444000.0, 339760000.0, 94226000.0, -54386000.0, 350770000.0, 53223000.0, -45621000.0, 351650000.0, 22654000.0, -32309000.0, 345920000.0, 4821000.0, -24446000.0, 338550000.0, -5825200.0, -24508000.0, 330940000.0, -13494000.0, -31187000.0, 322610000.0, -19742000.0, -43127000.0, 312900000.0, -24405000.0, -59301000.0, 300940000.0, -25687000.0, -78509000.0, 284820000.0, -19481000.0, -99141000.0, 333930000.0, 95452000.0, -45437000.0, 346010000.0, 58862000.0, -40689000.0, 351830000.0, 28281000.0, -32483000.0, 352030000.0, 6827600.0, -27062000.0, 349830000.0, -7992100.0, -27594000.0, 347400000.0, -19216000.0, -34246000.0, 345530000.0, -28384000.0, -46222000.0, 344430000.0, -35373000.0, -62633000.0, 343910000.0, -38311000.0, -82575000.0, 343140000.0, -33090000.0, -105260000.0, 331160000.0, 96141000.0, -36986000.0, 343740000.0, 62077000.0, -34425000.0, 352490000.0, 31773000.0, -29672000.0, 357230000.0, 7980000.0, -26489000.0, 359950000.0, -10201000.0, -27617000.0, 362800000.0, -24706000.0, -33859000.0, 367240000.0, -36730000.0, -44933000.0, 374190000.0, -46097000.0, -60202000.0, 384230000.0, -50979000.0, -78979000.0, 397710000.0, -47449000.0, -100740000.0, 330040000.0, 96541000.0, -28753000.0, 342980000.0, 63834000.0, -27417000.0, 353640000.0, 33741000.0, -24853000.0, 361740000.0, 8392900.0, -23283000.0, 368630000.0, -12345000.0, -24758000.0, 376230000.0, -29598000.0, -30194000.0, 386300000.0, -44150000.0, -39616000.0, 400270000.0, -55686000.0, -52616000.0, 419290000.0, -62375000.0, -68619000.0, 444510000.0, -60416000.0, -87054000.0, 329760000.0, 96777000.0, -20572000.0, 343000000.0, 64735000.0, -19919000.0, 354960000.0, 34734000.0, -18658000.0, 365460000.0, 8347300.0, -18054000.0, 375540000.0, -14226000.0, -19488000.0, 386950000.0, -33580000.0, -23721000.0, 401570000.0, -50150000.0, -30894000.0, 421130000.0, -63435000.0, -40773000.0, 447070000.0, -71513000.0, -52866000.0, 480810000.0, -70613000.0, -66515000.0, 329810000.0, 96909000.0, -12369000.0, 343290000.0, 65154000.0, -12086000.0, 356070000.0, 35168000.0, -11547000.0, 368120000.0, 8131500.0, -11398000.0, 380360000.0, -15626000.0, -12426000.0, 394420000.0, -36393000.0, -15117000.0, 412220000.0, -54353000.0, -19601000.0, 435640000.0, -68875000.0, -25757000.0, 466320000.0, -77807000.0, -33322000.0, 505210000.0, -77448000.0, -41588000.0, 329910000.0, 96969000.0, -4128300.0, 343520000.0, 65312000.0, -4051200.0, 356700000.0, 35317000.0, -3907100.0, 369510000.0, 7965300.0, -3893500.0, 382830000.0, -16375000.0, -4265100.0, 398250000.0, -37849000.0, -5188500.0, 417680000.0, -56518000.0, -6714200.0, 443070000.0, -71653000.0, -8800800.0, 476140000.0, -81181000.0, -11377000.0, 518350000.0, -80854000.0, -14727000.0, 329910000.0, 96969000.0, 4128300.0, 329810000.0, 96909000.0, 12369000.0, 329760000.0, 96777000.0, 20572000.0, 330040000.0, 96541000.0, 28753000.0, 331160000.0, 96141000.0, 36986000.0, 333930000.0, 95452000.0, 45437000.0, 339760000.0, 94226000.0, 54386000.0, 351480000.0, 91950000.0, 64207000.0, 376230000.0, 87586000.0, 74986000.0, 447920000.0, 85761000.0, 78055000.0, 343520000.0, 65312000.0, 4051200.0, 343290000.0, 65154000.0, 12086000.0, 343000000.0, 64735000.0, 19919000.0, 342980000.0, 63834000.0, 27417000.0, 343740000.0, 62077000.0, 34425000.0, 346010000.0, 58862000.0, 40689000.0, 350770000.0, 53223000.0, 45621000.0, 359080000.0, 43558000.0, 47604000.0, 370880000.0, 27249000.0, 41603000.0, 356730000.0, -3390300.0, 11434000.0, 356700000.0, 35317000.0, 3907100.0, 356070000.0, 35168000.0, 11547000.0, 354960000.0, 34734000.0, 18658000.0, 353640000.0, 33741000.0, 24853000.0, 352490000.0, 31773000.0, 29672000.0, 351830000.0, 28281000.0, 32483000.0, 351650000.0, 22654000.0, 32309000.0, 350770000.0, 14496000.0, 27578000.0, 343770000.0, 4514000.0, 16401000.0, 328120000.0, 1513300.0, 4026000.0, 369510000.0, 7965300.0, 3893500.0, 368120000.0, 8131500.0, 11398000.0, 365460000.0, 8347300.0, 18054000.0, 361740000.0, 8392900.0, 23283000.0, 357230000.0, 7980000.0, 26489000.0, 352030000.0, 6827600.0, 27062000.0, 345920000.0, 4821000.0, 24446000.0, 337960000.0, 2312900.0, 18461000.0, 327550000.0, 726910.0, 10416000.0, 314480000.0, -202790.0, 2496700.0, 382830000.0, -16375000.0, 4265100.0, 380360000.0, -15626000.0, 12426000.0, 375540000.0, -14226000.0, 19488000.0, 368630000.0, -12345000.0, 24758000.0, 359950000.0, -10201000.0, 27617000.0, 349830000.0, -7992100.0, 27594000.0, 338550000.0, -5825200.0, 24508000.0, 326530000.0, -3673300.0, 18713000.0, 314400000.0, -1741100.0, 11117000.0, 303370000.0, -250360.0, 3249100.0, 398250000.0, -37849000.0, 5188500.0, 394420000.0, -36393000.0, 15117000.0, 386950000.0, -33580000.0, 23721000.0, 376230000.0, -29598000.0, 30194000.0, 362800000.0, -24706000.0, 33859000.0, 347400000.0, -19216000.0, 34246000.0, 330940000.0, -13494000.0, 31187000.0, 314580000.0, -8014300.0, 24878000.0, 299850000.0, -3384200.0, 15941000.0, 288590000.0, -492100.0, 5398300.0, 417680000.0, -56518000.0, 6714200.0, 412220000.0, -54353000.0, 19601000.0, 401570000.0, -50150000.0, 30894000.0, 386300000.0, -44150000.0, 39616000.0, 367240000.0, -36730000.0, 44933000.0, 345530000.0, -28384000.0, 46222000.0, 322610000.0, -19742000.0, 43127000.0, 300230000.0, -11573000.0, 35597000.0, 280540000.0, -4834100.0, 23922000.0, 266060000.0, -676450.0, 8740800.0, 443070000.0, -71653000.0, 8800800.0, 435640000.0, -68875000.0, 25757000.0, 421130000.0, -63435000.0, 40773000.0, 400270000.0, -55686000.0, 52616000.0, 374190000.0, -46097000.0, 60202000.0, 344430000.0, -35373000.0, 62633000.0, 312900000.0, -24405000.0, 59301000.0, 281890000.0, -14206000.0, 49910000.0, 254050000.0, -5909800.0, 34444000.0, 232420000.0, -863910.0, 13152000.0, 476140000.0, -81181000.0, 11377000.0, 466320000.0, -77807000.0, 33322000.0, 447070000.0, -71513000.0, 52866000.0, 419290000.0, -62375000.0, 68619000.0, 384230000.0, -50979000.0, 78979000.0, 343910000.0, -38311000.0, 82575000.0, 300940000.0, -25687000.0, 78509000.0, 258180000.0, -14484000.0, 66446000.0, 218580000.0, -5813600.0, 46342000.0, 185340000.0, -607490.0, 18051000.0, 518350000.0, -80854000.0, 14727000.0, 505210000.0, -77448000.0, 41588000.0, 480810000.0, -70613000.0, 66515000.0, 444510000.0, -60416000.0, 87054000.0, 397710000.0, -47449000.0, 100740000.0, 343140000.0, -33090000.0, 105260000.0, 284820000.0, -19481000.0, 99141000.0, 227130000.0, -8937300.0, 82444000.0, 173220000.0, -2853100.0, 56500000.0, 125090000.0, -1200200.0, 21752000.0, -1313400.0, -2631500.0, -3524400.0, -3483100.0, 1261000.0, -3811800.0, -2571100.0, 3177700.0, -808450.0, 2161500.0, 3844000.0, 3253100.0, 10320000.0, 3840100.0, 7334800.0, 21170000.0, 3469700.0, 10985000.0, 33950000.0, 2866000.0, 14017000.0, 47986000.0, 2022900.0, 16344000.0, 62704000.0, 664870.0, 17890000.0, 77558000.0, -2471000.0, 18483000.0, -285060.0, -5694800.0, -2371200.0, 6760200.0, 7575700.0, 3880300.0, 18923000.0, 13313000.0, 12964000.0, 34035000.0, 14752000.0, 22495000.0, 50796000.0, 13855000.0, 31346000.0, 68378000.0, 11729000.0, 39032000.0, 86238000.0, 8970300.0, 45414000.0, 104030000.0, 5889000.0, 50560000.0, 121600000.0, 2726300.0, 54705000.0, 139070000.0, 292520.0, 58370000.0, 3767500.0, 2055500.0, 5833100.0, 20433000.0, 20832000.0, 23403000.0, 42703000.0, 27609000.0, 39207000.0, 67205000.0, 27853000.0, 52625000.0, 92105000.0, 24624000.0, 63576000.0, 116400000.0, 19679000.0, 72224000.0, 139590000.0, 14041000.0, 78841000.0, 161390000.0, 8330900.0, 83741000.0, 181660000.0, 2965700.0, 87206000.0, 200150000.0, -2035600.0, 89303000.0, 13635000.0, 25489000.0, 21408000.0, 44206000.0, 40857000.0, 50774000.0, 78278000.0, 43196000.0, 72031000.0, 112360000.0, 38798000.0, 87218000.0, 144730000.0, 31178000.0, 97791000.0, 174660000.0, 22301000.0, 104840000.0, 201850000.0, 13264000.0, 109170000.0, 226290000.0, 4659700.0, 111390000.0, 248060000.0, -3248900.0, 111940000.0, 267420000.0, -10320000.0, 111220000.0, 32654000.0, 61962000.0, 46264000.0, 81485000.0, 64918000.0, 83741000.0, 128540000.0, 57462000.0, 106750000.0, 171550000.0, 45453000.0, 120330000.0, 209790000.0, 31986000.0, 127640000.0, 243260000.0, 18651000.0, 130680000.0, 272250000.0, 6223600.0, 130770000.0, 297190000.0, -4961500.0, 128780000.0, 318550000.0, -14784000.0, 125320000.0, 336700000.0, -23231000.0, 120830000.0, 64207000.0, 105570000.0, 80912000.0, 133440000.0, 88803000.0, 119610000.0, 192540000.0, 68017000.0, 139050000.0, 242120000.0, 47038000.0, 147190000.0, 283330000.0, 27542000.0, 148570000.0, 317410000.0, 10167000.0, 145840000.0, 345440000.0, -4950800.0, 140570000.0, 368370000.0, -17889000.0, 133720000.0, 386990000.0, -28812000.0, 125890000.0, 401930000.0, -37911000.0, 117450000.0, 110980000.0, 149770000.0, 123740000.0, 199170000.0, 108830000.0, 154770000.0, 266780000.0, 73708000.0, 165090000.0, 318980000.0, 44216000.0, 164580000.0, 359500000.0, 19694000.0, 158330000.0, 390930000.0, -608950.0, 149070000.0, 415230000.0, -17364000.0, 138280000.0, 433820000.0, -31148000.0, 126750000.0, 447770000.0, -42431000.0, 114910000.0, 457890000.0, -51600000.0, 103010000.0, 174130000.0, 188860000.0, 171410000.0, 275790000.0, 123030000.0, 185460000.0, 346310000.0, 74969000.0, 182230000.0, 396530000.0, 38784000.0, 171200000.0, 432570000.0, 10860000.0, 156870000.0, 458440000.0, -11064000.0, 141380000.0, 476780000.0, -28502000.0, 125710000.0, 489330000.0, -42465000.0, 110270000.0, 497280000.0, -53645000.0, 95211000.0, 501470000.0, -62524000.0, 80621000.0, 252910000.0, 218810000.0, 219500000.0, 358920000.0, 131140000.0, 208850000.0, 426340000.0, 73400000.0, 189340000.0, 469810000.0, 32955000.0, 167410000.0, 498180000.0, 3326900.0, 145740000.0, 516400000.0, -19198000.0, 125130000.0, 527370000.0, -36762000.0, 105680000.0, 532860000.0, -50638000.0, 87300000.0, 533980000.0, -61586000.0, 69873000.0, 531470000.0, -69983000.0, 53340000.0, 343070000.0, 236710000.0, 264480000.0, 445540000.0, 134310000.0, 223210000.0, 502380000.0, 71027000.0, 186460000.0, 535150000.0, 28855000.0, 154880000.0, 553780000.0, -1268200.0, 127450000.0, 563270000.0, -23908000.0, 103100000.0, 566200000.0, -41499000.0, 80989000.0, 563990000.0, -55363000.0, 60577000.0, 557510000.0, -66235000.0, 41643000.0, 547050000.0, -74433000.0, 24234000.0, 911600000.0, 222700000.0, 1943800.0, 890530000.0, 209580000.0, 5309700.0, 854110000.0, 183480000.0, 7463900.0, 810100000.0, 145770000.0, 8433100.0, 764530000.0, 100460000.0, 8689100.0, 720370000.0, 53386000.0, 8697500.0, 678440000.0, 10230000.0, 8698400.0, 638770000.0, -25231000.0, 8744300.0, 601310000.0, -51543000.0, 8842500.0, 565470000.0, -69330000.0, 9447300.0, 918300000.0, 220300000.0, 5531100.0, 898110000.0, 209160000.0, 15289000.0, 862870000.0, 186500000.0, 21909000.0, 819810000.0, 152840000.0, 25252000.0, 774870000.0, 111180000.0, 26411000.0, 731270000.0, 66542000.0, 26665000.0, 690020000.0, 24172000.0, 26795000.0, 651200000.0, -12078000.0, 27027000.0, 614720000.0, -40366000.0, 27316000.0, 580800000.0, -60676000.0, 27596000.0, 931870000.0, 215180000.0, 9102800.0, 911630000.0, 206410000.0, 25356000.0, 876060000.0, 187870000.0, 36806000.0, 832270000.0, 159080000.0, 42992000.0, 786380000.0, 121880000.0, 45374000.0, 741930000.0, 80392000.0, 45939000.0, 700200000.0, 39450000.0, 46095000.0, 661260000.0, 3000800.0, 46396000.0, 624960000.0, -26714000.0, 46818000.0, 591320000.0, -49105000.0, 47088000.0, 952840000.0, 206930000.0, 12852000.0, 931820000.0, 200870000.0, 36035000.0, 894660000.0, 187140000.0, 52895000.0, 848570000.0, 164110000.0, 62511000.0, 800060000.0, 132360000.0, 66492000.0, 753170000.0, 94941000.0, 67422000.0, 709490000.0, 56233000.0, 67405000.0, 669190000.0, 20247000.0, 67490000.0, 631960000.0, -10350000.0, 67845000.0, 597580000.0, -34418000.0, 68171000.0, 982010000.0, 194940000.0, 16960000.0, 959680000.0, 191920000.0, 47845000.0, 919880000.0, 183650000.0, 70991000.0, 870020000.0, 167410000.0, 84868000.0, 817130000.0, 142330000.0, 91003000.0, 765920000.0, 110240000.0, 92434000.0, 718490000.0, 74857000.0, 91995000.0, 675190000.0, 40182000.0, 91402000.0, 635600000.0, 9309300.0, 91225000.0, 599250000.0, -16036000.0, 91298000.0, 1020600000.0, 178340000.0, 21600000.0, 996530000.0, 178650000.0, 61320000.0, 953250000.0, 176550000.0, 92007000.0, 898230000.0, 168260000.0, 111370000.0, 839080000.0, 151420000.0, 120580000.0, 781330000.0, 126380000.0, 122880000.0, 727840000.0, 95899000.0, 121800000.0, 679340000.0, 63773000.0, 119900000.0, 635450000.0, 33446000.0, 118370000.0, 595480000.0, 7287800.0, 117430000.0, 1070100000.0, 155910000.0, 26954000.0, 1044100000.0, 159820000.0, 77030000.0, 996740000.0, 164580000.0, 116990000.0, 935320000.0, 165580000.0, 143660000.0, 867890000.0, 158980000.0, 157460000.0, 800900000.0, 143410000.0, 161480000.0, 738270000.0, 120250000.0, 159790000.0, 681460000.0, 92679000.0, 155800000.0, 630430000.0, 64278000.0, 151660000.0, 584380000.0, 38018000.0, 148250000.0, 1132800000.0, 126010000.0, 33205000.0, 1104900000.0, 133710000.0, 95596000.0, 1053000000.0, 145970000.0, 147170000.0, 984160000.0, 157710000.0, 183780000.0, 906320000.0, 163900000.0, 204700000.0, 826780000.0, 161240000.0, 212260000.0, 750740000.0, 149170000.0, 210530000.0, 680970000.0, 129660000.0, 203730000.0, 618220000.0, 105840000.0, 195070000.0, 562150000.0, 80969000.0, 186550000.0, 1211600000.0, 86437000.0, 40543000.0, 1181900000.0, 97962000.0, 117680000.0, 1125700000.0, 118160000.0, 183930000.0, 1048800000.0, 142110000.0, 234260000.0, 958490000.0, 164120000.0, 266440000.0, 862320000.0, 179240000.0, 281130000.0, 766800000.0, 184420000.0, 281380000.0, 676550000.0, 179160000.0, 271500000.0, 594230000.0, 165530000.0, 255680000.0, 520780000.0, 145670000.0, 237110000.0, 1310200000.0, 34185000.0, 49146000.0, 1279400000.0, 49322000.0, 143960000.0, 1219700000.0, 77483000.0, 228830000.0, 1135000000.0, 114760000.0, 298240000.0, 1030700000.0, 155970000.0, 348270000.0, 913260000.0, 195440000.0, 376960000.0, 789560000.0, 227820000.0, 384540000.0, 666280000.0, 248990000.0, 373240000.0, 549060000.0, 256640000.0, 346840000.0, 442950000.0, 252610000.0, 308810000.0, 442950000.0, 252610000.0, -308810000.0, 549060000.0, 256640000.0, -346840000.0, 666280000.0, 248990000.0, -373240000.0, 789560000.0, 227820000.0, -384540000.0, 913260000.0, 195440000.0, -376960000.0, 1030700000.0, 155970000.0, -348270000.0, 1135000000.0, 114760000.0, -298240000.0, 1219700000.0, 77483000.0, -228830000.0, 1279400000.0, 49322000.0, -143960000.0, 1310200000.0, 34185000.0, -49146000.0, 520780000.0, 145670000.0, -237110000.0, 594230000.0, 165530000.0, -255680000.0, 676550000.0, 179160000.0, -271500000.0, 766800000.0, 184420000.0, -281380000.0, 862320000.0, 179240000.0, -281130000.0, 958490000.0, 164120000.0, -266440000.0, 1048800000.0, 142110000.0, -234260000.0, 1125700000.0, 118160000.0, -183930000.0, 1181900000.0, 97962000.0, -117680000.0, 1211600000.0, 86437000.0, -40543000.0, 562150000.0, 80969000.0, -186550000.0, 618220000.0, 105840000.0, -195070000.0, 680970000.0, 129660000.0, -203730000.0, 750740000.0, 149170000.0, -210530000.0, 826780000.0, 161240000.0, -212260000.0, 906320000.0, 163900000.0, -204700000.0, 984160000.0, 157710000.0, -183780000.0, 1053000000.0, 145970000.0, -147170000.0, 1104900000.0, 133710000.0, -95596000.0, 1132800000.0, 126010000.0, -33205000.0, 584380000.0, 38018000.0, -148250000.0, 630430000.0, 64278000.0, -151660000.0, 681460000.0, 92679000.0, -155800000.0, 738270000.0, 120250000.0, -159790000.0, 800900000.0, 143410000.0, -161480000.0, 867890000.0, 158980000.0, -157460000.0, 935320000.0, 165580000.0, -143660000.0, 996740000.0, 164580000.0, -116990000.0, 1044100000.0, 159820000.0, -77030000.0, 1070100000.0, 155910000.0, -26954000.0, 595480000.0, 7287800.0, -117430000.0, 635450000.0, 33446000.0, -118370000.0, 679340000.0, 63773000.0, -119900000.0, 727840000.0, 95899000.0, -121800000.0, 781330000.0, 126380000.0, -122880000.0, 839080000.0, 151420000.0, -120580000.0, 898230000.0, 168260000.0, -111370000.0, 953250000.0, 176550000.0, -92007000.0, 996530000.0, 178650000.0, -61320000.0, 1020600000.0, 178340000.0, -21600000.0, 599250000.0, -16036000.0, -91298000.0, 635600000.0, 9309300.0, -91225000.0, 675190000.0, 40182000.0, -91402000.0, 718490000.0, 74857000.0, -91995000.0, 765920000.0, 110240000.0, -92434000.0, 817130000.0, 142330000.0, -91003000.0, 870020000.0, 167410000.0, -84868000.0, 919880000.0, 183650000.0, -70991000.0, 959680000.0, 191920000.0, -47845000.0, 982010000.0, 194940000.0, -16960000.0, 597580000.0, -34418000.0, -68171000.0, 631960000.0, -10350000.0, -67845000.0, 669190000.0, 20247000.0, -67490000.0, 709490000.0, 56233000.0, -67405000.0, 753170000.0, 94941000.0, -67422000.0, 800060000.0, 132360000.0, -66492000.0, 848570000.0, 164110000.0, -62511000.0, 894660000.0, 187140000.0, -52895000.0, 931820000.0, 200870000.0, -36035000.0, 952840000.0, 206930000.0, -12852000.0, 591320000.0, -49105000.0, -47088000.0, 624960000.0, -26714000.0, -46818000.0, 661260000.0, 3000800.0, -46396000.0, 700200000.0, 39450000.0, -46095000.0, 741930000.0, 80392000.0, -45939000.0, 786380000.0, 121880000.0, -45374000.0, 832270000.0, 159080000.0, -42992000.0, 876060000.0, 187870000.0, -36806000.0, 911630000.0, 206410000.0, -25356000.0, 931870000.0, 215180000.0, -9102800.0, 580800000.0, -60676000.0, -27596000.0, 614720000.0, -40366000.0, -27316000.0, 651200000.0, -12078000.0, -27027000.0, 690020000.0, 24172000.0, -26795000.0, 731270000.0, 66542000.0, -26665000.0, 774870000.0, 111180000.0, -26411000.0, 819810000.0, 152840000.0, -25252000.0, 862870000.0, 186500000.0, -21909000.0, 898110000.0, 209160000.0, -15289000.0, 918300000.0, 220300000.0, -5531100.0, 565470000.0, -69330000.0, -9447300.0, 601310000.0, -51543000.0, -8842500.0, 638770000.0, -25231000.0, -8744300.0, 678440000.0, 10230000.0, -8698400.0, 720370000.0, 53386000.0, -8697500.0, 764530000.0, 100460000.0, -8689100.0, 810100000.0, 145770000.0, -8433100.0, 854110000.0, 183480000.0, -7463900.0, 890530000.0, 209580000.0, -5309700.0, 911600000.0, 222700000.0, -1943800.0, -1313400.0, -2631500.0, 3524400.0, -285060.0, -5694800.0, 2371200.0, 3767500.0, 2055500.0, -5833100.0, 13635000.0, 25489000.0, -21408000.0, 32654000.0, 61962000.0, -46264000.0, 64207000.0, 105570000.0, -80912000.0, 110980000.0, 149770000.0, -123740000.0, 174130000.0, 188860000.0, -171410000.0, 252910000.0, 218810000.0, -219500000.0, 343070000.0, 236710000.0, -264480000.0, -3483100.0, 1261000.0, 3811800.0, 6760200.0, 7575700.0, -3880300.0, 20433000.0, 20832000.0, -23403000.0, 44206000.0, 40857000.0, -50774000.0, 81485000.0, 64918000.0, -83741000.0, 133440000.0, 88803000.0, -119610000.0, 199170000.0, 108830000.0, -154770000.0, 275790000.0, 123030000.0, -185460000.0, 358920000.0, 131140000.0, -208850000.0, 445540000.0, 134310000.0, -223210000.0, -2571100.0, 3177700.0, 808450.0, 18923000.0, 13313000.0, -12964000.0, 42703000.0, 27609000.0, -39207000.0, 78278000.0, 43196000.0, -72031000.0, 128540000.0, 57462000.0, -106750000.0, 192540000.0, 68017000.0, -139050000.0, 266780000.0, 73708000.0, -165090000.0, 346310000.0, 74969000.0, -182230000.0, 426340000.0, 73400000.0, -189340000.0, 502380000.0, 71027000.0, -186460000.0, 2161500.0, 3844000.0, -3253100.0, 34035000.0, 14752000.0, -22495000.0, 67205000.0, 27853000.0, -52625000.0, 112360000.0, 38798000.0, -87218000.0, 171550000.0, 45453000.0, -120330000.0, 242120000.0, 47038000.0, -147190000.0, 318980000.0, 44216000.0, -164580000.0, 396530000.0, 38784000.0, -171200000.0, 469810000.0, 32955000.0, -167410000.0, 535150000.0, 28855000.0, -154880000.0, 10320000.0, 3840100.0, -7334800.0, 50796000.0, 13855000.0, -31346000.0, 92105000.0, 24624000.0, -63576000.0, 144730000.0, 31178000.0, -97791000.0, 209790000.0, 31986000.0, -127640000.0, 283330000.0, 27542000.0, -148570000.0, 359500000.0, 19694000.0, -158330000.0, 432570000.0, 10860000.0, -156870000.0, 498180000.0, 3326900.0, -145740000.0, 553780000.0, -1268200.0, -127450000.0, 21170000.0, 3469700.0, -10985000.0, 68378000.0, 11729000.0, -39032000.0, 116400000.0, 19679000.0, -72224000.0, 174660000.0, 22301000.0, -104840000.0, 243260000.0, 18651000.0, -130680000.0, 317410000.0, 10167000.0, -145840000.0, 390930000.0, -608950.0, -149070000.0, 458440000.0, -11064000.0, -141380000.0, 516400000.0, -19198000.0, -125130000.0, 563270000.0, -23908000.0, -103100000.0, 33950000.0, 2866000.0, -14017000.0, 86238000.0, 8970300.0, -45414000.0, 139590000.0, 14041000.0, -78841000.0, 201850000.0, 13264000.0, -109170000.0, 272250000.0, 6223600.0, -130770000.0, 345440000.0, -4950800.0, -140570000.0, 415230000.0, -17364000.0, -138280000.0, 476780000.0, -28502000.0, -125710000.0, 527370000.0, -36762000.0, -105680000.0, 566200000.0, -41499000.0, -80989000.0, 47986000.0, 2022900.0, -16344000.0, 104030000.0, 5889000.0, -50560000.0, 161390000.0, 8330900.0, -83741000.0, 226290000.0, 4659700.0, -111390000.0, 297190000.0, -4961500.0, -128780000.0, 368370000.0, -17889000.0, -133720000.0, 433820000.0, -31148000.0, -126750000.0, 489330000.0, -42465000.0, -110270000.0, 532860000.0, -50638000.0, -87300000.0, 563990000.0, -55363000.0, -60577000.0, 62704000.0, 664870.0, -17890000.0, 121600000.0, 2726300.0, -54705000.0, 181660000.0, 2965700.0, -87206000.0, 248060000.0, -3248900.0, -111940000.0, 318550000.0, -14784000.0, -125320000.0, 386990000.0, -28812000.0, -125890000.0, 447770000.0, -42431000.0, -114910000.0, 497280000.0, -53645000.0, -95211000.0, 533980000.0, -61586000.0, -69873000.0, 557510000.0, -66235000.0, -41643000.0, 77558000.0, -2471000.0, -18483000.0, 139070000.0, 292520.0, -58370000.0, 200150000.0, -2035600.0, -89303000.0, 267420000.0, -10320000.0, -111220000.0, 336700000.0, -23231000.0, -120830000.0, 401930000.0, -37911000.0, -117450000.0, 457890000.0, -51600000.0, -103010000.0, 501470000.0, -62524000.0, -80621000.0, 531470000.0, -69983000.0, -53340000.0, 547050000.0, -74433000.0, -24234000.0, 445420000.0, 256020000.0, 311570000.0, 551310000.0, 259300000.0, 349160000.0, 668170000.0, 250870000.0, 375050000.0, 791000000.0, 229030000.0, 385820000.0, 914210000.0, 196120000.0, 377760000.0, 1031200000.0, 156300000.0, 348700000.0, 1135200000.0, 114880000.0, 298420000.0, 1219700000.0, 77511000.0, 228860000.0, 1279300000.0, 49319000.0, 143930000.0, 1310200000.0, 34181000.0, 49101000.0, 521890000.0, 149450000.0, 239280000.0, 595210000.0, 168890000.0, 257680000.0, 677420000.0, 181920000.0, 273270000.0, 767540000.0, 186490000.0, 282850000.0, 862910000.0, 180630000.0, 282250000.0, 958910000.0, 164950000.0, 267190000.0, 1049000000.0, 142520000.0, 234680000.0, 1125800000.0, 118330000.0, 184100000.0, 1181900000.0, 98012000.0, 117690000.0, 1211600000.0, 86445000.0, 40483000.0, 562340000.0, 84926000.0, 188470000.0, 618350000.0, 109560000.0, 196840000.0, 681090000.0, 132940000.0, 205370000.0, 750900000.0, 151820000.0, 211980000.0, 826980000.0, 163190000.0, 213450000.0, 906540000.0, 165180000.0, 205580000.0, 984350000.0, 158450000.0, 184330000.0, 1053200000.0, 146330000.0, 147440000.0, 1105000000.0, 133850000.0, 95662000.0, 1132800000.0, 126050000.0, 33166000.0, 583810000.0, 42175000.0, 150050000.0, 629880000.0, 68269000.0, 153270000.0, 681000000.0, 96309000.0, 157270000.0, 737950000.0, 123330000.0, 161120000.0, 800740000.0, 145810000.0, 162640000.0, 867860000.0, 160670000.0, 158370000.0, 935390000.0, 166630000.0, 144280000.0, 996840000.0, 165150000.0, 117330000.0, 1044200000.0, 160070000.0, 77140000.0, 1070100000.0, 155980000.0, 26944000.0, 594180000.0, 11704000.0, 119150000.0, 634300000.0, 37690000.0, 119850000.0, 678370000.0, 67691000.0, 121200000.0, 727090000.0, 99316000.0, 122990000.0, 780830000.0, 129140000.0, 123920000.0, 838810000.0, 153460000.0, 121430000.0, 898150000.0, 169600000.0, 111990000.0, 953270000.0, 177320000.0, 92361000.0, 996590000.0, 179020000.0, 61458000.0, 1020600000.0, 178440000.0, 21616000.0, 597240000.0, -11312000.0, 92913000.0, 633880000.0, 13819000.0, 92554000.0, 673760000.0, 44363000.0, 92540000.0, 717360000.0, 78559000.0, 93006000.0, 765110000.0, 113310000.0, 93331000.0, 816630000.0, 144670000.0, 91756000.0, 869780000.0, 169020000.0, 85429000.0, 919820000.0, 184620000.0, 71333000.0, 959700000.0, 192400000.0, 47992000.0, 982020000.0, 195090000.0, 16993000.0, 594840000.0, -29363000.0, 69614000.0, 629680000.0, -5563200.0, 68996000.0, 667320000.0, 24682000.0, 68440000.0, 708020000.0, 60191000.0, 68226000.0, 752080000.0, 98278000.0, 68148000.0, 799350000.0, 134960000.0, 67111000.0, 848180000.0, 165950000.0, 62986000.0, 894500000.0, 188270000.0, 53197000.0, 931790000.0, 201460000.0, 36174000.0, 952840000.0, 207110000.0, 12892000.0, 587860000.0, -43722000.0, 48272000.0, 622130000.0, -21650000.0, 47738000.0, 658980000.0, 7682900.0, 47129000.0, 698400000.0, 43647000.0, 46709000.0, 740590000.0, 83969000.0, 46475000.0, 785470000.0, 124720000.0, 45837000.0, 831740000.0, 161120000.0, 43356000.0, 875820000.0, 189170000.0, 37044000.0, 911560000.0, 207090000.0, 25470000.0, 931860000.0, 215390000.0, 9139200.0, 576610000.0, -54993000.0, 28414000.0, 611360000.0, -35038000.0, 27934000.0, 648530000.0, -7160700.0, 27504000.0, 687940000.0, 28592000.0, 27181000.0, 729710000.0, 70339000.0, 26997000.0, 773800000.0, 114230000.0, 26699000.0, 819170000.0, 155060000.0, 25483000.0, 862570000.0, 187930000.0, 22064000.0, 898010000.0, 209920000.0, 15365000.0, 918280000.0, 220540000.0, 5556100.0, 560550000.0, -63398000.0, 9778700.0, 597460000.0, -45983000.0, 9072400.0, 635750000.0, -20101000.0, 8916400.0, 676100000.0, 14856000.0, 8833800.0, 718620000.0, 57388000.0, 8811200.0, 763310000.0, 103690000.0, 8787700.0, 809360000.0, 148160000.0, 8513900.0, 853750000.0, 185030000.0, 7519600.0, 890410000.0, 210410000.0, 5337400.0, 911570000.0, 222960000.0, 1952400.0, 541740000.0, -68384000.0, 25171000.0, 526830000.0, -64198000.0, 55428000.0, 497920000.0, -57242000.0, 83779000.0, 455800000.0, -47023000.0, 107080000.0, 401540000.0, -34190000.0, 122180000.0, 338040000.0, -20448000.0, 125910000.0, 270310000.0, -8464600.0, 116250000.0, 204210000.0, -1011100.0, 93716000.0, 143780000.0, 654250.0, 61524000.0, 82261000.0, -2535300.0, 19619000.0, 553080000.0, -60473000.0, 43026000.0, 530270000.0, -56167000.0, 72217000.0, 494650000.0, -48757000.0, 98429000.0, 446500000.0, -38242000.0, 118870000.0, 387230000.0, -25441000.0, 130380000.0, 320260000.0, -12281000.0, 130080000.0, 251020000.0, -1582800.0, 116580000.0, 185490000.0, 3896500.0, 91242000.0, 125780000.0, 3079700.0, 57550000.0, 66684000.0, 733410.0, 18959000.0, 560440000.0, -49946000.0, 62281000.0, 530060000.0, -45601000.0, 89789000.0, 487570000.0, -37965000.0, 113470000.0, 433300000.0, -27322000.0, 130540000.0, 369180000.0, -14829000.0, 137940000.0, 299220000.0, -2693000.0, 133200000.0, 229270000.0, 6181400.0, 115660000.0, 164930000.0, 9204200.0, 87417000.0, 107690000.0, 6261600.0, 53131000.0, 51258000.0, 2129900.0, 17321000.0, 563500000.0, -36454000.0, 82899000.0, 525440000.0, -32102000.0, 108220000.0, 475830000.0, -24363000.0, 128820000.0, 415390000.0, -13860000.0, 141870000.0, 346730000.0, -2149800.0, 144510000.0, 274510000.0, 8313000.0, 134860000.0, 204780000.0, 14692000.0, 113080000.0, 142820000.0, 14896000.0, 82174000.0, 89376000.0, 9367200.0, 47719000.0, 36540000.0, 2987300.0, 14887000.0, 561420000.0, -19228000.0, 105120000.0, 515290000.0, -14884000.0, 127640000.0, 458240000.0, -7236400.0, 144360000.0, 391700000.0, 2637000.0, 152450000.0, 319100000.0, 12779000.0, 149500000.0, 245660000.0, 20630000.0, 134450000.0, 177470000.0, 23695000.0, 108410000.0, 119280000.0, 20554000.0, 75221000.0, 70991000.0, 12160000.0, 41064000.0, 23113000.0, 3600500.0, 11736000.0, 552740000.0, 3088200.0, 129500000.0, 497840000.0, 7357300.0, 148190000.0, 433050000.0, 14456000.0, 159690000.0, 360800000.0, 22771000.0, 161490000.0, 285340000.0, 30059000.0, 151970000.0, 212260000.0, 33942000.0, 131100000.0, 147350000.0, 32605000.0, 101030000.0, 94575000.0, 25558000.0, 66234000.0, 52879000.0, 14334000.0, 33089000.0, 11666000.0, 3981400.0, 7950600.0, 534880000.0, 32963000.0, 156940000.0, 470210000.0, 36802000.0, 169790000.0, 397630000.0, 42268000.0, 173890000.0, 320730000.0, 47258000.0, 167550000.0, 244350000.0, 49590000.0, 150340000.0, 173980000.0, 47498000.0, 123500000.0, 114690000.0, 40333000.0, 90112000.0, 69216000.0, 28883000.0, 54921000.0, 35584000.0, 15289000.0, 23920000.0, 2980500.0, 3996900.0, 3714600.0, 502900000.0, 74998000.0, 188570000.0, 427450000.0, 77216000.0, 191710000.0, 347980000.0, 78529000.0, 184860000.0, 268880000.0, 76920000.0, 167940000.0, 194850000.0, 70800000.0, 142000000.0, 130790000.0, 59745000.0, 109610000.0, 80214000.0, 44922000.0, 74543000.0, 44192000.0, 28752000.0, 41093000.0, 19942000.0, 13900000.0, 14034000.0, -2178300.0, 3336600.0, -523420.0, 446960000.0, 138290000.0, 225560000.0, 360770000.0, 135170000.0, 211430000.0, 277960000.0, 126980000.0, 188220000.0, 201460000.0, 112560000.0, 157620000.0, 135620000.0, 92124000.0, 122380000.0, 83343000.0, 67648000.0, 86239000.0, 45601000.0, 42850000.0, 52795000.0, 21347000.0, 22053000.0, 24785000.0, 7277300.0, 8140400.0, 4549400.0, -3377400.0, 1397500.0, -3714800.0, 345730000.0, 240800000.0, 267600000.0, 255590000.0, 223420000.0, 222840000.0, 176640000.0, 193770000.0, 174730000.0, 113130000.0, 154640000.0, 126810000.0, 65866000.0, 109950000.0, 83488000.0, 33794000.0, 65439000.0, 48205000.0, 14312000.0, 27788000.0, 22683000.0, 4095000.0, 3183900.0, 6520400.0, -175810.0, -5387600.0, -2141500.0, -1320500.0, -2612100.0, -3567800.0, 485740000.0, -11084000.0, 48222000.0, 437710000.0, 8563100.0, 23306000.0, 400970000.0, 983630.0, 10533000.0, 374930000.0, 260840.0, 7910000.0, 351210000.0, -100260.0, 7818000.0, 325020000.0, -334650.0, 9193200.0, 292740000.0, -547470.0, 11806000.0, 251110000.0, -758210.0, 15569000.0, 197670000.0, -513780.0, 19926000.0, 132420000.0, -1221200.0, 23232000.0, 349620000.0, -33941000.0, 2203800.0, 381600000.0, 17652000.0, 28695000.0, 377720000.0, 5377900.0, 23577000.0, 363330000.0, 1064400.0, 20069000.0, 346120000.0, -1003100.0, 20863000.0, 325680000.0, -2572500.0, 24714000.0, 300410000.0, -4027300.0, 31350000.0, 268580000.0, -5188500.0, 40481000.0, 228630000.0, -5224600.0, 51128000.0, 179710000.0, -2416800.0, 60233000.0, 335430000.0, -38322000.0, -5010700.0, 346160000.0, 5648200.0, 15871000.0, 356100000.0, 7044700.0, 25673000.0, 352740000.0, 1007400.0, 27026000.0, 343140000.0, -3040100.0, 29976000.0, 329790000.0, -6545100.0, 36078000.0, 312810000.0, -9860700.0, 45561000.0, 291620000.0, -12557000.0, 58243000.0, 265310000.0, -13062000.0, 73144000.0, 232130000.0, -7771200.0, 87664000.0, 332200000.0, -38989000.0, -4474200.0, 335000000.0, -5273300.0, 8913400.0, 342410000.0, 2435200.0, 22273000.0, 345220000.0, -1075000.0, 29106000.0, 342480000.0, -6388500.0, 34813000.0, 336430000.0, -11803000.0, 42783000.0, 328090000.0, -17196000.0, 54036000.0, 317670000.0, -21734000.0, 68699000.0, 304800000.0, -23258000.0, 86168000.0, 287890000.0, -17395000.0, 105110000.0, 331940000.0, -38972000.0, -2667800.0, 331960000.0, -13777000.0, 6028100.0, 336680000.0, -4113500.0, 18518000.0, 341560000.0, -5362200.0, 27849000.0, 344040000.0, -10886000.0, 35698000.0, 344690000.0, -17872000.0, 44862000.0, 344600000.0, -25255000.0, 56828000.0, 344460000.0, -31744000.0, 72048000.0, 344460000.0, -34835000.0, 90354000.0, 344030000.0, -29994000.0, 111310000.0, 332320000.0, -39264000.0, -1139200.0, 331860000.0, -20102000.0, 4895400.0, 335300000.0, -10643000.0, 15218000.0, 341130000.0, -10625000.0, 24728000.0, 347300000.0, -16073000.0, 33317000.0, 353620000.0, -24195000.0, 42727000.0, 360890000.0, -33311000.0, 54349000.0, 369990000.0, -41667000.0, 68810000.0, 381660000.0, -46520000.0, 86185000.0, 396390000.0, -43355000.0, 106360000.0, 332760000.0, -39954000.0, -177060.0, 332700000.0, -24747000.0, 4196800.0, 335950000.0, -16273000.0, 12129000.0, 342550000.0, -15815000.0, 20425000.0, 351400000.0, -21235000.0, 28415000.0, 362240000.0, -30180000.0, 37016000.0, 375640000.0, -40691000.0, 47283000.0, 392550000.0, -50648000.0, 59814000.0, 414000000.0, -57076000.0, 74719000.0, 441150000.0, -55429000.0, 91824000.0, 333120000.0, -40821000.0, 264170.0, 333680000.0, -28053000.0, 3347900.0, 337260000.0, -20641000.0, 8940100.0, 344610000.0, -20207000.0, 15253000.0, 355430000.0, -25704000.0, 21626000.0, 369630000.0, -35244000.0, 28479000.0, 387740000.0, -46799000.0, 36502000.0, 410710000.0, -57980000.0, 46156000.0, 439630000.0, -65561000.0, 57476000.0, 475770000.0, -64910000.0, 70134000.0, 333370000.0, -41588000.0, 316230.0, 334450000.0, -30200000.0, 2183600.0, 338460000.0, -23602000.0, 5510300.0, 346440000.0, -23347000.0, 9429900.0, 358580000.0, -28965000.0, 13507000.0, 375030000.0, -38905000.0, 17906000.0, 396320000.0, -51147000.0, 23004000.0, 423400000.0, -63167000.0, 29074000.0, 457380000.0, -71413000.0, 36187000.0, 498980000.0, -71249000.0, 43845000.0, 333490000.0, -42033000.0, 131780.0, 334870000.0, -31262000.0, 760150.0, 339150000.0, -25093000.0, 1864700.0, 347480000.0, -24976000.0, 3191200.0, 360300000.0, -30678000.0, 4591300.0, 377870000.0, -40822000.0, 6105600.0, 400770000.0, -53408000.0, 7852900.0, 429920000.0, -65827000.0, 9920200.0, 466450000.0, -74571000.0, 12348000.0, 511530000.0, -74403000.0, 15512000.0, 333490000.0, -42033000.0, -131780.0, 333370000.0, -41588000.0, -316230.0, 333120000.0, -40821000.0, -264170.0, 332760000.0, -39954000.0, 177060.0, 332320000.0, -39264000.0, 1139200.0, 331940000.0, -38972000.0, 2667800.0, 332200000.0, -38989000.0, 4474200.0, 335430000.0, -38322000.0, 5010700.0, 349620000.0, -33941000.0, -2203800.0, 485740000.0, -11084000.0, -48222000.0, 334870000.0, -31262000.0, -760150.0, 334450000.0, -30200000.0, -2183600.0, 333680000.0, -28053000.0, -3347900.0, 332700000.0, -24747000.0, -4196800.0, 331860000.0, -20102000.0, -4895400.0, 331960000.0, -13777000.0, -6028100.0, 335000000.0, -5273300.0, -8913400.0, 346160000.0, 5648200.0, -15871000.0, 381600000.0, 17652000.0, -28695000.0, 437710000.0, 8563100.0, -23306000.0, 339150000.0, -25093000.0, -1864700.0, 338460000.0, -23602000.0, -5510300.0, 337260000.0, -20641000.0, -8940100.0, 335950000.0, -16273000.0, -12129000.0, 335300000.0, -10643000.0, -15218000.0, 336680000.0, -4113500.0, -18518000.0, 342410000.0, 2435200.0, -22273000.0, 356100000.0, 7044700.0, -25673000.0, 377720000.0, 5377900.0, -23577000.0, 400970000.0, 983630.0, -10533000.0, 347480000.0, -24976000.0, -3191200.0, 346440000.0, -23347000.0, -9429900.0, 344610000.0, -20207000.0, -15253000.0, 342550000.0, -15815000.0, -20425000.0, 341130000.0, -10625000.0, -24728000.0, 341560000.0, -5362200.0, -27849000.0, 345220000.0, -1075000.0, -29106000.0, 352740000.0, 1007400.0, -27026000.0, 363330000.0, 1064400.0, -20069000.0, 374930000.0, 260840.0, -7910000.0, 360300000.0, -30678000.0, -4591300.0, 358580000.0, -28965000.0, -13507000.0, 355430000.0, -25704000.0, -21626000.0, 351400000.0, -21235000.0, -28415000.0, 347300000.0, -16073000.0, -33317000.0, 344040000.0, -10886000.0, -35698000.0, 342480000.0, -6388500.0, -34813000.0, 343140000.0, -3040100.0, -29976000.0, 346120000.0, -1003100.0, -20863000.0, 351210000.0, -100260.0, -7818000.0, 377870000.0, -40822000.0, -6105600.0, 375030000.0, -38905000.0, -17906000.0, 369630000.0, -35244000.0, -28479000.0, 362240000.0, -30180000.0, -37016000.0, 353620000.0, -24195000.0, -42727000.0, 344690000.0, -17872000.0, -44862000.0, 336430000.0, -11803000.0, -42783000.0, 329790000.0, -6545100.0, -36078000.0, 325680000.0, -2572500.0, -24714000.0, 325020000.0, -334650.0, -9193200.0, 400770000.0, -53408000.0, -7852900.0, 396320000.0, -51147000.0, -23004000.0, 387740000.0, -46799000.0, -36502000.0, 375640000.0, -40691000.0, -47283000.0, 360890000.0, -33311000.0, -54349000.0, 344600000.0, -25255000.0, -56828000.0, 328090000.0, -17196000.0, -54036000.0, 312810000.0, -9860700.0, -45561000.0, 300410000.0, -4027300.0, -31350000.0, 292740000.0, -547470.0, -11806000.0, 429920000.0, -65827000.0, -9920200.0, 423400000.0, -63167000.0, -29074000.0, 410710000.0, -57980000.0, -46156000.0, 392550000.0, -50648000.0, -59814000.0, 369990000.0, -41667000.0, -68810000.0, 344460000.0, -31744000.0, -72048000.0, 317670000.0, -21734000.0, -68699000.0, 291620000.0, -12557000.0, -58243000.0, 268580000.0, -5188500.0, -40481000.0, 251110000.0, -758210.0, -15569000.0, 466450000.0, -74571000.0, -12348000.0, 457380000.0, -71413000.0, -36187000.0, 439630000.0, -65561000.0, -57476000.0, 414000000.0, -57076000.0, -74719000.0, 381660000.0, -46520000.0, -86185000.0, 344460000.0, -34835000.0, -90354000.0, 304800000.0, -23258000.0, -86168000.0, 265310000.0, -13062000.0, -73144000.0, 228630000.0, -5224600.0, -51128000.0, 197670000.0, -513780.0, -19926000.0, 511530000.0, -74403000.0, -15512000.0, 498980000.0, -71249000.0, -43845000.0, 475770000.0, -64910000.0, -70134000.0, 441150000.0, -55429000.0, -91824000.0, 396390000.0, -43355000.0, -106360000.0, 344030000.0, -29994000.0, -111310000.0, 287890000.0, -17395000.0, -105110000.0, 232130000.0, -7771200.0, -87664000.0, 179710000.0, -2416800.0, -60233000.0, 132420000.0, -1221200.0, -23232000.0, -1320500.0, -2612100.0, 3567800.0, -3377400.0, 1397500.0, 3714800.0, -2178300.0, 3336600.0, 523430.0, 2980500.0, 3996900.0, -3714600.0, 11666000.0, 3981400.0, -7950600.0, 23113000.0, 3600500.0, -11736000.0, 36540000.0, 2987300.0, -14887000.0, 51258000.0, 2129900.0, -17321000.0, 66684000.0, 733410.0, -18959000.0, 82261000.0, -2535300.0, -19619000.0, -175810.0, -5387600.0, 2141500.0, 7277300.0, 8140400.0, -4549400.0, 19942000.0, 13900000.0, -14034000.0, 35584000.0, 15289000.0, -23920000.0, 52879000.0, 14334000.0, -33089000.0, 70991000.0, 12160000.0, -41064000.0, 89376000.0, 9367200.0, -47719000.0, 107690000.0, 6261600.0, -53131000.0, 125780000.0, 3079700.0, -57550000.0, 143780000.0, 654250.0, -61524000.0, 4095000.0, 3183900.0, -6520400.0, 21347000.0, 22053000.0, -24785000.0, 44192000.0, 28752000.0, -41093000.0, 69216000.0, 28883000.0, -54921000.0, 94575000.0, 25558000.0, -66234000.0, 119280000.0, 20554000.0, -75221000.0, 142820000.0, 14896000.0, -82174000.0, 164930000.0, 9204200.0, -87417000.0, 185490000.0, 3896500.0, -91242000.0, 204210000.0, -1011100.0, -93716000.0, 14312000.0, 27788000.0, -22683000.0, 45601000.0, 42850000.0, -52795000.0, 80214000.0, 44922000.0, -74543000.0, 114690000.0, 40333000.0, -90112000.0, 147350000.0, 32605000.0, -101030000.0, 177470000.0, 23695000.0, -108410000.0, 204780000.0, 14692000.0, -113080000.0, 229270000.0, 6181400.0, -115660000.0, 251020000.0, -1582800.0, -116580000.0, 270310000.0, -8464600.0, -116250000.0, 33794000.0, 65439000.0, -48205000.0, 83343000.0, 67648000.0, -86239000.0, 130790000.0, 59745000.0, -109610000.0, 173980000.0, 47498000.0, -123500000.0, 212260000.0, 33942000.0, -131100000.0, 245660000.0, 20630000.0, -134450000.0, 274510000.0, 8313000.0, -134860000.0, 299220000.0, -2693000.0, -133200000.0, 320260000.0, -12281000.0, -130080000.0, 338040000.0, -20448000.0, -125910000.0, 65866000.0, 109950000.0, -83488000.0, 135620000.0, 92124000.0, -122380000.0, 194850000.0, 70800000.0, -142000000.0, 244350000.0, 49590000.0, -150340000.0, 285340000.0, 30059000.0, -151970000.0, 319100000.0, 12779000.0, -149500000.0, 346730000.0, -2149800.0, -144510000.0, 369180000.0, -14829000.0, -137940000.0, 387230000.0, -25441000.0, -130380000.0, 401540000.0, -34190000.0, -122180000.0, 113130000.0, 154640000.0, -126810000.0, 201460000.0, 112560000.0, -157620000.0, 268880000.0, 76920000.0, -167940000.0, 320730000.0, 47258000.0, -167550000.0, 360800000.0, 22771000.0, -161490000.0, 391700000.0, 2637000.0, -152450000.0, 415390000.0, -13860000.0, -141870000.0, 433300000.0, -27322000.0, -130540000.0, 446500000.0, -38242000.0, -118870000.0, 455800000.0, -47023000.0, -107080000.0, 176640000.0, 193770000.0, -174730000.0, 277960000.0, 126980000.0, -188220000.0, 347980000.0, 78529000.0, -184860000.0, 397630000.0, 42268000.0, -173890000.0, 433050000.0, 14456000.0, -159690000.0, 458240000.0, -7236400.0, -144360000.0, 475830000.0, -24363000.0, -128820000.0, 487570000.0, -37965000.0, -113470000.0, 494650000.0, -48757000.0, -98429000.0, 497920000.0, -57242000.0, -83779000.0, 255590000.0, 223420000.0, -222840000.0, 360770000.0, 135170000.0, -211430000.0, 427450000.0, 77216000.0, -191710000.0, 470210000.0, 36802000.0, -169790000.0, 497840000.0, 7357400.0, -148190000.0, 515290000.0, -14884000.0, -127640000.0, 525440000.0, -32102000.0, -108220000.0, 530060000.0, -45601000.0, -89789000.0, 530270000.0, -56167000.0, -72217000.0, 526830000.0, -64198000.0, -55428000.0, 345730000.0, 240800000.0, -267600000.0, 446960000.0, 138290000.0, -225560000.0, 502900000.0, 74998000.0, -188570000.0, 534880000.0, 32963000.0, -156940000.0, 552740000.0, 3088200.0, -129500000.0, 561420000.0, -19228000.0, -105120000.0, 563500000.0, -36454000.0, -82899000.0, 560440000.0, -49946000.0, -62281000.0, 553080000.0, -60473000.0, -43026000.0, 541740000.0, -68384000.0, -25171000.0, 911570000.0, 222960000.0, -1952400.0, 890410000.0, 210410000.0, -5337400.0, 853750000.0, 185030000.0, -7519600.0, 809360000.0, 148160000.0, -8513900.0, 763310000.0, 103690000.0, -8787700.0, 718620000.0, 57388000.0, -8811200.0, 676100000.0, 14856000.0, -8833800.0, 635750000.0, -20101000.0, -8916400.0, 597460000.0, -45983000.0, -9072400.0, 560550000.0, -63398000.0, -9778700.0, 918280000.0, 220540000.0, -5556100.0, 898010000.0, 209920000.0, -15365000.0, 862570000.0, 187930000.0, -22064000.0, 819170000.0, 155060000.0, -25483000.0, 773800000.0, 114230000.0, -26699000.0, 729710000.0, 70339000.0, -26997000.0, 687940000.0, 28592000.0, -27181000.0, 648530000.0, -7160700.0, -27504000.0, 611360000.0, -35038000.0, -27934000.0, 576610000.0, -54993000.0, -28414000.0, 931860000.0, 215390000.0, -9139200.0, 911560000.0, 207090000.0, -25470000.0, 875820000.0, 189170000.0, -37044000.0, 831740000.0, 161120000.0, -43356000.0, 785470000.0, 124720000.0, -45837000.0, 740590000.0, 83969000.0, -46475000.0, 698400000.0, 43647000.0, -46709000.0, 658980000.0, 7682900.0, -47129000.0, 622130000.0, -21650000.0, -47738000.0, 587860000.0, -43722000.0, -48272000.0, 952840000.0, 207110000.0, -12892000.0, 931790000.0, 201460000.0, -36174000.0, 894500000.0, 188270000.0, -53197000.0, 848180000.0, 165950000.0, -62986000.0, 799350000.0, 134960000.0, -67111000.0, 752080000.0, 98278000.0, -68148000.0, 708020000.0, 60191000.0, -68226000.0, 667320000.0, 24682000.0, -68440000.0, 629680000.0, -5563200.0, -68996000.0, 594840000.0, -29363000.0, -69614000.0, 982020000.0, 195090000.0, -16993000.0, 959700000.0, 192400000.0, -47992000.0, 919820000.0, 184620000.0, -71333000.0, 869780000.0, 169020000.0, -85429000.0, 816630000.0, 144670000.0, -91756000.0, 765110000.0, 113310000.0, -93331000.0, 717360000.0, 78559000.0, -93006000.0, 673760000.0, 44363000.0, -92540000.0, 633880000.0, 13819000.0, -92554000.0, 597240000.0, -11312000.0, -92913000.0, 1020600000.0, 178440000.0, -21616000.0, 996590000.0, 179020000.0, -61458000.0, 953270000.0, 177320000.0, -92361000.0, 898150000.0, 169600000.0, -111990000.0, 838810000.0, 153460000.0, -121430000.0, 780830000.0, 129140000.0, -123920000.0, 727090000.0, 99316000.0, -122990000.0, 678370000.0, 67691000.0, -121200000.0, 634300000.0, 37690000.0, -119850000.0, 594180000.0, 11704000.0, -119150000.0, 1070100000.0, 155980000.0, -26944000.0, 1044200000.0, 160070000.0, -77140000.0, 996840000.0, 165150000.0, -117330000.0, 935390000.0, 166630000.0, -144280000.0, 867860000.0, 160670000.0, -158370000.0, 800740000.0, 145810000.0, -162640000.0, 737950000.0, 123330000.0, -161120000.0, 681000000.0, 96309000.0, -157270000.0, 629880000.0, 68269000.0, -153270000.0, 583810000.0, 42175000.0, -150050000.0, 1132800000.0, 126050000.0, -33166000.0, 1105000000.0, 133850000.0, -95662000.0, 1053200000.0, 146330000.0, -147440000.0, 984350000.0, 158450000.0, -184330000.0, 906540000.0, 165180000.0, -205580000.0, 826980000.0, 163190000.0, -213450000.0, 750900000.0, 151820000.0, -211980000.0, 681090000.0, 132940000.0, -205370000.0, 618350000.0, 109560000.0, -196840000.0, 562340000.0, 84926000.0, -188470000.0, 1211600000.0, 86445000.0, -40483000.0, 1181900000.0, 98012000.0, -117690000.0, 1125800000.0, 118330000.0, -184100000.0, 1049000000.0, 142520000.0, -234680000.0, 958910000.0, 164950000.0, -267190000.0, 862910000.0, 180630000.0, -282250000.0, 767540000.0, 186490000.0, -282850000.0, 677420000.0, 181920000.0, -273270000.0, 595210000.0, 168890000.0, -257680000.0, 521890000.0, 149450000.0, -239280000.0, 1310200000.0, 34181000.0, -49101000.0, 1279300000.0, 49319000.0, -143930000.0, 1219700000.0, 77511000.0, -228860000.0, 1135200000.0, 114880000.0, -298420000.0, 1031200000.0, 156300000.0, -348700000.0, 914210000.0, 196120000.0, -377760000.0, 791000000.0, 229030000.0, -385820000.0, 668170000.0, 250870000.0, -375050000.0, 551310000.0, 259300000.0, -349160000.0, 445420000.0, 256020000.0, -311570000.0], 'exm_flow_model.py': [], diff --git a/examples/exg_disp.py b/examples/exg_disp.py new file mode 100644 index 0000000..3c922e1 --- /dev/null +++ b/examples/exg_disp.py @@ -0,0 +1,84 @@ +""" +Test script for exs_beam1 example. +Analysis of a simply supported beam. +""" + +import numpy as np +import calfem.core as cfc +import calfem.utils as cfu +import matplotlib.pyplot as plt + +np.set_printoptions(precision=4, linewidth=120) + +# Element topology matrix (DOFs only, no element numbers) +edof = np.array([ + [1, 2, 3, 4], # Element 1: DOFs 1,2,3,4 (node 1-2) + [3, 4, 5, 6] # Element 2: DOFs 3,4,5,6 (node 2-3) +]) + +cfu.disp_h1("Element topology matrix (edof):") +cfu.disp_array(edof, fmt=".0f", headers=["Element", "DOF1", "DOF2", "DOF3", "DOF4"]) + +# Initialize global system +K = np.zeros((6, 6)) +f = np.zeros((6, 1)) +f[2] = -10000 # Load at DOF 3 (index 2 in 0-based indexing) + +cfu.disp("Global stiffness matrix initialized.") +cfu.disp_h1("Load vector:") +cfu.disp_array(f, headers=["f"]) + +# Material and geometric properties +E = 210e9 # Young's modulus [Pa] +I = 2510e-8 # Moment of inertia [m⁴] +ep = [E, I] # Element properties + +# Element coordinates [m] +ex1 = np.array([0, 3]) # Element 1: from x=0 to x=3 +ex2 = np.array([3, 9]) # Element 2: from x=3 to x=9 + +# Compute element stiffness matrices +Ke1 = cfc.beam1e(ex1, ep) +cfu.disp_h1("Element 1 stiffness matrix:") +cfu.disp_array(Ke1) + +Ke2 = cfc.beam1e(ex2, ep) +cfu.disp_h1("Element 2 stiffness matrix:") +cfu.disp_array(Ke2) + +# Assemble global stiffness matrix +K = cfc.assem(edof[0], K, Ke1) +K = cfc.assem(edof[1], K, Ke2) + +cfu.disp("") +cfu.disp("Global stiffness matrix assembled successfully") + +# Boundary conditions (simply supported beam) +bc = np.array([ + [1, 0], # DOF 1 = 0 (vertical displacement at left support) + [5, 0] # DOF 5 = 0 (vertical displacement at right support) +]) + +bc_dof = np.array([1, 5]) +bc_value = np.array([0.0, 0.0]) + +# Solve the system +a, r = cfc.solveq(K, f, bc_dof, bc_value) +cfu.disp_h1("Displacements:") +cfu.disp_array(a) +cfu.disp_h1("Reaction forces [N]:") +cfu.disp_array(r) + +# Extract element displacements +Ed = cfc.extract_ed(edof, a) + +# Compute section forces and internal displacements +# For beam1s, we don't need eq parameter for point loads +es1, edi1, eci1 = cfc.beam1s(ex1, ep, Ed[0], nep=6) +es2, edi2, eci2 = cfc.beam1s(ex2, ep, Ed[1], nep=11) + +cfu.disp_h1("Element 1 section forces [N, Nm]:") +cfu.disp_array(es1[:5]) # Show first 5 points +cfu.disp_h1("Element 2 section forces [N, Nm]:") +cfu.disp_array(es2[:5]) # Show first 5 points + diff --git a/examples/exs_bar2.py b/examples/exs_bar2.py index 0524c26..55e84a0 100644 --- a/examples/exs_bar2.py +++ b/examples/exs_bar2.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# example exs3 +# example exs_bar2 # ---------------------------------------------------------------- # PURPOSE # Analysis of a plane truss. @@ -10,15 +10,16 @@ # Ola Dahlblom 2004-09-07 # Jonas Lindemann 2009-01-25 # Ola Dahlblom 2023-02-02 +# Henrik Danielsson 2026-01-08 # ---------------------------------------------------------------- +# ----- Import necessary modules --------------------------------- + import numpy as np import calfem.core as cfc import calfem.utils as cfu import calfem.vis_mpl as cfv -cfu.disp_h1("Analysis of a plane truss.") - # ----- Topology matrix Edof ------------------------------------- edof = np.array([ @@ -32,12 +33,14 @@ K = np.array(np.zeros((8, 8))) f = np.array(np.zeros((8, 1))) +f[5] = -80e3 + # ----- Element properties --------------------------------------- -E = 2.0e11 -A1 = 6.0e-4 -A2 = 3.0e-4 -A3 = 10.0e-4 +E = 2.0e11 # (N/m^2) +A1 = 6.0e-4 # (m^2) +A2 = 3.0e-4 # (m^2) +A3 = 10.0e-4 # (m^2) ep1 = [E, A1] ep2 = [E, A2] ep3 = [E, A3] @@ -58,76 +61,86 @@ Ke2 = cfc.bar2e(ex2, ey2, ep2) Ke3 = cfc.bar2e(ex3, ey3, ep3) +cfu.disp_h2("Ke1") +cfu.disp_array(Ke1, tablefmt='plain') +cfu.disp_h2("Ke2") +cfu.disp_array(Ke2, tablefmt='plain') +cfu.disp_h2("Ke3") +cfu.disp_array(Ke3, tablefmt='plain') + # ----- Assemble Ke into K --------------------------------------- K = cfc.assem(edof[0, :], K, Ke1) K = cfc.assem(edof[1, :], K, Ke2) K = cfc.assem(edof[2, :], K, Ke3) -cfu.disp_h2("Stiffness matrix K:") -cfu.disp_array(K) +cfu.disp_h2("Stiffness matrix K (N/m):") +cfu.disp_array(K, tablefmt='plain') + +# ----- Boundary conditions and nodal loads ---------------------- + +bc_dofs = np.array([1, 2, 3, 4, 7, 8]) +bc_vals = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) # ----- Solve the system of equations ---------------------------- -bc = np.array([1, 2, 3, 4, 7, 8]) -f[5] = -80e3 -a, r = cfc.solveq(K, f, bc) +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) -cfu.disp_h2("Displacements a:") +cfu.disp_h2("Displacements a (m):") cfu.disp_array(a) -cfu.disp_h2("Reaction forces r:") +cfu.disp_h2("Reaction forces r (N):") cfu.disp_array(r) # ----- Element forces ------------------------------------------- ed1 = cfc.extract_ed(edof[0, :], a) -N1 = cfc.bar2s(ex1, ey1, ep1, ed1) ed2 = cfc.extract_ed(edof[1, :], a) -N2 = cfc.bar2s(ex2, ey2, ep2, ed2) ed3 = cfc.extract_ed(edof[2, :], a) -N3 = cfc.bar2s(ex3, ey3, ep3, ed3) -cfu.disp_h2("Element forces r:") +es1 = cfc.bar2s(ex1, ey1, ep1, ed1) +es2 = cfc.bar2s(ex2, ey2, ep2, ed2) +es3 = cfc.bar2s(ex3, ey3, ep3, ed3) + +cfu.disp_h2("Element normal forces (N):") -print("N1 = ") -print(N1) -print("N2 = ") -print(N2) -print("N3 = ") -print(N3) +cfu.disp("N1") +cfu.disp_array(es1) +cfu.disp("N2") +cfu.disp_array(es2) +cfu.disp("N3") +cfu.disp_array(es3) # ----- Draw deformed frame --------------------------------------- -plotpar = [2, 1, 0] +plotpar1 = [2, 1, 0] sfac = cfv.scalfact2(ex3, ey3, ed1, 0.1) -print("sfac=") -print(sfac) +print("sfac =", sfac) cfv.figure(1) -cfv.eldraw2(ex1, ey1, plotpar) -cfv.eldraw2(ex2, ey2, plotpar) -cfv.eldraw2(ex3, ey3, plotpar) - -plotpar = [1, 2, 1] -cfv.eldisp2(ex1, ey1, ed1, plotpar, sfac) -cfv.eldisp2(ex2, ey2, ed2, plotpar, sfac) -cfv.eldisp2(ex3, ey3, ed3, plotpar, sfac) +cfv.eldraw2(ex1, ey1, plotpar1) +cfv.eldraw2(ex2, ey2, plotpar1) +cfv.eldraw2(ex3, ey3, plotpar1) + +plotpar2 = [1, 2, 1] +cfv.eldisp2(ex1, ey1, ed1, plotpar2, sfac) +cfv.eldisp2(ex2, ey2, ed2, plotpar2, sfac) +cfv.eldisp2(ex3, ey3, ed3, plotpar2, sfac) cfv.axis([-0.4, 2.0, -0.4, 1.4]) -plotpar1 = 2 -cfv.scalgraph2(sfac, [1e-3, 0, -0.3], plotpar1) +plotpar3 = 2 +cfv.scalgraph2(sfac, [1e-3, 0, -0.3], plotpar3) cfv.title("Displacements") # ----- Draw normal force diagram -------------------------------- plotpar = [2, 1] -sfac = cfv.scalfact2(ex1, ey1, N2[:, 0], 0.1) +sfac = cfv.scalfact2(ex1, ey1, es2[:, 0], 0.1) cfv.figure(2) -cfv.secforce2(ex1, ey1, N1[:, 0], plotpar, sfac) -cfv.secforce2(ex2, ey2, N2[:, 0], plotpar, sfac) -cfv.secforce2(ex3, ey3, N3[:, 0], plotpar, sfac) +cfv.secforce2(ex1, ey1, es1[:, 0], plotpar, sfac) +cfv.secforce2(ex2, ey2, es2[:, 0], plotpar, sfac) +cfv.secforce2(ex3, ey3, es3[:, 0], plotpar, sfac) cfv.axis([-0.4, 2.0, -0.4, 1.4]) -cfv.scalgraph2(sfac, [5e4, 0, -0.3], plotpar1) +cfv.scalgraph2(sfac, [5e4, 0, -0.3], plotpar3) cfv.title("Normal force") -cfv.show_and_wait() +cfv.show_and_wait() \ No newline at end of file diff --git a/examples/exs_bar2_la.py b/examples/exs_bar2_la.py index 65e450b..41dbe6d 100644 --- a/examples/exs_bar2_la.py +++ b/examples/exs_bar2_la.py @@ -83,18 +83,19 @@ cfc.assem(eltopo, K, Ke) cfu.disp_h2("Stiffness matrix K:") -cfu.disp_array(K) +cfu.disp_array(K, tablefmt="plain") # ----- Solve the system of equations ---------------------------- -bc = np.array([1, 2, 3, 4]) -a, r = cfc.solveq(K, f, bc) +bc_dofs = np.array([1, 2, 3, 4]) +bc_vals = np.array([0.0, 0.0, 0.0, 0.0]) +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) cfu.disp_h2("Displacements a:") -cfu.disp_array(a) +cfu.disp_array(a, tablefmt='plain') cfu.disp_h2("Reaction forces r:") -cfu.disp_array(r) +cfu.disp_array(r, tablefmt='plain') # ----- Element forces ------------------------------------------- diff --git a/examples/exs_beam1.py b/examples/exs_beam1.py index 0361cd1..ff6cc35 100644 --- a/examples/exs_beam1.py +++ b/examples/exs_beam1.py @@ -45,6 +45,11 @@ Ke1 = cfc.beam1e(ex1, ep) Ke2 = cfc.beam1e(ex2, ep) +cfu.disp_h2("Ke1") +cfu.disp_array(Ke1, tablefmt='plain') +cfu.disp_h2("Ke2") +cfu.disp_array(Ke2, tablefmt='plain') + # ----- Assemble Ke into K --------------------------------------- cfc.assem(edof[0, :], K, Ke1) @@ -52,8 +57,9 @@ # ----- Solve the system of equations and compute reactions ------ -bc = np.array([1, 5]) -a, r = cfc.solveq(K, f, bc) +bc_dofs = np.array([1, 5]) +bc_vals = np.array([0.0, 0.0]) +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) cfu.disp_array(a, ["a"]) cfu.disp_array(r, ["r"]) diff --git a/examples/exs_beam2.py b/examples/exs_beam2.py index 0774ee5..f1253ad 100644 --- a/examples/exs_beam2.py +++ b/examples/exs_beam2.py @@ -34,6 +34,9 @@ f = np.array(np.zeros((12, 1))) f[3] = 2.0e3 +cfu.disp_h1("Load vector f") +cfu.disp_array(f, ["f"]) + # ----- Element stiffness and element load matrices ------------- E = 200.0e9 @@ -42,8 +45,8 @@ I1 = 1.6e-5 I2 = 5.4e-5 -ep1 = np.array([E, A1, I1]) -ep3 = np.array([E, A2, I2]) +ep1 = [E, A1, I1] +ep3 = [E, A2, I2] ex1 = np.array([0, 0]) ex2 = np.array([6, 6]) ex3 = np.array([0, 6]) @@ -66,8 +69,10 @@ # ----- Solve the system of equations and compute reactions ------ -bc = np.array([1, 2, 3, 10, 11]) -a, r = cfc.solveq(K, f, bc) +bc_dofs = np.array([1, 2, 3, 10, 11]) +bc_vals = np.array([0.0, 0.0, 0.0, 0.0, 0.0]) + +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) cfu.disp_array(a, ["a"]) cfu.disp_array(r, ["r"]) diff --git a/examples/exs_beambar2.py b/examples/exs_beambar2.py index 2dc1ef6..6b56f79 100644 --- a/examples/exs_beambar2.py +++ b/examples/exs_beambar2.py @@ -47,11 +47,11 @@ I1 = 5.4e-5 A2 = 1.e-3 -ep1 = np.array([E, A1, I1]) -ep4 = np.array([E, A2]) +ep1 = [E, A1, I1] +ep4 = [E, A2] -eq1 = np.array([0, 0]) -eq2 = np.array([0, -10e+3]) +eq1 = [0, 0] +eq2 = [0, -10e+3] ex1 = np.array([0, 2]) ex2 = np.array([2, 4]) @@ -80,8 +80,9 @@ # ----- Solve the system of equations and compute reactions ------ -bc = np.array([1, 2, 3, 13, 14]) -a, r = cfc.solveq(K, f, bc) +bc_dofs = np.array([1, 2, 3, 13, 14]) +bc_vals = np.array([0.0, 0.0, 0.0, 0.0, 0.0]) +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) cfu.disp_h2("Displacements a:") cfu.disp_array(a) diff --git a/examples/exs_flw_diff2.py b/examples/exs_flw_diff2.py index 570b988..c4288cf 100644 --- a/examples/exs_flw_diff2.py +++ b/examples/exs_flw_diff2.py @@ -18,49 +18,50 @@ # ----- System matrices ----- -K = np.zeros((15, 15)) -f = np.zeros((15, 1)) -Coord = np.array( - [ - [0, 0], - [0.025, 0], - [0.05, 0], - [0, 0.025], - [0.025, 0.025], - [0.05, 0.025], - [0, 0.05], - [0.025, 0.05], - [0.05, 0.05], - [0, 0.075], - [0.025, 0.075], - [0.05, 0.075], - [0, 0.1], - [0.025, 0.1], - [0.05, 0.1], - ] -) - -Dof = np.array( - [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15]] -) +coord = np.array([ + [0, 0], + [0.025, 0], + [0.05, 0], + [0, 0.025], + [0.025, 0.025], + [0.05, 0.025], + [0, 0.05], + [0.025, 0.05], + [0.05, 0.05], + [0, 0.075], + [0.025, 0.075], + [0.05, 0.075], + [0, 0.1], + [0.025, 0.1], + [0.05, 0.1], +]) + +dofs = np.arange(1, coord.shape[0] + 1).reshape(coord.shape[0], 1) # ----- Element properties, topology and coordinates ----- -ep = np.array([1]) -D = np.array([[1, 0], [0, 1]]) -Edof = np.array( - [ - [1, 2, 5, 4], - [2, 3, 6, 5], - [4, 5, 8, 7], - [5, 6, 9, 8], - [7, 8, 11, 10], - [8, 9, 12, 11], - [10, 11, 14, 13], - [11, 12, 15, 14], - ] -) -Ex, Ey = cfc.coordxtr(Edof, Coord, Dof) +ep = [1] + +D = np.array([ + [1, 0], + [0, 1] +]) + +edof = np.array([ + [1, 2, 5, 4], + [2, 3, 6, 5], + [4, 5, 8, 7], + [5, 6, 9, 8], + [7, 8, 11, 10], + [8, 9, 12, 11], + [10, 11, 14, 13], + [11, 12, 15, 14], +]) + +ex, ey = cfc.coordxtr(edof, coord, dofs) + +K = np.zeros((15, 15)) # Global conductivity matrix +f = np.zeros((15, 1)) # Global source vector (no sources in this problem) # ----- Generate FE-mesh ----- @@ -69,35 +70,62 @@ # ----- Create and assemble element matrices ----- -for i in range(8): - Ke = cfc.flw2qe(Ex[i], Ey[i], ep, D) - K = cfc.assem(Edof[i], K, Ke) +for elx, ely, etopo in zip(ex, ey, edof): + Ke = cfc.flw2qe(elx, ely, ep, D) + K = cfc.assem(etopo, K, Ke) + +# for i in range(8): +# Ke = cfc.flw2qe(ex[i], ey[i], ep, D) +# K = cfc.assem(edof[i], K, Ke) # ----- Solve equation system ----- -bcPrescr = np.array([1, 2, 3, 4, 7, 10, 13, 14, 15]) -bcVal = np.array([0, 0, 0, 0, 0, 0, 0.5e-3, 1e-3, 1e-3]) -a, r = cfc.solveq(K, f, bcPrescr, bcVal) +bc_dofs = np.array([1, 2, 3, 4, 7, 10, 13, 14, 15]) +bc_vals = np.array([0, 0, 0, 0, 0, 0, 0.5e-3, 1e-3, 1e-3]) + +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) + +cfu.disp_h2("Concentration at nodes [kg/m^3]:") +cfu.disp_array(a, ["a"]) + +cfu.disp_h2("Boundary fluxes at nodes [kg/m^2/s)]:") +cfu.disp_array(r, ["r"]) + # ----- Compute element flux vector ----- -Ed = cfc.extractEldisp(Edof, a) -Es = np.zeros((8, 2)) -for i in range(8): - Es[i], Et = cfc.flw2qs(Ex[i], Ey[i], ep, D, Ed[i]) +ed = cfc.extract_eldisp(edof, a) + +es = np.zeros((8, 2)) +el_idx = 0 + +for elx, ely, eld in zip(ex, ey, ed): + es_el, t = cfc.flw2qs(elx, ely, ep, D, eld) + es[el_idx] = es_el + + el_idx += 1 + +# for i in range(8): +# es[i], et = cfc.flw2qs(ex[i], ey[i], ep, D, ed[i]) + +cfu.disp_h2(f"Element flux vectors [kg/m^2/s]:") +cfu.disp_array(es, headers=["qx", "qy"]) + +cfu.disp_h2("Concentration field [*10^-3 kg/m^3]:") +cfu.disp("Pure water boundaries (DOFs 1-4,7,10): 0.000") +cfu.disp(f"Internal concentrations:") + +a_dofs = [5, 6, 8, 9, 11, 12] +a_internal = a[a_dofs - np.ones(len(a_dofs), dtype=int)] +a_table = np.hstack((np.array(a_dofs, dtype=int).reshape(-1, 1), a_internal.reshape(-1, 1))) + +cfu.disp_array(a_table, headers=["DOF", "Concentration"]) +cfu.disp(f"Solution boundaries (DOFs 14,15): 1.000") # ----- Draw flux vectors and contourlines ----- -cfu.disp_h2("Ex") -cfu.disp_array(Ex, headers=["x0", "x1", "x2", "x3"]) -cfu.disp_h2("Ey") -cfu.disp_array(Ey, headers=["x0", "x1", "x2", "x3"]) -cfu.disp_h2("a") -cfu.disp_array(a) -cfu.disp_h2("Ed") -cfu.disp_array(Ed, headers=["ed0", "ed1", "ed2", "ed3"]) - -cfv.eldraw2(Ex, Ey, [1, 2, 1], range(1, Ex.shape[0] + 1)) -cfv.eliso2_mpl(Ex, Ey, Ed) +cfv.figure() +cfv.eldraw2(ex, ey, [1, 2, 1], range(1, ex.shape[0] + 1)) +cfv.eliso2_mpl(ex, ey, ed) cfv.show_and_wait() diff --git a/examples/exs_flw_temp1.py b/examples/exs_flw_temp1.py index 83010f8..4e24cf3 100644 --- a/examples/exs_flw_temp1.py +++ b/examples/exs_flw_temp1.py @@ -31,7 +31,7 @@ K = np.array(np.zeros((6, 6))) f = np.array(np.zeros((6, 1))) -f[3] = 10 +f[3] = 10.0 # ----- Element stiffness and element load matrices ------------- @@ -62,10 +62,10 @@ a, r = cfc.solveq(K, f, bc, bcVal) cfu.disp_h2("Temperatures a:") -cfu.disp_array(a) +cfu.disp_array(a, tablefmt="plain") cfu.disp_h2("Reaction flows r:") -cfu.disp_array(r) +cfu.disp_array(r, tablefmt="plain") # ----- Section forces ------------------------------------------- diff --git a/examples/exs_spring.py b/examples/exs_spring.py index b79ba22..89a5c44 100644 --- a/examples/exs_spring.py +++ b/examples/exs_spring.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# example exs1 +# example exs_spring # ---------------------------------------------------------------- # PURPOSE # Linear elastic spring analysis. Introduction to the basic @@ -12,70 +12,83 @@ # K-G Olsson 1995-09-28 # O Dahlblom 2004-09-06 # J Lindemann 2009-01-25 +# H Danielsson 2026-01-08 # ---------------------------------------------------------------- -# ----- import necesarry mooules +# ----- Import necessary modules --------------------------------- import numpy as np import calfem.core as cfc import calfem.utils as cfu -# ----- Topology matrix Edof +# ----- Topology matrix Edof ------------------------------------- edof = np.array([ - [1, 2], # element 1 between node 1 and 2 - [2, 3], # element 2 between node 2 and 3 - [2, 3] # element 3 between node 2 and 3 + [1, 2], # element 1 between nodes 1 and 2 + [2, 3], # element 2 between nodes 2 and 3 + [2, 3] # element 3 between nodes 2 and 3 ]) -# ----- Stiffness matrix K and load vector f +# ----- Stiffness matrix K and load vector f --------------------- -K = np.zeros((3, 3)) -f = np.zeros((3, 1)) +K = np.zeros((3, 3)) # empty global stiffness matrix +f = np.zeros((3, 1)) # empty global load vector -# ----- Element stiffness matrices +f[1] = 100.0 # (N), f[1] corresponds to dof 2 -k = 1500. -ep1 = k -ep2 = 2.*k -Ke1 = cfc.spring1e(ep1) -Ke2 = cfc.spring1e(ep2) -# ----- Assemble Ke into K +# ----- Element stiffness matrices Ke ---------------------------- -cfc.assem(edof[0, :], K, Ke2) -cfc.assem(edof[1, :], K, Ke1) -cfc.assem(edof[2, :], K, Ke2) +k = 1500. # (N/m) +ep1 = 2.*k # spring stiffness, element 1 +ep2 = k # spring stiffness, element 2 +ep3 = 2.*k # spring stiffness, element 3 +Ke1 = cfc.spring1e(ep1) # element stiffness matrix, element 1 +Ke2 = cfc.spring1e(ep2) # element stiffness matrix, element 2 +Ke3 = cfc.spring1e(ep3) # element stiffness matrix, element 3 -cfu.disp_h2("Stiffness matrix K:") -cfu.disp_array(K) +cfu.disp_h2("Ke1") +cfu.disp_array(Ke1, tablefmt='plain') +cfu.disp_h2("Ke2") +cfu.disp_array(Ke2, tablefmt='plain') +cfu.disp_h2("Ke3") +cfu.disp_array(Ke3, tablefmt='plain') -# f[1] corresponds to edof 2 +# ----- Assemble Ke into K --------------------------------------- -f[1] = 100.0 +cfc.assem(edof[0, :], K, Ke1) # assemble element stiffness matrix 1 +cfc.assem(edof[1, :], K, Ke2) # assemble element stiffness matrix 2 +cfc.assem(edof[2, :], K, Ke3) # assemble element stiffness matrix 3 -# ----- Solve the system of equations +cfu.disp_h2("Stiffness matrix K (N/m):") +cfu.disp_array(K, tablefmt='plain') -bc = np.array([1, 3]) -a, r = cfc.solveq(K, f, bc) +# ----- Boundary conditions and nodal loads ---------------------- -cfu.disp_h2("Displacements a:") -cfu.disp_array(a) +bc_dofs = np.array([1, 3]) # dofs with prescribed displacment (0) +bc_vals = np.array([0.0, 0.0]) # prescribed displacments -cfu.disp_h2("Reaction forces r:") -cfu.disp_array(r) +# ----- Solve the system of equations ---------------------------- -# ----- Caculate element forces +a, r = cfc.solveq(K, f, bc_dofs, bc_vals) -ed1 = cfc.extract_ed(edof[0, :], a) -ed2 = cfc.extract_ed(edof[1, :], a) -ed3 = cfc.extract_ed(edof[2, :], a) +cfu.disp_h2("Displacements a (m):") +cfu.disp_array(a, tablefmt='plain') -es1 = cfc.spring1s(ep2, ed1) -es2 = cfc.spring1s(ep1, ed2) -es3 = cfc.spring1s(ep2, ed3) +cfu.disp_h2("Reaction forces r (N):") +cfu.disp_array(r, tablefmt='plain') -cfu.disp_h2("Element forces N:") +# ----- Caculate element forces ---------------------------------- + +ed1 = cfc.extract_ed(edof[0, :], a) # Nodal displacements, element 1 +ed2 = cfc.extract_ed(edof[1, :], a) # Nodal displacements, element 2 +ed3 = cfc.extract_ed(edof[2, :], a) # Nodal displacements, element 3 + +es1 = cfc.spring1s(ep1, ed1) # Element force, element 1 +es2 = cfc.spring1s(ep2, ed2) # Element force, element 2 +es3 = cfc.spring1s(ep3, ed3) # Element force, element 3 + +cfu.disp_h2("Element forces (N):") print("N1 = "+str(es1)) print("N2 = "+str(es2)) -print("N3 = "+str(es3)) +print("N3 = "+str(es3)) \ No newline at end of file diff --git a/gen_output_dict.py b/gen_output_dict.py index 66b91b1..a8d92c0 100644 --- a/gen_output_dict.py +++ b/gen_output_dict.py @@ -6,6 +6,13 @@ import os, sys, re, subprocess from pprint import pprint +from pathlib import Path + +# Add src directory to system path to use local calfem package +script_dir = Path(__file__).parent +src_dir = script_dir / "src" +sys.path.insert(0, str(src_dir)) + def extract_numeric_values(output_text): """Extract numeric values from output text using regex.""" import re diff --git a/paper.md b/paper.md new file mode 100644 index 0000000..d7e387e --- /dev/null +++ b/paper.md @@ -0,0 +1,136 @@ +--- +title: 'CALFEM for Python: An Educational Package for Teaching the Finite Element Method' +tags: + - Python + - finite element method + - structural mechanics + - computational mechanics + - engineering education + - numerical methods +authors: + - name: Jonas Lindemann + orcid: 0009-0001-9799-4640 # Replace with your actual ORCID + affiliation: 1 + - name: Per-Erik Austrell + orcid: 0000-0002-1234-5678 # Replace with your actual ORCID + affiliation: 1 + - name: Håkan Carlsson + orcid: 0000-0003-8765-4321 # Replace with your actual ORCID + affiliation: 1 + - name: Ola Dahlblom + orcid: 0000-0002-2345-6789 # Replace with your actual ORCID + affiliation: 1 + - name: Susanne Heyeden + orcid: 0000-0001-3456-7890 # Replace with your actual ORCID + affiliation: 1 + - name: Anders Olsson + orcid: 0000-0002-4567-8901 # Replace with your actual ORCID + affiliation: 1 + - name: Karl-Gunnar Olsson + orcid: 0000-0003-5678-9012 # Replace with your actual ORCID + affiliation: 1 + # Add other key contributors here + # - name: Contributor Name + # orcid: 0000-0000-0000-0000 + # affiliation: 1 +affiliations: + - name: Division of Structural Mechanics, Lund University, Sweden + index: 1 +date: 18 October 2025 +bibliography: paper.bib +--- + +# Summary + +CALFEM for Python is an open-source software package designed for teaching and learning the finite element method (FEM) in structural mechanics and solid mechanics courses. Originally developed as a MATLAB toolkit at Lund University since the late 1970s, CALFEM (Computer Aided Learning of the Finite Element Method) has been ported to Python to provide students and educators with a freely accessible, transparent implementation of fundamental FEM concepts. The package includes core finite element routines, mesh generation capabilities via GMSH and Triangle, and comprehensive visualization tools using matplotlib and visvis. CALFEM for Python bridges the gap between theoretical FEM concepts and practical implementation, enabling students to understand, modify, and extend finite element algorithms without the cost barriers of commercial software or proprietary development environments. + +# Statement of Need + +The finite element method is a cornerstone of modern engineering analysis, yet teaching FEM effectively presents several challenges. Commercial FEM software packages, while powerful, often act as "black boxes" that obscure the underlying algorithms from students. MATLAB-based teaching tools like the original CALFEM provide transparency but require expensive licenses that may be inaccessible to students and institutions, particularly in developing countries. Furthermore, as universities increasingly adopt Python for engineering education due to its open-source nature and widespread use in industry and research, there is a critical need for FEM teaching tools that align with this pedagogical shift. + +CALFEM for Python addresses these needs by providing: + +- **Accessibility**: Free and open-source (MIT licensed) software that eliminates cost barriers for students worldwide +- **Pedagogical Clarity**: Clean, readable Python implementations that allow students to examine and understand FEM algorithms at the code level +- **Practical Integration**: Seamless integration with the scientific Python ecosystem (NumPy, SciPy, matplotlib), preparing students for modern computational workflows +- **Comprehensive Functionality**: Coverage of essential FEM concepts including element formulation, assembly procedures, constraint handling, and post-processing +- **Active Learning**: Extensible codebase that encourages students to modify and experiment with FEM implementations + +The package has been specifically designed for graduate and postgraduate courses in structural mechanics and has been developed in direct response to Lund University's transition to Python-based computational education. Unlike research-focused FEM packages such as FEniCS or commercial packages like ABAQUS, CALFEM for Python prioritizes educational transparency and ease of understanding over computational efficiency or advanced features. + +# Learning Objectives and Content + +CALFEM for Python supports the following learning objectives in finite element courses: + +1. **Understanding FEM Fundamentals**: Students learn element formulation, stiffness matrix assembly, boundary condition application, and solution procedures through transparent code implementations +2. **Hands-on Implementation**: Students can modify element routines, implement new element types, and experiment with different solution strategies +3. **Mesh Generation**: Integration with GMSH and Triangle teaches students about discretization quality and its impact on solution accuracy +4. **Visualization and Interpretation**: Built-in plotting capabilities help students visualize meshes, deformations, stresses, and other field quantities +5. **Research Preparation**: Graduate students gain skills in algorithm development and FEM programming that transfer to research applications + +## Package Components + +The package is organized into several modules: + +- **`calfem.core`**: Core FEM routines including element stiffness matrices (bar, beam, plane stress/strain, solid elements), assembly functions, equation solvers, and boundary condition handlers +- **`calfem.geometry`**: Geometry definition tools for creating computational domains +- **`calfem.mesh`**: Mesh generation interfaces to GMSH and Triangle for structured and unstructured meshes +- **`calfem.vis_mpl`**: Matplotlib-based visualization for 2D and 3D results +- **`calfem.utils`**: Utility functions for data handling and result extraction + +## Educational Materials + +CALFEM for Python includes: + +- Comprehensive API documentation hosted on ReadTheDocs +- Multiple worked examples covering various problem types (structural frames, heat transfer, solid mechanics) +- Jupyter notebook tutorials demonstrating typical analysis workflows +- PDF manuals detailing theory and implementation (including the original CALFEM manual and expanded mesh generation guide) + +# Instructional Design and Experience + +## Pedagogical Approach + +CALFEM for Python follows a constructivist learning approach where students build understanding by actively working with FEM implementations. The package design emphasizes: + +- **Code Readability**: Functions use descriptive names and clear structure that mirrors mathematical formulations +- **Gradual Complexity**: Examples progress from simple 1D bar elements to complex 3D solid mechanics problems +- **Exploratory Learning**: Students are encouraged to modify examples, change parameters, and observe results +- **Error Transparency**: Clear error messages and debugging capabilities help students understand when and why solutions fail + +## Teaching Experience + +CALFEM for Python has been used at Lund University for teaching finite element methods to graduate and postgraduate students in civil engineering, mechanical engineering, and engineering mechanics since 2010. The package has proven particularly effective for: + +- **Bridging Theory and Practice**: Students connect theoretical lectures on FEM with hands-on coding exercises +- **Thesis Projects**: Multiple master's thesis projects have extended the package's capabilities (mesh generation, visualization, specialized applications) +- **Research Training**: Graduate students use the package as a foundation for developing custom FEM codes for their research + +## Adoption by Other Instructors + +The package is designed for straightforward adoption by other instructors: + +- **Easy Installation**: Available via pip (`pip install calfem-python`) +- **Minimal Dependencies**: Relies primarily on standard scientific Python libraries +- **Flexible Integration**: Can be used for homework assignments, laboratory exercises, or project work +- **Example Repository**: Extensive examples provide starting points for assignments and projects + +Instructors can adapt the existing examples to their specific course needs or guide students in developing custom applications. The open-source nature allows customization for specialized topics (e.g., non-linear analysis, dynamics) without license restrictions. + +# Comparison to Similar Educational Software + +Several other FEM packages exist for education and research: + +- **FEniCS**: A powerful automated FEM framework that excels at complex PDEs but has a steeper learning curve and abstracts away many implementation details +- **SfePy**: A research-oriented FEM package with extensive capabilities but less focus on pedagogical clarity +- **GetFEM++**: Primarily C++-based with Python bindings, targeting research more than education +- **deal.II**: Excellent C++ FEM library with good documentation but requires C++ proficiency +- **PyFEM**: Similar educational focus but less mature and less comprehensive in scope + +CALFEM for Python fills a specific niche by providing undergraduate/graduate-level transparency with comprehensive documentation specifically designed for structural mechanics education. Its MATLAB heritage means it aligns well with classical FEM textbooks, while its Python implementation prepares students for modern computational practices. + +# Acknowledgements + +The development of CALFEM for Python builds upon decades of work on the original MATLAB version by the Division of Structural Mechanics at Lund University. Significant contributions to the Python port have been made through master's thesis projects, including work on mesh generation (Edholm 2013), initial Python implementation (Ottosson 2010), visualization (Åmand 2022), and geometry editors (Eriksson 2021). We acknowledge the continued support of Lund University and the contribution of students and faculty who have used and improved the package. + +# References \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2759790..fbf12fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "calfem-python" -version = "3.6.13" +version = "3.6.14" description = "CALFEM for Python" authors = [ {name = "Jonas Lindemann", email = "jonas.lindemann@lunarc.lu.se"}, diff --git a/src/calfem/__init__.py b/src/calfem/__init__.py index 989d06c..5eec275 100644 --- a/src/calfem/__init__.py +++ b/src/calfem/__init__.py @@ -1,2 +1,2 @@ -__version__ = '3.6.1' +__version__ = '3.6.14' VERSION = __version__ diff --git a/src/calfem/core.py b/src/calfem/core.py index 52b627b..7e2ea71 100644 --- a/src/calfem/core.py +++ b/src/calfem/core.py @@ -5448,6 +5448,52 @@ def assem(edof: ArrayLike, K: Union[NDArray[np.floating], csr_matrix, csc_matrix else: return K, f +def red(A: ArrayLike, b: ArrayLike) -> NDArray[np.floating]: + """ + Reduce the size of a square matrix by omitting rows and columns. + + Algorithm for reducing the size of a square matrix A by omitting + rows and columns defined by the matrix b. + + Parameters + ---------- + A : array_like + Unreduced square matrix, shape (nd, nd). + b : array_like + Boundary condition matrix containing DOF indices to remove, + shape (nbc, 1) or (nbc,), where nbc is the number of constraints. + + Returns + ------- + B : ndarray + Reduced matrix with rows and columns removed. + + Examples + -------- + >>> K = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + >>> bc = np.array([[2]]) # Remove row/column 2 (1-indexed) + >>> K_red = red(K, bc) + """ + A_arr = np.asarray(A) + b_arr = np.asarray(b) + + nd = A_arr.shape[0] + fdof = np.arange(1, nd + 1) + + # Extract prescribed DOFs from first column + if b_arr.ndim == 1: + pdof = b_arr + else: + pdof = b_arr[:, 0] + + # Remove prescribed DOFs from free DOFs (convert to 0-indexed) + fdof = np.delete(fdof, pdof - 1) + + # Extract reduced matrix (convert back to 0-indexed for numpy) + B = A_arr[np.ix_(fdof - 1, fdof - 1)] + + return B + def solveq(K, f, bcPrescr=None, bcVal=None): """ Solve static FE-equations considering boundary conditions. @@ -5468,7 +5514,7 @@ def solveq(K, f, bcPrescr=None, bcVal=None): ------- a : ndarray Solution including boundary values, shape (nd, 1). - Q : ndarray + r : ndarray Reaction force vector, shape (nd, 1). """ diff --git a/src/calfem/vis_mpl.py b/src/calfem/vis_mpl.py index 3cf9ecf..2a5ae11 100644 --- a/src/calfem/vis_mpl.py +++ b/src/calfem/vis_mpl.py @@ -1452,7 +1452,7 @@ def eldraw2(ex, ey, plotpar=[1, 2, 1], elnum=[]): - linecolor: 1=black, 2=blue, 3=magenta, 4=red - nodemark: 0=no mark, 1=circle, 2=star elnum : array_like, optional - Element numbers, typically edof(:,1) - the first column in the topology matrix. + Element numbers. Notes ----- @@ -1727,7 +1727,11 @@ def pltstyle2(plotpar): else: raise ValueError("Invalid value for plotpar[1].") - if p3 == 1: + + if p3 == 0: + node_color = "" + node_type = "" + elif p3 == 1: node_color = (0, 0, 0) node_type = "o" elif p3 == 2: @@ -1819,6 +1823,8 @@ def eldisp2(ex, ey, ed, plotpar=[2, 1, 1], sfac=None): k = sfac + plt.axis("equal") + line_color, line_style, node_color, node_style = pltstyle2(plotpar) if nen == 2: @@ -2067,6 +2073,7 @@ def dispbeam2(ex, ey, edi, plotpar=[2, 1, 1], sfac=None): xc = np.array(A[:, 0]) yc = np.array(A[:, 1]) + plt.axis("equal") plt.plot(xc, yc, color=line_color, linewidth=1) A1 = np.array([A[0, 0], A[Nbr - 1, 0]]).reshape(1, 2) @@ -2182,6 +2189,7 @@ def secforce2(ex, ey, es, plotpar=[2, 1], sfac=None, eci=None): xc = np.array(A[:, 0]) yc = np.array(A[:, 1]) + plt.axis("equal") plt.plot(xc, yc, color=line_color, linewidth=1) # Plot stripes in diagram diff --git a/test_calfem.py b/test_calfem.py index 4cb33ed..f3e9aa7 100644 --- a/test_calfem.py +++ b/test_calfem.py @@ -6,6 +6,13 @@ """ import os, sys, re, subprocess +from pathlib import Path + +# Add src directory to system path to use local calfem package +script_dir = Path(__file__).parent +src_dir = script_dir / "src" +sys.path.insert(0, str(src_dir)) + import example_outputs as eo import numpy as np @@ -83,4 +90,5 @@ def test_examples(): print(f"PASSED.") if __name__ == "__main__": + test_examples() diff --git a/test_red.py b/test_red.py new file mode 100644 index 0000000..07b2426 --- /dev/null +++ b/test_red.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +""" +Test script for the red function +""" + +import sys +import os +from pathlib import Path + +# Add src directory to system path to use local calfem package +script_dir = Path(__file__).parent +src_dir = script_dir / "src" +sys.path.insert(0, str(src_dir)) + +import numpy as np +from calfem.core import red + +def test_red_basic(): + """Test basic matrix reduction""" + print("Testing red() - basic case...") + + # Create a simple 3x3 matrix + K = np.array([[1, 2, 3], + [4, 5, 6], + [7, 8, 9]]) + + # Remove second DOF (1-indexed) + bc = np.array([2]) + K_red = red(K, bc) + + # Expected result: 2x2 matrix with rows/cols 0 and 2 + expected = np.array([[1, 3], + [7, 9]]) + + assert K_red.shape == (2, 2), f"Expected shape (2, 2), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Basic test passed") + +def test_red_multiple_dofs(): + """Test reduction with multiple DOFs""" + print("\nTesting red() - multiple DOFs...") + + # Create a 5x5 matrix + K = np.arange(1, 26).reshape(5, 5) + + # Remove DOFs 2 and 4 (1-indexed) + bc = np.array([2, 4]) + K_red = red(K, bc) + + # Should have rows/cols 0, 2, 4 (0-indexed) + expected = K[np.ix_([0, 2, 4], [0, 2, 4])] + + assert K_red.shape == (3, 3), f"Expected shape (3, 3), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Multiple DOFs test passed") + +def test_red_2d_bc_array(): + """Test with 2D boundary condition array (typical CALFEM format)""" + print("\nTesting red() - 2D boundary condition array...") + + # Create a 4x4 stiffness matrix + K = np.array([[10, -5, 0, 0], + [-5, 10, -5, 0], + [ 0, -5, 10, -5], + [ 0, 0, -5, 10]]) + + # Boundary conditions in typical CALFEM format: [dof, value] + bc = np.array([[1, 0], + [4, 0]]) + + K_red = red(K, bc) + + # Should remove first and last DOFs, leaving middle 2x2 + expected = np.array([[10, -5], + [-5, 10]]) + + assert K_red.shape == (2, 2), f"Expected shape (2, 2), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ 2D boundary condition array test passed") + +def test_red_symmetric_matrix(): + """Test that symmetry is preserved""" + print("\nTesting red() - symmetric matrix preservation...") + + # Create a symmetric stiffness matrix + K = np.array([[4, -2, 0, -1], + [-2, 6, -3, 0], + [0, -3, 5, -2], + [-1, 0, -2, 3]]) + + # Verify input is symmetric + assert np.allclose(K, K.T), "Input matrix should be symmetric" + + # Remove DOF 3 + bc = np.array([3]) + K_red = red(K, bc) + + # Check that result is still symmetric + assert np.allclose(K_red, K_red.T), "Reduced matrix should remain symmetric" + print("✓ Symmetry preservation test passed") + +def test_red_realistic_fem(): + """Test with a realistic FEM scenario""" + print("\nTesting red() - realistic FEM example...") + + # Simple 2-element spring system (3 DOFs total) + # Fixed at DOF 1, free at DOF 2, fixed at DOF 3 + k1 = 1000 # N/m + k2 = 2000 # N/m + + K = np.array([[k1, -k1, 0], + [-k1, k1+k2, -k2], + [0, -k2, k2]]) + + # Fix DOFs 1 and 3 + bc = np.array([1, 3]) + K_red = red(K, bc) + + # Should have only the middle DOF + expected = np.array([[k1 + k2]]) + + assert K_red.shape == (1, 1), f"Expected shape (1, 1), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Realistic FEM test passed") + +def test_red_input_types(): + """Test that red works with different input types""" + print("\nTesting red() - different input types...") + + # Test with list inputs + K_list = [[1, 2], [3, 4]] + bc_list = [1] + K_red1 = red(K_list, bc_list) + + # Test with numpy arrays + K_array = np.array([[1, 2], [3, 4]]) + bc_array = np.array([1]) + K_red2 = red(K_array, bc_array) + + # Both should give the same result + assert np.allclose(K_red1, K_red2), "Results should be the same regardless of input type" + + expected = np.array([[4]]) + assert np.allclose(K_red1, expected), f"Expected {expected}, got {K_red1}" + print("✓ Input types test passed") + +def run_all_tests(): + """Run all red function tests""" + print("="*60) + print("Testing red() function") + print("="*60) + + try: + test_red_basic() + test_red_multiple_dofs() + test_red_2d_bc_array() + test_red_symmetric_matrix() + test_red_realistic_fem() + test_red_input_types() + + print("\n" + "="*60) + print("All tests passed! ✓") + print("="*60) + return True + except AssertionError as e: + print(f"\n✗ Test failed: {e}") + return False + except Exception as e: + print(f"\n✗ Unexpected error: {e}") + import traceback + traceback.print_exc() + return False + +if __name__ == "__main__": + success = run_all_tests() + sys.exit(0 if success else 1) diff --git a/tests/test_red.py b/tests/test_red.py new file mode 100644 index 0000000..f023c66 --- /dev/null +++ b/tests/test_red.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +""" +Test script for the red function +""" + +import sys +import os +from pathlib import Path + +# Add src directory to system path to use local calfem package +script_dir = Path(__file__).parent.parent +src_dir = script_dir / "src" +sys.path.insert(0, str(src_dir)) + +import numpy as np +from calfem.core import red + +def test_red_basic(): + """Test basic matrix reduction""" + print("Testing red() - basic case...") + + # Create a simple 3x3 matrix + K = np.array([[1, 2, 3], + [4, 5, 6], + [7, 8, 9]]) + + # Remove second DOF (1-indexed) + bc = np.array([2]) + K_red = red(K, bc) + + # Expected result: 2x2 matrix with rows/cols 0 and 2 + expected = np.array([[1, 3], + [7, 9]]) + + assert K_red.shape == (2, 2), f"Expected shape (2, 2), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Basic test passed") + +def test_red_multiple_dofs(): + """Test reduction with multiple DOFs""" + print("\nTesting red() - multiple DOFs...") + + # Create a 5x5 matrix + K = np.arange(1, 26).reshape(5, 5) + + # Remove DOFs 2 and 4 (1-indexed) + bc = np.array([2, 4]) + K_red = red(K, bc) + + # Should have rows/cols 0, 2, 4 (0-indexed) + expected = K[np.ix_([0, 2, 4], [0, 2, 4])] + + assert K_red.shape == (3, 3), f"Expected shape (3, 3), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Multiple DOFs test passed") + +def test_red_2d_bc_array(): + """Test with 2D boundary condition array (typical CALFEM format)""" + print("\nTesting red() - 2D boundary condition array...") + + # Create a 4x4 stiffness matrix + K = np.array([[10, -5, 0, 0], + [-5, 10, -5, 0], + [ 0, -5, 10, -5], + [ 0, 0, -5, 10]]) + + # Boundary conditions in typical CALFEM format: [dof, value] + bc = np.array([[1, 0], + [4, 0]]) + + K_red = red(K, bc) + + # Should remove first and last DOFs, leaving middle 2x2 + expected = np.array([[10, -5], + [-5, 10]]) + + assert K_red.shape == (2, 2), f"Expected shape (2, 2), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ 2D boundary condition array test passed") + +def test_red_symmetric_matrix(): + """Test that symmetry is preserved""" + print("\nTesting red() - symmetric matrix preservation...") + + # Create a symmetric stiffness matrix + K = np.array([[4, -2, 0, -1], + [-2, 6, -3, 0], + [0, -3, 5, -2], + [-1, 0, -2, 3]]) + + # Verify input is symmetric + assert np.allclose(K, K.T), "Input matrix should be symmetric" + + # Remove DOF 3 + bc = np.array([3]) + K_red = red(K, bc) + + # Check that result is still symmetric + assert np.allclose(K_red, K_red.T), "Reduced matrix should remain symmetric" + print("✓ Symmetry preservation test passed") + +def test_red_realistic_fem(): + """Test with a realistic FEM scenario""" + print("\nTesting red() - realistic FEM example...") + + # Simple 2-element spring system (3 DOFs total) + # Fixed at DOF 1, free at DOF 2, fixed at DOF 3 + k1 = 1000 # N/m + k2 = 2000 # N/m + + K = np.array([[k1, -k1, 0], + [-k1, k1+k2, -k2], + [0, -k2, k2]]) + + # Fix DOFs 1 and 3 + bc = np.array([1, 3]) + K_red = red(K, bc) + + # Should have only the middle DOF + expected = np.array([[k1 + k2]]) + + assert K_red.shape == (1, 1), f"Expected shape (1, 1), got {K_red.shape}" + assert np.allclose(K_red, expected), f"Expected:\n{expected}\nGot:\n{K_red}" + print("✓ Realistic FEM test passed") + +def test_red_input_types(): + """Test that red works with different input types""" + print("\nTesting red() - different input types...") + + # Test with list inputs + K_list = [[1, 2], [3, 4]] + bc_list = [1] + K_red1 = red(K_list, bc_list) + + # Test with numpy arrays + K_array = np.array([[1, 2], [3, 4]]) + bc_array = np.array([1]) + K_red2 = red(K_array, bc_array) + + # Both should give the same result + assert np.allclose(K_red1, K_red2), "Results should be the same regardless of input type" + + expected = np.array([[4]]) + assert np.allclose(K_red1, expected), f"Expected {expected}, got {K_red1}" + print("✓ Input types test passed") + +def run_all_tests(): + """Run all red function tests""" + print("="*60) + print("Testing red() function") + print("="*60) + + try: + test_red_basic() + test_red_multiple_dofs() + test_red_2d_bc_array() + test_red_symmetric_matrix() + test_red_realistic_fem() + test_red_input_types() + + print("\n" + "="*60) + print("All tests passed! ✓") + print("="*60) + return True + except AssertionError as e: + print(f"\n✗ Test failed: {e}") + return False + except Exception as e: + print(f"\n✗ Unexpected error: {e}") + import traceback + traceback.print_exc() + return False + +if __name__ == "__main__": + success = run_all_tests() + sys.exit(0 if success else 1)