diff --git a/.gitignore b/.gitignore index 03c4805..960854a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ __pycache__/ # local Harness configuration and build outputs .harness/config.json .harness/build/ +.harness/build-ninja-msvc-debug/ .harness/doxygen/ # phase execution outputs diff --git a/.harness/build-ninja/.ninja_deps b/.harness/build-ninja/.ninja_deps new file mode 100644 index 0000000..21b3c73 Binary files /dev/null and b/.harness/build-ninja/.ninja_deps differ diff --git a/.harness/build-ninja/.ninja_log b/.harness/build-ninja/.ninja_log new file mode 100644 index 0000000..6f73273 --- /dev/null +++ b/.harness/build-ninja/.ninja_log @@ -0,0 +1,132 @@ +# ninja log v7 +107 1367 8092384218864831 src/fesa/CMakeFiles/fesa_solver.dir/build_info.cpp.obj cbb74df2cfe16446 +97 1760 8092384218802669 src/fesa/CMakeFiles/fesa_solver.dir/assembly/parallel_for.cpp.obj 6d361d78b8ddb1e6 +132 2029 8092384219120278 src/fesa/CMakeFiles/fesa_solver.dir/core/status.cpp.obj d9066190c54698e1 +127 2129 8092384218979200 src/fesa/CMakeFiles/fesa_solver.dir/core/diagnostic.cpp.obj a5cabe8b0504c8b6 +122 2167 8092384218979200 src/fesa/CMakeFiles/fesa_solver.dir/core/ascii.cpp.obj c1314f837b92110e +63 2464 8092384218329431 _deps/googletest-build/googletest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.obj bd6626bb67644ce5 +112 2521 8092384218924680 src/fesa/CMakeFiles/fesa_solver.dir/constraints/essential_constraint_policy.cpp.obj 839def0f97ba4345 +67 2557 8092384218488485 src/fesa/CMakeFiles/fesa_solver.dir/analysis/analysis_model.cpp.obj 61c968a4b6f63aff +72 2575 8092384218488485 src/fesa/CMakeFiles/fesa_solver.dir/analysis/analysis_state.cpp.obj 7fe12c916f130467 +117 2585 8092384218979200 src/fesa/CMakeFiles/fesa_solver.dir/constraints/prescribed_displacement.cpp.obj cf4a7839ef2889be +92 2604 8092384218727988 src/fesa/CMakeFiles/fesa_solver.dir/assembly/load_assembler.cpp.obj a9a88a41a899d830 +102 2671 8092384218842800 src/fesa/CMakeFiles/fesa_solver.dir/assembly/sparse_assembler.cpp.obj e370471d9b7f46eb +82 2748 8092384218645949 src/fesa/CMakeFiles/fesa_solver.dir/app/fesa_application.cpp.obj b131425fcf446caf +136 2761 8092384219192725 src/fesa/CMakeFiles/fesa_solver.dir/elements/element_factory.cpp.obj c53943f91b42e499 +141 3032 8092384219211547 src/fesa/CMakeFiles/fesa_solver.dir/elements/euler_beam_3d.cpp.obj 8d8a96d17efb1fbd +87 3044 8092384218668902 src/fesa/CMakeFiles/fesa_solver.dir/app/output_paths.cpp.obj 2f4555a69a891bf2 +77 3054 8092384218488485 src/fesa/CMakeFiles/fesa_solver.dir/analysis/linear_static_analysis.cpp.obj 96370aed2a86ae09 +1369 4357 8092384231534591 src/fesa/CMakeFiles/fesa_solver.dir/elements/mitc4_shell.cpp.obj 4497417f368343ba +2029 4511 8092384238129153 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/domain_builder.cpp.obj f82b7186c8b1d417 +2167 4531 8092384239513629 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/domain_mapper.cpp.obj 78013a69808c94d7 +1761 4592 8092384235437686 src/fesa/CMakeFiles/fesa_solver.dir/fem/dof_manager.cpp.obj be7398345e5a9ad +2465 4609 8092384242481563 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/input_reader.cpp.obj 209f6a2dba784f60 +2558 4634 8092384243411066 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/step_definition_mapper.cpp.obj e2bf727de4df328f +2575 4654 8092384243589363 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/topology_mapper.cpp.obj 35a7cf559a2383f0 +2522 4978 8092384243054401 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/material_property_mapper.cpp.obj e3d7c5c1826acfd0 +58 4997 8092384218329431 _deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.obj 5f59395ac6fe27d6 +2672 5237 8092384244558583 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_primitives.cpp.obj a94f3e6278bb7040 +2605 5250 8092384243885657 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_model_writer.cpp.obj 54d576166219ebe3 +2762 5307 8092384245447369 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_results_writer.cpp.obj b086f45ee057095d +2585 5660 8092384243687256 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_atomic_file.cpp.obj acf4093ec1ca0dab +3045 5693 8092384248271192 src/fesa/CMakeFiles/fesa_solver.dir/loads/concentrated_nodal_load.cpp.obj b738f2f3ef238897 +3032 5716 8092384248152286 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_self_check.cpp.obj 61e23edf9fd3defe +2749 5755 8092384245329453 src/fesa/CMakeFiles/fesa_solver.dir/io/hdf5/hdf5_result_writer.cpp.obj 76edfaf76dda1150 +5008 5765 8092384267920473 lib/gtest.lib 3ad571dfafc7ee18 +3054 5812 8092384248369539 src/fesa/CMakeFiles/fesa_solver.dir/materials/isotropic_linear_elastic_material.cpp.obj ec18800579e40b2f +2129 6343 8092384239119443 src/fesa/CMakeFiles/fesa_solver.dir/io/abaqus/domain_mapping_context.cpp.obj 541cf582d5d72f1d +4978 6880 8092384267621712 src/fesa/CMakeFiles/fesa_solver.dir/properties/general_beam_section.cpp.obj 14abd1111f7f07ba +5813 6922 8092384275957474 lib/gtest_main.lib 1fea6bfefff1654b +4532 7019 8092384263153824 src/fesa/CMakeFiles/fesa_solver.dir/math/sparse_matrix.cpp.obj 43c886855039f11b +4635 7086 8092384264181273 src/fesa/CMakeFiles/fesa_solver.dir/model/shell_geometry.cpp.obj 64372c6247c9d1fe +4654 7099 8092384264379650 src/fesa/CMakeFiles/fesa_solver.dir/model/source_target_resolver.cpp.obj f0d949f736370376 +5238 7149 8092384270209372 src/fesa/CMakeFiles/fesa_solver.dir/properties/shell_section.cpp.obj b4b7f64079a1b357 +4512 7175 8092384262955435 src/fesa/CMakeFiles/fesa_solver.dir/math/matrix.cpp.obj 90a5827630c77ffa +4358 7188 8092384261413268 src/fesa/CMakeFiles/fesa_solver.dir/math/dense_blas_internal.cpp.obj 1d155025fdc36e32 +4592 7436 8092384263746888 src/fesa/CMakeFiles/fesa_solver.dir/math/vector.cpp.obj 31eb0e6e052791f4 +5308 7496 8092384270902468 src/fesa/CMakeFiles/fesa_solver.dir/results/beam_result_recovery.cpp.obj 8dbf5a7584b82d05 +4610 7578 8092384263925156 src/fesa/CMakeFiles/fesa_solver.dir/model/domain.cpp.obj 327270abdb77ada5 +5694 7594 8092384274770343 src/fesa/CMakeFiles/fesa_solver.dir/results/recovery_candidate.cpp.obj 36f81aba1565e4cd +5251 7882 8092384270347432 src/fesa/CMakeFiles/fesa_solver.dir/results/analysis_state_commit.cpp.obj f591f5f73fa893d +5756 7931 8092384275383077 src/fesa/CMakeFiles/fesa_solver.dir/results/shell_result_recovery.cpp.obj d6de270523c88b62 +5661 7969 8092384274433391 src/fesa/CMakeFiles/fesa_solver.dir/results/global_equilibrium_recovery.cpp.obj dc54637dec7c2fe +5717 8847 8092384275008914 src/fesa/CMakeFiles/fesa_solver.dir/results/result_recovery.cpp.obj dcfbfce0a69b5131 +5765 9159 8092384275484616 src/fesa/CMakeFiles/fesa_solver.dir/solvers/linear/mkl_pardiso_solver.cpp.obj c7d3578377b60ab4 +6356 9177 8092384281377735 tests/CMakeFiles/fesa_unit_tests.dir/unit/build_info_test.cpp.obj cc2d626fb4f55428 +7087 9322 8092384288690125 tests/CMakeFiles/fesa_unit_tests.dir/unit/assembly/parallel_for_test.cpp.obj 64cd58a46d8c2ed0 +6881 9633 8092384286632996 tests/CMakeFiles/fesa_unit_tests.dir/unit/analysis/analysis_test.cpp.obj 629ae05c2a17e2a2 +7176 10116 8092384289581651 tests/CMakeFiles/fesa_unit_tests.dir/unit/app/output_paths_test.cpp.obj 190d4f41b24a7775 +9160 10155 8092384309439240 src/fesa/fesa_solver.lib 834cb49484ed4975 +7578 10308 8092384293615881 tests/CMakeFiles/fesa_unit_tests.dir/unit/core/diagnostic_test.cpp.obj 382faf72525f5dbd +7497 10354 8092384292804797 tests/CMakeFiles/fesa_unit_tests.dir/unit/core/ascii_test.cpp.obj 4c8e3757a2b86a10 +7594 10413 8092384293774107 tests/CMakeFiles/fesa_unit_tests.dir/unit/core/source_identity_test.cpp.obj 2f8c538d6bbcf9a6 +7019 10542 8092384288017054 tests/CMakeFiles/fesa_unit_tests.dir/unit/analysis/analysis_state_test.cpp.obj 4eceb64a57a9abdc +6922 10553 8092384287049746 tests/CMakeFiles/fesa_unit_tests.dir/unit/analysis/analysis_model_test.cpp.obj 40c473ba9bc9973e +7883 10959 8092384296644544 tests/CMakeFiles/fesa_unit_tests.dir/unit/core/status_test.cpp.obj ab6dc42cc2881a67 +7100 10971 8092384288828228 tests/CMakeFiles/fesa_unit_tests.dir/unit/assembly/load_assembler_test.cpp.obj fd58472fadea8d92 +7189 11213 8092384289719698 tests/CMakeFiles/fesa_unit_tests.dir/unit/constraints/boundary_condition_test.cpp.obj 6d8a23b383677aae +7437 11353 8092384292190435 tests/CMakeFiles/fesa_unit_tests.dir/unit/constraints/essential_constraints_test.cpp.obj fc4706d7a106f2b0 +7150 11433 8092384289323046 tests/CMakeFiles/fesa_unit_tests.dir/unit/assembly/sparse_assembler_test.cpp.obj 1d73050ff822ef16 +7970 11517 8092384297528284 tests/CMakeFiles/fesa_unit_tests.dir/unit/elements/euler_beam_3d_test.cpp.obj 4757a86932e814d5 +7932 12441 8092384297154255 tests/CMakeFiles/fesa_unit_tests.dir/unit/elements/element_factory_test.cpp.obj 1646374b1d49e4ea +9634 12565 8092384314168466 tests/CMakeFiles/fesa_unit_tests.dir/unit/math/matrix_test.cpp.obj 1c0388a2cb34a977 +10309 12712 8092384320925938 tests/CMakeFiles/fesa_unit_tests.dir/unit/math/vector_test.cpp.obj 537626a817bb764a +8848 12728 8092384306313035 tests/CMakeFiles/fesa_unit_tests.dir/unit/elements/mitc4_shell_test.cpp.obj 2f4e47f40acc7795 +10156 12796 8092384319383650 tests/CMakeFiles/fesa_unit_tests.dir/unit/math/vector3_test.cpp.obj 7940001bdaf8e4fe +9322 13452 8092384311062628 tests/CMakeFiles/fesa_unit_tests.dir/unit/math/dense_blas_internal_test.cpp.obj f2f846d2a426012d +9177 13464 8092384309597453 tests/CMakeFiles/fesa_unit_tests.dir/unit/fem/dof_manager_test.cpp.obj 6004da54fb433c80 +10117 13583 8092384318989204 tests/CMakeFiles/fesa_unit_tests.dir/unit/math/sparse_matrix_test.cpp.obj f75bb2f18a5bd303 +10542 13638 8092384323262138 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/abaqus/input_reader_test.cpp.obj 54d4660fb8524142 +10554 13838 8092384323380087 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/abaqus/input_syntax_test.cpp.obj 14036fa417a21f26 +10354 14002 8092384321383068 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/abaqus/domain_mapping_components_test.cpp.obj 8b6d55d5290b3dcf +10414 14961 8092384321975774 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/abaqus/domain_mapper_test.cpp.obj 4256f1932890204e +11214 14967 8092384329967026 tests/CMakeFiles/fesa_unit_tests.dir/unit/loads/load_test.cpp.obj 41fecb4ac4aefc2d +11434 15018 8092384332164407 tests/CMakeFiles/fesa_unit_tests.dir/unit/model/model_types_test.cpp.obj 167fe5a77a5994eb +11517 15025 8092384332997863 tests/CMakeFiles/fesa_unit_tests.dir/unit/model/shell_geometry_test.cpp.obj 785d2d3084addad4 +12566 15363 8092384343501584 tests/CMakeFiles/fesa_unit_tests.dir/unit/materials/material_test.cpp.obj 1b5d607a45cc656b +11354 15565 8092384331373052 tests/CMakeFiles/fesa_unit_tests.dir/unit/model/domain_test.cpp.obj 4e4ba6955bfefa4 +10972 15603 8092384327552836 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/hdf5/hdf5_writer_components_test.cpp.obj 7b26f2ede20a2e21 +12442 15702 8092384342237335 tests/CMakeFiles/fesa_unit_tests.dir/unit/model/source_target_resolver_test.cpp.obj 7dee827d528c74d3 +12713 15742 8092384344954378 tests/CMakeFiles/fesa_unit_tests.dir/unit/properties/element_property_test.cpp.obj 8473fe9452582ea0 +13465 15869 8092384352483655 tests/CMakeFiles/fesa_unit_tests.dir/unit/results/results_writer_test.cpp.obj d9deb24734dfc76 +10960 16310 8092384327434560 tests/CMakeFiles/fesa_unit_tests.dir/unit/io/hdf5/hdf5_results_writer_test.cpp.obj 562b8f04b2dcdc01 +13584 16592 8092384353669318 tests/CMakeFiles/fesa_unit_tests.dir/unit/solvers/linear/linear_solver_test.cpp.obj 60444f53e28a5449 +12728 16604 8092384345112691 tests/CMakeFiles/fesa_unit_tests.dir/unit/results/result_records_test.cpp.obj 750f53bc9d3bf3f1 +13639 16746 8092384354224529 tests/CMakeFiles/fesa_unit_tests.dir/unit/solvers/linear/mkl_pardiso_solver_test.cpp.obj b761afa1036f4978 +14003 16836 8092384357866571 tests/CMakeFiles/fesa_integration_tests.dir/integration/app/fesa_application_test.cpp.obj 83061b0b6e67b7d2 +12797 17156 8092384345803861 tests/CMakeFiles/fesa_unit_tests.dir/unit/results/result_recovery_components_test.cpp.obj 83ac2cda76cf82a +13839 17161 8092384356222006 tests/CMakeFiles/fesa_integration_tests.dir/integration/analysis/linear_static_analysis_test.cpp.obj 2637ca1438adff43 +13452 17652 8092384352365561 tests/CMakeFiles/fesa_unit_tests.dir/unit/results/result_recovery_test.cpp.obj 16815e6d5b74928a +17162 19481 8092384412470224 tests/fesa_integration_tests.exe d976ae10942a92cd +17162 19481 8092384412470224 tests/fesa_integration_tests_d537bc73_tests.cmake d976ae10942a92cd +17162 19481 8092384412470224 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake d976ae10942a92cd +17652 19869 8092384416412729 tests/fesa_unit_tests.exe c7f61799ccaff6df +17652 19869 8092384416412729 tests/fesa_unit_tests_576e7e9d_tests.cmake c7f61799ccaff6df +17652 19869 8092384416412729 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake c7f61799ccaff6df +57 907 8092384649865117 src/fesa/CMakeFiles/fesa_cli.dir/app/main.cpp.obj db4c7e4d98d0b37a +62 1025 8092384649865117 tests/CMakeFiles/fesa_reference_tests.dir/reference/reference_tolerance_policy.cpp.obj 4d4567dc725e04bf +67 1957 8092384649929171 tests/CMakeFiles/fesa_reference_tests.dir/reference/reference_tolerance_policy_test.cpp.obj df1c2a7b89dbaab5 +87 2236 8092384650156206 tests/CMakeFiles/fesa_reference_tests.dir/reference/mitc4_reference_comparison.cpp.obj d5641bbf190f8212 +98 2282 8092384650262486 tests/CMakeFiles/fesa_reference_tests.dir/reference/mitc4_reference_cases_test.cpp.obj 724d2e009b4467de +82 2448 8092384650085756 tests/CMakeFiles/fesa_reference_tests.dir/reference/b33_reference_comparison_test.cpp.obj fe2325128628efc1 +92 2498 8092384650202184 tests/CMakeFiles/fesa_reference_tests.dir/reference/mitc4_reference_comparison_test.cpp.obj 536ec854d4427ddc +72 2767 8092384649929171 tests/CMakeFiles/fesa_reference_tests.dir/reference/reference_comparison.cpp.obj c9b25f54d0e8d98f +908 2795 8092384658379739 src/fesa/fesa.exe 1f8f56fa7a9b4ffe +76 2814 8092384649929171 tests/CMakeFiles/fesa_reference_tests.dir/reference/reference_comparison_test.cpp.obj 20f54b6ae2255260 +2814 4306 8092384692235536 tests/fesa_reference_tests.exe c70eaec9df33bb90 +2814 4306 8092384692235536 tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +2814 4306 8092384692235536 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +53 1720 8092385992962344 tests/CMakeFiles/fesa_reference_tests.dir/reference/mitc4_reference_cases_test.cpp.obj 724d2e009b4467de +57 1772 8092387178958005 tests/CMakeFiles/fesa_reference_tests.dir/reference/b33_reference_comparison_test.cpp.obj fe2325128628efc1 +51 2086 8092387178799897 tests/CMakeFiles/fesa_reference_tests.dir/reference/reference_comparison.cpp.obj c9b25f54d0e8d98f +2086 2967 8092387207983024 tests/fesa_reference_tests.exe c70eaec9df33bb90 +2086 2967 8092387207983024 tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +2086 2967 8092387207983024 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +47 1627 8092387468833159 tests/CMakeFiles/fesa_reference_tests.dir/reference/mitc4_reference_cases_test.cpp.obj 724d2e009b4467de +1627 2458 8092387492815552 tests/fesa_reference_tests.exe c70eaec9df33bb90 +1627 2458 8092387492815552 tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +1627 2458 8092387492815552 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake c70eaec9df33bb90 +31 1687 8092388278143624 tests/CMakeFiles/fesa_integration_tests.dir/integration/app/fesa_application_test.cpp.obj 83061b0b6e67b7d2 +1688 2540 8092388303138660 tests/fesa_integration_tests.exe d976ae10942a92cd +1688 2540 8092388303138660 tests/fesa_integration_tests_d537bc73_tests.cmake d976ae10942a92cd +1688 2540 8092388303138660 C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake d976ae10942a92cd diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfig.cmake b/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfig.cmake new file mode 100644 index 0000000..2ac43eb --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfig.cmake @@ -0,0 +1,37 @@ + +####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### +####### Any changes to this file will be overwritten by the next CMake run #### +####### The input file was Config.cmake.in ######## + +get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) + +macro(set_and_check _var _file) + set(${_var} "${_file}") + if(NOT EXISTS "${_file}") + message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") + endif() +endmacro() + +macro(check_required_components _NAME) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(NOT ${_NAME}_${comp}_FOUND) + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() + +#################################################################################### +include(CMakeFindDependencyMacro) +if () + set(THREADS_PREFER_PTHREAD_FLAG ) + find_dependency(Threads) +endif() +if (OFF) + find_dependency(absl) + find_dependency(re2) +endif() + +include("${CMAKE_CURRENT_LIST_DIR}/GTestTargets.cmake") +check_required_components("") diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfigVersion.cmake b/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfigVersion.cmake new file mode 100644 index 0000000..18adc9e --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/GTestConfigVersion.cmake @@ -0,0 +1,43 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "1.16.0") + +if (PACKAGE_FIND_VERSION_RANGE) + # Package version must be in the requested version range + if ((PACKAGE_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MIN) + OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_GREATER PACKAGE_FIND_VERSION_MAX) + OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_GREATER_EQUAL PACKAGE_FIND_VERSION_MAX))) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + endif() +else() + if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) + else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() + endif() +endif() + + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock.pc b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock.pc new file mode 100644 index 0000000..dee3a40 --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock.pc @@ -0,0 +1,10 @@ +libdir=C:/Program Files (x86)/FESA/lib +includedir=C:/Program Files (x86)/FESA/include + +Name: gmock +Description: GoogleMock (without main() function) +Version: 1.16.0 +URL: https://github.com/google/googletest +Requires: gtest = 1.16.0 +Libs: -L${libdir} -lgmock +Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=0 diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock_main.pc b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock_main.pc new file mode 100644 index 0000000..317b487 --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gmock_main.pc @@ -0,0 +1,10 @@ +libdir=C:/Program Files (x86)/FESA/lib +includedir=C:/Program Files (x86)/FESA/include + +Name: gmock_main +Description: GoogleMock (with main() function) +Version: 1.16.0 +URL: https://github.com/google/googletest +Requires: gmock = 1.16.0 +Libs: -L${libdir} -lgmock_main +Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=0 diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest.pc b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest.pc new file mode 100644 index 0000000..f8cf008 --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest.pc @@ -0,0 +1,9 @@ +libdir=C:/Program Files (x86)/FESA/lib +includedir=C:/Program Files (x86)/FESA/include + +Name: gtest +Description: GoogleTest (without main() function) +Version: 1.16.0 +URL: https://github.com/google/googletest +Libs: -L${libdir} -lgtest +Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=0 diff --git a/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest_main.pc b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest_main.pc new file mode 100644 index 0000000..464e309 --- /dev/null +++ b/.harness/build-ninja/_deps/googletest-build/googletest/generated/gtest_main.pc @@ -0,0 +1,10 @@ +libdir=C:/Program Files (x86)/FESA/lib +includedir=C:/Program Files (x86)/FESA/include + +Name: gtest_main +Description: GoogleTest (with main() function) +Version: 1.16.0 +URL: https://github.com/google/googletest +Requires: gtest = 1.16.0 +Libs: -L${libdir} -lgtest_main +Cflags: -I${includedir} -DGTEST_HAS_PTHREAD=0 diff --git a/.harness/build-ninja/build.ninja b/.harness/build-ninja/build.ninja new file mode 100644 index 0000000..46a298b --- /dev/null +++ b/.harness/build-ninja/build.ninja @@ -0,0 +1,2058 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 4.4 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: FESA +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles\rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\ + +############################################# +# Utility command for test + +build CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build test: phony CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build list_install_components: phony + + +############################################# +# Utility command for install + +build CMakeFiles\install.util: CUSTOM_COMMAND all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build install: phony CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build CMakeFiles\install\local.util: CUSTOM_COMMAND all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build install\local: phony CMakeFiles\install\local.util + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/cmake/FesaDependencies.cmake +# ============================================================================= + + +############################################# +# Utility command for test + +build _deps\googletest-build\CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build _deps\googletest-build\test: phony _deps\googletest-build\CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build _deps\googletest-build\CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build _deps\googletest-build\edit_cache: phony _deps\googletest-build\CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build _deps\googletest-build\CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build _deps\googletest-build\rebuild_cache: phony _deps\googletest-build\CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build _deps\googletest-build\list_install_components: phony + + +############################################# +# Utility command for install + +build _deps\googletest-build\CMakeFiles\install.util: CUSTOM_COMMAND _deps\googletest-build\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build _deps\googletest-build\install: phony _deps\googletest-build\CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build _deps\googletest-build\CMakeFiles\install\local.util: CUSTOM_COMMAND _deps\googletest-build\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build _deps\googletest-build\install\local: phony _deps\googletest-build\CMakeFiles\install\local.util + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# C:/git/googletest/CMakeLists.txt +# ============================================================================= + +# ============================================================================= +# Object build statements for STATIC_LIBRARY target gmock + + +############################################# +# Order-only phony target for gmock + +build cmake_object_order_depends_target_gmock: phony || . + +build _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\C_\git\googletest\googletest\src\gtest-all.cc.obj: CXX_COMPILER__gmock_unscanned_Debug C$:\git\googletest\googletest\src\gtest-all.cc || cmake_object_order_depends_target_gmock + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googlemock\include -IC:\git\googletest\googlemock -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + OBJECT_FILE_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\C_\git\googletest\googletest\src + TARGET_COMPILE_PDB = lib\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + +build _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\src\gmock-all.cc.obj: CXX_COMPILER__gmock_unscanned_Debug C$:\git\googletest\googlemock\src\gmock-all.cc || cmake_object_order_depends_target_gmock + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googlemock\include -IC:\git\googletest\googlemock -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + OBJECT_FILE_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\src + TARGET_COMPILE_PDB = lib\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + + +# ============================================================================= +# Link build statements for STATIC_LIBRARY target gmock + + +############################################# +# Link the static library lib\gmock.lib + +build lib\gmock.lib: CXX_STATIC_LIBRARY_LINKER__gmock_Debug _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\C_\git\googletest\googletest\src\gtest-all.cc.obj _deps\googletest-build\googlemock\CMakeFiles\gmock.dir\src\gmock-all.cc.obj + CONFIG = Debug + LANGUAGE_COMPILE_FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = lib\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_FILE = lib\gmock.lib + TARGET_PDB = bin\gmockpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock.dir + +# ============================================================================= +# Object build statements for STATIC_LIBRARY target gmock_main + + +############################################# +# Order-only phony target for gmock_main + +build cmake_object_order_depends_target_gmock_main: phony || . + +build _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\C_\git\googletest\googletest\src\gtest-all.cc.obj: CXX_COMPILER__gmock_main_unscanned_Debug C$:\git\googletest\googletest\src\gtest-all.cc || cmake_object_order_depends_target_gmock_main + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googlemock\include -IC:\git\googletest\googlemock -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + OBJECT_FILE_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\C_\git\googletest\googletest\src + TARGET_COMPILE_PDB = lib\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + +build _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src\gmock-all.cc.obj: CXX_COMPILER__gmock_main_unscanned_Debug C$:\git\googletest\googlemock\src\gmock-all.cc || cmake_object_order_depends_target_gmock_main + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googlemock\include -IC:\git\googletest\googlemock -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + OBJECT_FILE_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src + TARGET_COMPILE_PDB = lib\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + +build _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src\gmock_main.cc.obj: CXX_COMPILER__gmock_main_unscanned_Debug C$:\git\googletest\googlemock\src\gmock_main.cc || cmake_object_order_depends_target_gmock_main + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googlemock\include -IC:\git\googletest\googlemock -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + OBJECT_FILE_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src + TARGET_COMPILE_PDB = lib\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + + +# ============================================================================= +# Link build statements for STATIC_LIBRARY target gmock_main + + +############################################# +# Link the static library lib\gmock_main.lib + +build lib\gmock_main.lib: CXX_STATIC_LIBRARY_LINKER__gmock_main_Debug _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\C_\git\googletest\googletest\src\gtest-all.cc.obj _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src\gmock-all.cc.obj _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir\src\gmock_main.cc.obj + CONFIG = Debug + LANGUAGE_COMPILE_FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 + OBJECT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = lib\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_FILE = lib\gmock_main.lib + TARGET_PDB = bin\gmock_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googlemock\CMakeFiles\gmock_main.dir + + +############################################# +# Utility command for test + +build _deps\googletest-build\googlemock\CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build _deps\googletest-build\googlemock\test: phony _deps\googletest-build\googlemock\CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build _deps\googletest-build\googlemock\CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build _deps\googletest-build\googlemock\edit_cache: phony _deps\googletest-build\googlemock\CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build _deps\googletest-build\googlemock\CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build _deps\googletest-build\googlemock\rebuild_cache: phony _deps\googletest-build\googlemock\CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build _deps\googletest-build\googlemock\list_install_components: phony + + +############################################# +# Utility command for install + +build _deps\googletest-build\googlemock\CMakeFiles\install.util: CUSTOM_COMMAND _deps\googletest-build\googlemock\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build _deps\googletest-build\googlemock\install: phony _deps\googletest-build\googlemock\CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build _deps\googletest-build\googlemock\CMakeFiles\install\local.util: CUSTOM_COMMAND _deps\googletest-build\googlemock\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build _deps\googletest-build\googlemock\install\local: phony _deps\googletest-build\googlemock\CMakeFiles\install\local.util + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# C:/git/googletest/googlemock/CMakeLists.txt +# ============================================================================= + +# ============================================================================= +# Object build statements for STATIC_LIBRARY target gtest + + +############################################# +# Order-only phony target for gtest + +build cmake_object_order_depends_target_gtest: phony || . + +build _deps\googletest-build\googletest\CMakeFiles\gtest.dir\src\gtest-all.cc.obj: CXX_COMPILER__gtest_unscanned_Debug C$:\git\googletest\googletest\src\gtest-all.cc || cmake_object_order_depends_target_gtest + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -IC:\git\googletest\googletest\include -IC:\git\googletest\googletest + OBJECT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest.dir + OBJECT_FILE_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest.dir\src + TARGET_COMPILE_PDB = lib\gtestpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gtestpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest.dir + + +# ============================================================================= +# Link build statements for STATIC_LIBRARY target gtest + + +############################################# +# Link the static library lib\gtest.lib + +build lib\gtest.lib: CXX_STATIC_LIBRARY_LINKER__gtest_Debug _deps\googletest-build\googletest\CMakeFiles\gtest.dir\src\gtest-all.cc.obj + CONFIG = Debug + LANGUAGE_COMPILE_FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 + OBJECT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = lib\gtestpdb_debug_postfix-NOTFOUND.pdb + TARGET_FILE = lib\gtest.lib + TARGET_PDB = bin\gtestpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest.dir + +# ============================================================================= +# Object build statements for STATIC_LIBRARY target gtest_main + + +############################################# +# Order-only phony target for gtest_main + +build cmake_object_order_depends_target_gtest_main: phony || cmake_object_order_depends_target_gtest + +build _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir\src\gtest_main.cc.obj: CXX_COMPILER__gtest_main_unscanned_Debug C$:\git\googletest\googletest\src\gtest_main.cc || cmake_object_order_depends_target_gtest_main + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -GS -W4 -WX -wd4251 -wd4275 -nologo -J -D_UNICODE -DUNICODE -DWIN32 -D_WIN32 -DSTRICT -DWIN32_LEAN_AND_MEAN -wd4702 -utf-8 -DGTEST_HAS_PTHREAD=0 -EHsc -D_HAS_EXCEPTIONS=1 + INCLUDES = -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir + OBJECT_FILE_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir\src + TARGET_COMPILE_PDB = lib\gtest_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_PDB = bin\gtest_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir + + +# ============================================================================= +# Link build statements for STATIC_LIBRARY target gtest_main + + +############################################# +# Link the static library lib\gtest_main.lib + +build lib\gtest_main.lib: CXX_STATIC_LIBRARY_LINKER__gtest_main_Debug _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir\src\gtest_main.cc.obj || lib\gtest.lib + CONFIG = Debug + LANGUAGE_COMPILE_FLAGS = /DWIN32 /D_WINDOWS /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 + OBJECT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = lib\gtest_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_FILE = lib\gtest_main.lib + TARGET_PDB = bin\gtest_mainpdb_debug_postfix-NOTFOUND.pdb + TARGET_SUPPORT_DIR = _deps\googletest-build\googletest\CMakeFiles\gtest_main.dir + + +############################################# +# Utility command for test + +build _deps\googletest-build\googletest\CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build _deps\googletest-build\googletest\test: phony _deps\googletest-build\googletest\CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build _deps\googletest-build\googletest\CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build _deps\googletest-build\googletest\edit_cache: phony _deps\googletest-build\googletest\CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build _deps\googletest-build\googletest\CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build _deps\googletest-build\googletest\rebuild_cache: phony _deps\googletest-build\googletest\CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build _deps\googletest-build\googletest\list_install_components: phony + + +############################################# +# Utility command for install + +build _deps\googletest-build\googletest\CMakeFiles\install.util: CUSTOM_COMMAND _deps\googletest-build\googletest\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build _deps\googletest-build\googletest\install: phony _deps\googletest-build\googletest\CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build _deps\googletest-build\googletest\CMakeFiles\install\local.util: CUSTOM_COMMAND _deps\googletest-build\googletest\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build _deps\googletest-build\googletest\install\local: phony _deps\googletest-build\googletest\CMakeFiles\install\local.util + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/CMakeLists.txt +# ============================================================================= + +# ============================================================================= +# Object build statements for STATIC_LIBRARY target fesa_solver + + +############################################# +# Order-only phony target for fesa_solver + +build cmake_object_order_depends_target_fesa_solver: phony || . + +build src\fesa\CMakeFiles\fesa_solver.dir\analysis\analysis_model.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\analysis\analysis_model.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\analysis + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\analysis\analysis_state.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\analysis\analysis_state.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\analysis + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\analysis\linear_static_analysis.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\analysis\linear_static_analysis.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\analysis + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\app\fesa_application.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\app\fesa_application.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\app + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\app\output_paths.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\app\output_paths.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\app + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\assembly\load_assembler.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\assembly\load_assembler.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\assembly + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\assembly\parallel_for.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\assembly\parallel_for.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\assembly + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\assembly\sparse_assembler.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\assembly\sparse_assembler.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\assembly + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\build_info.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\build_info.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\constraints\essential_constraint_policy.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\constraints\essential_constraint_policy.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\constraints + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\constraints\prescribed_displacement.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\constraints\prescribed_displacement.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\constraints + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\core\ascii.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\core\ascii.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\core + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\core\diagnostic.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\core\diagnostic.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\core + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\core\status.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\core\status.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\core + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\elements\element_factory.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\elements\element_factory.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\elements + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\elements\euler_beam_3d.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\elements\euler_beam_3d.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\elements + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\elements\mitc4_shell.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\elements\mitc4_shell.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\elements + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\fem\dof_manager.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\fem\dof_manager.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\fem + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_builder.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\domain_builder.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_mapping_context.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\domain_mapping_context.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_mapper.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\domain_mapper.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\input_reader.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\input_reader.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\material_property_mapper.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\material_property_mapper.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\step_definition_mapper.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\step_definition_mapper.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\topology_mapper.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\abaqus\topology_mapper.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_atomic_file.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_atomic_file.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_model_writer.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_model_writer.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_primitives.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_primitives.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_result_writer.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_result_writer.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_results_writer.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_results_writer.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_self_check.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\io\hdf5\hdf5_self_check.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5 + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\loads\concentrated_nodal_load.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\loads\concentrated_nodal_load.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\loads + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\materials\isotropic_linear_elastic_material.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\materials\isotropic_linear_elastic_material.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\materials + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\math\dense_blas_internal.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\math\dense_blas_internal.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\math + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\math\matrix.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\math\matrix.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\math + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\math\sparse_matrix.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\math\sparse_matrix.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\math + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\math\vector.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\math\vector.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\math + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\model\domain.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\model\domain.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\model + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\model\shell_geometry.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\model\shell_geometry.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\model + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\model\source_target_resolver.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\model\source_target_resolver.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\model + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\properties\general_beam_section.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\properties\general_beam_section.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\properties + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\properties\shell_section.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\properties\shell_section.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\properties + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\analysis_state_commit.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\analysis_state_commit.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\beam_result_recovery.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\beam_result_recovery.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\global_equilibrium_recovery.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\global_equilibrium_recovery.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\recovery_candidate.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\recovery_candidate.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\result_recovery.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\result_recovery.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\results\shell_result_recovery.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\results\shell_result_recovery.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\results + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +build src\fesa\CMakeFiles\fesa_solver.dir\solvers\linear\mkl_pardiso_solver.cpp.obj: CXX_COMPILER__fesa_solver_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\solvers\linear\mkl_pardiso_solver.cpp || cmake_object_order_depends_target_fesa_solver + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB -D__TBB_NO_IMPLICIT_LINKAGE=1 + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\include" -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:W0 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_solver.dir\solvers\linear + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + + +# ============================================================================= +# Link build statements for STATIC_LIBRARY target fesa_solver + + +############################################# +# Link the static library src\fesa\fesa_solver.lib + +build src\fesa\fesa_solver.lib: CXX_STATIC_LIBRARY_LINKER__fesa_solver_Debug src\fesa\CMakeFiles\fesa_solver.dir\analysis\analysis_model.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\analysis\analysis_state.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\analysis\linear_static_analysis.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\app\fesa_application.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\app\output_paths.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\assembly\load_assembler.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\assembly\parallel_for.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\assembly\sparse_assembler.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\build_info.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\constraints\essential_constraint_policy.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\constraints\prescribed_displacement.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\core\ascii.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\core\diagnostic.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\core\status.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\elements\element_factory.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\elements\euler_beam_3d.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\elements\mitc4_shell.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\fem\dof_manager.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_builder.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_mapping_context.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\domain_mapper.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\input_reader.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\material_property_mapper.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\step_definition_mapper.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\abaqus\topology_mapper.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_atomic_file.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_model_writer.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_primitives.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_result_writer.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_results_writer.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\io\hdf5\hdf5_self_check.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\loads\concentrated_nodal_load.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\materials\isotropic_linear_elastic_material.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\math\dense_blas_internal.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\math\matrix.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\math\sparse_matrix.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\math\vector.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\model\domain.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\model\shell_geometry.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\model\source_target_resolver.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\properties\general_beam_section.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\properties\shell_section.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\analysis_state_commit.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\beam_result_recovery.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\global_equilibrium_recovery.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\recovery_candidate.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\result_recovery.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\results\shell_result_recovery.cpp.obj src\fesa\CMakeFiles\fesa_solver.dir\solvers\linear\mkl_pardiso_solver.cpp.obj + CONFIG = Debug + LANGUAGE_COMPILE_FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 + OBJECT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + POST_BUILD = cd . + PRE_LINK = cd . + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_solver.dir\fesa_solver.pdb + TARGET_FILE = src\fesa\fesa_solver.lib + TARGET_PDB = src\fesa\fesa_solver.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_solver.dir + +# ============================================================================= +# Object build statements for EXECUTABLE target fesa_cli + + +############################################# +# Order-only phony target for fesa_cli + +build cmake_object_order_depends_target_fesa_cli: phony || cmake_object_order_depends_target_fesa_solver + +build src\fesa\CMakeFiles\fesa_cli.dir\app\main.cpp.obj: CXX_COMPILER__fesa_cli_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\app\main.cpp || cmake_object_order_depends_target_fesa_cli + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /WX + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include + OBJECT_DIR = src\fesa\CMakeFiles\fesa_cli.dir + OBJECT_FILE_DIR = src\fesa\CMakeFiles\fesa_cli.dir\app + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_cli.dir\ + TARGET_PDB = src\fesa\fesa.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_cli.dir + + +# ============================================================================= +# Link build statements for EXECUTABLE target fesa_cli + + +############################################# +# Link the executable src\fesa\fesa.exe + +build src\fesa\fesa.exe: CXX_EXECUTABLE_LINKER__fesa_cli_Debug src\fesa\CMakeFiles\fesa_cli.dir\app\main.cpp.obj | src\fesa\fesa_solver.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib C$:\Program$ Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib || src\fesa\fesa_solver.lib + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console + LINK_LIBRARIES = src\fesa\fesa_solver.lib "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib" "C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib" "C:\Program Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib" shlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib + OBJECT_DIR = src\fesa\CMakeFiles\fesa_cli.dir + POST_BUILD = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libiomp5md.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libmmd.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_def.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" "C:/Program Files/HDF_Group/HDF5/2.1.1/bin/hdf5.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa" + PRE_LINK = cd . + TARGET_COMPILE_PDB = src\fesa\CMakeFiles\fesa_cli.dir\ + TARGET_FILE = src\fesa\fesa.exe + TARGET_IMPLIB = src\fesa\fesa.lib + TARGET_PDB = src\fesa\fesa.pdb + TARGET_SUPPORT_DIR = src\fesa\CMakeFiles\fesa_cli.dir + + +############################################# +# Utility command for test + +build src\fesa\CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build src\fesa\test: phony src\fesa\CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build src\fesa\CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build src\fesa\edit_cache: phony src\fesa\CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build src\fesa\CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build src\fesa\rebuild_cache: phony src\fesa\CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build src\fesa\list_install_components: phony + + +############################################# +# Utility command for install + +build src\fesa\CMakeFiles\install.util: CUSTOM_COMMAND src\fesa\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build src\fesa\install: phony src\fesa\CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build src\fesa\CMakeFiles\install\local.util: CUSTOM_COMMAND src\fesa\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build src\fesa\install\local: phony src\fesa\CMakeFiles\install\local.util + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/CMakeLists.txt +# ============================================================================= + +# ============================================================================= +# Object build statements for EXECUTABLE target fesa_unit_tests + + +############################################# +# Order-only phony target for fesa_unit_tests + +build cmake_object_order_depends_target_fesa_unit_tests: phony || cmake_object_order_depends_target_fesa_solver cmake_object_order_depends_target_gtest cmake_object_order_depends_target_gtest_main + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\build_info_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\build_info_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_model_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_model_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_state_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_state_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\parallel_for_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\parallel_for_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\load_assembler_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\sparse_assembler_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\app\output_paths_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\app + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints\boundary_condition_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints\essential_constraints_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\core\ascii_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\ascii_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\core + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\core\diagnostic_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\diagnostic_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\core + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\core\source_identity_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\source_identity_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\core + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\core\status_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\status_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\core + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\element_factory_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\element_factory_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\elements + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\euler_beam_3d_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\elements + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\mitc4_shell_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\elements + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\fem\dof_manager_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\fem + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\math\dense_blas_internal_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\dense_blas_internal_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\math + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\math\matrix_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\matrix_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\math + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\math\sparse_matrix_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\sparse_matrix_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\math + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\math\vector3_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\math + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\math\vector_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\math + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\domain_mapping_components_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapping_components_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\domain_mapper_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\input_reader_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_reader_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\input_syntax_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_syntax_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5\hdf5_results_writer_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5 + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5\hdf5_writer_components_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_writer_components_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5 + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\loads\load_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\loads\load_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\loads + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\model\domain_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\domain_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\model + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\model\model_types_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\model_types_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\model + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\model\shell_geometry_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\model + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\model\source_target_resolver_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\source_target_resolver_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\model + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\materials\material_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\materials\material_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\materials + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\properties\element_property_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\properties\element_property_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\properties + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_records_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_records_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\results + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_recovery_components_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\results + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_recovery_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\results + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\results\results_writer_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\results_writer_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\results + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear\linear_solver_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\linear_solver_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + +build tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear\mkl_pardiso_solver_test.cpp.obj: CXX_COMPILER__fesa_unit_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp || cmake_object_order_depends_target_fesa_unit_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi -DMKL_ILP64 + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:I"C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + + +# ============================================================================= +# Link build statements for EXECUTABLE target fesa_unit_tests + + +############################################# +# Link the executable tests\fesa_unit_tests.exe + +build tests\fesa_unit_tests.exe tests\fesa_unit_tests_576e7e9d_tests.cmake | ${cmake_ninja_workdir}tests\fesa_unit_tests_576e7e9d_tests.cmake: CXX_EXECUTABLE_LINKER__fesa_unit_tests_Debug tests\CMakeFiles\fesa_unit_tests.dir\unit\build_info_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_model_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\analysis\analysis_state_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\parallel_for_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\load_assembler_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\assembly\sparse_assembler_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\app\output_paths_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints\boundary_condition_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\constraints\essential_constraints_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\core\ascii_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\core\diagnostic_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\core\source_identity_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\core\status_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\element_factory_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\euler_beam_3d_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\elements\mitc4_shell_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\fem\dof_manager_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\math\dense_blas_internal_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\math\matrix_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\math\sparse_matrix_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\math\vector3_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\math\vector_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\domain_mapping_components_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\domain_mapper_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\input_reader_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\abaqus\input_syntax_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5\hdf5_results_writer_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\io\hdf5\hdf5_writer_components_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\loads\load_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\model\domain_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\model\model_types_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\model\shell_geometry_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\model\source_target_resolver_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\materials\material_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\properties\element_property_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_records_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_recovery_components_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\results\result_recovery_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\results\results_writer_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear\linear_solver_test.cpp.obj tests\CMakeFiles\fesa_unit_tests.dir\unit\solvers\linear\mkl_pardiso_solver_test.cpp.obj | src\fesa\fesa_solver.lib lib\gtest_main.lib C$:\Program$ Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib lib\gtest.lib || lib\gtest.lib lib\gtest_main.lib src\fesa\fesa_solver.lib + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console + LINK_LIBRARIES = src\fesa\fesa_solver.lib lib\gtest_main.lib "C:\Program Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib" shlwapi.lib "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib" "C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib" lib\gtest.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib + OBJECT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + POST_BUILD = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libiomp5md.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libmmd.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_def.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files/HDF_Group/HDF5/2.1.1/bin/hdf5.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -P C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_discovery.cmake -- " + PRE_LINK = cd . + RESTAT = 1 + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_unit_tests.dir\ + TARGET_FILE = tests\fesa_unit_tests.exe + TARGET_IMPLIB = tests\fesa_unit_tests.lib + TARGET_PDB = tests\fesa_unit_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_unit_tests.dir + RSP_FILE = CMakeFiles\fesa_unit_tests.rsp + +# ============================================================================= +# Object build statements for EXECUTABLE target fesa_integration_tests + + +############################################# +# Order-only phony target for fesa_integration_tests + +build cmake_object_order_depends_target_fesa_integration_tests: phony || cmake_object_order_depends_target_fesa_solver cmake_object_order_depends_target_gtest cmake_object_order_depends_target_gtest_main + +build tests\CMakeFiles\fesa_integration_tests.dir\integration\analysis\linear_static_analysis_test.cpp.obj: CXX_COMPILER__fesa_integration_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp || cmake_object_order_depends_target_fesa_integration_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_integration_tests.dir\integration\analysis + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_integration_tests.dir\ + TARGET_PDB = tests\fesa_integration_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + +build tests\CMakeFiles\fesa_integration_tests.dir\integration\app\fesa_application_test.cpp.obj: CXX_COMPILER__fesa_integration_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp || cmake_object_order_depends_target_fesa_integration_tests + CONFIG = Debug + DEFINES = -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_integration_tests.dir\integration\app + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_integration_tests.dir\ + TARGET_PDB = tests\fesa_integration_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + + +# ============================================================================= +# Link build statements for EXECUTABLE target fesa_integration_tests + + +############################################# +# Link the executable tests\fesa_integration_tests.exe + +build tests\fesa_integration_tests.exe tests\fesa_integration_tests_d537bc73_tests.cmake | ${cmake_ninja_workdir}tests\fesa_integration_tests_d537bc73_tests.cmake: CXX_EXECUTABLE_LINKER__fesa_integration_tests_Debug tests\CMakeFiles\fesa_integration_tests.dir\integration\analysis\linear_static_analysis_test.cpp.obj tests\CMakeFiles\fesa_integration_tests.dir\integration\app\fesa_application_test.cpp.obj | src\fesa\fesa_solver.lib lib\gtest_main.lib C$:\Program$ Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib lib\gtest.lib || lib\gtest.lib lib\gtest_main.lib src\fesa\fesa_solver.lib + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console + LINK_LIBRARIES = src\fesa\fesa_solver.lib lib\gtest_main.lib "C:\Program Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib" shlwapi.lib "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib" "C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib" lib\gtest.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib + OBJECT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + POST_BUILD = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libiomp5md.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libmmd.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_def.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files/HDF_Group/HDF5/2.1.1/bin/hdf5.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -P C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_discovery.cmake -- " + PRE_LINK = cd . + RESTAT = 1 + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_integration_tests.dir\ + TARGET_FILE = tests\fesa_integration_tests.exe + TARGET_IMPLIB = tests\fesa_integration_tests.lib + TARGET_PDB = tests\fesa_integration_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_integration_tests.dir + +# ============================================================================= +# Object build statements for EXECUTABLE target fesa_reference_tests + + +############################################# +# Order-only phony target for fesa_reference_tests + +build cmake_object_order_depends_target_fesa_reference_tests: phony || cmake_object_order_depends_target_fesa_solver cmake_object_order_depends_target_gtest cmake_object_order_depends_target_gtest_main + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_tolerance_policy.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_tolerance_policy_test.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_comparison.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_comparison_test.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\b33_reference_comparison_test.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\b33_reference_comparison_test.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_comparison.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_comparison_test.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + +build tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_cases_test.cpp.obj: CXX_COMPILER__fesa_reference_tests_unscanned_Debug C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_cases_test.cpp || cmake_object_order_depends_target_fesa_reference_tests + CONFIG = Debug + DEFINES = -DFESA_TEST_BINARY_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja\" -DFESA_TEST_SOURCE_DIR=\"C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson\" -DH5_BUILT_AS_DYNAMIC_LIB + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi + INCLUDES = -IC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\include -external:I"C:\Program Files\HDF_Group\HDF5\2.1.1\include" -external:IC:\git\googletest\googletest\include -external:IC:\git\googletest\googletest -external:W0 + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + OBJECT_FILE_DIR = tests\CMakeFiles\fesa_reference_tests.dir\reference + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + + +# ============================================================================= +# Link build statements for EXECUTABLE target fesa_reference_tests + + +############################################# +# Link the executable tests\fesa_reference_tests.exe + +build tests\fesa_reference_tests.exe tests\fesa_reference_tests_ac7cf2f0_tests.cmake | ${cmake_ninja_workdir}tests\fesa_reference_tests_ac7cf2f0_tests.cmake: CXX_EXECUTABLE_LINKER__fesa_reference_tests_Debug tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_tolerance_policy.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_tolerance_policy_test.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_comparison.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\reference_comparison_test.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\b33_reference_comparison_test.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_comparison.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_comparison_test.cpp.obj tests\CMakeFiles\fesa_reference_tests.dir\reference\mitc4_reference_cases_test.cpp.obj | src\fesa\fesa_solver.lib lib\gtest_main.lib C$:\Program$ Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib lib\gtest.lib || lib\gtest.lib lib\gtest_main.lib src\fesa\fesa_solver.lib + CONFIG = Debug + FLAGS = /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -MDd -Zi + LINK_FLAGS = /machine:x64 /debug /INCREMENTAL /subsystem:console + LINK_LIBRARIES = src\fesa\fesa_solver.lib lib\gtest_main.lib "C:\Program Files\HDF_Group\HDF5\2.1.1\lib\hdf5.lib" shlwapi.lib "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_ilp64_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_intel_thread_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\mkl\2026.1\lib\mkl_core_dll.lib" "C:\Program Files (x86)\Intel\oneAPI\compiler\2026.1\lib\libiomp5md.lib" "C:\Program Files (x86)\Intel\oneAPI\tbb\2023.1\lib\tbb12_debug.lib" lib\gtest.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib + OBJECT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + POST_BUILD = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libiomp5md.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/../../compiler/2026.1/bin/libmmd.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_def.3.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && "C:\Program Files\CMake\bin\cmake.exe" -E copy_if_different "C:/Program Files/HDF_Group/HDF5/2.1.1/bin/hdf5.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_intel_thread.3.dll" "C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/bin/mkl_core.3.dll" "C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/bin/tbb12_debug.dll" C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests && cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -P C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_discovery.cmake -- " + PRE_LINK = cd . + RESTAT = 1 + TARGET_COMPILE_PDB = tests\CMakeFiles\fesa_reference_tests.dir\ + TARGET_FILE = tests\fesa_reference_tests.exe + TARGET_IMPLIB = tests\fesa_reference_tests.lib + TARGET_PDB = tests\fesa_reference_tests.pdb + TARGET_SUPPORT_DIR = tests\CMakeFiles\fesa_reference_tests.dir + + +############################################# +# Utility command for fesa_tests + +build tests\fesa_tests: phony tests\CMakeFiles\fesa_tests tests\fesa_integration_tests.exe tests\fesa_reference_tests.exe tests\fesa_unit_tests.exe + + +############################################# +# Utility command for test + +build tests\CMakeFiles\test.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\ctest.exe" " + DESC = Running tests... + pool = console + restat = 1 + +build tests\test: phony tests\CMakeFiles\test.util + + +############################################# +# Utility command for edit_cache + +build tests\CMakeFiles\edit_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake-gui.exe" -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build tests\edit_cache: phony tests\CMakeFiles\edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build tests\CMakeFiles\rebuild_cache.util: CUSTOM_COMMAND + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" --regenerate-during-build -SC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson -BC:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build tests\rebuild_cache: phony tests\CMakeFiles\rebuild_cache.util + + +############################################# +# Utility command for list_install_components + +build tests\list_install_components: phony + + +############################################# +# Utility command for install + +build tests\CMakeFiles\install.util: CUSTOM_COMMAND tests\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -P cmake_install.cmake" + DESC = Install the project... + pool = console + restat = 1 + +build tests\install: phony tests\CMakeFiles\install.util + + +############################################# +# Utility command for install/local + +build tests\CMakeFiles\install\local.util: CUSTOM_COMMAND tests\all + COMMAND = C:\WINDOWS\system32\cmd.exe /C "cd /D C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests && "C:\Program Files\CMake\bin\cmake.exe" -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake" + DESC = Installing only the local directory... + pool = console + restat = 1 + +build tests\install\local: phony tests\CMakeFiles\install\local.util + + +############################################# +# Phony custom command for tests\CMakeFiles\fesa_tests + +build tests\CMakeFiles\fesa_tests | ${cmake_ninja_workdir}tests\CMakeFiles\fesa_tests: phony tests\fesa_unit_tests.exe tests\fesa_integration_tests.exe tests\fesa_reference_tests.exe || lib\gtest.lib lib\gtest_main.lib src\fesa\fesa_solver.lib tests\fesa_integration_tests.exe tests\fesa_reference_tests.exe tests\fesa_unit_tests.exe + +# ============================================================================= +# Target aliases. + +build fesa.exe: phony src\fesa\fesa.exe + +build fesa_cli: phony src\fesa\fesa.exe + +build fesa_integration_tests: phony tests\fesa_integration_tests.exe + +build fesa_integration_tests.exe: phony tests\fesa_integration_tests.exe + +build fesa_reference_tests: phony tests\fesa_reference_tests.exe + +build fesa_reference_tests.exe: phony tests\fesa_reference_tests.exe + +build fesa_solver: phony src\fesa\fesa_solver.lib + +build fesa_solver.lib: phony src\fesa\fesa_solver.lib + +build fesa_tests: phony tests\fesa_tests + +build fesa_unit_tests: phony tests\fesa_unit_tests.exe + +build fesa_unit_tests.exe: phony tests\fesa_unit_tests.exe + +build gmock: phony lib\gmock.lib + +build gmock.lib: phony lib\gmock.lib + +build gmock_main: phony lib\gmock_main.lib + +build gmock_main.lib: phony lib\gmock_main.lib + +build gtest: phony lib\gtest.lib + +build gtest.lib: phony lib\gtest.lib + +build gtest_main: phony lib\gtest_main.lib + +build gtest_main.lib: phony lib\gtest_main.lib + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja + +build all: phony src\fesa\all tests\all + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/_deps/googletest-build + +build _deps\googletest-build\all: phony _deps\googletest-build\googlemock\all + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/_deps/googletest-build/googlemock + +build _deps\googletest-build\googlemock\all: phony lib\gmock.lib lib\gmock_main.lib _deps\googletest-build\googletest\all + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/_deps/googletest-build/googletest + +build _deps\googletest-build\googletest\all: phony lib\gtest.lib lib\gtest_main.lib + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/src/fesa + +build src\fesa\all: phony src\fesa\fesa_solver.lib src\fesa\fesa.exe + +# ============================================================================= + +############################################# +# Folder: C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests + +build tests\all: phony tests\fesa_unit_tests.exe tests\fesa_integration_tests.exe tests\fesa_reference_tests.exe + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests\cmake_install.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\CTestTestfile.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\CTestTestfile.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googlemock\CTestTestfile.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\_deps\googletest-build\googletest\CTestTestfile.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\src\fesa\CTestTestfile.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\.harness\build-ninja\tests\CTestTestfile.cmake: RERUN_CMAKE | C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\cmake\mkl\MKLConfig.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\cmake\mkl\MKLConfigVersion.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\cmake\tbb\TBBConfig.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\cmake\tbb\TBBConfigVersion.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\BasicConfigVersion-AnyNewerVersion.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCCompilerABI.c C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXCompilerABI.cpp C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCommonLanguageInclude.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCompilerIdDetection.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDependentOption.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCXXCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerABI.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerId.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerSupport.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineRCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineSystem.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeFindBinUtils.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeFindDependencyMacro.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeGenericSystem.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeInitializeConfigs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeLanguageInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakePackageConfigHelpers.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseImplicitIncludeInfo.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseImplicitLinkInfo.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseLibraryArchitecture.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeRCCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeRCInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystem.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystemSpecificInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystemSpecificInitialize.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCXXCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCompilerCommon.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestRCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckCSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckCXXSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckIncludeFile.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckIncludeFileCXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckLibraryExists.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ADSP-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ARMCC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ARMClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\AppleClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Borland-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Bruce-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\CMakeCommonCompilerMacros.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Clang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Clang-DetermineCompilerInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Compaq-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Compaq-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Cray-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\CrayClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Diab-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Embarcadero-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Fujitsu-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\FujitsuClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GHS-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GNU-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GNU-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\HP-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\HP-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IAR-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMCPP-C-DetermineVersionInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMCPP-CXX-DetermineVersionInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMClang-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMClang-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Intel-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IntelLLVM-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\LCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\LCC-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-CXX-CXXImportStd.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\NVHPC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\NVIDIA-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\OpenWatcom-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\OrangeC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PGI-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PathScale-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PellesC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Renesas-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SCO-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SDCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SunPro-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SunPro-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TI-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TIClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Tasking-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TinyCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\VisualAge-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\VisualAge-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Watcom-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XL-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XL-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XLClang-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XLClang-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\zOS-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\zOS-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindDoxygen.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindPackageHandleStandardArgs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindPackageMessage.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindThreads.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\GNUInstallDirs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\GoogleTest.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCXXLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCommonLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeDetermineLinkerId.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeInspectCLinker.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeInspectCXXLinker.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CheckSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\FeatureTesting.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-Determine-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-Initialize.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\WindowsPaths.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\WriteBasicConfigVersionFile.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-config-version.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-config.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_java-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_java-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_static-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_static-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\libaec-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\libaec-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\zlib-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\zlib-targets.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\CMakeLists.txt C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\cmake\FesaDependencies.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\CMakeLists.txt C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\CMakeLists.txt C$:\git\googletest\CMakeLists.txt C$:\git\googletest\googlemock\CMakeLists.txt C$:\git\googletest\googlemock\cmake\gmock.pc.in C$:\git\googletest\googlemock\cmake\gmock_main.pc.in C$:\git\googletest\googletest\CMakeLists.txt C$:\git\googletest\googletest\cmake\Config.cmake.in C$:\git\googletest\googletest\cmake\gtest.pc.in C$:\git\googletest\googletest\cmake\gtest_main.pc.in C$:\git\googletest\googletest\cmake\internal_utils.cmake CMakeCache.txt CMakeFiles\4.4.0\CMakeCCompiler.cmake CMakeFiles\4.4.0\CMakeCXXCompiler.cmake CMakeFiles\4.4.0\CMakeRCCompiler.cmake CMakeFiles\4.4.0\CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\cmake\mkl\MKLConfig.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\mkl\2026.1\lib\cmake\mkl\MKLConfigVersion.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\cmake\tbb\TBBConfig.cmake C$:\Program$ Files$ (x86)\Intel\oneAPI\tbb\2023.1\lib\cmake\tbb\TBBConfigVersion.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\BasicConfigVersion-AnyNewerVersion.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCCompilerABI.c C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXCompilerABI.cpp C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCXXInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCommonLanguageInclude.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeCompilerIdDetection.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDependentOption.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCXXCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerABI.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerId.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineCompilerSupport.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineRCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeDetermineSystem.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeFindBinUtils.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeFindDependencyMacro.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeGenericSystem.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeInitializeConfigs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeLanguageInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakePackageConfigHelpers.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseImplicitIncludeInfo.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseImplicitLinkInfo.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeParseLibraryArchitecture.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeRCCompiler.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeRCInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystem.cmake.in C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystemSpecificInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeSystemSpecificInitialize.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCXXCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestCompilerCommon.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CMakeTestRCCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckCSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckCXXSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckIncludeFile.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckIncludeFileCXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\CheckLibraryExists.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ADSP-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ARMCC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\ARMClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\AppleClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Borland-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Bruce-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\CMakeCommonCompilerMacros.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Clang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Clang-DetermineCompilerInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Compaq-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Compaq-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Cray-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\CrayClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Diab-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Embarcadero-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Fujitsu-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\FujitsuClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GHS-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GNU-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\GNU-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\HP-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\HP-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IAR-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMCPP-C-DetermineVersionInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMCPP-CXX-DetermineVersionInternal.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMClang-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IBMClang-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Intel-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\IntelLLVM-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\LCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\LCC-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-CXX-CXXImportStd.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\NVHPC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\NVIDIA-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\OpenWatcom-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\OrangeC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PGI-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PathScale-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\PellesC-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Renesas-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SCO-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SDCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SunPro-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\SunPro-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TI-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TIClang-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Tasking-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\TinyCC-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\VisualAge-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\VisualAge-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\Watcom-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XL-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XL-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XLClang-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\XLClang-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\zOS-C-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Compiler\zOS-CXX-DetermineCompiler.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindDoxygen.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindPackageHandleStandardArgs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindPackageMessage.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\FindThreads.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\GNUInstallDirs.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\GoogleTest.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCXXLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeCommonLinkerInformation.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeDetermineLinkerId.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeInspectCLinker.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CMakeInspectCXXLinker.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\CheckSourceCompiles.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Internal\FeatureTesting.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Linker\MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Linker\Windows-MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-Determine-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-Initialize.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC-C.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC-CXX.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows-MSVC.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\Windows.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\Platform\WindowsPaths.cmake C$:\Program$ Files\CMake\share\cmake-4.4\Modules\WriteBasicConfigVersionFile.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-config-version.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-config.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_java-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_java-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_static-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\hdf5_static-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\libaec-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\libaec-targets.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\zlib-targets-relwithdebinfo.cmake C$:\Program$ Files\HDF_Group\HDF5\2.1.1\cmake\zlib-targets.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\CMakeLists.txt C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\cmake\FesaDependencies.cmake C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\src\fesa\CMakeLists.txt C$:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\CMakeLists.txt C$:\git\googletest\CMakeLists.txt C$:\git\googletest\googlemock\CMakeLists.txt C$:\git\googletest\googlemock\cmake\gmock.pc.in C$:\git\googletest\googlemock\cmake\gmock_main.pc.in C$:\git\googletest\googletest\CMakeLists.txt C$:\git\googletest\googletest\cmake\Config.cmake.in C$:\git\googletest\googletest\cmake\gtest.pc.in C$:\git\googletest\googletest\cmake\gtest_main.pc.in C$:\git\googletest\googletest\cmake\internal_utils.cmake CMakeCache.txt CMakeFiles\4.4.0\CMakeCCompiler.cmake CMakeFiles\4.4.0\CMakeCXXCompiler.cmake CMakeFiles\4.4.0\CMakeRCCompiler.cmake CMakeFiles\4.4.0\CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/.harness/build-ninja/reference/cantilever-beam-b33/cantilever beam.inp b/.harness/build-ninja/reference/cantilever-beam-b33/cantilever beam.inp new file mode 100644 index 0000000..9eedc9c --- /dev/null +++ b/.harness/build-ninja/reference/cantilever-beam-b33/cantilever beam.inp @@ -0,0 +1,106 @@ +*Heading +** Job name: Job-1 Model name: Model-1 +** Generated by: Abaqus/CAE Learning Edition 2024 +*Preprint, echo=NO, model=NO, history=NO, contact=NO +** +** PARTS +** +*Part, name=PART-1_1 +*Node + 1, 0., 0., 0. + 2, 1., 0., 0. + 3, 2., 0., 0. + 4, 3., 0., 0. + 5, 4., 0., 0. + 6, 5., 0., 0. + 7, 6., 0., 0. + 8, 7., 0., 0. + 9, 8., 0., 0. + 10, 9., 0., 0. + 11, 10., 0., 0. +*Element, type=B33 + 1, 1, 2 + 2, 2, 3 + 3, 3, 4 + 4, 4, 5 + 5, 5, 6 + 6, 6, 7 + 7, 7, 8 + 8, 8, 9 + 9, 9, 10 +10, 10, 11 +*Elset, elset=Set-1, generate + 1, 10, 1 +*Elset, elset=Set-2, generate + 1, 10, 1 +*Elset, elset=Set-3, generate + 1, 10, 1 +*Elset, elset=Set-4, generate + 1, 10, 1 +** Section: Section-1 Profile: Profile-1 +*Beam General Section, elset=Set-1, material=Material-1, section=GENERAL +1., 0.0833333, 0., 0.0833333, 0.140833 +0.,1.,0. +*End Part +** +** +** ASSEMBLY +** +*Assembly, name=Assembly +** +*Instance, name=PART-1_1-1, part=PART-1_1 +*End Instance +** +*Nset, nset=Set-3, instance=PART-1_1-1 + 1, +*Nset, nset=Set-4, instance=PART-1_1-1 + 11, +*End Assembly +** +** MATERIALS +** +*Material, name=Material-1 +*Elastic + 2.1e+11, 0.3 +** +** BOUNDARY CONDITIONS +** +** Name: BC-1 Type: Displacement/Rotation +*Boundary +Set-3, 1, 1 +Set-3, 2, 2 +Set-3, 3, 3 +Set-3, 4, 4 +Set-3, 5, 5 +Set-3, 6, 6 +** ---------------------------------------------------------------- +** +** STEP: Step-1 +** +*Step, name=Step-1, nlgeom=NO +*Static +1., 1., 1e-05, 1. +** +** LOADS +** +** Name: Load-1 Type: Concentrated force +*Cload +Set-4, 3, -1e+06 +** +** OUTPUT REQUESTS +** +*Restart, write, frequency=0 +** +** FIELD OUTPUT: F-Output-1 +** +*Output, field +*Node Output +CF, RF, TF, U +*Element Output, directions=YES +LE, NFORC, NFORCSO, PE, PEEQ, PEMAG, S, SF +*Contact Output, variable=PRESELECT +** +** HISTORY OUTPUT: H-Output-1 +** +*Output, history, variable=PRESELECT +*End Step diff --git a/.harness/build-ninja/reference/cantilever-beam-b33/comparison.json b/.harness/build-ninja/reference/cantilever-beam-b33/comparison.json new file mode 100644 index 0000000..1ca12a3 --- /dev/null +++ b/.harness/build-ninja/reference/cantilever-beam-b33/comparison.json @@ -0,0 +1 @@ +{"rows":[{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-1.0000000000000001e-30,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0000000000000001e-30,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":9.9999999999999994e-30,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":9.9999999999999994e-30,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.00027619058666684742,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.00027619057800000002,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":8.6668474046786015e-12,"threshold":1.3809528900000002e-05,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":3.1379953173777712e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.00054285736000035233,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.00054285733499999996,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":2.5000352374231205e-11,"threshold":2.7142866749999998e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":4.6053264388941535e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0010666670933340199,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.00106666714,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":4.6665980107940541e-11,"threshold":5.3333357000000002e-05,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":4.3749336937425992e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.00102857184000065,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0010285718600000001,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.9999350049301756e-11,"threshold":5.1428593000000005e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":1.9443804392336531e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0023142866400014625,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.00231428654,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0000146240599084e-10,"threshold":0.000115714327,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":4.3210493029955932e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0014571434400008924,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0014571434600000001,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.9999107621695988e-11,"threshold":7.2857173000000011e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":1.3724872101265847e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0039619063466691208,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0039619063,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":4.6669120824793797e-11,"threshold":0.00019809531500000001,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":1.1779461019760563e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.001828572160001083,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.00182857213,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":3.0001082998096229e-11,"threshold":9.1428606500000009e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":1.6406835971024141e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0059523833333369452,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0059523833899999996,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":5.6663054456840278e-11,"threshold":0.00029761916950000003,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":9.5193892503688811e-09,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0021428580000012261,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0021428579900000001,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0001225975858619e-11,"threshold":0.00010714289950000001,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":4.6672369436196838e-09,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0082285747200048897,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0082285748800000006,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.5999511090991625e-10,"threshold":0.00041142874400000004,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":1.9443842128579649e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.002400000960001323,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0024000010499999999,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":8.9998676913727316e-11,"threshold":0.0001200000525,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":3.7499432308051413e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.010733337626672909,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0107333381,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":4.7332709106340243e-10,"threshold":0.00053666690500000006,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":4.4098777719803909e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0026000010400013753,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.00260000094,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0000137523613617e-10,"threshold":0.00013000004700000002,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":3.8462053493002263e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.013409529173340963,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0134095289,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":2.733409627114769e-10,"threshold":0.0006704764450000001,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":2.0384083941343898e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0027428582400013941,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0027428581399999998,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0000139431809441e-10,"threshold":0.00013714290699999999,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":3.645882842416867e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.016200006480009025,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.016200005999999999,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":4.8000902558298364e-10,"threshold":0.00081000030000000006,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":2.9630175790242526e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0028285725600013939,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0028285726400000002,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":7.9998606263703698e-11,"threshold":0.00014142863200000002,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":2.8282323434940561e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UX","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UY","value":0,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":0.00019047627199999999,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.019047626666677083,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"UZ","value":-0.0190476272,"unit_dimension":"length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":5.3332291707897106e-10,"threshold":0.00095238136000000005,"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"relative_error":2.7999441162885163e-08,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URX","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0028571440000013902,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URY","value":0.0028571439899999999,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":1.0001390340907967e-11,"threshold":0.00014285719949999999,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":3.5004852313753944e-09,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"displacement","component":"URZ","value":0,"unit_dimension":"radian","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/displacement"},"absolute_error":0,"threshold":2.85714399e-05,"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1000000.0000008196,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1000000,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":8.1956386566162109e-07,"threshold":50000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":8.1956386566162112e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":-10000000.000005051,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":-10000000,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.0514936447143555e-06,"threshold":500000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":5.0514936447143551e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1.4901161193847656e-08,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.4901161193847656e-08,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":-7.4505805969238281e-09,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":7.4505805969238281e-09,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":2.9802322387695312e-08,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":2.9802322387695312e-08,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":-2.0861625671386719e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":2.0861625671386719e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":-7.4505805969238281e-09,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":7.4505805969238281e-09,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":-5.9604644775390625e-08,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.9604644775390625e-08,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":1.3411045074462891e-07,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.3411045074462891e-07,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1.7881393432617188e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.7881393432617188e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":1.7881393432617188e-07,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.7881393432617188e-07,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1.7881393432617188e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.7881393432617188e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":5.9604644775390625e-08,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.9604644775390625e-08,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":-5.3644180297851562e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.3644180297851562e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":2.9802322387695312e-08,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":2.9802322387695312e-08,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":-5.9604644775390625e-08,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.9604644775390625e-08,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":2.9802322387695312e-08,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":2.9802322387695312e-08,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":-5.9604644775390625e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.9604644775390625e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":2.0861625671386719e-07,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":2.0861625671386719e-07,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF1","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF2","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":1.1920928955078125e-07,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RF3","value":0,"unit_dimension":"force","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":1.1920928955078125e-07,"threshold":10000,"reference_scale":1000000,"near_zero_band":10000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM1","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":-5.9604644775390625e-08,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM2","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":5.9604644775390625e-08,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":0,"endpoint_index":-1,"quantity":"reaction","component":"RM3","value":0,"unit_dimension":"force*length","coordinate_system":"global-cartesian","hdf5_dataset_path":"/steps/Step-1/frames/0/nodal/reaction"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":10000000.000005048,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":10000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":5.0477683544158936e-06,"threshold":500000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":5.0477683544158931e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":1,"source_element_label":1,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":9000000.0000042431,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":9000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":4.2431056499481201e-06,"threshold":450000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.7145618332756893e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":1,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":9000000.0000042599,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":9000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":4.2598694562911987e-06,"threshold":450000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.7331882847679983e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":2,"source_element_label":2,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":8000000.0000034403,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":8000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":3.4403055906295776e-06,"threshold":400000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.3003819882869718e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":2,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":8000000.0000034627,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":8000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":3.4626573324203491e-06,"threshold":400000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.3283216655254363e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":3,"source_element_label":3,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":7000000.0000026366,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":7000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":2.6365742087364197e-06,"threshold":350000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":3.7665345839091709e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":3,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":7000000.0000025677,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":7000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":2.5676563382148743e-06,"threshold":350000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":3.668080483164106e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":4,"source_element_label":4,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":6000000.0000020145,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":6000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":2.01445072889328e-06,"threshold":300000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":3.3574178814887999e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":4,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":6000000.0000018328,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":6000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":1.8328428268432617e-06,"threshold":300000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":3.0547380447387696e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":5,"source_element_label":5,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":5000000.0000013774,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":5000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":1.3774260878562927e-06,"threshold":250000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":2.7548521757125853e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":5,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":5000000.0000012713,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":5000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":1.2712553143501282e-06,"threshold":250000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":2.5425106287002566e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":6,"source_element_label":6,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":4000000.0000006957,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":4000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":6.9569796323776245e-07,"threshold":200000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":1.7392449080944062e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":6,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":4000000.0000006501,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":4000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":6.50063157081604e-07,"threshold":200000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":1.6251578927040101e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":7,"source_element_label":7,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":3000000.0000001346,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":3000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":1.3457611203193665e-07,"threshold":150000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.4858704010645549e-14,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":7,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":3000000.0000002407,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":3000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":2.407468855381012e-07,"threshold":150000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":8.0248961846033735e-14,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":8,"source_element_label":8,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":1999999.9999996345,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":2000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":3.6554411053657532e-07,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":1.8277205526828766e-13,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":8,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":1999999.9999999076,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":2000000,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":9.2433765530586243e-08,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":4.6216882765293121e-14,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":9,"source_element_label":9,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":999999.99999958952,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":999999.875,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0.12499958951957524,"threshold":49999.993750000001,"reference_scale":10000000,"near_zero_band":100000,"relative_error":1.2499960514452589e-07,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":9,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":999999.9999994681,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"My","value":999999.875,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0.12499946809839457,"threshold":49999.993750000001,"reference_scale":10000000,"near_zero_band":100000,"relative_error":1.2499948372333003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":10,"source_element_label":10,"endpoint_index":0,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"N","value":0,"unit_dimension":"force","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":0,"reference_scale":0,"near_zero_band":0,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"zero-scale-exact","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"T","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":2.4286118949223834e-07,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"My","value":-0.015625,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0.015625242861189492,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true},{"fesa":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"reference":{"model_id":"cantilever-beam-b33","step_name":"Step-1","frame_index":0,"instance_name":"PART-1_1-1","source_node_label":11,"source_element_label":10,"endpoint_index":1,"quantity":"section_resultant","component":"Mz","value":0,"unit_dimension":"force*length","coordinate_system":"beam-local","hdf5_dataset_path":"/steps/Step-1/frames/0/element/section_resultant"},"absolute_error":0,"threshold":100000,"reference_scale":10000000,"near_zero_band":100000,"relative_error":0,"relative_error_applicable":false,"tolerance_branch":"near-zero","passed":true}],"metrics":[{"quantity":"displacement","family_identity":"displacement-translation","components":["UX","UY","UZ"],"reference_scale":0.0190476272,"near_zero_band":0.00019047627199999999,"near_zero_count":23,"row_count":33,"maximum_absolute_error":5.3332291707897106e-10,"relative_rms":8.4596232170003814e-09,"worst_row":62,"rms_passed":true,"passed":true,"diagnostic_code":""},{"quantity":"displacement","family_identity":"displacement-rotation","components":["URX","URY","URZ"],"reference_scale":0.0028571439899999999,"near_zero_band":2.85714399e-05,"near_zero_count":23,"row_count":33,"maximum_absolute_error":1.0000139431809441e-10,"relative_rms":1.1723557271997219e-08,"worst_row":52,"rms_passed":true,"passed":true,"diagnostic_code":""},{"quantity":"reaction","family_identity":"reaction-force","components":["RF1","RF2","RF3"],"reference_scale":1000000,"near_zero_band":10000,"near_zero_count":32,"row_count":33,"maximum_absolute_error":8.1956386566162109e-07,"relative_rms":2.0922817757699256e-13,"worst_row":68,"rms_passed":true,"passed":true,"diagnostic_code":""},{"quantity":"reaction","family_identity":"reaction-moment","components":["RM1","RM2","RM3"],"reference_scale":10000000,"near_zero_band":100000,"near_zero_count":32,"row_count":33,"maximum_absolute_error":5.0514936447143555e-06,"relative_rms":8.8111605584712208e-14,"worst_row":70,"rms_passed":true,"passed":true,"diagnostic_code":""},{"quantity":"section_resultant","family_identity":"section-force","components":["N"],"reference_scale":0,"near_zero_band":0,"near_zero_count":20,"row_count":20,"maximum_absolute_error":0,"relative_rms":0,"worst_row":132,"rms_passed":true,"passed":true,"diagnostic_code":""},{"quantity":"section_resultant","family_identity":"section-moment","components":["T","My","Mz"],"reference_scale":10000000,"near_zero_band":100000,"near_zero_count":41,"row_count":60,"maximum_absolute_error":0.12499958951957524,"relative_rms":2.2910664449287597e-09,"worst_row":202,"rms_passed":true,"passed":true,"diagnostic_code":""}],"physics_evidence":{"free_residual_norm":9.3563393211070323e-07,"applied_force":[0,0,-1000000],"reaction_force":[0,0,999999.99999988079],"applied_moment_about_origin":[0,10000000,0],"reaction_moment_about_origin":[0,-9999999.9999972582,0],"endpoint_consistency_passed":true},"stress_comparison_applicable":false,"stress_comparison_reason":"Abaqus beam stress comparison is N/A; analytical/unit and HDF5 schema tests provide stress evidence.","passed":true} diff --git a/.harness/build-ninja/reference/mitc4-shell-s4-comparison/comparison.json b/.harness/build-ninja/reference/mitc4-shell-s4-comparison/comparison.json new file mode 100644 index 0000000..c9e05bd --- /dev/null +++ b/.harness/build-ninja/reference/mitc4-shell-s4-comparison/comparison.json @@ -0,0 +1 @@ +{"case_id":"shell-s4","source_element_type":"S4","internal_formulation":"FESA-MITC4","integration_rule":"2x2x2-gauss; mitc4-edge-midpoint-shear","rows":[{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR1","fesa_value":0,"reference_value":-1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U1","fesa_value":0,"reference_value":-3.1998230000000001e-40,"absolute_error":3.1998230000000001e-40,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U2","fesa_value":0,"reference_value":4.9807135999999997e-39,"absolute_error":4.9807135999999997e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U3","fesa_value":-2.3550441765084857e-05,"reference_value":-2.3740820300000001e-05,"absolute_error":1.9037853491514389e-07,"threshold":1.187041015e-06,"relative_error":0.0080190377800527755,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR1","fesa_value":-1.035480055332503e-20,"reference_value":-1.1241873199999999e-21,"absolute_error":9.2306132333250303e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR2","fesa_value":5.0891712441652425e-21,"reference_value":1.3860685e-22,"absolute_error":4.9505643941652428e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR3","fesa_value":0,"reference_value":1.8744721100000001e-39,"absolute_error":1.8744721100000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR2","fesa_value":0,"reference_value":1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR1","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR2","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR1","fesa_value":0,"reference_value":1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR2","fesa_value":0,"reference_value":-1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR1","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR2","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR1","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR2","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR1","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR2","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U1","fesa_value":0,"reference_value":-7.19702547e-39,"absolute_error":7.19702547e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U2","fesa_value":0,"reference_value":2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U3","fesa_value":-5.0585056699635712e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036429076e-08,"threshold":2.5511187700000005e-07,"relative_error":0.008571116043419074,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR1","fesa_value":-5.6243920395881555e-06,"reference_value":-5.6260682900000002e-06,"absolute_error":1.6762504118447317e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348831921693,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR2","fesa_value":3.400898134293328e-21,"reference_value":-2.7656802000000002e-21,"absolute_error":6.1665783342933285e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR3","fesa_value":0,"reference_value":-2.6971211900000001e-39,"absolute_error":2.6971211900000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U1","fesa_value":0,"reference_value":4.8544846400000002e-39,"absolute_error":4.8544846400000002e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U2","fesa_value":0,"reference_value":3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U3","fesa_value":-1.6215889629758092e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758091623e-08,"threshold":8.0782893000000004e-07,"relative_error":0.003671014218201595,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR1","fesa_value":-7.5506002663693056e-06,"reference_value":-7.6072574299999999e-06,"absolute_error":5.6657163630694338e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821130727,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR2","fesa_value":-1.5524365607222739e-21,"reference_value":1.03518463e-21,"absolute_error":2.5876211907222741e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR3","fesa_value":0,"reference_value":-9.2782633799999999e-40,"absolute_error":9.2782633799999999e-40,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U1","fesa_value":0,"reference_value":3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U2","fesa_value":0,"reference_value":-1.3749642800000001e-38,"absolute_error":1.3749642800000001e-38,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U3","fesa_value":-1.6215889629758081e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758081458e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182009662,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR1","fesa_value":8.920301433811875e-21,"reference_value":4.0481758699999999e-21,"absolute_error":4.8721255638118751e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR2","fesa_value":7.550600266369331e-06,"reference_value":7.6072574299999999e-06,"absolute_error":5.6657163630668927e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821097325,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR3","fesa_value":0,"reference_value":1.30327764e-39,"absolute_error":1.30327764e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U1","fesa_value":0,"reference_value":2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U2","fesa_value":0,"reference_value":-7.3588249999999996e-39,"absolute_error":7.3588249999999996e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U3","fesa_value":-5.0585056699635585e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036441782e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434215651,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR1","fesa_value":1.5645303302567618e-21,"reference_value":1.8280069500000001e-21,"absolute_error":2.6347661974323827e-22,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR2","fesa_value":5.6243920395881385e-06,"reference_value":5.6260682900000002e-06,"absolute_error":1.6762504118616724e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348832222803,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR3","fesa_value":0,"reference_value":2.2499780600000001e-39,"absolute_error":2.2499780600000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR1","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR2","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR1","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR2","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR1","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR2","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR1","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR2","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U1","fesa_value":0,"reference_value":1.4116124400000001e-38,"absolute_error":1.4116124400000001e-38,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U2","fesa_value":0,"reference_value":-2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U3","fesa_value":-5.0585056699635763e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036423994e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434180783,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR1","fesa_value":5.6243920395881571e-06,"reference_value":5.6260682900000002e-06,"absolute_error":1.6762504118430377e-09,"threshold":2.8130341450000001e-07,"relative_error":0.0002979434883189158,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR2","fesa_value":4.4347655236023856e-21,"reference_value":4.4763755300000003e-21,"absolute_error":4.1610006397614764e-23,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR3","fesa_value":0,"reference_value":-3.0512979799999999e-39,"absolute_error":3.0512979799999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U1","fesa_value":0,"reference_value":-5.8484494600000002e-39,"absolute_error":5.8484494600000002e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U2","fesa_value":0,"reference_value":-3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U3","fesa_value":-1.6215889629758105e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758105175e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182024338,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR1","fesa_value":7.5506002663693149e-06,"reference_value":7.6072574299999999e-06,"absolute_error":5.6657163630685021e-08,"threshold":3.8036287150000004e-07,"relative_error":0.007447777882111848,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR2","fesa_value":2.1356311506355561e-20,"reference_value":-1.50497021e-21,"absolute_error":2.2861281716355561e-20,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR3","fesa_value":0,"reference_value":-1.46886487e-39,"absolute_error":1.46886487e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U1","fesa_value":0,"reference_value":-3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U2","fesa_value":0,"reference_value":-6.0932731199999999e-39,"absolute_error":6.0932731199999999e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U3","fesa_value":-1.6215889629758112e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758111951e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182028536,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR1","fesa_value":-1.1112696166449936e-20,"reference_value":1.01630023e-21,"absolute_error":1.2128996396449936e-20,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR2","fesa_value":-7.5506002663693065e-06,"reference_value":-7.6072574299999999e-06,"absolute_error":5.6657163630693491e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821129617,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR3","fesa_value":0,"reference_value":-2.15680433e-39,"absolute_error":2.15680433e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U1","fesa_value":0,"reference_value":-2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U2","fesa_value":0,"reference_value":4.0232974499999997e-39,"absolute_error":4.0232974499999997e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U3","fesa_value":-5.0585056699635797e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036420606e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434174156,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR1","fesa_value":-4.4259335525163488e-21,"reference_value":-1.17114982e-21,"absolute_error":3.2547837325163488e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR2","fesa_value":-5.6243920395881648e-06,"reference_value":-5.6260682900000002e-06,"absolute_error":1.6762504118354144e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348831756082,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR3","fesa_value":0,"reference_value":4.2180695300000003e-39,"absolute_error":4.2180695300000003e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR1","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR2","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR1","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR2","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR1","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR2","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR1","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR2","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR1","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR2","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR1","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR2","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR1","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR2","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR1","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR2","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR1","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR2","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR1","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR2","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR1","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR2","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR1","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR2","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U1","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U2","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U3","fesa_value":-3.9829685019171916e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.574881917191893e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261691977,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR1","fesa_value":-4.5712631023128406e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.2671231284037584e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239150437,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR2","fesa_value":1.398506320372601e-06,"reference_value":1.46733487e-06,"absolute_error":6.882854962739899e-08,"threshold":7.3366743500000007e-08,"relative_error":0.04690718597002945,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U1","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U2","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U3","fesa_value":-1.2104431691990609e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009390823e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616115819,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR1","fesa_value":-4.7611888400534304e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.0992630053430593e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141385,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR2","fesa_value":4.7611888400534338e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053433982e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141457,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR3","fesa_value":0,"reference_value":1.4251779899999999e-39,"absolute_error":1.4251779899999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U1","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U2","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U3","fesa_value":-1.4301280732961153e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038847517e-09,"threshold":7.1619985000000001e-08,"relative_error":0.001585888843654988,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR1","fesa_value":-1.6987437569388302e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061169757e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999136,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR2","fesa_value":1.6987437569388296e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.1911193061170392e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999506,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR3","fesa_value":0,"reference_value":8.6599124099999996e-40,"absolute_error":8.6599124099999996e-40,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U1","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U2","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U3","fesa_value":-3.9829685019171891e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171893519e-09,"threshold":1.98719681e-07,"relative_error":0.002157532126168558,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR1","fesa_value":-1.3985063203725972e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627402802e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970032052,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR2","fesa_value":4.5712631023128397e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.267123128395288e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239131902,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U1","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U2","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U3","fesa_value":-3.9829685019172026e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819172029044e-09,"threshold":1.98719681e-07,"relative_error":0.002157532126171968,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR1","fesa_value":4.5712631023128541e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231285392836e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239446969,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR2","fesa_value":-1.3985063203726052e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627394755e-08,"threshold":7.3366743500000007e-08,"relative_error":0.04690718597002657,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U1","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U2","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U3","fesa_value":-1.2104431691990636e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009363718e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616093588,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR1","fesa_value":4.7611888400534347e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053434829e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741414748,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR2","fesa_value":-4.7611888400534372e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.099263005343737e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741415288,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR3","fesa_value":0,"reference_value":3.3318547500000001e-39,"absolute_error":3.3318547500000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U1","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U2","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U3","fesa_value":-1.4301280732961184e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038815753e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436527704,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR1","fesa_value":1.6987437569388346e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306116531e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735996551,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR2","fesa_value":-1.6987437569388336e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061166369e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735997167,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR3","fesa_value":0,"reference_value":-2.5950646299999998e-41,"absolute_error":2.5950646299999998e-41,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U1","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U2","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U3","fesa_value":-3.9829685019172035e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819172037514e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261721814,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR1","fesa_value":1.3985063203726063e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627393696e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970025848,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR2","fesa_value":-4.5712631023128524e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.267123128522343e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239409903,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U1","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U2","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U3","fesa_value":-1.2104431691990604e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009395906e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616119991,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR1","fesa_value":4.7611888400534169e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053417041e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741410972,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR2","fesa_value":4.7611888400534355e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053435676e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741414929,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR3","fesa_value":0,"reference_value":-1.1940870599999999e-39,"absolute_error":1.1940870599999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U1","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U2","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U3","fesa_value":-3.9829685019171933e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.574881917193587e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261696236,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR1","fesa_value":4.5712631023128456e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231284545804e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239261635,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR2","fesa_value":1.3985063203726016e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627398355e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970029019,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U1","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U2","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U3","fesa_value":-3.9829685019171874e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171876578e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261681317,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR1","fesa_value":1.3985063203725957e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627404284e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970033058,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR2","fesa_value":4.5712631023128363e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231283614067e-10,"threshold":2.2851681950000001e-07,"relative_error":0.0002027667623905777,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U1","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U2","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U3","fesa_value":-1.4301280732961157e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038843282e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436546923,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR1","fesa_value":1.6987437569388298e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306117018e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999383,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR2","fesa_value":1.6987437569388298e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306117018e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999383,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR3","fesa_value":0,"reference_value":2.3219193300000001e-39,"absolute_error":2.3219193300000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U1","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U2","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U3","fesa_value":-1.2104431691990617e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009382353e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616108871,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR1","fesa_value":-4.7611888400534313e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.099263005343144e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141403,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR2","fesa_value":-4.761188840053427e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.0992630053427205e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141313,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U1","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U2","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U3","fesa_value":-3.982968501917195e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171952811e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261700499,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR1","fesa_value":-4.571263102312849e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.2671231284884617e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239335768,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR2","fesa_value":-1.3985063203726012e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627398779e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970029311,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U1","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U2","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U3","fesa_value":-3.9829685019171976e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171978222e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261706895,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR1","fesa_value":-1.3985063203726061e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627393908e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970025987,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR2","fesa_value":-4.5712631023128473e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.267123128471521e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239298702,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U1","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U2","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U3","fesa_value":-1.4301280732961163e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038836929e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436542488,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR1","fesa_value":-1.6987437569388304e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061169545e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999013,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR2","fesa_value":-1.6987437569388317e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061168275e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735998276,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR3","fesa_value":0,"reference_value":1.78609082e-39,"absolute_error":1.78609082e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true}],"metrics":[{"family_identity":"displacement-translation","components":["U1","U2","U3"],"blocking":true,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"near_zero_count":122,"row_count":147,"maximum_absolute_error":1.9037853491514389e-07,"relative_rms":0.0010332756650397166,"worst_row":8,"rms_passed":true,"passed":true,"diagnostic_code":""},{"family_identity":"displacement-rotation","components":["UR1","UR2","UR3"],"blocking":false,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"near_zero_count":107,"row_count":147,"maximum_absolute_error":6.8828549627404284e-08,"relative_rms":0.0029771372973060382,"worst_row":261,"rms_passed":true,"passed":true,"diagnostic_code":""}],"vector_metrics":[{"instance_name":"Part-1-1","source_node_label":1,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":2,"displacement_norm_error":1.9037853491514389e-07,"rotation_norm_error":1.0474364347492016e-20},{"instance_name":"Part-1-1","source_node_label":3,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":4,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":5,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":6,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":7,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":8,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":9,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":10,"displacement_norm_error":4.3731870036429076e-08,"rotation_norm_error":1.6762504118447317e-09},{"instance_name":"Part-1-1","source_node_label":11,"displacement_norm_error":5.9311029758091623e-08,"rotation_norm_error":5.6657163630694338e-08},{"instance_name":"Part-1-1","source_node_label":12,"displacement_norm_error":5.9311029758081458e-08,"rotation_norm_error":5.6657163630668927e-08},{"instance_name":"Part-1-1","source_node_label":13,"displacement_norm_error":4.3731870036441782e-08,"rotation_norm_error":1.6762504118616724e-09},{"instance_name":"Part-1-1","source_node_label":14,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":15,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":16,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":17,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":18,"displacement_norm_error":4.3731870036423994e-08,"rotation_norm_error":1.6762504118430377e-09},{"instance_name":"Part-1-1","source_node_label":19,"displacement_norm_error":5.9311029758105175e-08,"rotation_norm_error":5.6657163630685021e-08},{"instance_name":"Part-1-1","source_node_label":20,"displacement_norm_error":5.9311029758111951e-08,"rotation_norm_error":5.6657163630693491e-08},{"instance_name":"Part-1-1","source_node_label":21,"displacement_norm_error":4.3731870036420606e-08,"rotation_norm_error":1.6762504118354144e-09},{"instance_name":"Part-1-1","source_node_label":22,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":23,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":24,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":25,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":26,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":27,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":28,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":29,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":30,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":31,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":32,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":33,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":34,"displacement_norm_error":8.574881917191893e-09,"rotation_norm_error":6.8834788003756478e-08},{"instance_name":"Part-1-1","source_node_label":35,"displacement_norm_error":8.6436208009390823e-08,"rotation_norm_error":7.211446900263782e-08},{"instance_name":"Part-1-1","source_node_label":36,"displacement_norm_error":2.2716267038847517e-09,"rotation_norm_error":3.0987106394881974e-08},{"instance_name":"Part-1-1","source_node_label":37,"displacement_norm_error":8.5748819171893519e-09,"rotation_norm_error":6.8834788003760276e-08},{"instance_name":"Part-1-1","source_node_label":38,"displacement_norm_error":8.5748819172029044e-09,"rotation_norm_error":6.8834788003752428e-08},{"instance_name":"Part-1-1","source_node_label":39,"displacement_norm_error":8.6436208009363718e-08,"rotation_norm_error":7.211446900264322e-08},{"instance_name":"Part-1-1","source_node_label":40,"displacement_norm_error":2.2716267038815753e-09,"rotation_norm_error":3.0987106394875986e-08},{"instance_name":"Part-1-1","source_node_label":41,"displacement_norm_error":8.5748819172037514e-09,"rotation_norm_error":6.8834788003751329e-08},{"instance_name":"Part-1-1","source_node_label":42,"displacement_norm_error":8.6436208009395906e-08,"rotation_norm_error":7.2114469002629442e-08},{"instance_name":"Part-1-1","source_node_label":43,"displacement_norm_error":8.574881917193587e-09,"rotation_norm_error":6.8834788003755909e-08},{"instance_name":"Part-1-1","source_node_label":44,"displacement_norm_error":8.5748819171876578e-09,"rotation_norm_error":6.8834788003761706e-08},{"instance_name":"Part-1-1","source_node_label":45,"displacement_norm_error":2.2716267038843282e-09,"rotation_norm_error":3.0987106394882127e-08},{"instance_name":"Part-1-1","source_node_label":46,"displacement_norm_error":8.6436208009382353e-08,"rotation_norm_error":7.2114469002633624e-08},{"instance_name":"Part-1-1","source_node_label":47,"displacement_norm_error":8.5748819171952811e-09,"rotation_norm_error":6.8834788003756372e-08},{"instance_name":"Part-1-1","source_node_label":48,"displacement_norm_error":8.5748819171978222e-09,"rotation_norm_error":6.8834788003751488e-08},{"instance_name":"Part-1-1","source_node_label":49,"displacement_norm_error":2.2716267038836929e-09,"rotation_norm_error":3.0987106394880327e-08}],"warnings":[],"worst_row":8,"passed":true} diff --git a/.harness/build-ninja/reference/mitc4-shell-s4-comparison/shell.inp b/.harness/build-ninja/reference/mitc4-shell-s4-comparison/shell.inp new file mode 100644 index 0000000..c107a7c --- /dev/null +++ b/.harness/build-ninja/reference/mitc4-shell-s4-comparison/shell.inp @@ -0,0 +1,164 @@ +*Heading +** Job name: shell Model name: Model-1 +** Generated by: Abaqus/CAE Learning Edition 2024 +*Preprint, echo=NO, model=NO, history=NO, contact=NO +** +** PARTS +** +*Part, name=Part-1 +*Node + 1, 0., -5., 0. + 2, 0., 0., 0. + 3, -5., 0., 0. + 4, -5., -5., 0. + 5, 0., 5., 0. + 6, 5., 0., 0. + 7, 5., 5., 0. + 8, -5., 5., 0. + 9, 5., -5., 0. + 10, 0., -3.33333325, 0. + 11, 0., -1.66666663, 0. + 12, -1.66666663, 0., 0. + 13, -3.33333325, 0., 0. + 14, -5., -1.66666663, 0. + 15, -5., -3.33333325, 0. + 16, -3.33333325, -5., 0. + 17, -1.66666663, -5., 0. + 18, 0., 3.33333325, 0. + 19, 0., 1.66666663, 0. + 20, 1.66666663, 0., 0. + 21, 3.33333325, 0., 0. + 22, 5., 1.66666663, 0. + 23, 5., 3.33333325, 0. + 24, 3.33333325, 5., 0. + 25, 1.66666663, 5., 0. + 26, -1.66666663, 5., 0. + 27, -3.33333325, 5., 0. + 28, -5., 3.33333325, 0. + 29, -5., 1.66666663, 0. + 30, 1.66666663, -5., 0. + 31, 3.33333325, -5., 0. + 32, 5., -3.33333325, 0. + 33, 5., -1.66666663, 0. + 34, -1.66666663, -3.33333325, 0. + 35, -1.66666663, -1.66666663, 0. + 36, -3.33333325, -3.33333325, 0. + 37, -3.33333325, -1.66666663, 0. + 38, 1.66666663, 3.33333325, 0. + 39, 1.66666663, 1.66666663, 0. + 40, 3.33333325, 3.33333325, 0. + 41, 3.33333325, 1.66666663, 0. + 42, -1.66666663, 1.66666663, 0. + 43, -1.66666663, 3.33333325, 0. + 44, -3.33333325, 1.66666663, 0. + 45, -3.33333325, 3.33333325, 0. + 46, 1.66666663, -1.66666663, 0. + 47, 1.66666663, -3.33333325, 0. + 48, 3.33333325, -1.66666663, 0. + 49, 3.33333325, -3.33333325, 0. +*Element, type=S4 + 1, 1, 10, 34, 17 + 2, 10, 11, 35, 34 + 3, 11, 2, 12, 35 + 4, 17, 34, 36, 16 + 5, 34, 35, 37, 36 + 6, 35, 12, 13, 37 + 7, 16, 36, 15, 4 + 8, 36, 37, 14, 15 + 9, 37, 13, 3, 14 +10, 5, 18, 38, 25 +11, 18, 19, 39, 38 +12, 19, 2, 20, 39 +13, 25, 38, 40, 24 +14, 38, 39, 41, 40 +15, 39, 20, 21, 41 +16, 24, 40, 23, 7 +17, 40, 41, 22, 23 +18, 41, 21, 6, 22 +19, 2, 19, 42, 12 +20, 19, 18, 43, 42 +21, 18, 5, 26, 43 +22, 12, 42, 44, 13 +23, 42, 43, 45, 44 +24, 43, 26, 27, 45 +25, 13, 44, 29, 3 +26, 44, 45, 28, 29 +27, 45, 27, 8, 28 +28, 2, 11, 46, 20 +29, 11, 10, 47, 46 +30, 10, 1, 30, 47 +31, 20, 46, 48, 21 +32, 46, 47, 49, 48 +33, 47, 30, 31, 49 +34, 21, 48, 33, 6 +35, 48, 49, 32, 33 +36, 49, 31, 9, 32 +*Nset, nset=Set-1, generate + 1, 49, 1 +*Elset, elset=Set-1, generate + 1, 36, 1 +** Section: Section-1 +*Shell Section, elset=Set-1, material=Material-1 +0.5, 5 +*End Part +** +** +** ASSEMBLY +** +*Assembly, name=Assembly +** +*Instance, name=Part-1-1, part=Part-1 +*End Instance +** +*Nset, nset=Set-1, instance=Part-1-1 + 2, +*Nset, nset=Set-2, instance=Part-1-1 + 1, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 22, 23, 24, 25 + 26, 27, 28, 29, 30, 31, 32, 33 +*Elset, elset=Set-2, instance=Part-1-1 + 1, 4, 7, 8, 9, 10, 13, 16, 17, 18, 21, 24, 25, 26, 27, 30 + 33, 34, 35, 36 +*End Assembly +** +** MATERIALS +** +*Material, name=Material-1 +*Elastic + 2.1e+11, 0.3 +** +** BOUNDARY CONDITIONS +** +** Name: BC-1 Type: Displacement/Rotation +*Boundary +Set-2, 1, 1 +Set-2, 2, 2 +Set-2, 3, 3 +Set-2, 4, 4 +Set-2, 5, 5 +Set-2, 6, 6 +** ---------------------------------------------------------------- +** +** STEP: Step-1 +** +*Step, name=Step-1, nlgeom=NO +*Static +1., 1., 1e-05, 1. +** +** LOADS +** +** Name: Load-1 Type: Concentrated force +*Cload +Set-1, 3, -100000. +** +** OUTPUT REQUESTS +** +*Restart, write, frequency=0 +** +** FIELD OUTPUT: F-Output-1 +** +*Output, field, variable=PRESELECT +** +** HISTORY OUTPUT: H-Output-1 +** +*Output, history, variable=PRESELECT +*End Step diff --git a/.harness/build-ninja/reference/mitc4-shell-s4-metadata/comparison.json b/.harness/build-ninja/reference/mitc4-shell-s4-metadata/comparison.json new file mode 100644 index 0000000..c9e05bd --- /dev/null +++ b/.harness/build-ninja/reference/mitc4-shell-s4-metadata/comparison.json @@ -0,0 +1 @@ +{"case_id":"shell-s4","source_element_type":"S4","internal_formulation":"FESA-MITC4","integration_rule":"2x2x2-gauss; mitc4-edge-midpoint-shear","rows":[{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR1","fesa_value":0,"reference_value":-1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":1,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U1","fesa_value":0,"reference_value":-3.1998230000000001e-40,"absolute_error":3.1998230000000001e-40,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U2","fesa_value":0,"reference_value":4.9807135999999997e-39,"absolute_error":4.9807135999999997e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"U3","fesa_value":-2.3550441765084857e-05,"reference_value":-2.3740820300000001e-05,"absolute_error":1.9037853491514389e-07,"threshold":1.187041015e-06,"relative_error":0.0080190377800527755,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR1","fesa_value":-1.035480055332503e-20,"reference_value":-1.1241873199999999e-21,"absolute_error":9.2306132333250303e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR2","fesa_value":5.0891712441652425e-21,"reference_value":1.3860685e-22,"absolute_error":4.9505643941652428e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":2,"component":"UR3","fesa_value":0,"reference_value":1.8744721100000001e-39,"absolute_error":1.8744721100000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR2","fesa_value":0,"reference_value":1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":3,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR1","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR2","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":4,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR1","fesa_value":0,"reference_value":1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":5,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"U3","fesa_value":0,"reference_value":-1.17769804e-32,"absolute_error":1.17769804e-32,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR2","fesa_value":0,"reference_value":-1.95418427e-32,"absolute_error":1.95418427e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":6,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR1","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR2","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":7,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR1","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR2","fesa_value":0,"reference_value":1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":8,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"U3","fesa_value":0,"reference_value":2.07395071e-35,"absolute_error":2.07395071e-35,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR1","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR2","fesa_value":0,"reference_value":-1.5941319700000001e-33,"absolute_error":1.5941319700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":9,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U1","fesa_value":0,"reference_value":-7.19702547e-39,"absolute_error":7.19702547e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U2","fesa_value":0,"reference_value":2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"U3","fesa_value":-5.0585056699635712e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036429076e-08,"threshold":2.5511187700000005e-07,"relative_error":0.008571116043419074,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR1","fesa_value":-5.6243920395881555e-06,"reference_value":-5.6260682900000002e-06,"absolute_error":1.6762504118447317e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348831921693,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR2","fesa_value":3.400898134293328e-21,"reference_value":-2.7656802000000002e-21,"absolute_error":6.1665783342933285e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":10,"component":"UR3","fesa_value":0,"reference_value":-2.6971211900000001e-39,"absolute_error":2.6971211900000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U1","fesa_value":0,"reference_value":4.8544846400000002e-39,"absolute_error":4.8544846400000002e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U2","fesa_value":0,"reference_value":3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"U3","fesa_value":-1.6215889629758092e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758091623e-08,"threshold":8.0782893000000004e-07,"relative_error":0.003671014218201595,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR1","fesa_value":-7.5506002663693056e-06,"reference_value":-7.6072574299999999e-06,"absolute_error":5.6657163630694338e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821130727,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR2","fesa_value":-1.5524365607222739e-21,"reference_value":1.03518463e-21,"absolute_error":2.5876211907222741e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":11,"component":"UR3","fesa_value":0,"reference_value":-9.2782633799999999e-40,"absolute_error":9.2782633799999999e-40,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U1","fesa_value":0,"reference_value":3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U2","fesa_value":0,"reference_value":-1.3749642800000001e-38,"absolute_error":1.3749642800000001e-38,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"U3","fesa_value":-1.6215889629758081e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758081458e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182009662,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR1","fesa_value":8.920301433811875e-21,"reference_value":4.0481758699999999e-21,"absolute_error":4.8721255638118751e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR2","fesa_value":7.550600266369331e-06,"reference_value":7.6072574299999999e-06,"absolute_error":5.6657163630668927e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821097325,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":12,"component":"UR3","fesa_value":0,"reference_value":1.30327764e-39,"absolute_error":1.30327764e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U1","fesa_value":0,"reference_value":2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U2","fesa_value":0,"reference_value":-7.3588249999999996e-39,"absolute_error":7.3588249999999996e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"U3","fesa_value":-5.0585056699635585e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036441782e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434215651,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR1","fesa_value":1.5645303302567618e-21,"reference_value":1.8280069500000001e-21,"absolute_error":2.6347661974323827e-22,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR2","fesa_value":5.6243920395881385e-06,"reference_value":5.6260682900000002e-06,"absolute_error":1.6762504118616724e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348832222803,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":13,"component":"UR3","fesa_value":0,"reference_value":2.2499780600000001e-39,"absolute_error":2.2499780600000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR1","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR2","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":14,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR1","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR2","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":15,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR1","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR2","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":16,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR1","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR2","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":17,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U1","fesa_value":0,"reference_value":1.4116124400000001e-38,"absolute_error":1.4116124400000001e-38,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U2","fesa_value":0,"reference_value":-2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"U3","fesa_value":-5.0585056699635763e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036423994e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434180783,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR1","fesa_value":5.6243920395881571e-06,"reference_value":5.6260682900000002e-06,"absolute_error":1.6762504118430377e-09,"threshold":2.8130341450000001e-07,"relative_error":0.0002979434883189158,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR2","fesa_value":4.4347655236023856e-21,"reference_value":4.4763755300000003e-21,"absolute_error":4.1610006397614764e-23,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":18,"component":"UR3","fesa_value":0,"reference_value":-3.0512979799999999e-39,"absolute_error":3.0512979799999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U1","fesa_value":0,"reference_value":-5.8484494600000002e-39,"absolute_error":5.8484494600000002e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U2","fesa_value":0,"reference_value":-3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"U3","fesa_value":-1.6215889629758105e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758105175e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182024338,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR1","fesa_value":7.5506002663693149e-06,"reference_value":7.6072574299999999e-06,"absolute_error":5.6657163630685021e-08,"threshold":3.8036287150000004e-07,"relative_error":0.007447777882111848,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR2","fesa_value":2.1356311506355561e-20,"reference_value":-1.50497021e-21,"absolute_error":2.2861281716355561e-20,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":19,"component":"UR3","fesa_value":0,"reference_value":-1.46886487e-39,"absolute_error":1.46886487e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U1","fesa_value":0,"reference_value":-3.1173094499999998e-23,"absolute_error":3.1173094499999998e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U2","fesa_value":0,"reference_value":-6.0932731199999999e-39,"absolute_error":6.0932731199999999e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"U3","fesa_value":-1.6215889629758112e-05,"reference_value":-1.61565786e-05,"absolute_error":5.9311029758111951e-08,"threshold":8.0782893000000004e-07,"relative_error":0.0036710142182028536,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR1","fesa_value":-1.1112696166449936e-20,"reference_value":1.01630023e-21,"absolute_error":1.2128996396449936e-20,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR2","fesa_value":-7.5506002663693065e-06,"reference_value":-7.6072574299999999e-06,"absolute_error":5.6657163630693491e-08,"threshold":3.8036287150000004e-07,"relative_error":0.0074477778821129617,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":20,"component":"UR3","fesa_value":0,"reference_value":-2.15680433e-39,"absolute_error":2.15680433e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U1","fesa_value":0,"reference_value":-2.3171766699999999e-23,"absolute_error":2.3171766699999999e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U2","fesa_value":0,"reference_value":4.0232974499999997e-39,"absolute_error":4.0232974499999997e-39,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"U3","fesa_value":-5.0585056699635797e-06,"reference_value":-5.1022375400000003e-06,"absolute_error":4.3731870036420606e-08,"threshold":2.5511187700000005e-07,"relative_error":0.0085711160434174156,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR1","fesa_value":-4.4259335525163488e-21,"reference_value":-1.17114982e-21,"absolute_error":3.2547837325163488e-21,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR2","fesa_value":-5.6243920395881648e-06,"reference_value":-5.6260682900000002e-06,"absolute_error":1.6762504118354144e-09,"threshold":2.8130341450000001e-07,"relative_error":0.00029794348831756082,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":21,"component":"UR3","fesa_value":0,"reference_value":4.2180695300000003e-39,"absolute_error":4.2180695300000003e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR1","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR2","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":22,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR1","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR2","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":23,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR1","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR2","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":24,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR1","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR2","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":25,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR1","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR2","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":26,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR1","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR2","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":27,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR1","fesa_value":0,"reference_value":1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR2","fesa_value":0,"reference_value":6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":28,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR1","fesa_value":0,"reference_value":5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR2","fesa_value":0,"reference_value":1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":29,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR1","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR2","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":30,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR1","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR2","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":31,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"U3","fesa_value":0,"reference_value":-3.3961335900000001e-34,"absolute_error":3.3961335900000001e-34,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR1","fesa_value":0,"reference_value":-1.3228819700000001e-33,"absolute_error":1.3228819700000001e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR2","fesa_value":0,"reference_value":-6.4281644100000003e-33,"absolute_error":6.4281644100000003e-33,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":32,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U1","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U2","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"U3","fesa_value":0,"reference_value":-6.2822664600000005e-33,"absolute_error":6.2822664600000005e-33,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR1","fesa_value":0,"reference_value":-5.1562540800000002e-34,"absolute_error":5.1562540800000002e-34,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR2","fesa_value":0,"reference_value":-1.44994833e-32,"absolute_error":1.44994833e-32,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":33,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U1","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U2","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"U3","fesa_value":-3.9829685019171916e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.574881917191893e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261691977,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR1","fesa_value":-4.5712631023128406e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.2671231284037584e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239150437,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR2","fesa_value":1.398506320372601e-06,"reference_value":1.46733487e-06,"absolute_error":6.882854962739899e-08,"threshold":7.3366743500000007e-08,"relative_error":0.04690718597002945,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":34,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U1","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U2","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"U3","fesa_value":-1.2104431691990609e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009390823e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616115819,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR1","fesa_value":-4.7611888400534304e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.0992630053430593e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141385,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR2","fesa_value":4.7611888400534338e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053433982e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141457,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":35,"component":"UR3","fesa_value":0,"reference_value":1.4251779899999999e-39,"absolute_error":1.4251779899999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U1","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U2","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"U3","fesa_value":-1.4301280732961153e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038847517e-09,"threshold":7.1619985000000001e-08,"relative_error":0.001585888843654988,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR1","fesa_value":-1.6987437569388302e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061169757e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999136,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR2","fesa_value":1.6987437569388296e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.1911193061170392e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999506,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":36,"component":"UR3","fesa_value":0,"reference_value":8.6599124099999996e-40,"absolute_error":8.6599124099999996e-40,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U1","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U2","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"U3","fesa_value":-3.9829685019171891e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171893519e-09,"threshold":1.98719681e-07,"relative_error":0.002157532126168558,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR1","fesa_value":-1.3985063203725972e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627402802e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970032052,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR2","fesa_value":4.5712631023128397e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.267123128395288e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239131902,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":37,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U1","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U2","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"U3","fesa_value":-3.9829685019172026e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819172029044e-09,"threshold":1.98719681e-07,"relative_error":0.002157532126171968,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR1","fesa_value":4.5712631023128541e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231285392836e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239446969,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR2","fesa_value":-1.3985063203726052e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627394755e-08,"threshold":7.3366743500000007e-08,"relative_error":0.04690718597002657,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":38,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U1","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U2","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"U3","fesa_value":-1.2104431691990636e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009363718e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616093588,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR1","fesa_value":4.7611888400534347e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053434829e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741414748,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR2","fesa_value":-4.7611888400534372e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.099263005343737e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741415288,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":39,"component":"UR3","fesa_value":0,"reference_value":3.3318547500000001e-39,"absolute_error":3.3318547500000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U1","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U2","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"U3","fesa_value":-1.4301280732961184e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038815753e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436527704,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR1","fesa_value":1.6987437569388346e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306116531e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735996551,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR2","fesa_value":-1.6987437569388336e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061166369e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735997167,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":40,"component":"UR3","fesa_value":0,"reference_value":-2.5950646299999998e-41,"absolute_error":2.5950646299999998e-41,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U1","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U2","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"U3","fesa_value":-3.9829685019172035e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819172037514e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261721814,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR1","fesa_value":1.3985063203726063e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627393696e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970025848,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR2","fesa_value":-4.5712631023128524e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.267123128522343e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239409903,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":41,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U1","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U2","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"U3","fesa_value":-1.2104431691990604e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009395906e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616119991,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR1","fesa_value":4.7611888400534169e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053417041e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741410972,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR2","fesa_value":4.7611888400534355e-06,"reference_value":4.7101962099999998e-06,"absolute_error":5.0992630053435676e-08,"threshold":2.355098105e-07,"relative_error":0.010826009741414929,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":42,"component":"UR3","fesa_value":0,"reference_value":-1.1940870599999999e-39,"absolute_error":1.1940870599999999e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U1","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U2","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"U3","fesa_value":-3.9829685019171933e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.574881917193587e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261696236,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR1","fesa_value":4.5712631023128456e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231284545804e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239261635,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR2","fesa_value":1.3985063203726016e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627398355e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970029019,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":43,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U1","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U2","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"U3","fesa_value":-3.9829685019171874e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171876578e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261681317,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR1","fesa_value":1.3985063203725957e-06,"reference_value":1.46733487e-06,"absolute_error":6.8828549627404284e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970033058,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR2","fesa_value":4.5712631023128363e-06,"reference_value":4.5703363900000002e-06,"absolute_error":9.2671231283614067e-10,"threshold":2.2851681950000001e-07,"relative_error":0.0002027667623905777,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":44,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U1","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U2","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"U3","fesa_value":-1.4301280732961157e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038843282e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436546923,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR1","fesa_value":1.6987437569388298e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306117018e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999383,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR2","fesa_value":1.6987437569388298e-06,"reference_value":1.7206549499999999e-06,"absolute_error":2.191119306117018e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999383,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":45,"component":"UR3","fesa_value":0,"reference_value":2.3219193300000001e-39,"absolute_error":2.3219193300000001e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U1","fesa_value":0,"reference_value":-1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U2","fesa_value":0,"reference_value":1.9600924700000001e-23,"absolute_error":1.9600924700000001e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"U3","fesa_value":-1.2104431691990617e-05,"reference_value":-1.21908679e-05,"absolute_error":8.6436208009382353e-08,"threshold":6.0954339500000002e-07,"relative_error":0.0070902423616108871,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR1","fesa_value":-4.7611888400534313e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.099263005343144e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141403,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR2","fesa_value":-4.761188840053427e-06,"reference_value":-4.7101962099999998e-06,"absolute_error":5.0992630053427205e-08,"threshold":2.355098105e-07,"relative_error":0.01082600974141313,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":46,"component":"UR3","fesa_value":0,"reference_value":0,"absolute_error":0,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U1","fesa_value":0,"reference_value":-5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U2","fesa_value":0,"reference_value":1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"U3","fesa_value":-3.982968501917195e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171952811e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261700499,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR1","fesa_value":-4.571263102312849e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.2671231284884617e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239335768,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR2","fesa_value":-1.3985063203726012e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627398779e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970029311,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":47,"component":"UR3","fesa_value":0,"reference_value":5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U1","fesa_value":0,"reference_value":-1.88724227e-23,"absolute_error":1.88724227e-23,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U2","fesa_value":0,"reference_value":5.9657980699999999e-24,"absolute_error":5.9657980699999999e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"U3","fesa_value":-3.9829685019171976e-06,"reference_value":-3.9743936199999997e-06,"absolute_error":8.5748819171978222e-09,"threshold":1.98719681e-07,"relative_error":0.0021575321261706895,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR1","fesa_value":-1.3985063203726061e-06,"reference_value":-1.46733487e-06,"absolute_error":6.8828549627393908e-08,"threshold":7.3366743500000007e-08,"relative_error":0.046907185970025987,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR2","fesa_value":-4.5712631023128473e-06,"reference_value":-4.5703363900000002e-06,"absolute_error":9.267123128471521e-10,"threshold":2.2851681950000001e-07,"relative_error":0.00020276676239298702,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":48,"component":"UR3","fesa_value":0,"reference_value":-5.2711370099999999e-25,"absolute_error":5.2711370099999999e-25,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U1","fesa_value":0,"reference_value":-7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U2","fesa_value":0,"reference_value":7.0849341300000002e-24,"absolute_error":7.0849341300000002e-24,"threshold":2.3740820300000003e-07,"relative_error":0,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"U3","fesa_value":-1.4301280732961163e-06,"reference_value":-1.4323997e-06,"absolute_error":2.2716267038836929e-09,"threshold":7.1619985000000001e-08,"relative_error":0.0015858888436542488,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":true,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR1","fesa_value":-1.6987437569388304e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061169545e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735999013,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR2","fesa_value":-1.6987437569388317e-06,"reference_value":-1.7206549499999999e-06,"absolute_error":2.1911193061168275e-08,"threshold":8.6032747499999997e-08,"relative_error":0.012734216735998276,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":true,"tolerance_branch":"relative","blocking":false,"within_tolerance":true},{"case_id":"shell-s4","instance_name":"Part-1-1","source_node_label":49,"component":"UR3","fesa_value":0,"reference_value":1.78609082e-39,"absolute_error":1.78609082e-39,"threshold":7.6072574299999997e-08,"relative_error":0,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"relative_error_applicable":false,"tolerance_branch":"near-zero","blocking":false,"within_tolerance":true}],"metrics":[{"family_identity":"displacement-translation","components":["U1","U2","U3"],"blocking":true,"reference_scale":2.3740820300000001e-05,"near_zero_band":2.3740820300000003e-07,"near_zero_count":122,"row_count":147,"maximum_absolute_error":1.9037853491514389e-07,"relative_rms":0.0010332756650397166,"worst_row":8,"rms_passed":true,"passed":true,"diagnostic_code":""},{"family_identity":"displacement-rotation","components":["UR1","UR2","UR3"],"blocking":false,"reference_scale":7.6072574299999999e-06,"near_zero_band":7.6072574299999997e-08,"near_zero_count":107,"row_count":147,"maximum_absolute_error":6.8828549627404284e-08,"relative_rms":0.0029771372973060382,"worst_row":261,"rms_passed":true,"passed":true,"diagnostic_code":""}],"vector_metrics":[{"instance_name":"Part-1-1","source_node_label":1,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":2,"displacement_norm_error":1.9037853491514389e-07,"rotation_norm_error":1.0474364347492016e-20},{"instance_name":"Part-1-1","source_node_label":3,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":4,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":5,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":6,"displacement_norm_error":1.17769804e-32,"rotation_norm_error":1.95418427e-32},{"instance_name":"Part-1-1","source_node_label":7,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":8,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":9,"displacement_norm_error":2.07395071e-35,"rotation_norm_error":2.2544430521865401e-33},{"instance_name":"Part-1-1","source_node_label":10,"displacement_norm_error":4.3731870036429076e-08,"rotation_norm_error":1.6762504118447317e-09},{"instance_name":"Part-1-1","source_node_label":11,"displacement_norm_error":5.9311029758091623e-08,"rotation_norm_error":5.6657163630694338e-08},{"instance_name":"Part-1-1","source_node_label":12,"displacement_norm_error":5.9311029758081458e-08,"rotation_norm_error":5.6657163630668927e-08},{"instance_name":"Part-1-1","source_node_label":13,"displacement_norm_error":4.3731870036441782e-08,"rotation_norm_error":1.6762504118616724e-09},{"instance_name":"Part-1-1","source_node_label":14,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":15,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":16,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":17,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":18,"displacement_norm_error":4.3731870036423994e-08,"rotation_norm_error":1.6762504118430377e-09},{"instance_name":"Part-1-1","source_node_label":19,"displacement_norm_error":5.9311029758105175e-08,"rotation_norm_error":5.6657163630685021e-08},{"instance_name":"Part-1-1","source_node_label":20,"displacement_norm_error":5.9311029758111951e-08,"rotation_norm_error":5.6657163630693491e-08},{"instance_name":"Part-1-1","source_node_label":21,"displacement_norm_error":4.3731870036420606e-08,"rotation_norm_error":1.6762504118354144e-09},{"instance_name":"Part-1-1","source_node_label":22,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":23,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":24,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":25,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":26,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":27,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":28,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":29,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":30,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":31,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":32,"displacement_norm_error":3.3961335900000001e-34,"rotation_norm_error":6.5628739427587462e-33},{"instance_name":"Part-1-1","source_node_label":33,"displacement_norm_error":6.2822664600000005e-33,"rotation_norm_error":1.4508648645837217e-32},{"instance_name":"Part-1-1","source_node_label":34,"displacement_norm_error":8.574881917191893e-09,"rotation_norm_error":6.8834788003756478e-08},{"instance_name":"Part-1-1","source_node_label":35,"displacement_norm_error":8.6436208009390823e-08,"rotation_norm_error":7.211446900263782e-08},{"instance_name":"Part-1-1","source_node_label":36,"displacement_norm_error":2.2716267038847517e-09,"rotation_norm_error":3.0987106394881974e-08},{"instance_name":"Part-1-1","source_node_label":37,"displacement_norm_error":8.5748819171893519e-09,"rotation_norm_error":6.8834788003760276e-08},{"instance_name":"Part-1-1","source_node_label":38,"displacement_norm_error":8.5748819172029044e-09,"rotation_norm_error":6.8834788003752428e-08},{"instance_name":"Part-1-1","source_node_label":39,"displacement_norm_error":8.6436208009363718e-08,"rotation_norm_error":7.211446900264322e-08},{"instance_name":"Part-1-1","source_node_label":40,"displacement_norm_error":2.2716267038815753e-09,"rotation_norm_error":3.0987106394875986e-08},{"instance_name":"Part-1-1","source_node_label":41,"displacement_norm_error":8.5748819172037514e-09,"rotation_norm_error":6.8834788003751329e-08},{"instance_name":"Part-1-1","source_node_label":42,"displacement_norm_error":8.6436208009395906e-08,"rotation_norm_error":7.2114469002629442e-08},{"instance_name":"Part-1-1","source_node_label":43,"displacement_norm_error":8.574881917193587e-09,"rotation_norm_error":6.8834788003755909e-08},{"instance_name":"Part-1-1","source_node_label":44,"displacement_norm_error":8.5748819171876578e-09,"rotation_norm_error":6.8834788003761706e-08},{"instance_name":"Part-1-1","source_node_label":45,"displacement_norm_error":2.2716267038843282e-09,"rotation_norm_error":3.0987106394882127e-08},{"instance_name":"Part-1-1","source_node_label":46,"displacement_norm_error":8.6436208009382353e-08,"rotation_norm_error":7.2114469002633624e-08},{"instance_name":"Part-1-1","source_node_label":47,"displacement_norm_error":8.5748819171952811e-09,"rotation_norm_error":6.8834788003756372e-08},{"instance_name":"Part-1-1","source_node_label":48,"displacement_norm_error":8.5748819171978222e-09,"rotation_norm_error":6.8834788003751488e-08},{"instance_name":"Part-1-1","source_node_label":49,"displacement_norm_error":2.2716267038836929e-09,"rotation_norm_error":3.0987106394880327e-08}],"warnings":[],"worst_row":8,"passed":true} diff --git a/.harness/build-ninja/reference/mitc4-shell-s4-metadata/shell.inp b/.harness/build-ninja/reference/mitc4-shell-s4-metadata/shell.inp new file mode 100644 index 0000000..c107a7c --- /dev/null +++ b/.harness/build-ninja/reference/mitc4-shell-s4-metadata/shell.inp @@ -0,0 +1,164 @@ +*Heading +** Job name: shell Model name: Model-1 +** Generated by: Abaqus/CAE Learning Edition 2024 +*Preprint, echo=NO, model=NO, history=NO, contact=NO +** +** PARTS +** +*Part, name=Part-1 +*Node + 1, 0., -5., 0. + 2, 0., 0., 0. + 3, -5., 0., 0. + 4, -5., -5., 0. + 5, 0., 5., 0. + 6, 5., 0., 0. + 7, 5., 5., 0. + 8, -5., 5., 0. + 9, 5., -5., 0. + 10, 0., -3.33333325, 0. + 11, 0., -1.66666663, 0. + 12, -1.66666663, 0., 0. + 13, -3.33333325, 0., 0. + 14, -5., -1.66666663, 0. + 15, -5., -3.33333325, 0. + 16, -3.33333325, -5., 0. + 17, -1.66666663, -5., 0. + 18, 0., 3.33333325, 0. + 19, 0., 1.66666663, 0. + 20, 1.66666663, 0., 0. + 21, 3.33333325, 0., 0. + 22, 5., 1.66666663, 0. + 23, 5., 3.33333325, 0. + 24, 3.33333325, 5., 0. + 25, 1.66666663, 5., 0. + 26, -1.66666663, 5., 0. + 27, -3.33333325, 5., 0. + 28, -5., 3.33333325, 0. + 29, -5., 1.66666663, 0. + 30, 1.66666663, -5., 0. + 31, 3.33333325, -5., 0. + 32, 5., -3.33333325, 0. + 33, 5., -1.66666663, 0. + 34, -1.66666663, -3.33333325, 0. + 35, -1.66666663, -1.66666663, 0. + 36, -3.33333325, -3.33333325, 0. + 37, -3.33333325, -1.66666663, 0. + 38, 1.66666663, 3.33333325, 0. + 39, 1.66666663, 1.66666663, 0. + 40, 3.33333325, 3.33333325, 0. + 41, 3.33333325, 1.66666663, 0. + 42, -1.66666663, 1.66666663, 0. + 43, -1.66666663, 3.33333325, 0. + 44, -3.33333325, 1.66666663, 0. + 45, -3.33333325, 3.33333325, 0. + 46, 1.66666663, -1.66666663, 0. + 47, 1.66666663, -3.33333325, 0. + 48, 3.33333325, -1.66666663, 0. + 49, 3.33333325, -3.33333325, 0. +*Element, type=S4 + 1, 1, 10, 34, 17 + 2, 10, 11, 35, 34 + 3, 11, 2, 12, 35 + 4, 17, 34, 36, 16 + 5, 34, 35, 37, 36 + 6, 35, 12, 13, 37 + 7, 16, 36, 15, 4 + 8, 36, 37, 14, 15 + 9, 37, 13, 3, 14 +10, 5, 18, 38, 25 +11, 18, 19, 39, 38 +12, 19, 2, 20, 39 +13, 25, 38, 40, 24 +14, 38, 39, 41, 40 +15, 39, 20, 21, 41 +16, 24, 40, 23, 7 +17, 40, 41, 22, 23 +18, 41, 21, 6, 22 +19, 2, 19, 42, 12 +20, 19, 18, 43, 42 +21, 18, 5, 26, 43 +22, 12, 42, 44, 13 +23, 42, 43, 45, 44 +24, 43, 26, 27, 45 +25, 13, 44, 29, 3 +26, 44, 45, 28, 29 +27, 45, 27, 8, 28 +28, 2, 11, 46, 20 +29, 11, 10, 47, 46 +30, 10, 1, 30, 47 +31, 20, 46, 48, 21 +32, 46, 47, 49, 48 +33, 47, 30, 31, 49 +34, 21, 48, 33, 6 +35, 48, 49, 32, 33 +36, 49, 31, 9, 32 +*Nset, nset=Set-1, generate + 1, 49, 1 +*Elset, elset=Set-1, generate + 1, 36, 1 +** Section: Section-1 +*Shell Section, elset=Set-1, material=Material-1 +0.5, 5 +*End Part +** +** +** ASSEMBLY +** +*Assembly, name=Assembly +** +*Instance, name=Part-1-1, part=Part-1 +*End Instance +** +*Nset, nset=Set-1, instance=Part-1-1 + 2, +*Nset, nset=Set-2, instance=Part-1-1 + 1, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 22, 23, 24, 25 + 26, 27, 28, 29, 30, 31, 32, 33 +*Elset, elset=Set-2, instance=Part-1-1 + 1, 4, 7, 8, 9, 10, 13, 16, 17, 18, 21, 24, 25, 26, 27, 30 + 33, 34, 35, 36 +*End Assembly +** +** MATERIALS +** +*Material, name=Material-1 +*Elastic + 2.1e+11, 0.3 +** +** BOUNDARY CONDITIONS +** +** Name: BC-1 Type: Displacement/Rotation +*Boundary +Set-2, 1, 1 +Set-2, 2, 2 +Set-2, 3, 3 +Set-2, 4, 4 +Set-2, 5, 5 +Set-2, 6, 6 +** ---------------------------------------------------------------- +** +** STEP: Step-1 +** +*Step, name=Step-1, nlgeom=NO +*Static +1., 1., 1e-05, 1. +** +** LOADS +** +** Name: Load-1 Type: Concentrated force +*Cload +Set-1, 3, -100000. +** +** OUTPUT REQUESTS +** +*Restart, write, frequency=0 +** +** FIELD OUTPUT: F-Output-1 +** +*Output, field, variable=PRESELECT +** +** HISTORY OUTPUT: H-Output-1 +** +*Output, history, variable=PRESELECT +*End Step diff --git a/.harness/build-ninja/tests/cmake_test_discovery_e3b0c44298.json b/.harness/build-ninja/tests/cmake_test_discovery_e3b0c44298.json new file mode 100644 index 0000000..e06443e --- /dev/null +++ b/.harness/build-ninja/tests/cmake_test_discovery_e3b0c44298.json @@ -0,0 +1,83 @@ +{ + "tests": 13, + "name": "AllTests", + "testsuites": [ + { + "name": "LinearStaticCli", + "tests": 8, + "testsuite": [ + { + "name": "FactorizesBeforeLoadAndSolvesWithoutRefactorization", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 306 + }, + { + "name": "FactorizesBeforeRejectingAnInvalidLoad", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 328 + }, + { + "name": "RealPipelineHandlesAnalyticalAndNonzeroPrescription", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 352 + }, + { + "name": "DefaultOutputUsesInputSiblingDerivedName", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 356 + }, + { + "name": "ReturnsEveryExactExitCodeAndOrderedDiagnostic", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 371 + }, + { + "name": "OutputSubstringRejectionLeavesDerivedFilesUnchanged", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 413 + }, + { + "name": "BusyOutputLeaseLeavesDerivedFilesUnchanged", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 443 + }, + { + "name": "OutputRequestsDoNotFilterMandatoryResults", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 468 + } + ] + }, + { + "name": "Mitc4ShellCli", + "tests": 5, + "testsuite": [ + { + "name": "UsesExistingLifecycleAndExactlyOneFactorization", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 389 + }, + { + "name": "AppliesKfcForNonzeroPrescribedDisplacement", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 412 + }, + { + "name": "RejectsSingularAndAcceptsZeroByZeroFreeSystem", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 450 + }, + { + "name": "DoesNotWriteAnInvalidRecoveryCandidate", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\analysis\\linear_static_analysis_test.cpp", + "line": 486 + }, + { + "name": "WritesShellHdf5ThroughTheExistingApplicationRoute", + "file": "C:\\git\\FESADev\\.worktrees\\nonlinear-static-newton-raphson\\tests\\integration\\app\\fesa_application_test.cpp", + "line": 505 + } + ] + } + ] +} diff --git a/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_discovery.cmake b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_discovery.cmake new file mode 100644 index 0000000..170e0b1 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_discovery.cmake @@ -0,0 +1,19 @@ +include("C:/Program Files/CMake/share/cmake-4.4/Modules/GoogleTestAddTests.cmake") +gtest_discover_tests_impl( + TEST_EXECUTABLE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + TEST_EXTRA_ARGS [==[]==] + TEST_PROPERTIES [==[LABELS]==] [==[linear-static-3d-euler-beam;integration]==] + TEST_PREFIX [==[]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[fesa_integration_tests_TESTS]==] + CTEST_FILE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[5]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + TEST_JSON_OUTPUT_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] +) diff --git a/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_include.cmake b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_include.cmake new file mode 100644 index 0000000..e27f973 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_include.cmake @@ -0,0 +1,5 @@ +if(EXISTS "C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake") + include("C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake") +else() + add_test(fesa_integration_tests_NOT_BUILT fesa_integration_tests_NOT_BUILT) +endif() diff --git a/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake new file mode 100644 index 0000000..8bb3926 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_integration_tests_d537bc73_tests.cmake @@ -0,0 +1,118 @@ +add_test([=[LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:306]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:328]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:352]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:356]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:371]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:413]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:443]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:468]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:389]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:412]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:450]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\analysis\linear_static_analysis_test.cpp:486]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +add_test([=[Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_integration_tests.exe [==[--gtest_filter=Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\integration\app\fesa_application_test.cpp:505]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;integration]] +) +set(fesa_integration_tests_TESTS [==[LinearStaticCli.FactorizesBeforeLoadAndSolvesWithoutRefactorization]==] [==[LinearStaticCli.FactorizesBeforeRejectingAnInvalidLoad]==] [==[LinearStaticCli.RealPipelineHandlesAnalyticalAndNonzeroPrescription]==] [==[LinearStaticCli.DefaultOutputUsesInputSiblingDerivedName]==] [==[LinearStaticCli.ReturnsEveryExactExitCodeAndOrderedDiagnostic]==] [==[LinearStaticCli.OutputSubstringRejectionLeavesDerivedFilesUnchanged]==] [==[LinearStaticCli.BusyOutputLeaseLeavesDerivedFilesUnchanged]==] [==[LinearStaticCli.OutputRequestsDoNotFilterMandatoryResults]==] [==[Mitc4ShellCli.UsesExistingLifecycleAndExactlyOneFactorization]==] [==[Mitc4ShellCli.AppliesKfcForNonzeroPrescribedDisplacement]==] [==[Mitc4ShellCli.RejectsSingularAndAcceptsZeroByZeroFreeSystem]==] [==[Mitc4ShellCli.DoesNotWriteAnInvalidRecoveryCandidate]==] [==[Mitc4ShellCli.WritesShellHdf5ThroughTheExistingApplicationRoute]==]) diff --git a/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_discovery.cmake b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_discovery.cmake new file mode 100644 index 0000000..c575ca7 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_discovery.cmake @@ -0,0 +1,19 @@ +include("C:/Program Files/CMake/share/cmake-4.4/Modules/GoogleTestAddTests.cmake") +gtest_discover_tests_impl( + TEST_EXECUTABLE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + TEST_EXTRA_ARGS [==[]==] + TEST_PROPERTIES [==[LABELS]==] [==[linear-static-3d-euler-beam;reference]==] + TEST_PREFIX [==[]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[fesa_reference_tests_TESTS]==] + CTEST_FILE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[5]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + TEST_JSON_OUTPUT_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] +) diff --git a/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_include.cmake b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_include.cmake new file mode 100644 index 0000000..db876a1 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_include.cmake @@ -0,0 +1,5 @@ +if(EXISTS "C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake") + include("C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake") +else() + add_test(fesa_reference_tests_NOT_BUILT fesa_reference_tests_NOT_BUILT) +endif() diff --git a/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake new file mode 100644 index 0000000..bdaf279 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_reference_tests_ac7cf2f0_tests.cmake @@ -0,0 +1,190 @@ +add_test([=[ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp:28]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp:56]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp:73]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp:95]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_tolerance_policy_test.cpp:108]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp:426]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp:538]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp:593]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp:663]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\reference_comparison_test.cpp:687]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\b33_reference_comparison_test.cpp:148]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:478]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:511]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:594]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:641]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:667]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:689]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:709]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_comparison_test.cpp:757]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_cases_test.cpp:177]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +add_test([=[Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_reference_tests.exe [==[--gtest_filter=Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\reference\mitc4_reference_cases_test.cpp:187]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;reference]] +) +set(fesa_reference_tests_TESTS [==[ReferenceTolerancePolicy.AppliesRelativeAndNearZeroThresholdsAtTheirInclusiveBoundaries]==] [==[ReferenceTolerancePolicy.RejectsFamiliesWhoseScaleRelativeRmsExceedsOnePercent]==] [==[ReferenceTolerancePolicy.FailsClosedForZeroScaleNonzeroErrorWithoutNonfiniteMetrics]==] [==[ReferenceTolerancePolicy.KeepsWarningOnlyFamilyExceedanceOutOfBlockingVerdict]==] [==[ReferenceTolerancePolicy.RejectsNonfiniteInputsBeforeToleranceEvaluation]==] [==[ReferenceComparisonContract.PrecheckRejectsMissingSchemaDuplicateAndNonfiniteRows]==] [==[ReferenceComparisonContract.AppliesSharedFamilyScaleAndNearZeroBranchesWithoutAnAbsoluteGate]==] [==[ReferenceComparisonContract.ReportsEveryRowAndAggregateMetricDeterministically]==] [==[ReferenceComparisonContract.PreservesSectionEndpointIdentityWithoutStationNormalization]==] [==[ReferenceComparisonContract.MapsEachSectionCsvComponentToItsDirectEndpointResultant]==] [==[B33ReferenceComparison.GeneratesAuthoritativeHdf5AndComparisonEvidence]==] [==[Mitc4ReferenceComparison.MapsTrimmedHeaderAndSixComponentsBySourceIdentity]==] [==[Mitc4ReferenceComparison.RejectsInvalidInventoryBeforeNumericComparison]==] [==[Mitc4ReferenceComparison.SharesTranslationScaleAcrossUComponentsAndUsesNearZeroBranches]==] [==[Mitc4ReferenceComparison.RotationExceedanceWarnsWithoutBlockingTranslationVerdict]==] [==[Mitc4ReferenceComparison.RotationRmsExceedanceWarnsWhenEveryRotationRowPasses]==] [==[Mitc4ReferenceComparison.RotationRowAndRmsExceedancesProduceSeparateWarnings]==] [==[Mitc4ReferenceComparison.ReportsMetricsVectorsWorstRowAndJsonDeterministically]==] [==[Mitc4ReferenceComparison.RequiresOnlyDeclaredInputCsvAndHdf5]==] [==[Mitc4S4Reference.PreservesS4AndWritesCommonMitc4Metadata]==] [==[Mitc4S4Reference.PassesBlockingUAndReportsEveryUrRow]==]) diff --git a/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_discovery.cmake b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_discovery.cmake new file mode 100644 index 0000000..a98f09c --- /dev/null +++ b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_discovery.cmake @@ -0,0 +1,19 @@ +include("C:/Program Files/CMake/share/cmake-4.4/Modules/GoogleTestAddTests.cmake") +gtest_discover_tests_impl( + TEST_EXECUTABLE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe]==] + TEST_EXECUTOR [==[]==] + TEST_WORKING_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + TEST_EXTRA_ARGS [==[]==] + TEST_PROPERTIES [==[LABELS]==] [==[linear-static-3d-euler-beam;unit]==] + TEST_PREFIX [==[]==] + TEST_SUFFIX [==[]==] + TEST_FILTER [==[]==] + NO_PRETTY_TYPES [==[FALSE]==] + NO_PRETTY_VALUES [==[FALSE]==] + TEST_LIST [==[fesa_unit_tests_TESTS]==] + CTEST_FILE [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake]==] + TEST_DISCOVERY_TIMEOUT [==[5]==] + TEST_DISCOVERY_EXTRA_ARGS [==[]==] + TEST_XML_OUTPUT_DIR [==[]==] + TEST_JSON_OUTPUT_DIR [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] +) diff --git a/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_include.cmake b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_include.cmake new file mode 100644 index 0000000..8048323 --- /dev/null +++ b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_include.cmake @@ -0,0 +1,5 @@ +if(EXISTS "C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake") + include("C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake") +else() + add_test(fesa_unit_tests_NOT_BUILT fesa_unit_tests_NOT_BUILT) +endif() diff --git a/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake new file mode 100644 index 0000000..70b87ab --- /dev/null +++ b/.harness/build-ninja/tests/fesa_unit_tests_576e7e9d_tests.cmake @@ -0,0 +1,1702 @@ +add_test([=[BuildInfo.VersionIsStableAndNonEmpty]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BuildInfo.VersionIsStableAndNonEmpty]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BuildInfo.VersionIsStableAndNonEmpty]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\build_info_test.cpp:10]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BuildInfo.PublicHeaderHasNoBackendDependency]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BuildInfo.PublicHeaderHasNoBackendDependency]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BuildInfo.PublicHeaderHasNoBackendDependency]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\build_info_test.cpp:20]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_test.cpp:41]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisModel.ClassifiesActiveEntitiesInStableOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisModel.ClassifiesActiveEntitiesInStableOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisModel.ClassifiesActiveEntitiesInStableOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_model_test.cpp:95]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_model_test.cpp:117]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_model_test.cpp:150]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisModel.RejectsMissingOrMultipleStep]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisModel.RejectsMissingOrMultipleStep]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisModel.RejectsMissingOrMultipleStep]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_model_test.cpp:174]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.AllocatesOnlyV0FullVectors]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.AllocatesOnlyV0FullVectors]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.AllocatesOnlyV0FullVectors]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_state_test.cpp:84]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.CopiesOrMovesWithoutAliasing]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.CopiesOrMovesWithoutAliasing]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.CopiesOrMovesWithoutAliasing]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\analysis\analysis_state_test.cpp:121]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.PreservesStepFrameAndStableRowOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.PreservesStepFrameAndStableRowOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.PreservesStepFrameAndStableRowOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_records_test.cpp:126]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_records_test.cpp:194]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.CommitsFiniteShellGlobalEvidence]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.CommitsFiniteShellGlobalEvidence]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.CommitsFiniteShellGlobalEvidence]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_records_test.cpp:230]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_records_test.cpp:247]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ParallelFor.ZeroOneManyExecuteExactlyOnce]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ParallelFor.ZeroOneManyExecuteExactlyOnce]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ParallelFor.ZeroOneManyExecuteExactlyOnce]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\parallel_for_test.cpp:26]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ParallelFor.SerialAndTbbProduceStableIndexedOutput]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ParallelFor.SerialAndTbbProduceStableIndexedOutput]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ParallelFor.SerialAndTbbProduceStableIndexedOutput]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\parallel_for_test.cpp:52]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ParallelFor.PropagatesBodyExceptionByContract]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ParallelFor.PropagatesBodyExceptionByContract]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ParallelFor.PropagatesBodyExceptionByContract]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\parallel_for_test.cpp:93]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:190]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:205]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.AssemblesNodeSetAndSixComponentLoads]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.AssemblesNodeSetAndSixComponentLoads]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.AssemblesNodeSetAndSixComponentLoads]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:232]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.AccumulatesSignedLoadsInSourceOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.AccumulatesSignedLoadsInSourceOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.AccumulatesSignedLoadsInSourceOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:256]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:278]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.AcceptsExactlyZeroAggregateShellMoment]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.AcceptsExactlyZeroAggregateShellMoment]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.AcceptsExactlyZeroAggregateShellMoment]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:303]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:322]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:345]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.FormsNonzeroPrescribedEffectiveRhs]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.FormsNonzeroPrescribedEffectiveRhs]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.FormsNonzeroPrescribedEffectiveRhs]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:360]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.RejectsNonfiniteOrDimensionMismatch]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.RejectsNonfiniteOrDimensionMismatch]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.RejectsNonfiniteOrDimensionMismatch]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:385]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[LoadAssembly.ZeroLoadsRemainZero]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=LoadAssembly.ZeroLoadsRemainZero]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[LoadAssembly.ZeroLoadsRemainZero]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\load_assembler_test.cpp:453]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp:230]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp:288]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp:343]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp:379]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\assembly\sparse_assembler_test.cpp:405]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.ValidatesKnownCsrAndMultiply]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.ValidatesKnownCsrAndMultiply]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.ValidatesKnownCsrAndMultiply]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\sparse_matrix_test.cpp:25]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.ReducesDuplicatesInFixedTupleOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.ReducesDuplicatesInFixedTupleOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.ReducesDuplicatesInFixedTupleOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\sparse_matrix_test.cpp:60]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.RejectsInvalidIndexPatternAndShape]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.RejectsInvalidIndexPatternAndShape]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.RejectsInvalidIndexPatternAndShape]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\sparse_matrix_test.cpp:81]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SparseAssembly.PreservesExpectedStructuralZeros]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SparseAssembly.PreservesExpectedStructuralZeros]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SparseAssembly.PreservesExpectedStructuralZeros]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\sparse_matrix_test.cpp:117]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.RejectsFirstTokenContainingOutputSubstring]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.RejectsFirstTokenContainingOutputSubstring]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.RejectsFirstTokenContainingOutputSubstring]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:50]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.RejectsEveryOutputSubstringVariant]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.RejectsEveryOutputSubstringVariant]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.RejectsEveryOutputSubstringVariant]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:61]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:73]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.PreservesBasenameCaseAndPrecedingDots]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.PreservesBasenameCaseAndPrecedingDots]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.PreservesBasenameCaseAndPrecedingDots]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:91]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.RejectsInputWithoutInpFinalExtension]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.RejectsInputWithoutInpFinalExtension]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.RejectsInputWithoutInpFinalExtension]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:102]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.LeaseCollisionPreservesPublicOutputPaths]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.LeaseCollisionPreservesPublicOutputPaths]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.LeaseCollisionPreservesPublicOutputPaths]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:111]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\app\output_paths_test.cpp:130]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp:105]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp:130]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp:157]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp:188]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\boundary_condition_test.cpp:200]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EssentialConstraints.ExtractsHandComputedBlocksInStableOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EssentialConstraints.ExtractsHandComputedBlocksInStableOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EssentialConstraints.ExtractsHandComputedBlocksInStableOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp:120]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EssentialConstraints.HandlesNoAllAndMixedConstraints]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EssentialConstraints.HandlesNoAllAndMixedConstraints]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EssentialConstraints.HandlesNoAllAndMixedConstraints]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp:166]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp:199]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EssentialConstraints.ReconstructsNonzeroPrescribedValues]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EssentialConstraints.ReconstructsNonzeroPrescribedValues]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EssentialConstraints.ReconstructsNonzeroPrescribedValues]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp:259]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EssentialConstraints.RejectsDimensionOrOrderMismatch]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EssentialConstraints.RejectsDimensionOrOrderMismatch]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EssentialConstraints.RejectsDimensionOrOrderMismatch]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\constraints\essential_constraints_test.cpp:292]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Ascii.LowercasesOnlyAsciiUppercaseBytes]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Ascii.LowercasesOnlyAsciiUppercaseBytes]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Ascii.LowercasesOnlyAsciiUppercaseBytes]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\ascii_test.cpp:10]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\ascii_test.cpp:20]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\ascii_test.cpp:30]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[CoreDiagnostics.DiagnosticsSortDeterministically]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=CoreDiagnostics.DiagnosticsSortDeterministically]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[CoreDiagnostics.DiagnosticsSortDeterministically]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\diagnostic_test.cpp:26]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[CoreDiagnostics.SourceIdentityPreservesRawIdentity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=CoreDiagnostics.SourceIdentityPreservesRawIdentity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[CoreDiagnostics.SourceIdentityPreservesRawIdentity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\source_identity_test.cpp:9]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[CoreDiagnostics.ResultEnforcesValueErrorExclusivity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=CoreDiagnostics.ResultEnforcesValueErrorExclusivity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[CoreDiagnostics.ResultEnforcesValueErrorExclusivity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\core\status_test.cpp:24]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\element_factory_test.cpp:170]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\element_factory_test.cpp:225]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\element_factory_test.cpp:287]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementFactory.RejectsUnknownAndIncompatibleDefinitions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementFactory.RejectsUnknownAndIncompatibleDefinitions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementFactory.RejectsUnknownAndIncompatibleDefinitions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\element_factory_test.cpp:312]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:501]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.TwoPointGaussMatchesClosedStiffness]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.TwoPointGaussMatchesClosedStiffness]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.TwoPointGaussMatchesClosedStiffness]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:567]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:590]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.RotatedTransformPreservesWorkAndEnergy]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.RotatedTransformPreservesWorkAndEnergy]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.RotatedTransformPreservesWorkAndEnergy]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:655]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:726]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:760]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:816]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.RejectsInvalidGeometryAndProperties]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.RejectsInvalidGeometryAndProperties]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.RejectsInvalidGeometryAndProperties]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:902]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:1015]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:1067]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[EulerBeam3D.OnePointNegativeControlHasRankFour]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=EulerBeam3D.OnePointNegativeControlHasRankFour]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[EulerBeam3D.OnePointNegativeControlHasRankFour]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\euler_beam_3d_test.cpp:1122]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:309]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:342]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:396]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:536]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:452]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:552]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:595]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:654]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:683]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:731]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellDrilling.UsesOnlyEightPositivePhysicalRotationDiagonalsAndFixedFactor]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellDrilling.UsesOnlyEightPositivePhysicalRotationDiagonalsAndFixedFactor]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellDrilling.UsesOnlyEightPositivePhysicalRotationDiagonalsAndFixedFactor]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:795]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:831]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:873]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\elements\mitc4_shell_test.cpp:912]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:178]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.RejectsEveryCorruptedOwnerMappingInvariant]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.RejectsEveryCorruptedOwnerMappingInvariant]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.RejectsEveryCorruptedOwnerMappingInvariant]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:230]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.NumbersSixDofsAndFreeEquationsStably]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.NumbersSixDofsAndFreeEquationsStably]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.NumbersSixDofsAndFreeEquationsStably]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:262]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.ExpandsAndValidatesPrescribedValues]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.ExpandsAndValidatesPrescribedValues]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.ExpandsAndValidatesPrescribedValues]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:284]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.BuildsTwelveDofScatterAndSortedUniquePattern]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.BuildsTwelveDofScatterAndSortedUniquePattern]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.BuildsTwelveDofScatterAndSortedUniquePattern]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:315]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.BuildsShellScatterInSourceNodeAndComponentOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.BuildsShellScatterInSourceNodeAndComponentOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.BuildsShellScatterInSourceNodeAndComponentOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:350]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:362]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DofManager.ReconstructsFullReducedRoundTrip]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DofManager.ReconstructsFullReducedRoundTrip]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DofManager.ReconstructsFullReducedRoundTrip]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\fem\dof_manager_test.cpp:383]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\dense_blas_internal_test.cpp:12]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\dense_blas_internal_test.cpp:28]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DenseMath.RowMajorMatrixMatchesKnownGemvGemm]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DenseMath.RowMajorMatrixMatchesKnownGemvGemm]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DenseMath.RowMajorMatrixMatchesKnownGemvGemm]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\matrix_test.cpp:12]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DenseMath.VectorOwnsAndChecksContiguousStorage]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DenseMath.VectorOwnsAndChecksContiguousStorage]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DenseMath.VectorOwnsAndChecksContiguousStorage]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector_test.cpp:12]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.StoresComponentsWithExactArithmetic]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.StoresComponentsWithExactArithmetic]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.StoresComponentsWithExactArithmetic]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:13]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:46]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.ComputesDotProduct]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.ComputesDotProduct]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.ComputesDotProduct]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:59]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.UsesRightHandedCrossProductOrientation]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.UsesRightHandedCrossProductOrientation]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.UsesRightHandedCrossProductOrientation]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:66]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.ComputesEuclideanNorm]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.ComputesEuclideanNorm]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.ComputesEuclideanNorm]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:81]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.NormalizesNonzeroVectors]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.NormalizesNonzeroVectors]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.NormalizesNonzeroVectors]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:88]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.ReportsFiniteComponents]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.ReportsFiniteComponents]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.ReportsFiniteComponents]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:97]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Vector3.RejectsZeroAndNonfiniteNormalization]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Vector3.RejectsZeroAndNonfiniteNormalization]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Vector3.RejectsZeroAndNonfiniteNormalization]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\math\vector3_test.cpp:106]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapping_components_test.cpp:118]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapping_components_test.cpp:162]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapping_components_test.cpp:190]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapping_components_test.cpp:211]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:248]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:330]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:472]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:533]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:575]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:638]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:681]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:721]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:761]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpDomainMapping.RejectsDloadWithoutDistributedLoadObject]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpDomainMapping.RejectsDloadWithoutDistributedLoadObject]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpDomainMapping.RejectsDloadWithoutDistributedLoadObject]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\domain_mapper_test.cpp:993]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpSyntax.RejectsMalformedOrOrphanData]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpSyntax.RejectsMalformedOrOrphanData]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpSyntax.RejectsMalformedOrOrphanData]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_reader_test.cpp:56]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpSyntax.ReadsLegacyCantileverWithoutMutation]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpSyntax.ReadsLegacyCantileverWithoutMutation]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpSyntax.ReadsLegacyCantileverWithoutMutation]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_reader_test.cpp:92]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpSyntax.CanonicalizesKeywordAndParameterNamesOnly]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpSyntax.CanonicalizesKeywordAndParameterNamesOnly]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpSyntax.CanonicalizesKeywordAndParameterNamesOnly]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_syntax_test.cpp:38]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[InpSyntax.PreservesDataAndSourceLocations]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=InpSyntax.PreservesDataAndSourceLocations]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[InpSyntax.PreservesDataAndSourceLocations]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\abaqus\input_syntax_test.cpp:63]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:824]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:994]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1022]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1074]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1102]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1119]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1202]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1262]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1300]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_results_writer_test.cpp:1318]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_writer_components_test.cpp:126]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_writer_components_test.cpp:147]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\io\hdf5\hdf5_writer_components_test.cpp:163]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Load.ConcentratedNodalLoadEmitsStableFullDofContributions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Load.ConcentratedNodalLoadEmitsStableFullDofContributions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Load.ConcentratedNodalLoadEmitsStableFullDofContributions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\loads\load_test.cpp:50]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\loads\load_test.cpp:85]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\domain_test.cpp:69]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainModel.ImmutableOwnershipPreservesStableOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainModel.ImmutableOwnershipPreservesStableOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainModel.ImmutableOwnershipPreservesStableOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\domain_test.cpp:152]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainModel.MultipleIdentityInstancesDoNotMerge]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainModel.MultipleIdentityInstancesDoNotMerge]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainModel.MultipleIdentityInstancesDoNotMerge]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\domain_test.cpp:211]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\domain_test.cpp:291]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainModel.SourceAndInternalIdentityRemainDistinct]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainModel.SourceAndInternalIdentityRemainDistinct]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainModel.SourceAndInternalIdentityRemainDistinct]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\model_types_test.cpp:33]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\model_types_test.cpp:131]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp:93]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp:139]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp:168]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp:195]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\shell_geometry_test.cpp:249]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\source_target_resolver_test.cpp:54]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\source_target_resolver_test.cpp:87]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\model\source_target_resolver_test.cpp:112]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Material.OwnsIsotropicElasticityThroughVirtualBase]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Material.OwnsIsotropicElasticityThroughVirtualBase]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Material.OwnsIsotropicElasticityThroughVirtualBase]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\materials\material_test.cpp:19]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[Material.RejectsInvalidCurrentElasticFields]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=Material.RejectsInvalidCurrentElasticFields]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[Material.RejectsInvalidCurrentElasticFields]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\materials\material_test.cpp:42]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\properties\element_property_test.cpp:20]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementProperty.OwnsShellSectionThroughVirtualBase]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementProperty.OwnsShellSectionThroughVirtualBase]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementProperty.OwnsShellSectionThroughVirtualBase]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\properties\element_property_test.cpp:48]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementProperty.PreservesEmptyOptionalSectionPointInventory]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementProperty.PreservesEmptyOptionalSectionPointInventory]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementProperty.PreservesEmptyOptionalSectionPointInventory]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\properties\element_property_test.cpp:67]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ElementProperty.RejectsInvalidCurrentSectionFields]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ElementProperty.RejectsInvalidCurrentSectionFields]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ElementProperty.RejectsInvalidCurrentSectionFields]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\properties\element_property_test.cpp:75]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:289]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:358]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:397]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:455]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:491]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_components_test.cpp:556]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:486]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:537]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.FailingFakeBundleRollsBackTheWholeState]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.FailingFakeBundleRollsBackTheWholeState]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.FailingFakeBundleRollsBackTheWholeState]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:568]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.ComputesResidualReactionForNonzeroPrescription]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.ComputesResidualReactionForNonzeroPrescription]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.ComputesResidualReactionForNonzeroPrescription]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:637]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.EnforcesNormalizedFreeResidual]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.EnforcesNormalizedFreeResidual]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.EnforcesNormalizedFreeResidual]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:666]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:724]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:745]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.OrdersStressPointsAndDefaultCentroid]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.OrdersStressPointsAndDefaultCentroid]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.OrdersStressPointsAndDefaultCentroid]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:775]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:813]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.RecoversShellRowsInStableElementAndGpOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.RecoversShellRowsInStableElementAndGpOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.RecoversShellRowsInStableElementAndGpOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:874]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.RecoversDirectBottomMiddleTopShellStress]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.RecoversDirectBottomMiddleTopShellStress]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.RecoversDirectBottomMiddleTopShellStress]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:923]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:951]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:971]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.UsesGlobalOriginForShellMomentBalance]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.UsesGlobalOriginForShellMomentBalance]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.UsesGlobalOriginForShellMomentBalance]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:1015]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:1059]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\results\result_recovery_test.cpp:1109]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.RejectsInvalidCsrStateAndDimensions]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.RejectsInvalidCsrStateAndDimensions]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.RejectsInvalidCsrStateAndDimensions]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\linear_solver_test.cpp:48]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp:90]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp:106]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.RefactorizesWithoutLeakingState]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.RefactorizesWithoutLeakingState]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.RefactorizesWithoutLeakingState]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp:126]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp:149]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +add_test([=[MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly]=] C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests/fesa_unit_tests.exe [==[--gtest_filter=MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly]==] --gtest_also_run_disabled_tests) +set_tests_properties([=[MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly]=] + PROPERTIES + + DEF_SOURCE_LINE [==[C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson\tests\unit\solvers\linear\mkl_pardiso_solver_test.cpp:197]==] + WORKING_DIRECTORY [==[C:/git/FESADev/.worktrees/nonlinear-static-newton-raphson/.harness/build-ninja/tests]==] + SKIP_REGULAR_EXPRESSION [==[\[ SKIPPED \]]==] + [[LABELS]] [[linear-static-3d-euler-beam;unit]] +) +set(fesa_unit_tests_TESTS [==[BuildInfo.VersionIsStableAndNonEmpty]==] [==[BuildInfo.PublicHeaderHasNoBackendDependency]==] [==[Analysis.PropagatesStatusAndDestroysThroughMinimalAnalysis]==] [==[AnalysisModel.ClassifiesActiveEntitiesInStableOrder]==] [==[AnalysisModel.ReferencesWithoutCopyingOrMutatingDomain]==] [==[AnalysisModel.KeepsNonOwningMixedDefinitionAndPropertyIndices]==] [==[AnalysisModel.RejectsMissingOrMultipleStep]==] [==[AnalysisState.AllocatesOnlyV0FullVectors]==] [==[AnalysisState.CopiesOrMovesWithoutAliasing]==] [==[AnalysisState.PreservesStepFrameAndStableRowOrder]==] [==[AnalysisState.OwnsExactShellRowsInStableElementAndLocationOrder]==] [==[AnalysisState.CommitsFiniteShellGlobalEvidence]==] [==[AnalysisState.InvalidShellCandidatesLeavePriorStateUnchanged]==] [==[ParallelFor.ZeroOneManyExecuteExactlyOnce]==] [==[ParallelFor.SerialAndTbbProduceStableIndexedOutput]==] [==[ParallelFor.PropagatesBodyExceptionByContract]==] [==[LoadAssembly.AccumulatesGenericContributionsInSuppliedSourceOrder]==] [==[LoadAssembly.RejectsGenericContributionErrorsBeforeCandidateCommit]==] [==[LoadAssembly.AssemblesNodeSetAndSixComponentLoads]==] [==[LoadAssembly.AccumulatesSignedLoadsInSourceOrder]==] [==[LoadAssembly.AggregatesAllSixGlobalShellLoadComponentsInSourceOrder]==] [==[LoadAssembly.AcceptsExactlyZeroAggregateShellMoment]==] [==[LoadAssembly.EnforcesAggregateShellMomentDirectorProjectionThreshold]==] [==[LoadAssembly.RejectsDrillingMomentBeforeEffectiveRhsCanBeFormed]==] [==[LoadAssembly.FormsNonzeroPrescribedEffectiveRhs]==] [==[LoadAssembly.RejectsNonfiniteOrDimensionMismatch]==] [==[LoadAssembly.ZeroLoadsRemainZero]==] [==[SparseAssembly.AssemblesFakeRuntimeContributionsIntoExactDeterministicCsr]==] [==[SparseAssembly.SerialTbbAndRepeatedRunsAreByteIdentical]==] [==[SparseAssembly.AssemblesFourNodeTwentyFourDofKernelAndPreservesDiagonalSlots]==] [==[SparseAssembly.ShellSerialTbbReverseAndRepeatedRunsAreByteIdentical]==] [==[SparseAssembly.S4AndS4rSemanticFixturesAssembleIdenticalStiffness]==] [==[SparseAssembly.ValidatesKnownCsrAndMultiply]==] [==[SparseAssembly.ReducesDuplicatesInFixedTupleOrder]==] [==[SparseAssembly.RejectsInvalidIndexPatternAndShape]==] [==[SparseAssembly.PreservesExpectedStructuralZeros]==] [==[OutputPaths.RejectsFirstTokenContainingOutputSubstring]==] [==[OutputPaths.RejectsEveryOutputSubstringVariant]==] [==[OutputPaths.DerivesNormalizedSiblingNamesFromRelativeInput]==] [==[OutputPaths.PreservesBasenameCaseAndPrecedingDots]==] [==[OutputPaths.RejectsInputWithoutInpFinalExtension]==] [==[OutputPaths.LeaseCollisionPreservesPublicOutputPaths]==] [==[OutputPaths.AnalysisRequestCarriesInputResultAndLogPaths]==] [==[BoundaryCondition.ResolvesStableNonzeroDefinitionsThroughBase]==] [==[BoundaryCondition.DomainOwnsExpandedPolymorphicDefinitionsStably]==] [==[BoundaryCondition.RejectsDuplicateConflictAndNonfiniteBeforeCandidateCommit]==] [==[BoundaryCondition.AcceptsIdenticalOverlapAcrossSourceDefinitions]==] [==[BoundaryCondition.ConcreteRejectsNonfinitePrescribedValue]==] [==[EssentialConstraints.ExtractsHandComputedBlocksInStableOrder]==] [==[EssentialConstraints.HandlesNoAllAndMixedConstraints]==] [==[EssentialConstraints.PreservesShellSizedNoMixedAndAllConstraintRoundTrips]==] [==[EssentialConstraints.ReconstructsNonzeroPrescribedValues]==] [==[EssentialConstraints.RejectsDimensionOrOrderMismatch]==] [==[Ascii.LowercasesOnlyAsciiUppercaseBytes]==] [==[Ascii.ComparesNamesWithoutLocaleOrUnicodeFolding]==] [==[Ascii.ParsesOnlyCompletePositiveBaseTenSourceLabels]==] [==[CoreDiagnostics.DiagnosticsSortDeterministically]==] [==[CoreDiagnostics.SourceIdentityPreservesRawIdentity]==] [==[CoreDiagnostics.ResultEnforcesValueErrorExclusivity]==] [==[ElementFactory.CreatesBeamWithStableLayoutStiffnessAndRecovery]==] [==[ElementFactory.CreatesMitc4WithStableLayoutStiffnessAndRecovery]==] [==[ElementFactory.OwnerBuildsNonOwningViewInStableElementOrder]==] [==[ElementFactory.RejectsUnknownAndIncompatibleDefinitions]==] [==[EulerBeam3D.HermiteAndBMatrixMatchReviewedSigns]==] [==[EulerBeam3D.TwoPointGaussMatchesClosedStiffness]==] [==[EulerBeam3D.HasSixRigidModesRankSixAndPositiveDeformationEnergy]==] [==[EulerBeam3D.RotatedTransformPreservesWorkAndEnergy]==] [==[EulerBeam3D.PreservesExactRotatedResultsAcrossVector3Migration]==] [==[EulerBeam3D.ConstantLineLoadMatchesAllSignedComponents]==] [==[EulerBeam3D.AnalyticalAxialTorsionAndTwoPlaneBendingRecover]==] [==[EulerBeam3D.RejectsInvalidGeometryAndProperties]==] [==[EulerBeam3D.RecoversSectionPointAndDefaultCentroidS11]==] [==[EulerBeam3D.ReproducesConstantStrainTwistAndCurvaturePatches]==] [==[EulerBeam3D.OnePointNegativeControlHasRankFour]==] [==[Mitc4ShellKinematics.ShapeFunctionsSatisfyNodalAndDerivativeIdentities]==] [==[Mitc4ShellKinematics.BuildsRightHandedFramesAndSeparatePhysicalDrillingMaps]==] [==[Mitc4ShellKinematics.FormsDirectColumnsAndAllCovariantTyingSamples]==] [==[Mitc4ShellKinematics.UsesOneFixedTwoByTwoByTwoQuadratureOrder]==] [==[Mitc4ShellConstitutive.BuildsExactPositiveDefiniteSectionMatricesAndRescalesUnits]==] [==[Mitc4ShellKernel.FormsFiniteScaledSymmetricPhysicalAndStabilizedStiffness]==] [==[Mitc4ShellKernel.PreservesExactStiffnessRecoveryAndPatchAcrossVector3Migration]==] [==[Mitc4ShellKernel.PreservesPhysicalEnergyUnderTwentyToTwentyFourCongruence]==] [==[Mitc4ShellKernel.RetainsSixRigidModesAndHasExpectedPhysicalAndStabilizedRank]==] [==[Mitc4ShellPatch.ReproducesIndependentMembraneBendingShearAndTwistFields]==] [==[Mitc4ShellDrilling.UsesOnlyEightPositivePhysicalRotationDiagonalsAndFixedFactor]==] [==[Mitc4ShellDrilling.FailsNonfiniteReferenceAndStabilizesEachPureDrillCoordinate]==] [==[Mitc4ShellDrilling.ExcludesPureDrillFromPhysicalRecoveryAndEnergy]==] [==[Mitc4ShellPhysicalRecovery.RecoversHandFieldAtFixedLocationsAndSectionPositions]==] [==[DofManager.BuildsGenericRuntimeLayoutsInDeclaredSourceOrder]==] [==[DofManager.RejectsEveryCorruptedOwnerMappingInvariant]==] [==[DofManager.NumbersSixDofsAndFreeEquationsStably]==] [==[DofManager.ExpandsAndValidatesPrescribedValues]==] [==[DofManager.BuildsTwelveDofScatterAndSortedUniquePattern]==] [==[DofManager.BuildsShellScatterInSourceNodeAndComponentOrder]==] [==[DofManager.IncludesShellConnectivityInSortedUniqueSparsePattern]==] [==[DofManager.ReconstructsFullReducedRoundTrip]==] [==[DenseBlasInternal.CDup003ConvertsZeroNormalAndOverflowLengths]==] [==[DenseBlasInternal.CDup003CopiesZeroAndNonzeroContiguousValues]==] [==[DenseMath.RowMajorMatrixMatchesKnownGemvGemm]==] [==[DenseMath.VectorOwnsAndChecksContiguousStorage]==] [==[Vector3.StoresComponentsWithExactArithmetic]==] [==[Vector3.ConvertsArrayAndPreservesScalarLeftEvaluationOrder]==] [==[Vector3.ComputesDotProduct]==] [==[Vector3.UsesRightHandedCrossProductOrientation]==] [==[Vector3.ComputesEuclideanNorm]==] [==[Vector3.NormalizesNonzeroVectors]==] [==[Vector3.ReportsFiniteComponents]==] [==[Vector3.RejectsZeroAndNonfiniteNormalization]==] [==[DomainMappingComponents.CModule001BuildsStableCandidatesBeforeAtomicDomainCommit]==] [==[DomainMappingComponents.CModule001PreservesExactFirstFailureThroughFacade]==] [==[DomainMappingComponents.CModule001RejectsInvalidMaterialAtOwningComponent]==] [==[DomainMappingComponents.CModule001RejectsUnresolvedLoadAtOwningComponent]==] [==[InpDomainMapping.MapsEverySupportedKeywordAndLegacyDeck]==] [==[InpDomainMapping.ExpandsSetsAndMultipleIdentityInstancesDeterministically]==] [==[InpDomainMapping.KeepsNodeAndElementSetNamesInSeparateNamespaces]==] [==[InpDomainMapping.NoOpAllowlistWarnsWithoutSemanticEffect]==] [==[InpDomainMapping.MapsS4AndS4rThroughOneMitc4Identity]==] [==[InpDomainMapping.RejectsInvalidShellAssignmentsAndProperties]==] [==[InpDomainMapping.RejectsInvalidShellConnectivityOptionsAndMixedModels]==] [==[InpDomainMapping.PreservesProcedureLoadAndOutputRequestBoundariesForShells]==] [==[InpDomainMapping.RejectsUnsupportedAndInvalidPortfolio]==] [==[InpDomainMapping.RejectsDloadWithoutDistributedLoadObject]==] [==[InpSyntax.RejectsMalformedOrOrphanData]==] [==[InpSyntax.ReadsLegacyCantileverWithoutMutation]==] [==[InpSyntax.CanonicalizesKeywordAndParameterNamesOnly]==] [==[InpSyntax.PreservesDataAndSourceLocations]==] [==[Hdf5ResultsWriter.WritesExactSchemaShapesAttributesAndIdentity]==] [==[Hdf5ResultsWriter.WritesMandatoryOutputsDespiteOutputRequests]==] [==[Hdf5ResultsWriter.WritesWarningsAndDefaultCentroid]==] [==[Hdf5ResultsWriter.FailureLeavesNoPartialAndPreservesExistingFinal]==] [==[Hdf5ResultsWriter.SuccessfullyReplacesExistingFinal]==] [==[Hdf5ResultsWriter.WritesExactShellMetadataAndModelIdentity]==] [==[Hdf5ResultsWriter.WritesExactMandatoryShellResultInventory]==] [==[Hdf5ResultsWriter.WritesShellInventoryDespiteRequestsAndOmitsForbiddenPaths]==] [==[Hdf5ResultsWriter.InvalidShellInventoryPreservesExistingFinal]==] [==[Hdf5ResultsWriter.Vector3ShellSerializationRejectsNonfiniteWithoutReplacingFinal]==] [==[Hdf5WriterComponents.BuildsStableBackendNeutralBeamDatasetPlans]==] [==[Hdf5WriterComponents.RejectsNonfiniteDatasetPlanInventory]==] [==[Hdf5WriterComponents.SelfCheckFailurePreservesExistingFinalThroughAtomicSeam]==] [==[Load.ConcentratedNodalLoadEmitsStableFullDofContributions]==] [==[Load.ConcentratedNodalLoadRejectsInvalidInputWithoutContributions]==] [==[ElementDefinition.DomainOwnsMixedDefinitionsInStableBaseOrder]==] [==[DomainModel.ImmutableOwnershipPreservesStableOrder]==] [==[DomainModel.MultipleIdentityInstancesDoNotMerge]==] [==[DomainModel.ShellOwnershipPreservesResolvedAssignmentsAndOptionalFrames]==] [==[DomainModel.SourceAndInternalIdentityRemainDistinct]==] [==[DomainModel.Mitc4ShellRecordsPreserveSourceAndInternalIdentity]==] [==[Mitc4Geometry.BuildsDeterministicFramesForPlanarRotatedAndWarpedElements]==] [==[Mitc4Geometry.PreservesExactWarpedResultsAcrossVector3Migration]==] [==[Mitc4Geometry.AreaWeightsSharedDirectorsInStableSourceIdentityOrder]==] [==[Mitc4Geometry.RejectsInvalidSurfaceJacobianAndIncidentOrientationCases]==] [==[Mitc4Geometry.ExposesTheCompleteRequiredValidationPointInventory]==] [==[SourceTargetResolver.SeparatesNamespacesAndInstancesAndExpandsInDeclarationOrder]==] [==[SourceTargetResolver.RejectsMissingAmbiguousAndNonpositiveTargets]==] [==[SourceTargetResolver.ReportsDuplicateMembershipsInDeterministicDeclarationOrder]==] [==[Material.OwnsIsotropicElasticityThroughVirtualBase]==] [==[Material.RejectsInvalidCurrentElasticFields]==] [==[ElementProperty.OwnsGeneralBeamSectionThroughVirtualBase]==] [==[ElementProperty.OwnsShellSectionThroughVirtualBase]==] [==[ElementProperty.PreservesEmptyOptionalSectionPointInventory]==] [==[ElementProperty.RejectsInvalidCurrentSectionFields]==] [==[ResultRecoveryComponents.GlobalEquilibriumUsesFullResidualAndGlobalOriginMoment]==] [==[ResultRecoveryComponents.BeamResultRecoveryKeepsEndpointGaussAndStressIdentities]==] [==[ResultRecoveryComponents.BeamResultRecoveryRejectsMalformedB33IdentityBeforeAppending]==] [==[ResultRecoveryComponents.ShellResultRecoveryKeepsGpStressOrderAndPhysicalEnergy]==] [==[ResultRecoveryComponents.CommitRecoveryCandidateRollsBackLaterInvalidShellBundle]==] [==[ResultRecoveryComponents.CommitRecoveryCandidateRejectsNonfiniteVectorAndPreservesWholeState]==] [==[ResultRecovery.AggregatesFakeBeamBundlesInStableRuntimeOrder]==] [==[ResultRecovery.AggregatesFakeShellBundleAndPhysicalEnergy]==] [==[ResultRecovery.FailingFakeBundleRollsBackTheWholeState]==] [==[ResultRecovery.ComputesResidualReactionForNonzeroPrescription]==] [==[ResultRecovery.EnforcesNormalizedFreeResidual]==] [==[ResultRecovery.KeepsEndActionSectionAndGaussResultsDistinct]==] [==[ResultRecovery.MatchesAxialTorsionAndTwoPlaneEndSigns]==] [==[ResultRecovery.OrdersStressPointsAndDefaultCentroid]==] [==[ResultRecovery.RequiresInteriorEndpointConsistencyWithoutAveraging]==] [==[ResultRecovery.RecoversShellRowsInStableElementAndGpOrder]==] [==[ResultRecovery.RecoversDirectBottomMiddleTopShellStress]==] [==[ResultRecovery.SumsOnlyPhysicalShellEnergyInSourceOrder]==] [==[ResultRecovery.KeepsFullResidualAndComputesGlobalShellEquilibrium]==] [==[ResultRecovery.UsesGlobalOriginForShellMomentBalance]==] [==[ResultRecovery.UsesScaleAwareShellMetricsAndRejectsExcess]==] [==[ResultRecovery.InvalidLaterShellLeavesEntirePriorStateUnchanged]==] [==[MklPardisoSolver.RejectsInvalidCsrStateAndDimensions]==] [==[MklPardisoSolver.SolvesKnownSpdWithNormalizedResidual]==] [==[MklPardisoSolver.ReusesOneFactorizationForRepeatedRhs]==] [==[MklPardisoSolver.RefactorizesWithoutLeakingState]==] [==[MklPardisoSolver.ClassifiesSingularIndefiniteAndNonfiniteFailures]==] [==[MklPardisoSolver.ConditioningSweepPassesResolvedCasesAndFailsUnresolvedCasesExplicitly]==]) diff --git a/.harness/config.example.json b/.harness/config.example.json index 51d1846..b8853ea 100644 --- a/.harness/config.example.json +++ b/.harness/config.example.json @@ -1,16 +1,11 @@ { "version": 1, - "projectType": "auto", - "tdd": { - "testRoots": [ - "tests", - "test" - ], - "testPatterns": [ - "{stem}_test.cpp", - "{stem}_tests.cpp", - "test_{stem}.cpp", - "{stem}.test.cpp" - ] + "projectType": "cmake", + "cmake": { + "sourceDir": ".", + "binaryDir": ".harness/build-ninja-msvc-debug", + "configurePreset": "windows-msvc-ninja-debug", + "buildPreset": "windows-msvc-ninja-debug", + "testPreset": "windows-msvc-ninja-debug" } } diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..3e9acbc --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,30 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "windows-msvc-ninja-debug", + "displayName": "Windows MSVC x64 Debug (Ninja)", + "generator": "Ninja", + "binaryDir": "${sourceDir}/.harness/build-ninja-msvc-debug", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", + "MKL_DIR": "$env{MKL_DIR}", + "TBB_DIR": "$env{TBB_DIR}", + "HDF5_DIR": "$env{HDF5_DIR}" + } + } + ], + "buildPresets": [ + { + "name": "windows-msvc-ninja-debug", + "configurePreset": "windows-msvc-ninja-debug" + } + ], + "testPresets": [ + { + "name": "windows-msvc-ninja-debug", + "configurePreset": "windows-msvc-ninja-debug" + } + ] +} diff --git a/docs/ADR.md b/docs/ADR.md index 82238ca..4ffd9b1 100644 --- a/docs/ADR.md +++ b/docs/ADR.md @@ -346,3 +346,30 @@ gate와 family RMS gate를 모두 유지해야 한다. Reference family 전체 MITC4 verification report 및 comparator schema는 새 정책에 맞춰 다시 생성해야 하지만 reference artifact, HDF5 schema, element formulation과 blocking/warning 분류는 변경하지 않는다. + +### ADR-023: Nonlinear Static은 prepared dispatch와 accepted-frame evidence로 분리한다 + +**결정**: CLI는 하나의 `.inp` operand만 받고 input lexical sibling +`_results.h5`와 `_log.txt`를 유도한다. `--output`은 지원하지 않는다. +`PrepareAnalysisInput()`이 syntax/semantic map을 한 번만 수행하고, prepared Domain의 +procedure identity가 linear static 또는 separate nonlinear full-Newton procedure를 선택한다. +Nonlinear procedure는 trial/committed state, unsymmetric tangent solver와 iteration log를 +독립적으로 소유하며 log close 뒤에만 schema-v1 HDF5 writer가 accepted frames를 atomic publish한다. + +schema-v1 `/global/equilibrium`의 six values는 global origin `[0,0,0]`에서 current `X+u` +force arm과 spatial physical nodal moments를 쓴 applied-plus-constrained-reaction balance +error다. Accepted free generalized residual과 constrained-reaction resultant는 distinct +projections이며 result dataset을 서로 대체하지 않는다. Nonlinear reference portfolio는 fine +primary `shellNL-meshfine`, coarse companion `shellNL`, linear control `shell`을 분리한다. +External U is blocking, UR is warning-only, local RF/RM is review-only, and RM3/stress is excluded; +the factor-one internal global force/moment balance and accepted free residual remain blocking. + +**이유**: Input parse, linear lifecycle, nonlinear trial state와 writer finalization을 한 +procedure에 섞으면 output lifetime과 failure atomicity를 검증할 수 없다. Applied-plus-reaction +balance, constrained reaction과 free residual을 구분하면 nonzero prescribed translation/rotation +case에서도 force arm, mask와 rotation-coordinate conversion의 의미가 보존된다. + +**트레이드오프**: Nonlinear path는 linear procedure보다 state/backend/writer 수가 늘고 fine +reference run 시간이 길다. 대신 HDF5 authoritative output, immutable CSV artifact와 external +solver internal-algorithm non-equivalence 원칙을 유지하며 local support-force distribution을 +blocking tolerance로 위장하지 않는다. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index d2de1c8..1a9e02a 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -317,9 +317,25 @@ Abaqus input file -> LinearSolver::solve(rhs, df) substitution -> full displacement 복구 -> full residual/reaction = K*d - F 및 ElementResultBundle 복구 --> ResultsWriter로 results.h5 atomic finalization +-> ResultsWriter로 derived `_results.h5` atomic finalization ``` +### 승인된 Nonlinear Static 경로 + +`PrepareAnalysisInput()`은 input syntax와 semantic Domain을 정확히 한 번 만든다. +`ExecutePreparedAnalysis()`는 sole static step의 procedure identity로 linear static 또는 +nonlinear static executor를 선택하며 두 procedure의 mutable state를 공유하지 않는다. +Nonlinear executor는 committed/trial `NonlinearAnalysisState`, full unsymmetric CSR tangent +solver와 closed-before-finalization Newton iteration log를 소유한다. Completion 뒤 +`FinalizePreparedAnalysisResult()`가 selected backend-neutral writer로 only accepted frames를 +atomic finalization한다. + +Nonlinear schema v1의 factor-one `/global/equilibrium`은 raw full-residual sum이 아니라 +global origin `[0,0,0]`에서 current `X+u` force arm과 independently spatialized applied and +masked constrained-reaction moments를 합한 applied-plus-reaction balance error다. Accepted +free residual은 generalized residual의 free mask projection이고 constrained-reaction resultant는 +별도 review summary다. 어느 quantity도 다른 quantity의 substitute가 아니다. + 강성행렬 factorization은 하중벡터 조립보다 먼저 수행한다. 반력은 element end action의 별도 합이 아니라 조립된 전체 residual에서 구한다. Constrained component는 physical reaction이고 free component는 equilibrium residual evidence로 full-index vector에 남긴다. @@ -400,7 +416,8 @@ Schema requirements: - schema version, units, coordinate system, solver version, source input identity를 metadata에 기록한다. - field output과 history output을 구분한다. - reference comparison을 위한 row identity는 node id, element id, integration point id, step/frame id를 포함한다. -- FESA solver는 `results.h5`를 authoritative output으로 쓴다. +- FESA solver는 input lexical sibling `_results.h5`를 authoritative output으로 쓰며, + 같은 directory의 `_log.txt`는 procedure log다. - Abaqus reference results는 기능 문서가 선언한 기존 CSV 파일이다. Directory/file naming, README, metadata 또는 provenance는 architecture readiness 조건이 아니다. - Verification은 기능이 요구하는 source identity와 component를 결정적으로 대응시키고 @@ -410,7 +427,7 @@ Schema requirements: - Writer는 final과 같은 directory의 임시 HDF5에 전체 schema를 쓴 뒤 flush, checked close, read-only reopen/self-check를 수행한다. Existing final은 `ReplaceFileW`, 새 final은 `MoveFileExW(..., MOVEFILE_WRITE_THROUGH)`로 완료하며 실패 시 temporary artifact를 - 정리하고 불완전한 파일을 정상 `results.h5`로 노출하지 않는다. + 정리하고 불완전한 파일을 정상 `_results.h5`로 노출하지 않는다. ## V0 결과 복구와 reference normalization @@ -438,10 +455,11 @@ Schema requirements: ## CLI와 diagnostics ```powershell -fesa.exe --output +fesa.exe ``` -`--output`을 생략하면 현재 작업 디렉터리의 `results.h5`를 사용한다. Exit code는 +CLI는 input과 같은 lexical sibling directory에 `_results.h5`와 +`_log.txt`를 유도하고 `--output`을 거부한다. Exit code는 `0=success`, `2=usage`, `3=input syntax/semantic mapping`, `4=model validation`, `5=factorization/substitution`, `6=HDF5 output`으로 고정한다. Diagnostic은 `severity`, `code`, `file`, `line`, `keyword`, `entity_identity`, `message`를 가지며 stderr에 @@ -479,3 +497,10 @@ displacement CSV만 사용한다. Global `U1/U2/U3` translation family만 blocki family-scale row/RMS 정책을 사용한다. S4R은 같은 kernel을 선택하는 source mapping과 metadata를 unit/integration tests로 검증하며 `reference/shellR/` artifact는 acceptance comparison에 포함하지 않는다. + +Approved nonlinear MITC4 verification은 `reference/shellNL-meshfine/` fine primary, +`reference/shellNL/` coarse companion과 `reference/shell/` linear control을 각각 독립 +copied-input directory에서 실행한다. Factor-one global force/moment balance와 accepted free +residual은 blocking internal evidence다. External `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 +warning-only이며 local nodal `RF1/RF2/RF3/RM1/RM2`는 deterministic review-only evidence다; +`RM3`와 stress는 nonlinear numerical comparison에서 제외한다. diff --git a/docs/PRD.md b/docs/PRD.md index 4eae466..71b3964 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -2,7 +2,7 @@ ## 목표 FESA는 Abaqus `.inp` keyword subset을 입력으로 받아 자체 유한요소 정식화로 구조해석을 -수행하고, step/frame 단위 결과를 `results.h5` HDF5로 저장하며, 기능이 지정한 Abaqus +수행하고, step/frame 단위 결과를 input lexical sibling `_results.h5` HDF5로 저장하며, 기능이 지정한 Abaqus reference CSV 수치와 비교 가능한 C++17/MSVC 솔버를 제공한다. Abaqus의 요소 알고리즘, 적분법, stabilization 또는 내부 결과 생성 절차를 재현하는 것은 목표가 아니다. @@ -36,7 +36,7 @@ Element/material 계층의 일반적인 runtime polymorphism, iterative solver, 2. FESA는 syntax를 읽은 뒤 semantic mapping과 model validation을 수행한다. 지원하지 않는 모델 의미는 구조화된 diagnostic과 안정된 exit code로 거부한다. 3. 해석 procedure는 active model view, DOF/equation map과 sparse system을 만들고, essential constraint elimination을 적용해 선형계를 factorize하고 substitution한다. 4. FESA는 full displacement를 복구하고 equilibrium residual/reaction과 element 결과를 계산한다. -5. 성공 시 output request와 무관한 mandatory 결과, metadata와 diagnostic을 versioned `results.h5`에 기록한다. 실패 시 불완전한 최종 결과 파일을 정상 결과처럼 남기지 않는다. +5. 성공 시 output request와 무관한 mandatory 결과, metadata와 diagnostic을 versioned lexical sibling `_results.h5`에 기록한다. 실패 시 불완전한 최종 결과 파일을 정상 결과처럼 남기지 않는다. 6. 검증 workflow는 기능이 지정한 HDF5 quantity를 기존 Abaqus CSV의 source identity와 component에 대응시켜 tolerance를 판정하고, 별도로 equilibrium과 물리적 타당성을 검토한다. Reference bundle naming이나 provenance는 수치 비교 gate가 아니다. @@ -76,10 +76,27 @@ Parser keyword, element kernel, solver backend 또는 output dataset 중 하나 - displacements, reactions, equilibrium end actions, section resultants, generalized results, axial `S11` output - HDF5 result schema v0 -- `fesa.exe --output ` CLI +- `fesa.exe ` CLI with lexical sibling result/log names - 승인된 `reference/cantilever beam/` B33 결과와 displacement, reaction, section resultant comparison; beam stress reference comparison은 N/A +## 승인된 Nonlinear Static 확장 + +- `*STATIC, NLGEOM=YES` 단일 step은 parse/map을 정확히 한 번 수행한 뒤 linear static과 + 분리된 full-Newton procedure로 dispatch한다. Nonlinear path는 별도 mutable state, + unsymmetric tangent solver, iteration log writer와 schema-v1 HDF5 writer를 사용한다. +- CLI는 정확히 하나의 ``만 받고 `_results.h5`와 `_log.txt`를 같은 + lexical sibling directory에 유도한다. `--output`은 지원하지 않는다. +- Nonlinear HDF5 schema v1은 committed accepted frame만 기록한다. factor-zero는 metadata + baseline이며 accepted frame이 아니고, successful factor-one row는 unique + `load_factor=1.0` accepted frame이다. +- Factor-one `/global/equilibrium`은 global origin에서 current `X+u` arm과 spatial physical + moment를 사용한 applied-plus-constrained-reaction balance error다. Accepted free residual과 + constrained-reaction resultant는 그 dataset의 대체 quantity가 아니다. +- `shellNL-meshfine`는 primary nonlinear case, `shellNL`은 companion, `shell`은 linear + regression control이다. `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 warning-only이며 local + `RF/RM`은 review-only (`RM3` 및 stress 제외)로 비교한다. + ## 신규 기능의 제품 완료 정의 새로운 element, load, constraint, material, analysis procedure 또는 output quantity는 다음 조건을 모두 만족할 때 FESA 제품 기능으로 취급한다. @@ -102,7 +119,7 @@ Parser keyword, element kernel, solver backend 또는 output dataset 중 하나 | FESA-PRD-003 | FESA는 현재 step의 실행 view를 `AnalysisModel`로 구성해야 한다. | active elements, loads, boundary conditions, properties/materials가 Domain 복사 없이 참조 또는 id view로 연결된다. | analysis model unit test | | FESA-PRD-004 | FESA는 equation numbering과 constraint/free mapping을 `DofManager`에 집중해야 한다. | Node/Element 내부에 equation id를 분산 저장하지 않는다. | code review, DofManager unit test | | FESA-PRD-005 | FESA는 해석 중 변하는 물리량을 `AnalysisState`에 저장해야 한다. | V0 displacement, external/internal force, residual, constrained reaction, step/frame identity와 element recovery rows가 출력에 연결되고 velocity, acceleration, temperature, iteration history는 할당하지 않는다. | state unit test, integration test | -| FESA-PRD-006 | FESA는 solver 결과를 HDF5 authoritative output `results.h5`로 저장해야 한다. | V0 step/frame field results, metadata, diagnostics가 schema version과 함께 저장된다. | HDF5 schema test | +| FESA-PRD-006 | FESA는 solver 결과를 derived HDF5 authoritative output `_results.h5`로 저장해야 한다. | V0 step/frame field results, metadata, diagnostics가 schema version과 함께 저장된다. | HDF5 schema test | | FESA-PRD-007 | FESA는 기능이 지정한 Abaqus reference CSV quantity와 비교 가능한 deterministic source-row/component mapping을 제공해야 한다. | Required source IDs/components는 일대일 대응되고 missing/extra/duplicate/nonfinite row는 tolerance 전에 실패한다. Canonical naming, README, metadata, provenance 또는 CSV schema version은 요구하지 않는다. | reference comparison report | | FESA-PRD-008 | FESA의 production C++ 변경은 테스트를 먼저 작성하고 실패를 확인한 뒤 구현해야 한다. | 관련 C++ test file, RED 실패와 후속 GREEN 성공 증거가 있고 Stop의 전체 MSVC build/test가 통과한다. | implementation report, Hook guardrail, CTest | | FESA-PRD-009 | FESA는 외부 라이브러리 API를 solver core에 직접 노출하지 않아야 한다. | MKL, TBB, HDF5 의존은 adapter module에 제한된다. | architecture review, dependency review | @@ -139,7 +156,7 @@ Parser keyword, element kernel, solver backend 또는 output dataset 중 하나 required reference quantity의 최소 source-ID/component matching이 승인되어 있다. 5. Tests fail before implementation: C++/integration/reference test를 제품 코드보다 먼저 작성하고 같은 Step 안에서 RED 실패와 후속 GREEN 성공을 확인한다. 6. CMake/CTest pass: MSVC/x64/Debug 기준 configure, build, test가 통과한다. -7. Reference comparison pass: 기능이 blocking으로 선언한 FESA `results.h5` quantity가 +7. Reference comparison pass: 기능이 blocking으로 선언한 FESA `_results.h5` quantity가 선언된 Abaqus CSV와 source identity/component별로 대응되고 승인된 tolerance 안에 있다. 8. Physics sanity pass: equilibrium, reaction consistency, displacement direction, symmetry, section-force consistency와 normalized residual이 검토되어 있다. 9. Release readiness pass: acceptance traceability, known limitations, release notes draft가 준비되어 있다. @@ -151,7 +168,8 @@ Parser keyword, element kernel, solver backend 또는 output dataset 중 하나 - instance translation/rotation, nested assembly 및 dependent/independent mesh semantics - `I12 != 0`, taper, offset, release, curved beam, warping - Abaqus `*DLOAD` 입력과 Domain distributed-load object -- 기하·재료비선형, dynamics, contact, thermal effects +- 승인된 fixed-load-factor nonlinear-static 범위를 벗어난 기하·재료비선형, dynamics, + contact, thermal effects - transverse shear stress와 torsional shear stress recovery - beam stress에 대한 Abaqus reference comparison - Abaqus, Nastran 또는 reference solver 직접 실행 자동화 diff --git a/docs/nonlinear-static-newton-raphson/build-test.md b/docs/nonlinear-static-newton-raphson/build-test.md new file mode 100644 index 0000000..8e65b82 --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/build-test.md @@ -0,0 +1,44 @@ +# Nonlinear Static Newton-Raphson Build and Test Report + +## Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| owner_agent | `implementation-agent` | +| working directory | `C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson` | +| configuration | `windows-msvc-ninja-debug`, x64 Debug | +| compiler | MSVC `cl.exe` from VS 18, toolset `14.51.36231` | +| generator | Ninja | +| dependency configuration | `FESA_GTEST_SOURCE_DIR=C:/git/googletest`; MKL `2026.1`; TBB `2023.1`; HDF5 `2.1.1` | +| final classification | none; all commands passed | + +## Fresh command log + +| stage | command | exit | duration | output tail | +| --- | --- | ---: | ---: | --- | +| configure | `cmake --preset windows-msvc-ninja-debug` | 0 | 1.066 s | `Configuring done`; `Generating done`; build files written to `.harness/build-ninja-msvc-debug` | +| build | `cmake --build --preset windows-msvc-ninja-debug` | 0 | 0.113 s | `ninja: no work to do.` | +| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | 0 | 0.219 s | 302 tests discovered | +| focused control/log | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure` | 0 | 0.471 s | 14/14 passed | +| focused procedure/writer | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure` | 0 | 2.524 s | 7/7 passed | +| nonlinear reference | `ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` | 0 | 905.404 s | 9/9 passed | +| extended reference | `ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` | 0 | 930.617 s | 9/9 matched tests passed | +| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | 0 | 956.498 s | 302/302 passed; integration 16, unit 256, reference 30 | + +The full CTest output reported no failed-test inventory. The build emitted no compiler/linker +output beyond `ninja: no work to do.`; the build tree audit found no new `warning C####` or +`: warning:` record. The only diagnostic setup issue was that standalone HDF5 inspection tools +need Intel `libmmd.dll` on `PATH`; this did not affect the staged test executables, CMake build, or +CTest and is not a product failure. + +## Results and handoff + +The selected `.harness/config.json` preset was used throughout. All commands were run from the +repository root in an x64 VsDevCmd environment. The final status is +`pass-for-physics-evaluation`; no Harness Python command was required because this Step did not +change Python, hooks, or agent configuration. + +This Step changed documentation and its own phase status only. It did not modify C++ production, +tests, CMake, Harness configuration, tolerance, reference artifacts, or output data. The immutable +reference artifact audit before and after comparison was identical; see `reference-comparison.md`. diff --git a/docs/nonlinear-static-newton-raphson/coordination.md b/docs/nonlinear-static-newton-raphson/coordination.md index c6b499a..9c95533 100644 --- a/docs/nonlinear-static-newton-raphson/coordination.md +++ b/docs/nonlinear-static-newton-raphson/coordination.md @@ -3,77 +3,72 @@ ## 1. Metadata and Feature Scope - feature_id: `nonlinear-static-newton-raphson` -- workflow_state: `needs-implementation` +- workflow_state: `completed` - owner_agent: `coordinator-agent` - request_date: `2026-08-18` -- last_updated: `2026-08-24` (Harness attempt 1 timed out before Step 0 evidence; Step 0 retry dispatch package ready) +- last_updated: `2026-08-28` (STAGE8-RELEASE-001 return audited; eight-stage workflow completed) - process_classification: `architectural` - requested_capability: Newton–Raphson 방법을 사용하는 새 nonlinear static analysis procedure - proposed_scope_boundary: 첫 release는 initial configuration 기준 Total Lagrangian, materially linear + geometrically nonlinear MITC4로 제한한다. 요구조건 인터뷰와 8단계 evidence gate를 먼저 완료하며, 승인 전에는 상세 수치·I/O·구현 범위를 확정하거나 기존 linear-static lifecycle을 변경하지 않는다. - naming_note: 사용자 표현 `Newton-Rhapson`은 표준 명칭 `Newton–Raphson`으로 정규화했다. -- current_goal: Retry the user-authorized no-push Harness execution of materialized phase `nonlinear-static-newton-raphson`; Step 0 `cli-output-lease-and-derived-names` remains the only current Step after attempt 1 failed before Step evidence. -- constraints: 승인된 Stage 1-5 hashes, physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel과 Stage 6 materialization evidence를 보존한다. Retry `python scripts/execute.py nonlinear-static-newton-raphson` without `--push`; do not run `--push`, force-push, or use `danger-full-access`. Attempt 1 failure is classified as `harness-uncaught-step-codex-timeout-no-retry` attempt 1; if the same classification reaches attempt 2, stop automatic rework and route to `needs-user-decision` or `blocked`. `scripts/execute.py` owns branch, pending-Step selection, retry, timestamps, commits, advancement and top-level phase status. Each Implementation Agent session owns only the Executor-selected current `stepN.md` and must perform `RED -> observed failure -> minimal GREEN -> VERIFY`, updating only that Step status plus summary/error/blocked payload. Do not advance Physics/Release until `implementation-report.md`, `build-test.md`, `reference-comparison.md` and passing implementation evidence exist. Stress CSVs are optional inspection/order evidence only with no comparison projection; `RM3` is excluded; shellNL `U` is blocking, `UR` warning-only, constrained `RF` families and physical spatial `RM1/RM2` are blocking; exact source-ID prechecks and `docs/TOLERANCE.md` are preserved. Reference input/CSV 생성·수정·rename·정규화와 Abaqus/Nastran/reference solver 실행을 금지한다. +- current_goal: Stage 8 `ready-for-release` is audited and the eight-stage workflow is closed. Root retains the user's requested final commit/push; no external release action is authorized. +- constraints: 승인된 physics/scope/tolerance/authoritative output/public compatibility, `rho_M <= 1e-12`, fixed-global source identity, no drilling load channel, thresholds `1e-2`/typed absolute `1e-3`, four-channel AND, Full Newton, fixed stepping, no line search, 100-iteration limit, `docs/TOLERANCE.md`, reference artifact filenames/hashes, stress optional inspection and `RM3` exclusion을 유지한다. USER-DECISION-004 option 1 keeps local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` review-only/nonblocking, with blocking factor-one global applied-plus-reaction resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence; global resultant semantics are global origin `[0,0,0]`, current force arms and spatial physical nodal moments. USER-DECISION-006 supersedes/retire prior moment-only `1e-9` and all `fesa.env`/runtime-config discussion: do not add `fesa.env`, config parsing, runtime API, or product behavior. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Sequential reapproval is delegated to Coordinator without intermediate user approval through Stage 4 Numerical/reference, Stage 5 I/O and Stage 6 Implementation Planning materialization; Steps `11` and `12` are completed under the approved Codex CLI `0.150.1`/Ninja/MSVC envelope. Stage 8 may create only `release.md`; no push, no `danger-full-access`, no reference mutation/solver, no source/tests/CMake/upstream/tolerance edit, and no publish/deploy/package/tag/external release. Any required contract change beyond the fixed `1e-8` global balance threshold stops as blocker. - repository_audit: 기존 worktree에는 `.codex/agents/*.toml`과 `AGENTS.md`의 사용자 변경이 있으며 이를 보존한다. ## 2. Eight-Stage Worklist | stage | owner | status | output paths | acceptance gate | evidence summary | blockers | attempt count | | --- | --- | --- | --- | --- | --- | --- | --- | -| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | `<=400` lines, 24 canonical shall requirements, exact 24-row Matrix, approved semantic loss 0, Stage-1 user question 0 | Approved compact content 395 lines; approval metadata 2 lines, current 397; 24↔24 exact ID sets, duplicate/missing/orphan 0, OQ/questions/trivia/placeholders 0; core semantics and NSNR-083 public precedence retained; forbidden changes 0; user explicitly approved on 2026-08-23. | 없음 | 40 | +| 1. Requirements | `requirement-agent` | `passed` | `docs/nonlinear-static-newton-raphson/requirements.md` | USER-DECISION-004 option 1을 requirements/reference acceptance contract에 최소 반영하고 compact requirements contract, existing thresholds, four-channel AND, Full Newton, 100-iteration limit, `docs/TOLERANCE.md`, approved semantic loss 0을 보존함 | Requirement Agent returned revised `requirements.md` status `draft`, ready for Coordinator/user re-approval, SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator audit passed: hash matched, 401 lines, 24 requirement records, 24 Matrix rows, duplicate/missing/orphan IDs 0, USER-DECISION-004 option 1 expressed, local RF/RM review-only, blocking global applied-plus-reaction force/moment plus accepted free residual present, formulation semantics preserved, AUDIT-001 Stage5/6 handoff present, no tolerance/reference/HDF5/public-scope expansion. User explicitly re-approved this hash on 2026-08-27. | 없음 | 43 | | 2. Research | `research-agent` | `passed` | `docs/nonlinear-static-newton-raphson/research.md` | 필요한 이론·benchmark·source reliability·applicability limit가 충분함 | Owner/Coordinator pass와 2026-08-23 사용자 명시 승인; 10 required sections, S1–S17, 12 benchmark candidates, 11 research-relevant requirement IDs, 14 unique open issues; nonlinear stored reference gap explicit; SHA-256 `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; forbidden changes 0. | 없음 | 1 | -| 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | strong/weak form, kinematics, tangent/residual, integration, state/recovery가 구현 가능한 계약이며 O-ROT/O-MAP/O-DRILL/O-MOM/O-BC가 승인 scope 안에서 해소됨 | Rework attempt 2 owner/Coordinator pass와 사용자 명시 승인: reaction force/generalized moment/spatial moment symbols와 dimensions가 rotation matrix `R_I`와 분리됨; immutable fixed-global source, `rho_M <= 1e-12` admissibility, exact projected physical-work covector, `DP`/`DJ_l`/map-Hessian residual-tangent identity가 §§4.4/5/11.2–11.3/13.1/13.4/17에서 일치함; 18 sections와 7 closures 보존; SHA-256 `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`. | 없음 | 2 | -| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | 두 문서가 함께 `pass-for-io-definition`이며 수치 안정성과 exact reference contract가 준비됨 | Corrected owner return, Coordinator audit pass and user explicit approval: status `pass-for-io-definition`; approved formulation hash matched; shellNL/shell artifacts inspected read-only with row counts `49/49/288`, duplicate required wide keys 0 and nonfinite required values 0; stress CSVs are optional read-only inspection/order evidence only; `RM3` excluded; required external comparison uses displacement, reaction force and physical spatial `RM1/RM2`; exact prechecks and `docs/TOLERANCE.md` policy retained. Current hashes: numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`, reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`. | 없음 | 2 | -| 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | Abaqus subset, semantic mapping, HDF5 schema, diagnostics, CSV projection이 승인됨 | Bounded rework owner status `ready-for-coordinator-review`, SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`; Coordinator audit passed and user explicitly approved the same hash. REWORK-002 defects are corrected: every argv token containing literal `--output` fails pre-input/pre-log/pre-output with one `cli-usage` diagnostic; `nsnr-log-v1` uses UTF-8 no BOM/LF/TAB fixed fields with four-channel gates, typed thresholds, branch identity, early-failure `not-evaluated(reason)`, round-trip numerics and escaping; log open/write/flush/close is fail-closed with zero-byte non-Newton success logs; exact `VARIABLE=PRESELECT` output requests are ignored-with-warning; lexical path/stem derivation, single-writer/candidate collision rules, HDF5 schema v1, reference projection, stress/RM3 exclusions and `docs/TOLERANCE.md` policy are preserved. | 없음 | 2 | -| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `in-progress` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md` | 상세 인터뷰와 계획 승인 후 TDD, MSVC/x64/Debug CMake/CTest, blocking reference comparison이 통과함 | User explicitly requested `Harness/Implementation` execution on `2026-08-24`. Attempt 1 of no-push `python scripts/execute.py nonlinear-static-newton-raphson` failed before Step 0 edits/evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`, `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`, no `step0-output.json` was produced and Executor did not enter `MAX_RETRIES`. Root evidence also reports workspace-write smoke pass `HARNESS_SMOKE_OK` in `20.4s`, MSVC baseline build pass and CTest `214/214`; the Python baseline `xhigh` vs `extra high` failure is pre-existing/unrelated. This is normalized as `harness-uncaught-step-codex-timeout-no-retry` attempt 1 and routes back to Implementation/Harness retry, not Correction Agent. | 없음; same-class attempt 1 is below stop limit | 4 | -| 7. Physics evaluation | `physics-evaluation-agent` | `pending` | `docs/nonlinear-static-newton-raphson/physics-evaluation.md` | equilibrium, reaction, direction, path/history, energy, symmetry, model coverage가 `pass-for-release-agent`임 | 없음 | Stage 6 passing evidence 필요 | 0 | -| 8. Release readiness | `release-agent` | `pending` | `docs/nonlinear-static-newton-raphson/release.md` | `ready-for-release` recommendation과 acceptance traceability가 완전함 | 없음 | Stage 7 passing evidence 필요 | 0 | +| 3. Formulation | `formulation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/formulation.md` | §14.1만 USER-DECISION-003 option 1로 갱신하고 strong/weak form, kinematics, tangent/residual, integration, state/recovery, O-ROT/O-MAP/O-DRILL/O-MOM/O-BC closure를 보존함 | Owner returned `ready-for-coordinator-and-user-reapproval`, SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, §14.1-only diff `34` additions/`5` deletions, revised requirements hash matched, 13/13 contract assertions and diff check passed, no other owner file changes. Coordinator audit passed and user explicitly re-approved this hash on 2026-08-24: exact-zero branch selector is matching external residual-channel scale, nonzero external scale retains relative `max(internal, external)` denominator and `1e-2`, typed absolutes remain `1e-3`, correction gates/four-channel AND/lifecycle/reference disposition unchanged. | 없음 | 3 | +| 4. Numerical/reference review | `numerical-review-agent` | `passed` | `docs/nonlinear-static-newton-raphson/numerical-review.md`; `docs/nonlinear-static-newton-raphson/reference-model.md` | USER-DECISION-006 delegated reapproval: both normalized factor-one global FORCE and MOMENT balance gates are fixed `<=1e-8`, with exact formulas, sum-of-contribution scales, zero-scale rule, source identity and USER-DECISION-004 dispositions preserved | Owner returned `pass-for-io-definition`, blockers none. Coordinator audit verified hashes `numerical-review.md` `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; both reports record global force/moment normalized gate `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, 12 reference hashes/length/mtime unchanged, fine primary/coarse companion, U blocking, UR warning-only, local RF/RM review-only and `RM3`/stress excluded. Root independently verified hashes, target occurrences and `git diff --check` with only LF/CRLF warnings. | 없음 | 6 | +| 5. I/O definition | `io-definition-agent` | `passed` | `docs/nonlinear-static-newton-raphson/io.md` | USER-DECISION-006 fixed both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8` while preserving HDF5 schema/projections/reference paths and `docs/TOLERANCE.md` separation | Owner returned `ready-for-coordinator-review`, blockers none. Coordinator verified raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`; owner/root LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. `io.md` records both coarse/fine global force and moment internal gates as dimension-separated normalized `<=1e-8`, preserves `/global/equilibrium` schema version/path/shape/source identity, constrained reaction/free residual projections, zero-scale rule, NSNR-069, local RF/RM review-only, U blocking, UR warning-only, `RM3`/stress exclusions, reference paths and external-only `docs/TOLERANCE.md`. | 없음 | 7 | +| 6. Implementation | `implementation-planning-agent`; `implementation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `docs/nonlinear-static-newton-raphson/implementation-report.md`; `docs/nonlinear-static-newton-raphson/build-test.md`; `docs/nonlinear-static-newton-raphson/reference-comparison.md`; `docs/nonlinear-static-newton-raphson/corrections.md`; `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` | Add one unambiguous overall handoff status `pass-for-physics-evaluation` to `reference-comparison.md` while preserving detailed verdict `blocking-pass-with-review-only-findings`, all evidence/dispositions and no-change assertions | Owner returned `pass-for-physics-evaluation`, blockers none, SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`. Coordinator verified exact `4`-line status-only diff, both required status/verdict tokens, all six review-only findings and `<=1e-8` metrics retained, whitespace clean, and no reference artifact or other owner-path change. | 없음 | 38 | +| 7. Physics evaluation | `physics-evaluation-agent` | `passed` | `docs/nonlinear-static-newton-raphson/physics-evaluation.md` | equilibrium, reaction, direction, path/history, energy, symmetry, model coverage가 `pass-for-release-agent`임 | STAGE7-PHYSICS-002 returned `pass-for-release-agent`, blockers none, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`. Corrected Stage 6 hash/status resolved PHYS-STATUS-001. Prior fresh focused CTest `23/23`, canonical reference hash audit, and physical checks remain passing; historical requirements metadata is nonblocking; four declared open items are nonblocking/known limitations. Coordinator verified all eight sections, exact corrected input hash, pass/handoff boundaries, whitespace, no Release file/dispatch, and no forbidden change. | 없음 | 2 | +| 8. Release readiness | `release-agent` | `passed` | `docs/nonlinear-static-newton-raphson/release.md` | `ready-for-release` recommendation과 acceptance traceability가 완전함 | Owner returned `ready-for-release`, blockers none, SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`. Coordinator verified all 11 required sections, exact current gate hashes/pass statuses, 24/24 unique must IDs with acceptance/test-or-reference/release disposition `included-pass`, 12/12 reference hashes, complete known limitations/release notes, transparent requirements metadata and reference-comparison feature-id omissions, whitespace/scope/no-change boundaries, and no external release action. | 없음 | 1 | ## 3. Active Dispatch Package and Latest Sub-Agent Return ### Active Dispatch Package - feature_id: `nonlinear-static-newton-raphson` -- current_dispatch: `stage-6-harness-implementation-execution-step0-retry-1` -- target_sub_agent: `implementation-agent` via `scripts/execute.py nonlinear-static-newton-raphson` -- required_inputs: - - User explicit execution request on `2026-08-24`: `Harness/Implementation를 실행해주세요.` - - Attempt 1 failure evidence: no-push Harness command `python scripts/execute.py nonlinear-static-newton-raphson`; `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no Step 0 source/test edits, no `step0-output.json`, no `MAX_RETRIES` handling. - - Root execution context evidence: workspace-write Codex smoke passed with `HARNESS_SMOKE_OK` in `20.4s`; MSVC baseline build passed; baseline CTest passed `214/214`; Python baseline has pre-existing unrelated HEAD `41816c8` contract failure `xhigh` actual vs `extra high` expected. - - `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/HARNESS.md`, `docs/HARNESS_WORKFLOW.md`, `.agents/skills/harness/SKILL.md`, `.codex/hooks.json` - - `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `BF4FC7A5CFDEEC19D62A36E1DF7CC34C0B9F614FA0A0FD8D0A321ADC73E69580` - - `phases/index.json` SHA-256 `F8BE89D579C303410BD1D2CD17AF33FCAD72BF68D9E10C3F644A39D1AA7331FB` - - `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `439B67E1DED442D828EB5C31DAB35D28F32DBA6F66537512CAFFB5616956C137` - - Executor-selected initial current Step: `phases/nonlinear-static-newton-raphson/step0.md`, Step 0 `cli-output-lease-and-derived-names`, status `pending` - - Approved Stage 1-5 hashes: requirements `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2`; research `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE`; formulation `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0`; numerical-review `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01`; reference-model `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3`; io `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28`. - - Preserved materialization evidence: exactly one pending phase entry, 13/13 pending steps, no executor metadata, no evidence docs yet. -- expected_outputs: - - Retry Harness execution command: `python scripts/execute.py nonlinear-static-newton-raphson` - - No `--push`. - - Executor-managed phase/step status, timestamps, commits and advancement. - - Implementation Agent per selected Step: RED evidence, observed failure, minimal GREEN changes, focused/full VERIFY and Step status payload. - - If all Steps complete, Stage 6 evidence docs: `docs/nonlinear-static-newton-raphson/implementation-report.md`, `docs/nonlinear-static-newton-raphson/build-test.md`, `docs/nonlinear-static-newton-raphson/reference-comparison.md`. -- acceptance_gate: Stage 6 can pass only after the materialized phase completes and Coordinator audits implementation-report, build-test, reference-comparison, full MSVC x64 Debug build/CTest, blocking reference comparison and no forbidden reference/upstream/tolerance mutation. Attempt 1 is a clear first `harness` failure, so the next bounded dispatch remains Implementation/Harness retry. -- stop_condition: Run only the no-push Harness executor for this phase. Do not dispatch Correction Agent for this first clear harness failure. If `harness-uncaught-step-codex-timeout-no-retry` recurs and reaches attempt 2, stop automatic rework and set workflow to `needs-user-decision` or `blocked`. Do not dispatch Physics Evaluation or Release. Do not run Abaqus/Nastran/reference solvers or generate/modify reference CSVs. Do not manually bypass Executor ownership of branch, pending selection, retry, timestamps, commits or advancement. -- missing_evidence: Successful Step 0 Harness/Implementation return with RED/observed failure/minimal GREEN/VERIFY evidence and Executor-managed Step status, or a new classified failure return from `scripts/execute.py nonlinear-static-newton-raphson`. +- current_dispatch: `none` +- target_sub_agent: `none` +- required_inputs: 없음 +- expected_outputs: 없음 +- acceptance_gate: All eight stages passed and `release.md` recommends `ready-for-release`; Coordinator closure is recorded. +- stop_condition: Workflow is closed. Do not publish, deploy, package, tag or externally release without separate explicit authority; root may perform only the already requested final commit/push. +- missing_evidence: 없음 ### Latest Sub-Agent Return -- target_sub_agent: `implementation-agent` via Harness Executor +- target_sub_agent: `release-agent` - output_paths: - - 없음: attempt 1 failed before Step evidence; `step0-output.json`, `implementation-report.md`, `build-test.md`, and `reference-comparison.md` were not produced. -- status: `failed-before-step-evidence` (Harness uncaught timeout); Coordinator classification `needs-implementation-retry` + - `docs/nonlinear-static-newton-raphson/release.md` +- status: owner `ready-for-release`; Coordinator decision `passed` - evidence_summary: - - Root reported no-push execution attempt 1 on an isolated branch/worktree: `python scripts/execute.py nonlinear-static-newton-raphson`. - - During Step 0 dispatch, `codex exec --json --sandbox workspace-write ...` remained active without source/test edits and timed out at `1800.7s`. - - `scripts/execute.py::_invoke_codex` raised uncaught `subprocess.TimeoutExpired`, so Executor did not produce `step0-output.json`, did not enter `MAX_RETRIES`, and Step 0 remains pending with no implementation evidence. - - Workspace-write smoke passed with `HARNESS_SMOKE_OK` in `20.4s`; root therefore classified sandbox helper/auth as functional and `danger-full-access` as unjustified. - - MSVC baseline build passed and CTest passed `214/214`; Python baseline has a pre-existing unrelated contract failure in HEAD `41816c8` (`xhigh` actual vs `extra high` expected). - - Coordinator records normalized failure classification `harness-uncaught-step-codex-timeout-no-retry`: attempt 1. Because this is the first clear harness failure, the next bounded dispatch remains `implementation-agent` via no-push Harness retry; `correction-agent` is not selected. + - `release.md` SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`; all 11 required sections and `ready-for-release` verdict are present. + - Gate inventory hashes match current Stage 1..7 files; full CTest `302/302`, reference `9/9`, `pass-for-physics-evaluation`, and `pass-for-release-agent` are recorded. + - Requirement/release sets are exactly 24/24 unique IDs, missing/extra/duplicate `0`, all `included-pass` with acceptance, test or reference evidence and release disposition. + - Known limitations and Release Notes include local RF/RM review-only, UR warning-only, `RM3`/stress exclusion, malformed optional stress row, weak stored nonlinear response, MITC4 locking risk and no external-solver equivalence claim. + - Requirements draft/pending metadata and missing literal reference-comparison feature_id are transparent nonblocking documentation issues tied to authoritative exact path/hash/approval evidence; upstream files were not edited. - blockers: - - 없음. -- self_audit_findings: Coordinator recorded root execution evidence only, verified the local phase index still lists Step 0 as `pending`, did not run Harness/build/tests, and changed only `coordination.md`. -- return_contract_check: status, evidence summary, blockers, failed-output absence and retry dispatch decision are present. -- acceptance_evidence_check: Stage 6 remains `in-progress`; no Stage 6 pass evidence exists. + - 없음 +- self_audit_findings: Release owner created only `release.md`; no source/test/CMake/Harness/upstream/reference/tolerance mutation, build/test/reference solver, publish/deploy/package/tag/external release, commit or push. +- return_contract_check: Output path, `ready-for-release`, gate/traceability/validation/limitation evidence, blockers, SHA-256, no-change assertion and closure recommendation are complete; Coordinator audit passed. +- acceptance_evidence_check: Stage 8 passes and Coordinator closes the workflow as `completed`; this does not authorize an external release action. + +### USER-DECISION-004 Selected Path + +- selected: User explicitly approved option 1 on `2026-08-26`. +- meaning: exact local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows remain deterministic source-key/schema/finite/inventory/error-reporting evidence but become review-only/nonblocking; `RM3` remains excluded. +- blocking evidence: factor-one global resultant force `[3]`, factor-one global resultant moment `[3]`, and accepted free-DOF residual gates/evidence. Resultant moment uses the existing I/O global-equilibrium contract: global origin `[0,0,0]`, current force arms and spatial physical nodal moments. +- unchanged: displacement comparison remains blocking, `UR1/UR2/UR3` remains warning-only, stress CSVs remain optional inspection/no comparison projection, `docs/TOLERANCE.md` applies where external comparison remains, and exact source-ID prechecks are preserved. +- prohibited: no averaging/collapse/zero clamp, no tolerance relaxation, no comparator weakening, no reference artifact edit, and no Abaqus S4 internal-equivalence claim. +- re-approval path: Stage 1 requirements, Stage 4 Numerical/reference and Stage 5 I/O are re-approved. Stage 6 implementation-planning revision draft is returned, Coordinator-audited, user-approved and materialized by MATERIALIZATION-003. DECISION-042 now supplies the separate explicit Step 11 Harness/Implementation request. Stage 3 formulation has no immediate dispatch because current §11.4 and §13.4 already define full residual/reactions and global resultant identities. + +`MESH-REFINEMENT-SPIKE-001` remains diagnostic evidence that option 3 is not met by the current Abaqus S4 coarse/fine pair. `TRANSLATION-REPORT-001` remains translation-only diagnostic evidence and does not authorize final reference-model, tolerance, comparator, HDF5 schema, implementation, Harness, Step 12, Physics or Release changes. ### Compact Migration Evidence @@ -177,11 +172,78 @@ | 2026-08-24 | Implementation Planning materialization dispatch package | `in-progress` | Coordinator authorized only `implementation-plan.md`, append pending phase entry, create phase index and `step0.md`..`step12.md` pending with no executor timestamps; source/tests/CMake/upstream/reference/tolerance/evidence docs and Harness/build/test execution remain forbidden. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return | | 2026-08-24 | Implementation Planning materialization owner return and Coordinator audit | `passed` | `implementation-plan.md`, `phases/index.json`, phase index and `step0.md`..`step12.md` are materialized after user approval. Coordinator/root audit passed phase uniqueness, 13/13 pending steps without executor metadata, 151 root assertions, reference hashes/row counts and no unauthorized evidence docs/execution/source/test/CMake/reference edits. | `ready-for-implementation` | Await separate explicit Harness/implementation execution request; do not run Executor automatically | | 2026-08-24 | Harness/Implementation execution authorization and dispatch package | `in-progress` | User explicitly requested Harness/Implementation execution. Coordinator verified materialized phase still has Step 0 `cli-output-lease-and-derived-names` as the first pending Step, preserved Stage 1-5 hashes and materialization evidence, and prepared no-push `scripts/execute.py nonlinear-static-newton-raphson` dispatch. | `needs-implementation` | Run no-push Harness executor; await Implementation/Harness return before any physics/release transition | -| 2026-08-24 | Harness/Implementation execution attempt 1 | `needs-rework` | No-push Harness attempt failed before Step 0 evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no source/test edits, `step0-output.json`, `MAX_RETRIES`, or Step evidence. Workspace-write smoke passed, MSVC baseline build passed and CTest passed `214/214`; Python baseline failure is pre-existing/unrelated. Normalized classification `harness-uncaught-step-codex-timeout-no-retry` attempt 1. | `needs-implementation` | Retry Step 0 through no-push `scripts/execute.py nonlinear-static-newton-raphson`; if the same classification reaches attempt 2, stop automatic rework and route to `needs-user-decision` or `blocked` | +| 2026-08-24 | Harness/Implementation execution attempt 1 | `needs-rework` | No-push Harness attempt failed before Step 0 evidence: `codex exec --json --sandbox workspace-write ...` timed out at `1800.7s`; `_invoke_codex` raised uncaught `subprocess.TimeoutExpired`; no source/test edits, `step0-output.json`, `MAX_RETRIES`, or Step evidence. Normalized classification `harness-uncaught-step-codex-timeout-no-retry` attempt 1. | `needs-implementation` | Bounded Harness repair before retry; do not route to Correction Agent for first clear harness failure | +| 2026-08-24 | Harness repair after attempt 1 | `passed` | Implementation Agent repaired Harness timeout/profile handling in `scripts/execute.py` with tests in `tests/test_execute.py`; RED 3 expected failures, GREEN 3 passed, focused 10/10 passed, full pytest 23 passed/1 pre-existing `xhigh` vs `extra high` mismatch. Root review found no new defect and reproduced the same evidence. No phase execution, phase/source/CMake/reference/evidence docs edit, or reference solver activity. | `needs-implementation` | Retry no-push Harness attempt 2 for Executor-selected Step 0 in workspace-write; if the same normalized timeout recurs, stop automatic rework and route to `needs-user-decision` or `blocked` | +| 2026-08-24 | Harness/Implementation execution attempt 2 | `blocked` | Repaired Executor produced `step0-output.json` with `exitCode` 124 and stderr `Codex timed out after 1800 seconds.`. The Implementation Agent turn completed, but every nested shell `command_execution` remained `status=in_progress` even for `Get-Date`, `cmd echo`, and `exit 0`; Step 0 stayed pending with no production/test changes. Root cause is `harness-nested-codex-windows-shell-tool-execution-hang` attempt 2. | `blocked` | Stop remaining automatic retries; no workaround/further Harness execution until explicit user/root decision or external runtime fix | +| 2026-08-24 | Root correction-cycle authorization | `in-progress` | Root authorized one bounded Correction Agent diagnostic/rework cycle for the repeated infrastructure/runtime failure; unauthorized retry PIDs have been terminated and none remain. Coordinator prepared a correction package limited to no-op/tool smoke reproduction, local Codex CLI/config option inspection, documented flag hypothesis testing, and optional TDD runner changes in `scripts/execute.py`/`tests/test_execute.py`. | `needs-correction` | Root profile dispatch to `correction-agent` is required because this Coordinator runtime exposes no callable `spawn_agent` tool | +| 2026-08-24 | Correction Agent return and Coordinator audit | `blocked` | Correction Agent returned `blocked` and created only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `C9F93AC99225725C88BB7F0BABC8F7D75D3E05082070090328203DB3776BEFE6`. Baseline smoke reproduced no nested shell completion; `--disable code_mode_host` failed closed; `--enable unified_exec` hung; combined flags failed closed. Root verified no nonlinear Harness/Codex processes remain, all 13 steps pending, Python 23 passed/1 pre-existing failure, MSVC build exit 0, discovery 214 and CTest 214/214. | `blocked` | No further Harness retry until external Codex runtime update/repair plus bounded shell smoke success | +| 2026-08-24 | Codex `0.149.1` smoke pass and runner preflight | `needs-rework` | User/root authorized Codex CLI update, bounded smoke and Harness rerun. Smoke passed only with aligned `CODEX_HOME`, filtered WindowsApps PATH entries and `--disable unified_exec`; current `scripts/execute.py` does not pass that flag to nested `codex exec`, while local `codex exec --help` confirms `--disable ` support. | `needs-correction` | Dispatch bounded runner-option correction before any no-push Harness phase rerun | +| 2026-08-24 | REWORK-004 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; runner now passes adjacent `--disable`, `unified_exec` after `codex exec`; regression test asserts the command contract; `corrections.md` SHA-256 `82572437689B41323B6533C2361F2F12BF07B5ED305825AA84C56AEEDC729930`; focused tests 10/10, full pytest only known pre-existing mismatch, MSVC build and 214/214 CTest pass per owner/root evidence. | `needs-implementation` | Root is authorized to run no-push `python scripts/execute.py nonlinear-static-newton-raphson` with Codex `0.149.1`, aligned `CODEX_HOME`, filtered child PATH, `workspace-write`, hooks retained and no `danger-full-access` | +| 2026-08-24 | Harness rerun Step 1 safe block | `needs-rework` | No-push Harness rerun under the approved Codex `0.149.1` envelope exited 2 safely, not by nested shell hang. Step 0 completed and committed (`fc16ef6`, metadata `e7c6932`). Step 1 is `blocked` because Visual Studio 18 CMake configure hit MSBuild `FileTracker` `E_ACCESSDENIED` in `workspace-write`; root reports clean Ninja/MSVC build and all 228 CTest cases passed. Top phase hash `E5AB831A326AA361B1C3491DA2DA09AC2CA8D66D9A3BCEE8E771D78C6352EC45`, phase index hash `5CD3B4E2BD50BF03A105CAC645F7F48F5A1360414E085B08C9D75BF6D46317A8`, Step 1 output hash `B04B25E8C2D1E0CD54E712B086623E1741FC563A70F0582FD6DC813F660CD6D7`. | `needs-correction` | Root profile dispatch to bounded `correction-agent` for FileTracker diagnosis under `workspace-write`; `danger-full-access` requires explicit new user approval and is not authorized | +| 2026-08-24 | REWORK-005 FileTracker Correction return and Coordinator audit | `blocked` | Correction returned `blocked` / `needs-user-decision`, changed only `docs/nonlinear-static-newton-raphson/corrections.md` SHA-256 `BCA9DEE6F6F262A70FB5C7A49B2BF06CA3FF8BC6C6838FB20A8B48071CF9D420`. VS18/MSBuild `18.8.2` fails in FESA and gtest at `FileTracker..cctor()` -> `GetLongFilePath` with `E_ACCESSDENIED`; inherited `TEMP`/`TMP` is outside workspace; `/p:TrackFileAccess=false` and `:workspace` echo were not proven; exact process trees were cleaned; Ninja/MSVC 27/27 focused and 228/228 full evidence is preserved but not an approved substitute. | `needs-user-decision` | User must choose A Ninja/MSVC evidence substitution, B isolated `danger-full-access` fallback, or C stop pending external Codex sandbox Temp/FileTracker repair | +| 2026-08-24 | USER-DECISION-002 option A and REWORK-006 dispatch | `in-progress` | User explicitly approved option A: Ninja/MSVC is the accepted Stage 6 validation contract. Coordinator/root audit found `.harness/config.json` ignored/absent, CMake presets absent, and adapter preset triplets sufficient to route Stop hook to Ninja without Harness Python production changes. Root dispatched `correction-agent` for preset/config plumbing, preset-contract RED test, planning/phase command rewrite, blocker-clear evidence, and phase reset only after evidence. | `needs-correction` | Await REWORK-006 Correction return; no Harness rerun, Step 2, `danger-full-access`, push, reference solver or reference artifact change | +| 2026-08-24 | REWORK-006 Correction return and Coordinator audit | `passed` | Correction returned `corrected-for-implementation-rerun`; `corrections.md` SHA-256 `7FA66A14E694D0451B4422BB5A233E117F2100231A9644771EFD428AF7AD6B81`; Ninja/MSVC Debug configure/build/discovery/full CTest passed with 228/228, Stop-hook `codex exec` exit 0, focused contract test 1/1, full Python 24 passed plus pre-existing `xhigh`/`extra high`; reference hashes unchanged; top phase and Step 1 reset to `pending` only after evidence; root independent review found no blocking issue. | `needs-implementation` | Root is authorized to rerun no-push `python scripts/execute.py nonlinear-static-newton-raphson` from Step 1 under approved Ninja/MSVC workspace-write envelope | +| 2026-08-24 | Harness Step 11 reference-comparison block and REWORK-007 dispatch | `needs-rework` | Harness Steps 0..10 completed. Step 11 owner added reference comparator/test files but blocked because copied `shellNL.inp` reaches `nonlinear-nonconvergence` after 100 Newton iterations; `shellNL_results.h5` is absent, `git diff -- reference` is clean, and Step 12 remains pending. Log evidence shows force/correction channels passing while residual moment remains failing; approved convergence contract must not be relaxed silently. | `needs-correction` | Root profile dispatch to bounded `correction-agent`: diagnose/fix only implementation-owned nonlinear solver/convergence defect under approved contracts, or return `upstream-contract` / `needs-user-decision` if the approved moment-denominator contract is the blocker | +| 2026-08-24 | REWORK-007 upstream-contract return and Coordinator audit | `blocked` | Correction returned `needs-upstream-decision`, `corrections.md` SHA-256 `63E0FF45AF44F564B276C2400B2D1A9AB5F90FC9E1470F4F8246ED57231B175B`, changed only that report. Proof: shellNL has no external rotational generalized force, so approved `D_M=max(||f_int||inf,||f_ext||inf)` gives `eta_M=1` for every nonzero rotational residual; focused CTest #288 reproduced the failure and 100/100 log records have numerator=denominator, relative branch, pass=0. | `needs-user-decision` | USER-DECISION-003: choose a residual-moment convergence contract path before requirements/formulation/numerical-review/io/planning rework or stop the feature | +| 2026-08-24 | USER-DECISION-003 option 1 and Requirements rework dispatch | `in-progress` | User approved option 1: if the matching external residual-channel scale is exact zero, apply the existing typed absolute residual gate; otherwise retain the current relative denominator. Coordinator recorded required re-approval sequence and bounded Stage 1 rework to NSNR-069 in `requirements.md` only. | `needs-requirements` | Root profile dispatch to `requirement-agent`; await revised `requirements.md` return and Coordinator audit before explicit Stage 1 re-approval | +| 2026-08-24 | Requirements NSNR-069 option 1 return and Coordinator audit | `passed` | Requirement Agent returned `draft`, `ready-for-coordinator-review`, `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator verified hash, `git diff --check`, 397 lines, 24/24 records/Matrix rows, scoped NSNR-069/status/tolerance/matrix/handoff diff, unchanged thresholds/four-channel AND/Full Newton/100 iterations/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch formulation yet | +| 2026-08-24 | Revised Stage 1 approval and Formulation §14.1 dispatch | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`. Coordinator closed the Stage 1 re-approval item and prepared a bounded `formulation-agent` package for `formulation.md` §14.1 only under USER-DECISION-003 option 1. | `needs-formulation` | Root profile dispatch to `formulation-agent`; await §14.1-only return and Coordinator audit; do not start numerical-review/I/O/planning/implementation | +| 2026-08-24 | Formulation §14.1 option 1 return and Coordinator audit | `passed` | Formulation Agent returned `ready-for-coordinator-and-user-reapproval`, `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator verified hash, §14.1-only diff `34` additions/`5` deletions, revised requirements hash alignment, external-scale exact-zero selector, retained nonzero-external relative gate, unchanged thresholds/correction gates/four-channel AND/lifecycle/reference disposition, and no forbidden execution or artifact change. | `needs-user-decision` | Ask user to explicitly approve revised `formulation.md`; do not dispatch numerical-review yet | +| 2026-08-24 | Revised Stage 3 approval and Numerical/reference dispatch | `in-progress` | User explicitly approved revised `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`. Coordinator closed REAPPROVAL-002 and prepared a bounded `numerical-review-agent` package to validate USER-DECISION-003 option 1, dimensions/predicates, shellNL readiness and reference disposition. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; await owner return and Coordinator audit; do not start I/O/planning/implementation | +| 2026-08-24 | Numerical/reference option 1 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`; `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, diff `+49/-11`; `reference-model.md` byte-identical SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator verified revised branch coverage, unchanged reference disposition, reference hashes/row counts, no concrete HDF5 dataset paths, no forbidden artifact/execution scope and diff check pass. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch I/O yet | +| 2026-08-24 | Revised Stage 4 approval and I/O dispatch | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153` and unchanged `reference-model.md` SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`. Coordinator closed REAPPROVAL-003 and prepared a bounded `io-definition-agent` package for `io.md` only. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start planning/implementation/Harness | +| 2026-08-24 | I/O option 1 return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`; `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, diff `+37/-20`. Coordinator verified approved source hash alignment, residual matching-external-scale exact-zero/nonzero selector, retained nonzero relative denominator, unchanged 39-field `nsnr-log-v1` labels/order, unchanged HDF5/reference projection and dispositions, stress optional/RM3 excluded, diff check pass and reference diff clean. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not dispatch planning/implementation/Harness | +| 2026-08-24 | Revised Stage 5 approval and Implementation Planning revision-draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`. Coordinator closed REAPPROVAL-004 and prepared a bounded `implementation-planning-agent` package to draft exact plan/phase revisions for USER-DECISION-003 option 1 while preserving Steps 0..10 history and Step 11 blocked comparator work. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; owner returns concise revision draft only; do not materialize planning files or run Harness until user approves the draft | +| 2026-08-25 | Implementation Planning option 1 revision draft return and Coordinator audit | `passed` | Implementation Planning owner returned `draft-ready-for-user-review`, no files changed/executed. Draft proposes minimal updates to `implementation-plan.md`, Step `5/7/10/11/12` and phase indexes; Step 11 owns RED-first `NSNR-CTRL-018..021` and `NSNR-LOG-012`, minimal `nonlinear_static_control.cpp` update, comparator preservation, copied `shellNL` reference comparison and full CTest. Coordinator verified approved upstream semantics and Harness ownership boundaries. | `needs-user-decision` | Ask user to explicitly approve the planning revision draft; do not materialize or run Harness | +| 2026-08-25 | Implementation Planning revision draft approval and materialization dispatch | `in-progress` | User explicitly approved the audited Implementation Planning revision draft and requested materialization. Coordinator closed REAPPROVAL-005 and prepared bounded materialization dispatch limited to `implementation-plan.md`, Step `5/7/10/11/12`, feature index and top index. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; do not run Harness/CTest/code/reference/push | +| 2026-08-25 | Implementation Planning materialization return and Coordinator audit | `passed` | Owner returned `ready-for-implementation`; approved 8 outputs materialized, Step 11 reset to `pending`, top phase reset to `pending`, Steps 0..10 completed history and Step 11 partial comparator files preserved, Step 12 pending, forbidden source/include/reference/tolerance diff empty, HEAD unchanged and no execution/commit/push. | `ready-for-implementation` | Await separate explicit no-push Harness/Implementation execution request; current Executor-selected pending Step is Step 11 | +| 2026-08-25 | Step 11 no-push Harness/Implementation execution authorization | `in-progress` | User explicitly requested no-push Harness/Implementation rerun from Step 11. Coordinator preflight verified isolated linked worktree, branch `feat-nonlinear-static-newton-raphson`, HEAD `65b56b1`, Step 11 `pending` with historical `started_at`, Step 12 `pending`, Codex CLI `0.149.1`, approved `windows-msvc-ninja-debug` preset/config, runner `--disable unified_exec`, and approved dirty state with preserved comparator files. | `needs-implementation` | Launch no-push Harness Executor under DECISION-038/039 envelope; await Step 11 return; no `danger-full-access`, push, reference mutation, reference solver, Step 12, Physics or Release | +| 2026-08-25 | Step 11 reference-comparison return and REWORK-008 dispatch package | `needs-rework` | Harness exit `2`; Step 11 blocked; Step 12 pending; `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`. Selector/control/log fix passed and factor-one HDF5 exists, but reference gate `15/16` failed on blocking reaction RMS. Additional read-only diagnosis shows deterministic key mapping and global equilibrium but local reaction redistribution mismatch already present in linear-limit reactions, so Correction must audit implementation-vs-upstream-contract before any production edit. | `needs-correction` | Root profile dispatch to `correction-agent` for REWORK-008 diagnostic; no tolerance/reference/HDF5 schema contract change, reference solver, reference mutation, `danger-full-access`, push, Step 12, Physics or Release | +| 2026-08-25 | REWORK-008 upstream-contract return and USER-DECISION-004 gate | `blocked` | Correction returned `needs-upstream-decision`, classification `upstream-contract` / `reference-blocking-model-adequacy-conflict`, Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. It found no reaction computation/storage/mapping defect: residual→reaction→HDF5 mapping exact, constrained `phi=0`, global resultant matches, and local RF/RM mismatch already exists in FESA-linear versus Abaqus-linear while each solver NL≈linear. No forbidden files changed by correction; reference diff clean and HEAD unchanged. | `needs-user-decision` | USER-DECISION-004: choose local nodal reactions review-only with global equilibrium blocking, global resultant-only blocking, or independent formulation-appropriate local-reaction benchmark; do not dispatch further work before explicit choice | +| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 numerical-review dispatch | `in-progress` | User added untracked main-checkout `reference/shellNL-meshfine` artifacts and explicitly approved a spike design for USER-DECISION-004 option 3 candidate validation. Coordinator verified read-only hashes/rows and feature-worktree missing state, then recorded a bounded `numerical-review-agent` package for artifact/input-equivalence/row-identity readiness only. | `needs-user-decision` | Root profile dispatch to `numerical-review-agent`; no final option selection, reference solver, artifact mutation, tolerance/comparator/HDF5 schema/implementation/Harness/Step 12/Physics/Release change | +| 2026-08-25 | MESH-REFINEMENT-SPIKE-001 diagnostic return and Coordinator audit | `passed` | Fine artifacts copied byte-identically; required displacement/reaction artifacts are valid, stress is optional inventory only with one malformed optional key. Existing executable run exited `0` and produced H5/log hashes. Translation/rotation pass common tolerance, but local RF/RM rows still fail per-row gates; inplane reaction worsens under refinement. Global resultants and free residuals are sound. The same Abaqus S4 coarse/fine pair is not an independent formulation-appropriate local-reaction benchmark. | `needs-user-decision` | Ask user to choose USER-DECISION-004; Coordinator recommends option 1 review-only local nodal rows plus blocking global equilibrium/resultants; no Harness/Step 11 rerun before approval | +| 2026-08-26 | TRANSLATION-REPORT-001 focused reporting dispatch | `in-progress` | User approved bounded focused report design for `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md`: coarse/fine U1/U2/U3 translation-only comparison with exact artifact/HDF5 identity, source-key prechecks, `docs/TOLERANCE.md`, metrics, worst rows, mesh trend and exclusions. | `needs-user-decision` | Root profile dispatch to `implementation-agent`; only the focused report may be created; do not create canonical `reference-comparison.md`, run solver/Harness/reference solver, edit code/comparator/tolerance/reference artifacts, change USER-DECISION-004, or advance Step 11/12 | +| 2026-08-26 | TRANSLATION-REPORT-001 return and Coordinator audit | `passed` | Implementation Agent returned `translation-diagnostic-pass-not-a-gate` and created only `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`. Coordinator/root audit verified exact artifact hashes, coarse/fine U-key prechecks, `docs/TOLERANCE.md` pass metrics, explicit exclusions, diff check pass, tracked reference diff clean and canonical evidence docs absent. | `needs-user-decision` | Historical pre-decision state; superseded by USER-DECISION-004 option 1 entry below. No Step 11 rerun, Step 12, Physics or Release before required upstream re-approval | +| 2026-08-26 | USER-DECISION-004 option 1 approval and requirements dispatch package | `in-progress` | User explicitly selected option 1. Coordinator recorded local nodal RF/RM as review-only/nonblocking, global resultant force/moment plus accepted free residual as blocking reaction/equilibrium evidence, verified Stage 3 formulation has no immediate semantic rework need because §11.4/§13.4 already define reactions/global resultants, and recorded the Stage 5/6 projection audit item for current-position/spatial-moment global equilibrium versus raw-residual implementation helper. | `needs-requirements` | Root profile dispatch to bounded `requirement-agent` for `requirements.md` only; after owner return, Coordinator audit and explicit user approval are required before Stage 4 | +| 2026-08-27 | REAPPROVAL-006 Requirements return and Coordinator audit | `passed` | Requirement Agent returned revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, status `draft`. Coordinator verified hash, 24/24 requirement and matrix preservation, USER-DECISION-004 option 1 semantics, AUDIT-001 Stage5/6 handoff, preserved formulation meaning, unchanged thresholds/reference immutability and no forbidden gate advancement. | `needs-user-decision` | Ask user to explicitly approve revised `requirements.md`; do not dispatch Stage 4 Numerical/reference until approval | +| 2026-08-27 | Revised Stage 1 approval and Stage 4 Numerical/reference dispatch package | `in-progress` | User explicitly approved revised `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`. Coordinator closed Stage 1 re-approval and prepared bounded `numerical-review-agent` package requiring `fesa-numerical-review`, USER-DECISION-004 option 1 reaction disposition, coarse/fine reference role review and AUDIT-001 downstream separation. | `needs-numerical-review` | Root profile dispatch to `numerical-review-agent`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5 | +| 2026-08-27 | REAPPROVAL-007 Numerical/reference return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator verified requirements/formulation alignment, fine-primary/coarse-companion roles, local RF/RM review-only with `RM3`/stress excluded, U blocking/UR warning-only, internal normalized `1e-10` global balance gate separated from external `docs/TOLERANCE.md`, NSNR-069 free residual gate and AUDIT-001 Stage5/6 handoff. | `needs-user-decision` | Ask user to explicitly approve revised Stage 4 artifacts; do not dispatch Stage 5 I/O yet | +| 2026-08-27 | Revised Stage 4 approval and Stage 5 I/O dispatch package | `in-progress` | User explicitly approved revised `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091` and `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`. Coordinator closed REAPPROVAL-007 and prepared bounded `io-definition-agent` package requiring `fesa-io-contract`, USER-DECISION-004 option 1 HDF5/reference projection update, AUDIT-001 logical quantity separation and no parser/API/code/reference changes. | `needs-io-definition` | Root profile dispatch to `io-definition-agent`; expected output only `io.md`; await owner return and Coordinator audit; do not start Stage 6/Harness | +| 2026-08-27 | REAPPROVAL-008 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`. Coordinator verified approved source hashes, HDF5 schema v1 authority, `/global/equilibrium` applied-plus-reaction current-position/spatial-moment semantics, distinct free-residual/constrained-resultant/balance-error projections, local RF/RM review-only, `RM3`/stress excluded, U blocking/UR warning-only, fine primary/coarse companion and internal `1e-10` versus external `docs/TOLERANCE.md` boundary. | `needs-user-decision` | Ask user to explicitly approve revised `io.md`; do not start Stage 6 planning/materialization/Harness before approval | +| 2026-08-27 | Revised Stage 5 approval and Stage 6 planning re-entry draft dispatch | `in-progress` | User explicitly approved revised `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`. Coordinator closed REAPPROVAL-008 and prepared bounded DRAFT ONLY `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`; the owner must audit existing Step 11+ plan/phase state and return a chat draft only. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no planning-file materialization, Harness, build, CTest, solver, reference solver, source/test/CMake/reference/tolerance edit, commit or push before draft approval | +| 2026-08-27 | REAPPROVAL-009 Planning draft return and Coordinator audit | `passed` | Planning Agent returned `draft-ready-for-user-review`, blockers none, no files changed/executed. Coordinator verified the draft is a minimal Step 11/12 revision: preserve Steps `0..10`, reset/rename only Step `11` after approval, keep Step `12` pending, cover AUDIT-001 current-arm/spatial-moment projections, no new HDF5 dataset/public header, internal/external tolerance separation, fine primary/coarse companion and approved Ninja/MSVC commands. | `needs-user-decision` | Ask user to approve or reject the Stage 6 revision draft; do not materialize planning files or run Harness until explicit approval | +| 2026-08-27 | REAPPROVAL-009 draft approval and MATERIALIZATION-003 dispatch package | `in-progress` | User explicitly approved the Coordinator-audited 2-Step draft. Coordinator prepared materialization-only dispatch to `implementation-planning-agent`, required `fesa-cpp-msvc-tdd` plus project-local `harness`, fixed current input hashes and allowed only `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md` as outputs. | `needs-implementation-plan` | Root profile dispatch to `implementation-planning-agent`; no Harness/build/CTest/solver/reference solver, code/tests/CMake/upstream/reference/tolerance edit, evidence-doc creation, commit or push | +| 2026-08-27 | MATERIALIZATION-003 return and Coordinator audit | `passed` | Planning Agent materialized exactly the allowed five outputs: `implementation-plan.md` `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, phase index `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, `step12.md` `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator verified JSON parse, 24/24 requirements mapping, clean placeholder scan, scoped `git diff --check` pass, `NSNR-PROC-019` collision handling, Step `11` pending, Step `12` pending, Steps `0..10` preserved, canonical evidence docs absent, tracked reference diff clean, and no execution/commit/push. | `needs-implementation` | Await separate explicit no-push Step 11 Harness/Implementation request; do not run Harness automatically | +| 2026-08-27 | Step 11 no-push Harness/Implementation execution approval | `in-progress` | User explicitly approved `Harness/Implementation 시작`. Coordinator verified current runner CLI takes slug `nonlinear-static-newton-raphson`, current phase has Step `11` pending and Step `12` pending, and prepared a no-push `implementation-agent` via Harness dispatch for Step `11` only under DECISION-038/039. Step `12` is outside this approval; current runner loops over pending steps, so root/Executor must enforce the one-step boundary or stop before Step `12`. | `needs-implementation` | Root may run `python scripts/execute.py nonlinear-static-newton-raphson` only under the recorded no-push Step 11 envelope; await Step `11` return | +| 2026-08-27 | Step 11 execution recurrent runtime block | `blocked` | DECISION-042 Step11-only execution used the approved no-push envelope but timed out after `1800s`; `step11-output.json` SHA-256 `9FCBC5CE10E2C1B931EC16CADFADF7684C45FBB0B11D9A404922D607EB16706D`, exit `124`, stderr `Codex timed out after 1800 seconds.`, stdout nested command executions stuck `in_progress`. Retry was prevented by secondary CP949 `UnicodeEncodeError` printing `↻`. Read-only shell smokes under tested flag/env variants did not complete. Step `11` and Step `12` remain pending; no production/test/reference edits, commit or push. | `needs-user-decision` | No automatic correction dispatch; user must choose a runtime/runner route before any Step `11` rerun | +| 2026-08-28 | USER-DECISION-005 option A and Step 11 runtime-smoke dispatch | `in-progress` | User approved option A: use official current Codex CLI `0.150.1` to restore the runtime/update path, prove same `workspace-write`/filtered WindowsApps PATH/`CODEX_HOME`/VsDevCmd/hooks/Terra-xhigh/`--disable unified_exec` envelope with a bounded nested shell smoke, then rerun only Step `11` no-push if the smoke passes. | `needs-implementation` | Root may perform the Codex `0.150.1` smoke preflight and, only on pass, launch Step `11` Harness/Implementation under the active dispatch; Step `12`, push, `danger-full-access`, reference solver/artifact mutation and manual hooks remain forbidden | +| 2026-08-28 | USER-DECISION-005A smoke pass and Step 11 dispatch confirmation | `passed` | Root supplied smoke success evidence: Codex CLI `0.150.1`, app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, same-envelope smoke `93.621s`, nested exit `0`, command_execution completed, command exit `0`, output `CODEX_SHELL_SMOKE_OK`, stderr empty. Coordinator updated `BLOCKER-002` to smoke-passed and confirmed Step `11` dispatch. | `needs-implementation` | Historical smoke gate pass; superseded by the Step `11` blocked return below | +| 2026-08-28 | USER-DECISION-005A Step 11 blocked return | `blocked` | Step `11` only no-push Harness ran after smoke pass; runner exit `2`; Step `11` blocked at `2026-08-28T02:03:23+09:00`; Step `12` pending. Current-arm/spatial projection reproduced and NSNR-069 free residual accepted, but coarse/fine factor-one global moment balance metrics `1.413750912531167e-10`/`2.7454660159924086e-10` exceed approved `1e-10`; CTest `295` and `299` failed. `step11-output.json` SHA-256 `D56EB816DDD63E71D8880CA5AF39C10A38E2BF562A28207D26417716154F1872`; no commits/push; reference hashes/length/mtimes unchanged and `git diff -- reference` empty. | `needs-user-decision` | USER-DECISION-006: choose an upstream convergence-acceptance/global-balance-gate path before any rework, Step `11` retry, Step `12`, Physics or Release | +| 2026-08-28 | USER-DECISION-006 superseding global balance threshold and Stage 4 dispatch package | `in-progress` | User withdrew the entire `fesa.env`/runtime-config discussion and superseded the prior moment-only `1e-9` decision. Current authoritative decision fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`; all formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation are preserved. User delegated Stage 4/5/6 reapproval and Step `11` completion without intermediate approval waits, bounded to this threshold-only change. | `needs-numerical-review` | Root/profile dispatch to `numerical-review-agent` with `fesa-numerical-review`; allowed outputs only `numerical-review.md` and `reference-model.md`; do not start Stage 5, planning, Harness, Step `11` retry, Step `12`, reference solver, push or `danger-full-access` before owner return and Coordinator audit | +| 2026-08-28 | REAPPROVAL-010 Stage 4 return and Coordinator audit | `passed` | Numerical Review Agent returned `pass-for-io-definition`, blockers none; `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`, `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`. Coordinator verified required output paths/status, both normalized factor-one global force/moment gates `<=1e-8`, unchanged formulas/scales/exact-zero/current-arm/spatial moment/factor-one/NSNR-069/`docs/TOLERANCE.md` boundaries, unchanged dispositions and no forbidden Stage 5/6/source/reference advancement. | `needs-io-definition` | Prepare bounded Stage 5 `io-definition-agent` dispatch; expected output only `io.md` | +| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O dispatch package | `in-progress` | Coordinator prepared bounded `io-definition-agent` package requiring `fesa-io-contract` and the passed Stage 4 hashes. Scope is limited to `io.md` global balance gate literals/diagnostics/handoff for force and moment `<=1e-8`; HDF5 schema/projections/reference paths/dispositions and `docs/TOLERANCE.md` separation must be preserved. | `needs-io-definition` | Root/profile dispatch to `io-definition-agent`; await owner return and Coordinator audit; do not start Stage 6 planning/Harness/Step 11 retry | +| 2026-08-28 | REAPPROVAL-011 Stage 5 I/O return and Coordinator audit | `passed` | I/O Definition Agent returned `ready-for-coordinator-review`, blockers none; `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`. Coordinator verified both coarse/fine global force and moment internal gates `<=1e-8`, unchanged HDF5 schema/projections/identities/scales/zero-scale/NSNR-069/reference paths and external-only `docs/TOLERANCE.md`, and no `fesa.env`/runtime-config direction. | `needs-implementation-plan` | Prepare bounded Stage 6 `implementation-planning-agent` materialization dispatch; do not run Harness or edit planning files as Coordinator | +| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization dispatch package | `in-progress` | Coordinator prepared bounded `implementation-planning-agent` package requiring `fesa-cpp-msvc-tdd` plus project-local `harness`. Scope is limited to `implementation-plan.md`, `phases/index.json`, phase index, `step11.md` and `step12.md`; update only obsolete `1e-10` global balance references to force/moment `<=1e-8`, preserve Steps `0..10` and dirty Step `11` implementation work, reset top/Step `11` for rerun only after materialization evidence, and keep Step `12` pending. | `needs-implementation-plan` | Root/profile dispatch to `implementation-planning-agent`; await materialization return and Coordinator audit; no Harness/build/CTest/solver/reference solver, implementation, commit or push | +| 2026-08-28 | REAPPROVAL-012 Stage 6 planning materialization return and Coordinator audit | `passed` | Planning owner returned `ready-for-implementation`, blockers none; hashes verified for `implementation-plan.md` `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, and `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. Coordinator/root verified JSON parse, top/Step `11` pending, Step `12` pending, Steps `0..10` completed metadata retained, Step `11.started_at` retained, `NSNR-REF-024..025` gate requirements present, and no execution. | `needs-implementation` | Prepare Step `11` only no-push `implementation-agent` Harness package under USER-DECISION-005A; do not start Step `12` | +| 2026-08-28 | STEP11-EXECUTION-003 global balance `1e-8` no-push dispatch package | `in-progress` | Coordinator prepared bounded Step `11` only package for `implementation-agent` via Harness. Runner/Executor owns branch, pending selection, retry, timestamps, commits, advancement and top-level phase status; Implementation Agent owns only Step `11` RED -> observed failure -> minimal GREEN -> VERIFY. Package requires `NSNR-REF-022` old-gate RED plus test-first `NSNR-REF-024..025`, no `fesa.env`/product config, reference immutability, no push and no Step `12` auto-advance. | `needs-implementation` | Root/Executor may launch Step `11` only under USER-DECISION-005A; await owner return and stop before Step `12` | +| 2026-08-28 | STEP11-EXECUTION-003 runtime/environment return and Coordinator audit | `needs-rework` | Step `11` only wrapper attempt 1 timed out and attempt 2 selected user-local WindowsApps `pwsh.exe`, producing `CreateProcessAsUserW failed: 5 (Access denied)` on every exec. Stop-hook CTest evidence nevertheless passed all `302/302`, including the Step `11` global balance/reference tests; Step `11` remains pending because the agent did not update status/summary and Executor did not commit. Root stopped retry 3 and cleaned PIDs `4240`/`12000`/`16924`. | `needs-correction` | Dispatch bounded report-only `correction-agent` for launch PATH filter diagnosis; no Step `11` rerun or Step `12` before correction return | +| 2026-08-28 | REWORK-009 user-local WindowsApps `pwsh.exe` launch filter return and Coordinator audit | `passed` | Correction Agent returned `corrected-for-implementation-rerun`, blockers none, `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator/root verified Section 14: all PATH entries matching `\\WindowsApps(?:\\|$)` filtered, `pwsh` unresolved, system Windows PowerShell selected, exact `FESA_CODEX_SHELL_SMOKE_OK`, recovered RED->GREEN, focused passes, Stop `302/302`, no forbidden edits/execution/commit/push/reference mutation. | `needs-implementation` | Issue one bounded Step `11` only no-push rerun package using corrected launch PATH filter | +| 2026-08-28 | STEP11-EXECUTION-004 all-WindowsApps-filter Step 11 rerun package | `in-progress` | Coordinator prepared bounded `implementation-agent`/Harness package: run only Step `11`, preserve fixed `<=1e-8` force/moment gates and all Stage 4/5/6 contracts, use Codex CLI `0.150.1` with `CODEX_HOME`, `workspace-write`, hooks, Terra/`xhigh`, `--disable unified_exec`, VsDevCmd x64/deps, Ninja/MSVC Debug preset and child PATH filtered by `\\WindowsApps(?:\\|$)`. | `needs-implementation` | Root/Executor may launch Step `11` only; hard-stop before Step `12`; no push, `danger-full-access`, reference mutation/solver or manual hooks | +| 2026-08-28 | STEP11-EXECUTION-004 return and Coordinator audit | `passed` | Harness Step `11` completed with implementation commit `6dbf1b2`, metadata commit `c58ba9f`, phase completion `2026-08-28T09:22:33+0900`, Step `12` pending, clean worktree before Coordinator update, no push. Fresh LastTest.log mtime `2026-08-28 09:22:32` has `302/302` pass; focused procedure/HDF5 `7/7` and threshold `2/2` pass; stale LastTestsFailed.log is from prior RED; reference diff clean and reference artifacts unchanged by supplied hash/mtime evidence. | `needs-implementation` | Stop before Step `12`; await explicit Step `12` Harness/Implementation request | +| 2026-08-28 | STEP12-EXECUTION-001 evidence-doc closure dispatch package | `in-progress` | User explicitly approved Step `12` execution. Coordinator verified clean worktree, HEAD `af5d72233c2bcd00edc087531d10eb92f7232d3e`, Step `11` completed, Step `12` pending, canonical reports absent and Step `12` scope: create actual-evidence-only `implementation-report.md`, `build-test.md`, `reference-comparison.md`, plus minimal directly-superseded PRD/ARCHITECTURE/ADR sync only. | `needs-implementation` | Root/Executor may run Step `12` under the prior successful Codex `0.150.1` all-WindowsApps-filter envelope; C++/tests/CMake/Harness/reference/tolerance changes, reference solver, Physics/Release dispatch and Coordinator execution remain forbidden | +| 2026-08-28 | STEP12-EXECUTION-001 return and Coordinator code-review audit | `passed` | Implementation Agent/Harness returned Step `12` completed, exitCode `0`, owner classification `pass-for-physics-evaluation`. Coordinator reviewed reports, phase metadata and diff range `d275e844f27107cfab52309025e259f2156345d2..624807a13543454ffbb6b0301e06bf8f79fbeeb9`; changed paths are allowed reports/global docs/phase metadata only, `git diff --check` for the range exits `0`, source/tests/CMake/Harness/tolerance/reference/upstream feature docs are unchanged, and no tracked-file Critical/Important/Minor finding was found. | `needs-physics-evaluation` | Stage 6 passed; next eligible action is bounded Stage 7 Physics Evaluation dispatch, not started by this audit | +| 2026-08-28 | STAGE7-PHYSICS-001 dispatch package | `in-progress` | User explicitly requested Stage 7 only. Coordinator state audit verified HEAD `014f6a7926f00950c62f8109226b2d4ab93efd36`, clean worktree before coordination update, Stage 6 passed, `implementation-report.md`/`build-test.md` classification `pass-for-physics-evaluation`, `reference-comparison.md` SHA-256 `5CFFB39BBDB323196461A54FCCFF8EE6E66866103D0931D4D3A94D2B3D644328`, and absent `physics-evaluation.md`. Dispatch requires `physics-evaluation-agent` with `fesa-physics-sanity`; it must audit the `reference-comparison.md` verdict wording and historical `requirements.md` draft/pending metadata against authoritative Coordinator/user approvals before issuing any pass. | `needs-physics-evaluation` | Await Physics owner return; do not dispatch Release, commit, push, run Harness/build/CTest/solver/reference solver, or edit source/tests/CMake/upstream contracts/reference/tolerance | +| 2026-08-28 | STAGE7-PHYSICS-001 return and Coordinator audit | `needs-rework` | Physics owner created only `physics-evaluation.md`, SHA-256 `01BDD1EB986E2F227A8830495B464B4DA7A977D8B9248CFD87351A415E03A10B`, and returned `needs-upstream-decision`. Fresh focused physics CTest `23/23` and 12-reference hash audit passed; no documented physical failure was found. Coordinator verified all required sections, hash, `git diff --check`, no forbidden changed path, and accepted the single upstream report-contract blocker `PHYS-STATUS-001`: required `reference-comparison.md` lacks `pass-for-physics-evaluation`. Historical requirements draft/pending metadata is nonblocking under the recorded explicit user approval of the current hash. | `needs-implementation` | Route one bounded report-only status reconciliation to `implementation-agent`, then rerun Physics; Release remains ineligible and was not dispatched | +| 2026-08-28 | PHYS-STATUS-001-IMPLEMENTATION-001 dispatch package | `in-progress` | User authorized both Stage 7/8 gates and Coordinator rework routing. Package assigns exactly one `implementation-agent` to edit only `reference-comparison.md`: add overall handoff `pass-for-physics-evaluation` while preserving detailed `blocking-pass-with-review-only-findings`, all values/dispositions/findings/hashes/no-change assertions. | `needs-implementation` | Await owner return; no tests/solver/evidence regeneration or other file edit; do not rerun Physics or dispatch Release before audit | +| 2026-08-28 | PHYS-STATUS-001-IMPLEMENTATION-001 return and Coordinator audit | `passed` | Implementation owner returned `pass-for-physics-evaluation`, blockers none, changed only `reference-comparison.md`, SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`. Coordinator verified an exact four-line handoff addition, retained detailed verdict/six review-only findings/all metrics and artifact evidence, clean whitespace, no reference diff, and no forbidden owner change. | `needs-physics-evaluation` | Rerun Stage 7 with corrected exact status; do not dispatch Release before Physics owner pass | +| 2026-08-28 | STAGE7-PHYSICS-002 rerun package | `in-progress` | Same Physics owner must revise only `physics-evaluation.md` against corrected Stage 6 hash, retain prior audited physical evidence, independently resolve `PHYS-STATUS-001`, and return `pass-for-release-agent` only if no remaining blocker exists. | `needs-physics-evaluation` | Await Physics owner return; no Release dispatch, commit/push or other file mutation | +| 2026-08-28 | STAGE7-PHYSICS-002 return and Coordinator audit | `passed` | Physics owner returned `pass-for-release-agent`, blockers none, revised only `physics-evaluation.md`, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`. Coordinator verified corrected Stage 6 hash/status, resolved PHYS-STATUS-001, eight required sections, prior fresh focused CTest `23/23` and reference hash evidence, all physics checks pass, only nonblocking/known-limit open items, explicit non-Release meaning, whitespace clean, no forbidden path/reference diff and no Release file. | `needs-release` | Stop before Release; root owns requested Stage 7 commit/push, then Stage 8 becomes the next bounded dispatch | +| 2026-08-28 | STAGE8-RELEASE-001 dispatch package | `in-progress` | User-requested Stage 7 commit/push is verified at clean local/origin HEAD `06861608da5ffa4c09b786c3f5052dc7c6604e1b`. Coordinator inventoried all required Stage 1..7 reports and pass statuses, 24 must requirements, full CTest `302/302`, reference `9/9`, `pass-for-physics-evaluation` and `pass-for-release-agent`. One release-agent must independently audit freshness/contradictions/traceability/known limitations and create only `release.md`. | `needs-release` | Await owner return; no other edit, external solver, publish/deploy/package/tag, commit or push | +| 2026-08-28 | STAGE8-RELEASE-001 return and Coordinator audit | `passed` | Release owner returned `ready-for-release`, blockers none, created only `release.md`, final SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`. Coordinator verified required sections/status, current gate hashes, 24/24 exact must traceability, 12/12 canonical reference hashes, all required known limitations/notes, transparent metadata omissions, whitespace/scope/no-change assertion and no external release action. | `completed` | Eight-stage workflow closed; root owns requested final commit/push only | -- current_dispatch: `stage-6-harness-implementation-execution-step0-retry-1` -- current_workflow_state: `needs-implementation` -- next_gate_requires_user_approval: `false` (Harness/Implementation execution owner evidence 선행) +- current_dispatch: `none` +- current_workflow_state: `completed` +- next_gate_requires_user_approval: no next gate; the eight-stage workflow is completed. Root may perform the already requested final commit/push. Any numerical value/disposition/source/tests/CMake/Harness/reference/tolerance change, external solver/artifact mutation or publish/deploy/package/tag/external release requires separate explicit authority. ## 5. Risk, Blocker, and User-Decision Register @@ -190,7 +252,49 @@ | BLOCKER-001 | dispatch | Stage 4 requires a valid `numerical-review-agent` child dispatch. Root supplied the valid profile dispatch and owner return, so this runtime-tooling blocker no longer blocks the gate. | `coordinator-agent` / runtime tooling | closed | | REWORK-001 | report-contract | Stage 4 returned evidence had a cross-report contradiction on stress CSV and `RM3` comparison disposition. Corrected reports now consistently treat stress CSVs as optional read-only inspection/order evidence only and exclude `RM3` from comparison. | `numerical-review-agent` | closed | | REWORK-002 | io-contract | Stage 5 `io.md` bounded correction completed: public CLI `--output` substring rejection, Newton iteration log schema, exact `VARIABLE=PRESELECT` ignored-with-warning handling, repository-wide non-Newton log lifecycle, DECISION-028/029/030 path/log lifecycle and collision semantics are now recorded in `io.md`. | `io-definition-agent` | closed | -| REWORK-003 | harness | Stage 6 Harness attempt 1 failed before Step 0 evidence because `_invoke_codex` did not catch `subprocess.TimeoutExpired` after `1800.7s`; no retry loop, `step0-output.json`, source/test edit, or implementation evidence was produced. Workspace-write smoke passed and `danger-full-access` is not justified. First same-class attempt routes back to no-push Implementation/Harness retry. | `implementation-agent` via Harness Executor | open | +| REWORK-003 | harness | Stage 6 attempt 1 timeout/no-retry defect is repaired in Harness infrastructure: timeouts now return structured exit `124` through `MAX_RETRIES`, and implementation-agent profile settings are passed to Codex. Same normalized failure attempt count remains 1; attempt 2 is authorized and same-class recurrence stops automatic rework. | `implementation-agent` via Harness Executor | closed | +| BLOCKER-002 | harness-runtime | Closed for USER-DECISION-005A route: nested Codex Windows shell tool execution hung under the approved Codex CLI `0.149.1` envelope in DECISION-042, but Codex CLI `0.150.1` same-envelope smoke passed and the Step `11` Harness rerun reached deterministic CTest/reference-gate failures instead of a shell hang. Recurrence of nested command `in_progress` timeout reopens this blocker. | external Codex runtime / user-root decision | closed-smoke-passed-step11-executed | +| BLOCKER-003 | dispatch-runtime | This Coordinator runtime exposed no callable `spawn_agent` tool, but root successfully performed the required Correction Agent profile dispatch. | coordinator/root tooling | closed | +| REWORK-004 | harness | Corrected: `scripts/execute.py` now passes adjacent `--disable`, `unified_exec` immediately after `codex exec`; `tests/test_execute.py` asserts this while preserving terra/xhigh routing; `corrections.md` records RED/GREEN/VERIFY and no Harness phase/source C++/CMake/reference edits. | `correction-agent` | closed | +| REWORK-005 | harness | FileTracker Correction returned `blocked`: VS18/MSBuild `FileTracker` `E_ACCESSDENIED` is classified as environment-owned sandbox/MSBuild interaction; no safe Visual Studio `workspace-write` workaround was proven. User resolved the route by approving option A Ninja/MSVC validation. | `correction-agent` | closed-by-USER-DECISION-002A | +| REWORK-006 | harness | Corrected: approved option A is expressed through tracked `CMakePresets.json`, ignored `.harness/config.json`, preset-based implementation-plan/step verification commands, RED-first contract test, workspace-write Ninja/MSVC blocker-clear evidence, and blocked-to-pending phase reset only after pass. | `correction-agent` | closed | +| REWORK-007 | upstream-contract | Step 11 reference comparison is blocked because the approved residual-moment convergence denominator makes no-applied-moment shellNL structurally nonconvergent for any nonzero rotational residual. Correction changed only `corrections.md` and returned `needs-upstream-decision`. | `correction-agent` | closed-upstream-contract | +| REWORK-008 | upstream-contract | Correction returned `needs-upstream-decision`, classification `reference-blocking-model-adequacy-conflict`: local nodal RF/RM blocking assumes unsupported Abaqus S4 versus FESA MITC4 distribution adequacy, while reaction pipeline/global equilibrium evidence is sound. Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`. | `correction-agent` | closed-upstream-contract | +| USER-DECISION-004 | user decision | User explicitly approved option 1 on `2026-08-26`: local nodal `RF1/RF2/RF3` and physical spatial `RM1/RM2` rows are review-only/nonblocking with deterministic source-key/schema/finite/inventory/error reporting; `RM3` remains excluded; blocking reaction/equilibrium evidence is factor-one global resultant force `[3]`, global resultant moment `[3]` and accepted free-DOF residual gates/evidence. No tolerance/comparator/reference relaxation is authorized. | user via Coordinator | closed | +| REAPPROVAL-006 | upstream-reapproval | USER-DECISION-004 option 1 Stage 1 propagation completed: requirements owner/Coordinator audit passed for `requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, and the user explicitly re-approved that hash on `2026-08-27`. Stage 3 formulation has no immediate dispatch because §11.4/§13.4 already define residual/reaction/global-resultant semantics. | `requirement-agent` / Coordinator / user | closed | +| REAPPROVAL-007 | upstream-reapproval | USER-DECISION-004 option 1 Stage 4 propagation completed: `numerical-review.md` SHA-256 `0A7224003CFF706E9B4D9F55BA2624805299FAC8F42ECD2BC37E429B26DF0091`, `reference-model.md` SHA-256 `81A82D3B367FF501F3C355F81D4E5DD4677BE58E4182E4EB8EEDBB2462FEA2CE`, owner status `pass-for-io-definition`, Coordinator audit passed, blockers none, and the user explicitly approved both hashes on `2026-08-27`. | `numerical-review-agent` / Coordinator / user | closed | +| REAPPROVAL-008 | upstream-reapproval | USER-DECISION-004 option 1 Stage 5 propagation completed: `io.md` raw SHA-256 `C7400C2B1454BE7287EE22D18BB28DA7AFB27FE6F8287783BB83769A4AB8D83C`, LF-normalized SHA-256 `BF775990D83D95B470F814BE57C9676305119D97E48225E231D4926E7809029F`; owner/Coordinator audit passed and the user explicitly approved the raw hash on `2026-08-27`. | `io-definition-agent` / Coordinator / user | closed | +| REAPPROVAL-009 | planning-reapproval | Stage 6 implementation planning re-entry draft returned `draft-ready-for-user-review`; Coordinator audit passed; user explicitly approved the draft on `2026-08-27`. Draft proposes only Step `11`/`12` replanning for USER-DECISION-004 option 1 and AUDIT-001 while preserving Steps `0..10`, current uncommitted Step 11 work, approved contracts, no-new-dataset semantics and no execution. | `implementation-planning-agent` / Coordinator / user | closed | +| MATERIALIZATION-003 | planning-materialization | Passed: Planning Agent materialized exactly `implementation-plan.md` SHA-256 `758F8F5BB224E88864338C48221D53D4BD2F8633E04C9F2136FFF9E2D1BADFB8`, `phases/index.json` SHA-256 `536D4BF9427792ECCCE4C9A2980210E050035D0202DB8A700BDD671E0DB218C7`, `phases/nonlinear-static-newton-raphson/index.json` SHA-256 `D808D5C0F389B444A529FC81A48B5726E4CF282CA51B62F3AECAC4D89EA6A5BF`, `step11.md` SHA-256 `D324F7E1495A25B3B8CEA7A2A6C68D559F8336C3A527A164ECD2D0A82C20A526`, and `step12.md` SHA-256 `F2831F7E802A40631C91E638C9079508EF1A97CFE46FACC51DCBB4EC55337452`. Coordinator audit found JSON parse clean, no placeholders, scoped `git diff --check` pass, changed planning outputs within allowlist, Step `11`/top phase pending, Steps `0..10` preserved, Step `12` pending, reference diff clean and no Harness/build/solver execution. | `implementation-planning-agent` / Coordinator | passed | +| DECISION-042 | user approval | User explicitly approved `Harness/Implementation 시작` for no-push Step `11` execution only. The verified command is `python scripts/execute.py nonlinear-static-newton-raphson`; Step `12` is not authorized and must not start before Coordinator audit. | user via Coordinator | closed | +| USER-DECISION-005 | user decision | User approved option A on `2026-08-28`: use official current Codex CLI `0.150.1` to repair/validate the runtime route, run a bounded same-envelope nested shell smoke, and only if it passes rerun Step `11` no-push. Smoke passed with app SHA-256 `CBD657DDFE151D1A6EBAD660BEFFDBD3265DC5AFF4B3A6095124D3E2F0156F2F`, doctor `20 ok/0 fail`, duration `93.621s`, nested exit `0`, command_execution completed and output `CODEX_SHELL_SMOKE_OK`. This does not authorize `danger-full-access`, reference solver/artifact changes, push, Step `12`, manual hooks or runner/source/test/phase edits outside the Step `11` contract. | user via Coordinator | closed-option-A-smoke-passed | +| USER-DECISION-006 | user decision | Closed/delegated superseding decision on `2026-08-28`: withdraw the entire `fesa.env`/runtime-config discussion; do not add `fesa.env`, config parsing, runtime API or product behavior. Current authoritative contract fixes both normalized factor-one global FORCE and MOMENT balance gates at `<=1e-8`, preserving exact formulas, sum-of-contribution scales, zero-scale rule, quantities/source identity, blocking/review/warning dispositions, NSNR-069 free-residual gates, HDF5 schema, reference artifacts and `docs/TOLERANCE.md` separation. Coordinator is delegated to run Stage 4/5/6 reapproval and Step `11` no-push completion without intermediate approval waits, but must stop on any change beyond this fixed threshold. | user via Coordinator | closed-delegated | +| REAPPROVAL-010 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 4 owner returned `pass-for-io-definition`, blockers none, `numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; Coordinator audit passed against the threshold-only package. | `numerical-review-agent` / Coordinator | passed | +| REAPPROVAL-011 | upstream-reapproval | Passed under delegated USER-DECISION-006 authority: Stage 5 owner returned `ready-for-coordinator-review`, blockers none, `io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; Coordinator audit passed against the threshold-only package with schema/projection/reference/TOLERANCE boundaries preserved. | `io-definition-agent` / Coordinator | passed | +| REAPPROVAL-012 | planning-materialization | Passed under delegated USER-DECISION-006 authority: Planning owner returned `ready-for-implementation`, blockers none; `implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `phases/index.json` `307D8041537D73B579E53F96B052BA035774B65ABF071BB230AAE20CFCF966A7`, phase index `E707372018A7F5DE86CDB40277AE567FE86915C47EFDB38A687E71DD65A2C9EB`, `step11.md` `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8`, `step12.md` `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`; Coordinator audit passed. | `implementation-planning-agent` / Coordinator | passed | +| STEP11-EXECUTION-003 | implementation-dispatch | Needs rework: Step `11` only no-push wrapper attempt 1 timed out and attempt 2 hit inaccessible `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe` with `CreateProcessAsUserW failed: 5`; Stop-hook CTest evidence passed `302/302`, but Step `11` status/summary/commit are absent. | `implementation-agent` / Harness Executor / Coordinator | needs-rework | +| REWORK-009 | harness-environment | Passed: Correction Agent diagnosed the user-local WindowsApps `pwsh.exe` launch filter miss and proved an all-`WindowsApps` PATH-filter same-envelope shell smoke. Output `corrections.md` SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`; changed `corrections.md` only; no runner/source/test/CMake/phase/upstream/reference/tolerance edits. | `correction-agent` / Coordinator | passed | +| STEP11-EXECUTION-004 | implementation-dispatch | Passed: Step `11` completed and committed under corrected all-WindowsApps child PATH filter. Implementation commit `6dbf1b2`; metadata commit `c58ba9f`; focused and Stop evidence passed; Step `12` remains pending and unstarted. | `implementation-agent` / Harness Executor / Coordinator | passed | +| STEP12-EXECUTION-001 | implementation-dispatch | Passed: Step `12` evidence-doc closure completed with canonical Stage 6 reports, minimal PRD/ARCHITECTURE/ADR sync, Executor-owned phase metadata/output and local commits. Coordinator code-review audit found no tracked-file Critical/Important/Minor finding and no forbidden source/tests/CMake/Harness/reference/tolerance change. | `implementation-agent` / Harness Executor / Coordinator | passed | +| BLOCKER-005 | dispatch-runtime | This Coordinator runtime exposes no callable collaboration `spawn_agent` tool and `tool_search` found no dispatch tool. Root completed prior profile/Harness dispatches through Step `12`; no active dispatch remains. Future Stage 7 dispatch still requires root/profile launch if this runtime remains unchanged. | coordinator/root tooling | closed-no-current-dispatch | +| PUSH-001 | external-push | Closed before Stage 7 intake: branch HEAD `014f6a7926f00950c62f8109226b2d4ab93efd36` matched `origin/feat-nonlinear-static-newton-raphson` with no ahead/behind marker. Stage 7 commit/push remains root-owned after this audit. | root/user remote auth | closed | +| STAGE7-PHYSICS-001 | physics-evaluation-dispatch | Needs rework: owner found no physical failure but withheld `pass-for-release-agent` because required `reference-comparison.md` has no `pass-for-physics-evaluation` handoff status. | `physics-evaluation-agent` / Coordinator | needs-rework | +| PHYS-STATUS-001 | upstream-report-contract | Resolved: Implementation owner added unambiguous overall `pass-for-physics-evaluation` while preserving detailed `blocking-pass-with-review-only-findings` and all evidence. Coordinator verified corrected SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` and exact status-only diff. | `implementation-agent` through Coordinator | passed | +| STAGE7-PHYSICS-002 | physics-evaluation-dispatch | Passed: owner returned `pass-for-release-agent`, blockers none; Coordinator audit verified SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`, corrected input hash, physics evidence and no-change/Release boundaries. | `physics-evaluation-agent` / Coordinator | passed | +| STAGE8-RELEASE-001 | release-readiness-dispatch | Passed: owner returned `ready-for-release`, blockers none; Coordinator verified release SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`, 24/24 traceability, gate/validation inventory, known limitations, release notes and authority boundaries. | `release-agent` / Coordinator | passed | +| AUDIT-001 | projection-implementation | Passed by STEP11-EXECUTION-004: `/global/equilibrium` and reference comparator tests cover current nodal positions, spatial physical nodal moments about global origin, distinct global balance/free residual projections, and nonzero prescribed motion without raw full residual/initial-coordinate shortcut. | `implementation-planning-agent` / `implementation-agent` | passed | +| MESH-REFINEMENT-SPIKE-001 | diagnostic-spike | Completed read-only numerical/reference spike for `reference/shellNL-meshfine`: artifacts copied byte-identically, required rows readable, existing executable run successful, primary displacement/rotation passed common tolerance, local RF/RM per-row gates failed, and current coarse/fine Abaqus S4 pair did not meet option 3 independent benchmark condition. | `numerical-review-agent` | passed | +| TRANSLATION-REPORT-001 | focused-report | Completed bounded report for coarse/fine `U1/U2/U3` translation displacement only. Output `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` SHA-256 `597D923FB1943CCB2BCF9D9FFC13FD904F795DFEB9CB71B097FF168B78694338`; diagnostic non-gate, not canonical `reference-comparison.md`, and does not alter reaction/rotation/stress or USER-DECISION-004 disposition. | `implementation-agent` | passed | +| USER-DECISION-002 | user decision | User explicitly chose option A: approve Ninja/MSVC evidence contract for Stage 6 continuation. Option B `danger-full-access` and option C external sandbox wait are not selected. | user via Coordinator | closed | +| USER-DECISION-003 | user decision | User approved option 1: if the matching external residual-channel scale is exact zero, use the existing typed absolute residual gate; keep current relative denominator when the external scale is nonzero. This starts required upstream re-approval in order: requirements NSNR-069, formulation §14.1, numerical-review, I/O, then implementation-plan/phase steps before implementation rerun. | user via Coordinator | closed | +| REAPPROVAL-001 | upstream-reapproval | USER-DECISION-003 option 1 Stage 1 propagation completed: requirements owner return and Coordinator audit passed for `requirements.md` SHA-256 `89B6AEC25BD6AF5B79D328EEF63359A82DDB9402AE9482E3082A70C474A7B8B8`, and the user explicitly re-approved that hash. | `requirement-agent` / user via Coordinator | closed | +| REAPPROVAL-002 | upstream-reapproval | USER-DECISION-003 option 1 Stage 3 propagation completed: formulation owner return and Coordinator audit passed for `formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, and the user explicitly re-approved that hash. | `formulation-agent` / user via Coordinator | closed | +| REAPPROVAL-003 | upstream-reapproval | USER-DECISION-003 option 1 Stage 4 propagation completed: Numerical Review owner return and Coordinator audit passed for `numerical-review.md` SHA-256 `E93E0DEF1FD5ECDF956D50C6F8B8F1C073E21650E14EDC97A683DCA4688FE153`, `reference-model.md` remained byte-identical at SHA-256 `44B619BE2494007D8F2F51F34B9D974F934C26818F5AB8AF2DAA288ABF78D2FC`, and the user explicitly re-approved both hashes. | `numerical-review-agent` / user via Coordinator | closed | +| REAPPROVAL-004 | upstream-reapproval | USER-DECISION-003 option 1 Stage 5 propagation completed: I/O owner return and Coordinator audit passed for `io.md` raw SHA-256 `DB0BD8339172FD05712D2B7469966DEB0A6A82CB5A0052817F4725319E741334`, LF-normalized SHA-256 `E0C42775FF5C3963A37DF70B00044DDA244A463A6DD222975C2903A1BFA205AF`, and the user explicitly re-approved both hashes. | `io-definition-agent` / user via Coordinator | closed | +| REAPPROVAL-005 | planning-reapproval | USER-DECISION-003 option 1 Stage 6 planning propagation draft passed Coordinator audit and the user explicitly approved materialization on `2026-08-25`. | `implementation-planning-agent` / user via Coordinator | closed | +| MATERIALIZATION-002 | planning-materialization | User-approved Stage 6 planning revision materialized only in `implementation-plan.md`, `step5.md`, `step7.md`, `step10.md`, `step11.md`, `step12.md`, feature index and top index; Steps 0..10 history/commits and partial Step 11 comparator files are preserved, Step 11/top status reset to `pending`, and Step 12 remains `pending`. | `implementation-planning-agent` | closed | +| DECISION-040 | user approval | User explicitly approved the audited Implementation Planning revision draft and requested materialization. This approval does not authorize Harness, CTest, code/test/CMake/source edits, reference artifact changes, commit, or push. | user via Coordinator | closed | +| DECISION-041 | user approval | User explicitly requested no-push Harness/Implementation rerun from Step 11 under DECISION-038/039: Codex CLI `0.149.1`, aligned `CODEX_HOME`, launch-env WindowsApps PATH filtering, `workspace-write`, hooks retained, `--disable unified_exec`, VsDevCmd x64, dependency env vars, approved Ninja/MSVC Debug preset, no `danger-full-access`, no push, no reference solver and no reference artifact mutation. | user via Coordinator | closed | | RISK-001 | architecture | 기존 `LinearStaticAnalysis` private lifecycle은 단일 factorization/substitution과 final frame만 소유하므로 nonlinear increment/iteration/state commit을 삽입하면 ADR 경계를 위반한다. | `coordinator-agent` routing | open | | RISK-002 | scope | `Newton–Raphson`은 solution algorithm이고 geometric/material/contact nonlinearity 범위를 단독으로 결정하지 않는다. | `requirement-agent` | mitigated by DECISION-001 | | RISK-003 | contract | 현재 `Element`는 displacement-dependent residual/consistent tangent/trial state 계약이 없고 `AnalysisState`는 nonlinear history를 소유하지 않는다. | downstream formulation/architecture gates | open | @@ -233,28 +337,35 @@ | DECISION-035 | user approval | User explicitly approved Stage 5 `docs/nonlinear-static-newton-raphson/io.md` SHA-256 `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` and requested Implementation Planning. | user via Coordinator | closed | | DECISION-036 | user approval | User explicitly approved the Stage 6 Implementation Planning 13-Step draft on `2026-08-24` and authorized creation of `implementation-plan.md` plus pending Harness phase files. | user via Coordinator | closed | | DECISION-037 | user approval | User explicitly requested no-push Harness/Implementation execution for materialized phase `nonlinear-static-newton-raphson` on `2026-08-24`. | user via Coordinator | closed | +| DECISION-038 | user/root runtime approval | User/root authorized Codex CLI update, shell smoke and no-push Harness rerun. Accepted runtime envelope is Codex CLI `0.149.1`, `CODEX_HOME=C:\Users\baram\.codex`, launch-env-only WindowsApps PATH filtering, `workspace-write`, hooks retained, implementation-agent `gpt-5.6-terra`/`xhigh`, no `danger-full-access`, and `--disable unified_exec`. | user/root via Coordinator | closed | +| DECISION-039 | user decision | Stage 6 FileTracker blocker route: user approved option A, making Ninja/MSVC x64 Debug with full CTest the accepted validation contract for continuation. `danger-full-access`, Visual Studio fallback, reference solver activity, push and Step 2 advancement remain unauthorized. | user via Coordinator | closed | | USER-DECISION-001 | user decision | Stage 6 Implementation Planning draft Steps `0..12` were approved on `2026-08-24`; materialization is authorized for `implementation-planning-agent`. | user via Coordinator | closed | ## 6. Rework-Loop Control and Stop Condition -- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-uncaught-step-codex-timeout-no-retry`: 1 +- normalized_failure_attempts: `requirements-next-question-routing-mismatch`: 1; `requirements-output-failure-atomicity-scope-ambiguity`: 1; `requirements-compact-public-contract-omission`: 1; `formulation-equilibrium-reaction-symbol-collision`: 1; `formulation-moment-admissibility-work-inconsistency`: 1; `numerical-review-cross-report-disposition-contradiction`: 1; `io-contract-public-cli-log-output-request-gap`: 1; `harness-nested-codex-windows-shell-tool-execution-hang`: 3; `harness-console-cp949-retry-glyph-unicodeencodeerror`: 1; `harness-msbuild-filetracker-eaccessdenied-workspace-write`: 2; `implementation-shellnl-nonlinear-nonconvergence-no-hdf5`: 1; `reference-blocking-model-adequacy-conflict`: 1; `upstream-global-moment-balance-gate-threshold-conflict`: 1; `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied`: 2; `physics-reference-comparison-handoff-status-mismatch`: 1 - automatic_rework_limit: 동일 normalized failure classification `2`회 - correction_agent_policy: 명확한 implementation failure는 먼저 `implementation-agent`에 반환하고, 반복되거나 원인이 불명확할 때만 `correction-agent`를 dispatch한다. - stop_condition: 동일 classification이 두 번이면 자동 rework를 중단하고 workflow를 `needs-user-decision` 또는 `blocked`로 전환한다. +- correction_cycle_authorization: REWORK-008 is closed as `upstream-contract`. MATERIALIZATION-003 and REAPPROVAL-012 are closed as `passed`. USER-DECISION-006 resolves the prior `upstream-global-moment-balance-gate-threshold-conflict` by fixing both normalized global balance gates at `<=1e-8`. STEP11-EXECUTION-003 reached normalized environment failure count `2`, automatic retry was stopped, REWORK-009 passed, STEP11-EXECUTION-004 passed, and STEP12-EXECUTION-001 passed. No correction loop is active. +- upstream_reapproval_sequence: Prior USER-DECISION-003/004/006 sequences remain closed. PHYS-STATUS-001 passed on first attempt, Stage 7 returned `pass-for-release-agent`, Stage 8 returned `ready-for-release`, and all Coordinator audits passed. No rework loop remains active. ## 7. Final Workflow Closure -- closure_status: `not-eligible` -- required_evidence: `docs/nonlinear-static-newton-raphson/release.md`의 `ready-for-release` recommendation -- closure_record: 없음 +- closure_status: `completed` +- required_evidence: satisfied by `docs/nonlinear-static-newton-raphson/release.md` SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`, owner verdict `ready-for-release`, blockers none +- closure_record: Eight stages are `passed`; Stage 6 `pass-for-physics-evaluation`, Stage 7 `pass-for-release-agent`, full CTest `302/302`, reference `9/9`, 24/24 must traceability and disclosed known limitations are audited. Closure means internal feature workflow readiness only and does not publish, deploy, package, tag or externally release. ## 8. No-Change Assertion -- source_code: 변경 없음 -- tests: 변경 없음 -- CMake: 변경 없음 -- reference_artifacts: 생성·수정·rename 없음 +- source_code: Steps 0..11 implementation source changes are committed through Harness; Step `11` implementation commit is `6dbf1b2`. Step `12` range contains no source-code diff. Coordinator did not edit source code. +- tests: Step `11` comparator/test changes are committed through Harness. Step `12` range contains no test diff; owner reports focused commands and full CTest `302/302` passed. Coordinator did not edit tests. +- CMake: Step `11` owner committed `tests/CMakeLists.txt` changes; REWORK-006 added tracked `CMakePresets.json` for DECISION-039 Ninja/MSVC validation. Coordinator did not edit CMake configuration. +- reference_artifacts: Root copied four `reference/shellNL-meshfine` artifacts byte-identically into the feature worktree for the approved spike; SHA-256 values match the recorded main-checkout hashes and row counts `729/729/5408`. No reference artifact was generated, renamed, normalized, repaired or modified by Coordinator. - tolerance_policies: 변경 없음 -- phase_files: user-approved planning owner가 `phases/index.json` pending entry와 `phases/nonlinear-static-newton-raphson/index.json`, `step0.md`..`step12.md`를 materialize함; Coordinator는 수정하지 않았고 Step 0은 implementation evidence 없이 pending으로 남아 있음 -- Harness: Root-reported attempt 1 evidence만 기록함; Coordinator는 실행하지 않았고 no-push `scripts/execute.py nonlinear-static-newton-raphson` retry dispatch package만 기록함 -- feature_documents: 이번 coordinator update에서는 `coordination.md`만 갱신함; `implementation-plan.md`는 user-approved planning owner가 materialize했고 `implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않음 +- phase_files: Step `12` metadata commit `624807a` records phase completion; `phases/index.json` SHA-256 `5FA3225F73E4B4FB6A7CFCD049DD66FF21715DFB41A91BB14F47ABDFE45378BD` and phase index SHA-256 `B941B903746DA19F1460C1022FE3501DFC44CE09E5D72CCCCCB7E38D7D55FD22`; Steps 0..12 are completed and top phase is completed. Coordinator did not edit phase files. +- Harness: STEP12-EXECUTION-001 completed under the approved envelope with owner-reported exitCode `0`, fresh configure/build/discovery/focused/full CTest and reference gate pass. Physics owner additionally ran focused CTest `23/23`; Release owner and Coordinator did not run Harness/build/test, use `danger-full-access`, clean outputs, publish/deploy/package/tag/external release, commit or push. +- feature_documents: REWORK-008 Correction updated `docs/nonlinear-static-newton-raphson/corrections.md` Section 13 SHA-256 `C8AC5A5015E5F9622E2964F514F2C06572F953B5244F006044DEDDF0F3D0A194`; Requirement Agent updated only `docs/nonlinear-static-newton-raphson/requirements.md` SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`; Formulation Agent updated only `docs/nonlinear-static-newton-raphson/formulation.md` SHA-256 `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`; REAPPROVAL-010 Numerical Review Agent updated Stage 4 reports to `docs/nonlinear-static-newton-raphson/numerical-review.md` SHA-256 `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` and `docs/nonlinear-static-newton-raphson/reference-model.md` SHA-256 `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`; REAPPROVAL-011 I/O Definition Agent updated only `docs/nonlinear-static-newton-raphson/io.md` raw SHA-256 `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, LF-normalized SHA-256 `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB`; REAPPROVAL-012 Planning owner materialized `docs/nonlinear-static-newton-raphson/implementation-plan.md` SHA-256 `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, `step11.md` SHA-256 `F0DFD7BF2A473F47BCF7F6195DD41569B349474BF93F5D5B642882A037DBB8F8` and `step12.md` SHA-256 `191432020B9C774BF153EECFD8F9A2EF74AF0014E2405478F541D85B517D7DD0`. STEP12-EXECUTION-001 created `implementation-report.md` SHA-256 `D75C8B5922C9EEF7C7262B01BFB12D5F7609B1A6DB3A7C6D5AE47CB45ADAD578`, `build-test.md` SHA-256 `ED6B1B6CFD9478B09B92E7ADE3891622FEA1AA521AD29550D6F4C78C952E8DDA`, `reference-comparison.md` SHA-256 `5CFFB39BBDB323196461A54FCCFF8EE6E66866103D0931D4D3A94D2B3D644328` and minimal `docs/PRD.md`/`docs/ARCHITECTURE.md`/`docs/ADR.md` sync. This coordinator update changed only isolated `coordination.md`. +- stage7_rework_documents: PHYS-STATUS-001-IMPLEMENTATION-001 changed only `reference-comparison.md` to SHA-256 `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241`; STAGE7-PHYSICS-002 revised only `physics-evaluation.md` to SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538`; Coordinator changed only `coordination.md`. +- release_document: STAGE8-RELEASE-001 created only `docs/nonlinear-static-newton-raphson/release.md`, SHA-256 `0DA80387B137DAA7629D4B0A0C1E5442F90E17F142345379669B2E1D1962E1D1`; Coordinator changed only `coordination.md`. +- correction_reports: REWORK-009 Correction Agent updated current `docs/nonlinear-static-newton-raphson/corrections.md` Section 14, SHA-256 `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. Coordinator did not edit `corrections.md`. diff --git a/docs/nonlinear-static-newton-raphson/corrections.md b/docs/nonlinear-static-newton-raphson/corrections.md new file mode 100644 index 0000000..98a7e94 --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/corrections.md @@ -0,0 +1,644 @@ +# Nonlinear Static Newton-Raphson Correction Report + +## 1. Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `docs/nonlinear-static-newton-raphson/coordination.md`; `phases/nonlinear-static-newton-raphson/step0-output.json`; `phases/nonlinear-static-newton-raphson/step1-output.json` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md` | +| status | `corrected-for-implementation-rerun` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 생성되지 않았으므로 현재 Coordinator failure evidence와 Executor의 `step0-output.json` 및 `step1-output.json`을 source failure report로 사용했다. + +Sections 2-6의 Codex `0.147.0` 내용은 initial correction history이고 Sections 7-9는 REWORK-004 history다. Section 10은 FileTracker diagnosis history이고 Sections 11-13은 이전 correction history다. Current correction과 status는 Section 14가 supersede한다. + +## 2. Failure Triage + +- classification: `harness` +- normalized classification: `harness-nested-codex-windows-shell-tool-execution-hang` +- first failed command: + + ```powershell + codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson - + ``` + +- failed target or test: nested shell smoke `cmd.exe /d /c echo CODEX_SHELL_SMOKE_OK` +- evidence tail: baseline diagnostic는 45초 안에 종료되지 않았다. JSONL에는 `item.started`, `type=command_execution`, `status=in_progress`가 기록됐지만 대응하는 completion event와 `CODEX_SHELL_SMOKE_OK` 출력이 없었다. 진단 root PID `11292`와 관찰된 descendant PID tree를 `taskkill /PID 11292 /T /F`로 종료한 뒤 `remainingPids=[]`를 확인했다. +- historical evidence: `step0-output.json`도 exit code `124`, stderr `Codex timed out after 1800 seconds.`를 기록했고 `Get-Date`, `cmd.exe /d /c echo test`, `exit 0` 등의 nested command가 `status=in_progress`에 머물렀다. + +## 3. Root Cause Summary + +실패 경계는 repaired Python Executor의 timeout/retry 처리나 FESA C++ 구현이 아니라 local `codex-cli 0.147.0`의 nested command execution runtime이다. 같은 worktree에서 direct PowerShell과 `cmd.exe`는 정상 실행되고, focused Harness Python test도 통과하며, runner-equivalent Codex baseline만 nested shell completion을 반환하지 않았다. + +Local CLI help는 `--disable `와 `--enable `를 문서화하고, `codex features list`는 `code_mode_host`를 `stable true`, `shell_tool`을 `stable true`, `unified_exec`를 `stable false`, `hooks`를 `stable true`로 보고했다. 다음 좁은 가설을 한 변수씩 검사했다. + +| variant | result | command completion evidence | +| --- | --- | --- | +| baseline | 45.318초 timeout 후 exact PID tree cleanup | `item.started/status=in_progress`; completion 및 echo output 없음 | +| `--disable code_mode_host` | exit `0`, 33.322초 | shell 미실행; stderr `code-mode host is disabled`; completion event 없음 | +| `--enable unified_exec` | 45.299초 timeout 후 exact PID tree cleanup | completion event 및 echo output 없음 | +| `--disable code_mode_host --enable unified_exec` | exit `0`, 25.922초 | shell 미실행; 동일한 fail-closed host-disabled error | + +따라서 `--disable code_mode_host`는 shell execution을 복구하지 않고 tool host를 fail-closed로 제거한다. `unified_exec`도 단독 또는 조합에서 실제 shell completion을 만들지 못했다. Codex 내부 결함의 더 세부 원인은 repository evidence로 확정할 수 없으며, 안전한 documented runner flag workaround는 입증되지 않았다. 이는 implementation defect, test defect 또는 CMake registration issue가 아니라 external Codex runtime blocker다. + +## 4. Correction Scope + +- changed source files: `scripts/execute.py` (`codex exec` argv에 adjacent `--disable`, `unified_exec` 추가) +- changed header files: 없음 +- changed test files: `tests/test_execute.py` (Implementation Agent command contract regression assertion 추가) +- changed CMake files: 없음 +- changed report files: `docs/nonlinear-static-newton-raphson/corrections.md` +- excluded upstream contract files: `requirements.md`, `research.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md` +- excluded artifacts/policies: phase definition/index, production C++, reference inputs/CSV, `docs/TOLERANCE.md` + +초기 correction cycle에서는 safe workaround가 입증되지 않아 runner/test를 변경하지 않았다. 이후 user/root가 Codex `0.149.1`의 bounded smoke로 `--disable unified_exec` runtime envelope를 입증했고, REWORK-004에서 그 pair만 TDD로 추가했다. 기존 Harness-repair 변경과 다른 owner의 dirty-worktree 변경은 그대로 보존했다. + +## 5. Verification Evidence + +| purpose | command | result | +| --- | --- | --- | +| installed CLI | `codex --version` | exit `0`; `codex-cli 0.147.0` | +| documented options | `codex exec --help`; `codex features list` | exit `0`; `--enable/--disable`, `code_mode_host`, `unified_exec`, `shell_tool`, `hooks` 확인 | +| targeted reproduction | runner-equivalent `codex exec ... --sandbox workspace-write ...` + one echo tool request | 45초 timeout; command started, completion/output 없음; exact tree cleanup 후 remaining PID 0 | +| focused Harness Python | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | exit `0`; 10 passed | +| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | exit `1`; 23 passed, 1 failed | +| MSVC Debug build | `cmake --build .harness/build --config Debug` | exit `0`; solver/CLI/unit/integration/reference targets built | +| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | exit `0`; 214 tests discovered | +| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | exit `0`; 214/214 passed | + +`.harness/config.json`은 없었다. Existing `.harness/build/CMakeCache.txt`는 `Visual Studio 18 2026`, `x64`, approved local GoogleTest/MKL/TBB/HDF5 paths를 사용하므로 Harness auto-detected build tree를 재사용했다. + +Full Python failure는 pre-existing out-of-scope contract mismatch다: `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`가 actual `xhigh`와 expected `extra high`를 비교한다. Dispatch 지시에 따라 이 test, `AGENTS.md`, agent profile을 변경하지 않았다. + +Stop hook은 Harness Step 실행을 금지한 이번 correction session에서 별도 Codex Step 종료 evidence를 생성하지 않았다. Hook entry point의 수동 실행은 project contract가 금지하므로 대신 config-resolved full MSVC build와 full CTest를 직접 실행해 결과를 위에 기록했다. + +## 6. Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | Step 0 `cli-output-lease-and-derived-names` | `CORR-HARNESS-SMOKE-001` | runner-equivalent `codex exec` invoking `cmd.exe /d /c echo CODEX_SHELL_SMOKE_OK` | 없음 | workspace-write, hooks, `gpt-5.6-terra`/`xhigh`, no-push, no `danger-full-access`를 유지한 실제 shell completion과 exact echo output; 실패 | +| `FESA-REQ-NSNR-083` | Step 0 `cli-output-lease-and-derived-names` | `CORR-HARNESS-SMOKE-002` | same smoke with `--disable code_mode_host` | 없음 | shell completion 복구; 실패 (`code-mode host is disabled`) | + +Runner correction acceptance criterion이 충족되지 않았으므로 Implementation Step 0의 `NSNR-CLI-*` RED/GREEN은 시작되지 않았고 Step 0 status는 `pending`으로 유지된다. + +## 7. Handoff Recommendation + +- recommendation: Coordinator Agent를 통해 Implementation Agent에 `needs-implementation-rerun` 요청. +- corrected runner contract: nested command는 `codex exec --disable unified_exec --json ...` 순서로 실행된다. +- preserved execution contract: Coordinator가 관리하는 rerun launch environment는 Codex `0.149.1`, aligned `CODEX_HOME`, approved WindowsApps PATH filtering, `workspace-write`, project hooks, `gpt-5.6-terra`, `xhigh`, no-push, no `danger-full-access`를 유지해야 한다. +- scope boundary: 이 correction은 runner option gate만 복구했다. Harness phase, Implementation Step 0, reference comparison 또는 physics success를 주장하지 않는다. + +## 8. Stop Condition + +- repeated failure: normalized classification attempt `2`는 초기 Codex `0.147.0` failure history로 보존한다. +- external mitigation: user/root의 Codex `0.149.1` bounded smoke와 `DECISION-038`이 새 좁은 runner correction을 승인했다. +- correction result: required adjacent `--disable unified_exec` pair와 regression test가 GREEN이다. +- residual blocker: runner correction 자체 blocker는 없음. Full Python suite의 pre-existing `xhigh` actual 대 `extra high` expected mismatch는 변경하지 않았다. +- upstream ambiguity/reference artifact gap: 없음; reference artifact는 읽기/수정/생성하지 않았다. +- final stop: correction-owned edits와 검증이 끝났으므로 여기서 중단하고, phase rerun 판단과 실행은 Coordinator/Implementation Agent에 반환한다. + +## 9. REWORK-004 TDD And Verification Evidence + +### Failure and Minimal Correction + +- classification: `harness` +- implementation defect: Codex `0.149.1`에서 통과한 runtime envelope의 `--disable unified_exec` option을 `scripts/execute.py`가 nested `codex exec`에 전달하지 않았다. +- RED test: `test_invoke_codex_uses_implementation_agent_command_contract` +- minimal GREEN: command vector에서 `"codex", "exec"` 바로 뒤에 `"--disable", "unified_exec"` 두 argument만 추가했다. +- preserved behavior: `workspace-write` default/validated override, `--dangerously-bypass-hook-trust`, `gpt-5.6-terra`, `model_reasoning_effort="xhigh"`, 1800-second structured timeout, no-push default, `danger-full-access` 비사용 정책은 변경하지 않았다. + +### RED / GREEN / VERIFY + +| stage | command | exit | duration | evidence tail | +| --- | --- | ---: | ---: | --- | +| RED | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py::test_invoke_codex_uses_implementation_agent_command_contract` | `1` | 1.2초 | `assert ('--disable', 'unified_exec') in adjacent_arguments`; 1 failed | +| GREEN | same targeted command | `0` | 1.1초 | 1 passed | +| focused VERIFY | `uv run --with pytest python -m pytest -v -rs tests/test_execute.py` | `0` | 1.1초 | 10 passed | +| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | `1` | 1.3초 | 23 passed, 1 pre-existing failure | +| MSVC Debug build | `cmake --build .harness/build --config Debug` | `0` | 3.8초 | solver/CLI/unit/integration/reference targets built | +| CTest discovery | `ctest --test-dir .harness/build -C Debug --show-only=json-v1` | `0` | 0.7초 | 214 tests discovered | +| full CTest | `ctest --test-dir .harness/build -C Debug --output-on-failure` | `0` | 10.2초 | 214/214 passed | + +Full Python failure는 기존 `test_agent_toml_and_limited_skill_yaml_schemas_are_parseable`의 `assert 'xhigh' == 'extra high'` 한 건이다. REWORK-004의 command-contract test를 포함한 `tests/test_execute.py`는 10/10 통과하며, dispatch 경계에 따라 pre-existing mismatch를 수정하지 않았다. + +### REWORK-004 Traceability + +| requirement id | task id | test id | corrected files | acceptance criterion | +| --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | Harness runner correction `REWORK-004`; blocks Step 0 `cli-output-lease-and-derived-names` | `test_invoke_codex_uses_implementation_agent_command_contract` | `scripts/execute.py`; `tests/test_execute.py` | nested Codex argv가 adjacent `--disable`, `unified_exec`를 포함하면서 Terra/xhigh routing을 보존함; passed | + +## 10. FileTracker Workspace-Write Diagnosis + +### 10.1 Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step1.md` | +| status | `blocked` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +### 10.2 Failure Triage + +- classification: `harness` +- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write` +- attempt: `1` +- first failed stage command: + + ```powershell + cmake --build .harness/build --config Debug + ``` + +- failed target or test: Visual Studio 18 generator의 `fesa_solver.vcxproj`와 GoogleTest `gtest.vcxproj` CL task +- evidence tail: MSBuild `18.8.2`가 `Microsoft.CppCommon.targets(790,5)`에서 `MSB4018`을 냈다. Inner exception은 `System.UnauthorizedAccessException`, HRESULT `0x80070005 (E_ACCESSDENIED)`이며 stack은 `NativeMethods.GetLongFilePath` -> `FileTracker..cctor()` -> `FileTracker.FileIsExcludedFromDependencies` -> `CanonicalTrackedInputFiles.ConstructDependencyTable` -> `CL.ComputeOutOfDateSources`다. +- command-result caveat: `step1-output.json`의 item 25는 build와 CTest를 세미콜론으로 연결해 aggregate exit `0`을 기록했지만, 그 내부 `cmake --build`는 exit `1`로 실패했다. 뒤따른 stale-build CTest 성공은 Visual Studio build 성공 evidence가 아니다. +- configure boundary: 보존된 `.harness/build/CMakeCache.txt`는 `CMAKE_GENERATOR=Visual Studio 18 2026`, platform `x64`다. CMake generation 자체가 아니라 생성된 MSBuild project의 CL dependency-tracking 단계가 실패했다. + +### 10.3 Root Cause Summary + +FESA source, Step 1 test 또는 CMake registration이 원인이 아니다. 서로 독립적인 FESA와 GoogleTest project가 동일한 `FileTracker` static initializer에서 실패하므로 project-local input보다 sandbox/environment boundary다. + +Microsoft의 `FileTracker.cs`는 static initialization에서 `Path.GetTempPath()`를 구한 뒤 그 경로에 `GetShortFilePath`와 `GetLongFilePath`를 적용한다. 관찰 stack의 첫 failing native call과 정확히 일치한다. 현재 inherited `TEMP`/`TMP`는 `C:\Users\baram\AppData\Local\Temp`이고 runner는 이를 재지정하지 않는다. 따라서 Codex Windows `workspace-write` restricted token이 workspace 밖 user Temp의 long-path normalization을 거부한 것이 가장 좁은 root-cause inference다. + +- boundary confidence: `high` — 두 project에서 같은 FileTracker initializer/`E_ACCESSDENIED`가 재현됨. +- exact denied-path confidence: `medium-high` — Microsoft source의 static field order와 inherited Temp가 일치하지만 failing API가 path argument를 log하지는 않음. +- implementation classification: environment-owned sandbox/MSBuild interaction; implementation defect, test defect, CMake registration issue가 아님. + +검토한 primary vendor evidence: + +- Microsoft MSBuild source: `https://github.com/dotnet/msbuild/blob/main/src/Utilities/TrackedDependencies/FileTracker.cs` +- Microsoft CL task documentation: `https://learn.microsoft.com/en-us/visualstudio/msbuild/cl-task?view=visualstudio` +- installed Visual Studio target: `C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Microsoft\VC\v180\Microsoft.CppCommon.targets` lines 48-49 and 764-771 +- OpenAI Codex sandbox CLI source: `https://github.com/openai/codex/blob/main/codex-rs/cli/src/lib.rs`; built-in writable profile name은 `:workspace` + +### 10.4 Correction Scope + +- changed report files: `docs/nonlinear-static-newton-raphson/corrections.md` +- changed source/header/test/CMake/runner files: 없음 +- preserved dirty Step 1 files: `include/fesa/model/domain.h`, `include/fesa/model/model_types.h`, `src/fesa/io/abaqus/domain_mapping_context.cpp`, `src/fesa/model/domain.cpp`와 관련 unit tests +- preserved workflow files: `docs/nonlinear-static-newton-raphson/coordination.md`, `phases/index.json`, `phases/nonlinear-static-newton-raphson/index.json` +- excluded files: C++/CMake, phase definition/index, coordination, runner, upstream contracts, reference/tolerance artifacts +- prohibited actions not performed: Harness phase rerun, Step 2, build cleanup/deletion, Abaqus/Nastran/reference solver, `danger-full-access`, commit, push + +### 10.5 Workaround Evaluation And Verification Evidence + +| purpose | exact command/evidence | result | +| --- | --- | --- | +| preserved failure | `cmake --build .harness/build --config Debug` in `step1-output.json` | internal build exit `1`; `FileTracker..cctor()` `E_ACCESSDENIED` in both FESA and gtest | +| supported property inspection | installed `Microsoft.CppCommon.targets`; Microsoft CL task docs | `TrackFileAccess` defaults to `true` and is passed to CL; property is vendor-defined for incremental file-access tracking | +| narrow property smoke | nested `codex exec --sandbox workspace-write ...` requesting exactly `cmake --build .harness/build --config Debug -- /p:TrackFileAccess=false` | 60-second diagnostic timeout before a command completion event; no pass/fail conclusion; exact root PID `13720` and descendants cleaned, then absent | +| direct sandbox launcher check | `codex sandbox -P :workspace -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson cmd.exe /d /c echo SANDBOX_OK` | 10-second timeout; no `SANDBOX_OK`; exact root PID `16708` tree cleaned, then absent | +| workspace-write alternative evidence | Visual Studio-bundled Ninja/MSVC build in `step1-output.json` | focused CTest 27/27 and full CTest 228/228 passed | + +`/p:TrackFileAccess=false`는 vendor-defined 후보지만 동일 `workspace-write`에서 build completion이 관찰되지 않아 safe workaround로 채택할 수 없다. `TEMP`/`TMP`를 worktree로 재지정하는 후보도 FileTracker가 system-wide Temp를 dependency exclusion 기준으로 사용한다는 Microsoft source comment 때문에 tracking semantics 보존을 입증하지 않고 자동 적용하지 않았다. + +Ninja/MSVC는 같은 sandbox에서 implementation/test 건전성을 입증하지만 Step 1 VERIFY가 명시한 `Visual Studio 18 2026` generator acceptance criterion을 대체하지 않는다. 따라서 correction-agent가 phase/upstream contract 변경 없이 자동 채택할 수 없다. `danger-full-access`는 지시대로 실행하거나 시험하지 않았다. + +### 10.6 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | Step 1 `nonlinear-static-domain-contract`; FileTracker correction attempt 1 | `CORR-HARNESS-FILETRACKER-001` | `cmake --build .harness/build --config Debug` | report only | approved `workspace-write`에서 Visual Studio 18/MSBuild build completion; not met | +| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-FILETRACKER-002` | same build with `/p:TrackFileAccess=false` | 없음 | vendor-defined property가 FileTracker denial을 제거하고 build를 완료함; completion evidence 없음 | + +### 10.7 Handoff Recommendation + +- recommendation: `needs-user-decision`; Coordinator Agent에 `blocked` 반환. +- safe automatic correction: 없음. Runner/CMake/Step 1 source를 변경하지 않는다. +- decision option 1: approved implementation plan/phase owner가 Ninja+MSVC를 Visual Studio generator 대체 evidence로 명시적으로 승인한다. 이는 correction-agent 범위 밖의 upstream acceptance 변경이다. +- decision option 2: 사용자가 `docs/HARNESS.md`의 isolated clean-worktree `danger-full-access` fallback을 명시적으로 승인한다. 이번 진단에서는 broader privilege를 사용하거나 시험하지 않았다. +- decision option 3: Codex/Windows sandbox 환경 소유자가 direct `:workspace` launcher와 user Temp long-path access 문제를 수정한 뒤 동일 Visual Studio build를 재검증한다. + +### 10.8 Stop Condition + +- repeated failure: normalized classification attempt `1`; 같은 classification의 두 번째 자동 rework는 아직 수행하지 않았다. +- environment blocker: direct `:workspace` no-op도 bounded completion을 내지 않아 workspace-only workaround를 신뢰성 있게 검증할 수 없다. +- upstream ambiguity: Ninja acceptance 또는 broader sandbox 권한은 사용자/Coordinator 결정이 필요하다. +- reference artifact gap: 없음; reference artifact는 읽기/수정/생성하지 않았다. +- final stop: safe, vendor-supported, contract-preserving `workspace-write` workaround가 입증되지 않아 code change 없이 `blocked`로 중단한다. + +## 11. REWORK-006 Ninja/MSVC Validation Contract Correction + +### 11.1 Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `phases/nonlinear-static-newton-raphson/step1-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` USER-DECISION-002 option A / REWORK-006 | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` | +| status | `corrected-for-implementation-rerun` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +### 11.2 Failure Triage + +- classification: `harness` +- normalized classification: `harness-msbuild-filetracker-eaccessdenied-workspace-write` +- attempt: `2`, resolved by USER-DECISION-002 option A의 approved validation-contract change +- first failed command: `cmake --build .harness/build --config Debug` +- failed target: Visual Studio generator/MSBuild `FileTracker..cctor()`; Section 10의 `E_ACCESSDENIED` +- replacement acceptance: `workspace-write` 안에서 VsDevCmd x64를 상속한 Ninja/MSVC Debug configure/build, CTest discovery, full CTest가 모두 통과해야 한다. + +### 11.3 Root Cause Summary + +FESA C++/test/CMake target defect가 아니라 Visual Studio generator의 MSBuild FileTracker와 `workspace-write` sandbox 사이 environment failure였다. User가 option A를 승인했으므로 tracked root `CMakePresets.json`과 existing Harness preset adapter를 사용해 동일 MSVC x64 Debug compiler를 Ninja로 구동한다. Harness Python은 이미 complete preset triplet과 parent environment copy를 지원하므로 production Python 변경은 필요하지 않았다. + +### 11.4 Correction Scope + +- validation plumbing: `CMakePresets.json`, `.harness/config.example.json`, `.gitignore`, ignored local `.harness/config.json`, `tests/test_harness_preset_contract.py` +- approved validation commands: `docs/nonlinear-static-newton-raphson/implementation-plan.md`, `phases/nonlinear-static-newton-raphson/step0.md`..`step12.md` +- report/status: `docs/nonlinear-static-newton-raphson/corrections.md`, `phases/nonlinear-static-newton-raphson/index.json`; top `phases/index.json`은 blocked payload 제거 후 HEAD와 같은 `pending` 의미로 복원됨 +- generated/ignored build output: `.harness/build-ninja-msvc-debug/`; 삭제하거나 cleanup하지 않았다. +- production Harness Python, runner, C++, CMakeLists, upstream physics/I/O/reference/tolerance contract: 변경 없음 +- preserved others' dirty files: Step 1 C++/unit tests와 Coordinator-owned `coordination.md`를 되돌리거나 덮어쓰지 않았다. + +### 11.5 RED -> GREEN Evidence + +| stage | command | result | +| --- | --- | --- | +| RED-1 | `uv run --with pytest python -m pytest -v -rs tests/test_harness_preset_contract.py` | exit `1`; `CMakePresets.json` `FileNotFoundError` | +| GREEN-1 | same focused command after preset/example/local config | exit `0`; 1 passed | +| RED-2 | `uv run --with pytest python -m pytest -q tests/test_harness_preset_contract.py` after adding generated-build ignore assertion | exit `1`; `.harness/build-ninja-msvc-debug/` rule absent | +| GREEN-2 | focused verbose command after `.gitignore` update | exit `0`; 1 passed; `git check-ignore` confirms config and build output | + +Contract details: + +- preset: `windows-msvc-ninja-debug` +- generator/configuration: `Ninja`, `CMAKE_BUILD_TYPE=Debug` +- binary directory: `.harness/build-ninja-msvc-debug` +- cache variables: `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR` use `$env{...}` and therefore fail closed when the parent launch envelope is incomplete. +- `.harness/config.json` is ignored and byte-identical to `.harness/config.example.json`; both SHA-256 `D07429860D472AE37D02D6CD638900FA46175085AF47F179E98601227F8D3C43` at verification. + +### 11.6 Verification Evidence + +Exact nested launch envelope: + +```powershell +VsDevCmd.bat -arch=x64 -host_arch=x64 +$env:FESA_GTEST_SOURCE_DIR='C:/git/googletest' +$env:MKL_DIR='C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl' +$env:TBB_DIR='C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb' +$env:HDF5_DIR='C:/Program Files/HDF_Group/HDF5/2.1.1/cmake' +codex exec --ephemeral --json --sandbox workspace-write --disable unified_exec --dangerously-bypass-hook-trust -m gpt-5.6-terra -c 'model_reasoning_effort="xhigh"' -C C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson +``` + +`CODEX_HOME=C:\Users\baram\.codex`를 상속하고 approved WindowsApps PATH entries를 child launch에서만 제거했다. `danger-full-access`와 sandbox bypass option은 사용하지 않았고 project hooks는 유지했다. + +| verify item | exact command/evidence | result | +| --- | --- | --- | +| environment preflight | nested shell prints architecture, four variables, `cl.exe`, `ninja.exe` | exit `0`; target/host `x64`; `cl.exe` Hostx64/x64; VS-bundled Ninja; all dependency paths exist | +| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0` | +| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0` | +| discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 228 tests | +| full CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `0`; 228/228 passed; 10.69초 | +| generated metadata | `.harness/build-ninja-msvc-debug/CMakeCache.txt`와 `CMakeCXXCompiler.cmake` | `Ninja`; `Debug`; compiler ID `MSVC`; Hostx64/x64 `cl.exe` | +| Stop | hooks-retained nested `codex exec` completion | overall exit `0`; no Stop blocking response; automatic Stop uses ignored config's same preset plan | +| full Harness Python | `uv run --with pytest python -m pytest -v -rs` | 24 passed, 1 pre-existing out-of-scope failure: actual `xhigh` vs expected `extra high` | + +첫 cold workspace run은 full CTest에서 temporary `fesa_reference_tests_NOT_BUILT`로 207/208만 통과해 blocker-clear로 사용하지 않았고 phase도 reset하지 않았다. Automatic hooks가 missing target build를 완료한 뒤 두 번째 independent nested `workspace-write` run에서 위 228/228 evidence를 확보한 다음에만 phase를 reset했다. + +Reference artifact no-change evidence: `git diff --name-only -- reference`는 empty였다. `shellNL.inp`, shellNL displacement/reaction/stress CSV와 shell input/displacement/reaction/stress CSV의 SHA-256은 implementation-plan inventory와 모두 일치한다. Reference solver와 feature Harness phase는 실행하지 않았다. + +### 11.7 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-083` | `REWORK-006`; Steps 0..12 validation contract | `CORR-HARNESS-PRESET-001` | Visual Studio/MSBuild build | `CMakePresets.json`; `.harness/config.example.json`; `.gitignore`; `tests/test_harness_preset_contract.py` | tracked Ninja/MSVC preset and Harness plan select MSVC/x64/Debug under `workspace-write` | +| `FESA-REQ-NSNR-083` | same | `CORR-HARNESS-PRESET-VERIFY-001` | preset configure/build/discovery/full CTest | implementation plan and `step0.md`..`step12.md` | nested env preflight plus 228/228 CTest pass | + +### 11.8 Handoff Recommendation And Stop Condition + +- recommendation: Coordinator를 통해 Implementation Agent에 Step 1 no-push rerun을 요청한다; Step 2로 advance하지 않는다. +- phase state after evidence: top phase `pending`; Step 1 `pending`, historical `started_at` 보존; `blocked_reason`과 `blocked_at`만 제거; Steps 2..12 remain `pending`. +- status: `corrected-for-implementation-rerun`. +- blockers: 이 correction 범위에는 없음. Existing Python `xhigh`/`extra high` mismatch는 명시된 out-of-scope pre-existing failure다. +- prohibited actions not performed: Harness phase rerun, Step 2, `danger-full-access`, push, commit, reference solver/artifact mutation, build cleanup/deletion. + +## 12. REWORK-007 Step 11 Nonlinear Nonconvergence Contract Triage + +### 12.1 Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` REWORK-007 | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| status | `needs-upstream-decision` | +| owner_agent | `correction-agent` | +| date | `2026-08-24` | + +### 12.2 Failure Triage + +- classification: `upstream-contract` +- normalized classification: `implementation-shellnl-nonlinear-nonconvergence-no-hdf5` +- attempt: `1` +- first failed command: + + ```powershell + ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure + ``` + +- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (CTest test 288) +- evidence tail: copied build-local `shellNL.inp` reaches `severity=error`, `code=nonlinear-nonconvergence` after iteration 100. `generated.HasValue()` is false because no authoritative copied-sibling `shellNL_results.h5` is committed. +- correction-agent reproduction: the exact focused test alone failed deterministically in 103.84 seconds with the same diagnostic. The original reference input was not passed to FESA. + +### 12.3 Root Cause Summary + +This is not an implementation defect in the observed convergence calculation. The implementation in `src/fesa/analysis/nonlinear_static_procedure.cpp` supplies same-trial free rotational residual, internal moment and external moment to `EvaluateNewtonConvergence`. `src/fesa/analysis/nonlinear_static_control.cpp` then implements the approved `NSNR-069` and formulation Section 14.1 literally: + +\[ +D_M=\max(\|f_{int,f}^{\phi}\|_\infty, + \|f_{ext,f}^{\phi}\|_\infty),\qquad +\eta_M=\frac{\|r_f^{\phi}\|_\infty}{D_M} +\] + +for every nonzero \(D_M\), with the typed absolute `1e-3 force-length` branch available only when \(D_M=0\) exactly. + +The approved `reference/shellNL/shellNL.inp` contains only `Set-1, 3, -100000.` under `*CLOAD`; it applies no rotational moment component. Therefore the free rotational external vector is exactly zero and + +\[ +r_f^{\phi}=f_{int,f}^{\phi}-0=f_{int,f}^{\phi}, +\qquad +D_M=\|f_{int,f}^{\phi}\|_\infty=\|r_f^{\phi}\|_\infty. +\] + +For every nonzero rotational residual, \(\eta_M=1>10^{-2}\). The channel can pass only if floating-point assembly produces the exact zero vector, at which point and only then the exact-zero branch is selected. Thus the current approved denominator structurally prevents practical convergence for a no-applied-moment shell case even when its residual is well below the approved typed absolute threshold. + +The reproduced log contains 100/100 parsed iteration records with exact printed equality between `residual_moment_numerator_norm` and `residual_moment_denominator_scale`; all 100 use `branch=relative` and `pass=0`. Representative values are: + +| iteration | numerator | denominator | branch | pass | +| ---: | ---: | ---: | --- | ---: | +| 1 | `2.363968570753043e-09` | `2.363968570753043e-09` | `relative` | 0 | +| 2 | `1.4372536725204554e-06` | `1.4372536725204554e-06` | `relative` | 0 | +| 3 | `3.138301877925187e-06` | `3.138301877925187e-06` | `relative` | 0 | +| 99 | `3.8876064110127118e-06` | `3.8876064110127118e-06` | `relative` | 0 | +| 100 | `4.6441010823627948e-06` | `4.6441010823627948e-06` | `relative` | 0 | + +Every listed numerator is below `1e-3 force-length`, but the approved exact-zero-denominator predicate forbids use of that absolute branch. Changing the implementation alone would contradict the approved requirement and formulation. + +### 12.4 Correction Scope + +- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md` +- changed production source/header/test/CMake files: none +- preserved dirty Step 11 files: `tests/CMakeLists.txt`, `tests/reference/nonlinear_static_reference_cases_test.cpp`, `tests/reference/nonlinear_static_reference_comparison.cpp`, `tests/reference/nonlinear_static_reference_comparison.h` +- excluded upstream files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md` +- excluded workflow/final reports: phase indexes/status, `implementation-report.md`, `build-test.md`, `reference-comparison.md` +- prohibited actions not performed: production/test/CMake change, threshold or denominator relaxation, Step 11 completion, Step 12 advancement, Abaqus/Nastran/reference solver, reference artifact generation/modification, `danger-full-access`, commit, push + +No RED test was added because no implementation correction is authorized: a test requiring this case to pass would encode a new convergence contract before user/upstream approval. The existing focused reference test already provides the failing integration evidence. + +### 12.5 Verification Evidence + +| purpose | exact command/evidence | result | +| --- | --- | --- | +| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `1`; 0/1 passed; test 288 failed in 103.84 s with 100-iteration `nonlinear-nonconvergence` | +| iteration-log audit | parse latest copied-run `shellNL_log.txt` fields for every iteration | 100 records; numerator equals denominator in 100/100; `relative` in 100/100; `residual_moment_pass=0` in 100/100 | +| implementation trace | `nonlinear_static_procedure.cpp` residual/internal/external channel construction plus `nonlinear_static_control.cpp` denominator evaluation | matches `NSNR-069` and formulation Section 14.1 exactly | +| input trace | `reference/shellNL/shellNL.inp` lines 149-151 | one translational direction-3 force; no applied rotational moment | +| reference preservation | pre/post SHA-256 plus `git diff -- reference` | all eight declared hashes unchanged; reference diff empty | +| full Ninja/MSVC build/CTest | not run | intentionally stopped at decisive `upstream-contract`; no implementation correction exists to verify | +| Stop | not applicable | Correction was not a Harness Step and made no production/test/CMake change | +| Harness Python pytest | not applicable | no Harness/Hook/agent-config behavior changed | + +### 12.6 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-069` | Step 5 `load-boundary-path-and-convergence-gates`; REWORK-007 | `CORR-NSNR-CONTRACT-001` log audit | focused test 288 | report only | no-applied-moment free rotational residual must have a reachable approved convergence decision; not met by current contract | +| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate` | `NSNR-REF-002`, `NSNR-REF-004` via test 288 | focused test 288 | report only | copied shellNL run produces authoritative HDF5 before comparison; blocked by NSNR-069 contract | + +### 12.7 Handoff Recommendation + +- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun yet. +- narrowest contract alternative: when the matching external residual-channel scale is exactly zero, select the existing typed absolute gate (`||r_f^phi||inf <= 1e-3 force-length`) even if the internal residual is nonzero; retain the current relative denominator when matching external scale is nonzero. +- broader contract alternative: make residual convergence pass when either its typed absolute gate or its current relative gate passes. This is simpler and symmetric across force/moment channels but changes acceptance for all load-scale regimes. +- scale-based contract alternative: define an explicit nonzero model force-length reference scale for moment residual normalization, including its deterministic characteristic-length source. This is more general but expands the numerical contract and needs formulation/numerical review. +- non-solution: changing the reference deck to add an applied moment would not correct the same structural failure for supported no-moment load cases and would also violate immutable reference ownership in this correction. + +Any selected alternative requires the owning upstream documents and tests to be revised and approved before production code changes. Correction Agent does not choose among them. + +### 12.8 Stop Condition + +- upstream ambiguity: the exact approved `max(internal, external)` denominator and exact-zero branch are the demonstrated cause. +- implementation stop: any code-only pass would relax/reinterpret `NSNR-069` and formulation Section 14.1. +- reference artifact gap: none; all declared reference artifacts exist and remain unchanged. +- repeated failure: normalized classification attempt `1`; no automatic second implementation correction is safe before an upstream decision. +- final stop: status `needs-upstream-decision`; Step 11 remains blocked and Step 12 remains pending. + +## 13. REWORK-008 Nonlinear Reaction Reference Mismatch Triage + +### 13.1 Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-008-nonlinear-reaction-reference-mismatch` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| status | `needs-upstream-decision` | +| owner_agent | `correction-agent` | +| date | `2026-08-25` | + +`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 immutable `step11-output.json` SHA-256 `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91`, Coordinator dispatch, current implementation/CTest와 read-only result/reference audit를 source evidence로 사용했다. + +### 13.2 Failure Triage + +- initial failure classification: `reference-comparison` +- final classification: `upstream-contract` +- normalized classification: `reference-blocking-model-adequacy-conflict` +- attempt: `1` for `REWORK-008`; 이전 `REWORK-007`은 별도 nonlinear convergence classification이다. +- first failed command in Step 11: + + ```powershell + cmake --build --preset windows-msvc-ninja-debug; ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure + ``` + +- correction-agent reproduction: + + ```powershell + ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure + ``` + +- failed target or test: `NonlinearStaticReference.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory` (fresh CTest test 293) +- evidence tail: exit `8`, 0/1 passed, 16.88 s. Row identity/schema/nonfinite prechecks passed before the common tolerance gate reported exactly three failed blocking families: in-plane RF RMS `0.11437709952897851`, transverse RF RMS `0.048448360241294064`, physical spatial RM RMS `0.02746412616679237`, each above `0.01`. + +### 13.3 Root Cause Summary + +Observed reaction computation/storage/mapping path에는 implementation defect evidence가 없다. + +1. `nonlinear_static_procedure.cpp`는 같은 accepted state에서 `residual = internal.force - external.generalized_external_force`를 만들고 `trial.reaction = trial.residual`로 저장한다. `nonlinear_analysis_state.cpp`는 모든 DOF에서 이 두 identity를 검증한다. +2. `nonlinear_hdf5_results_writer.cpp`는 translation reaction을 그대로 쓰고 rotational reaction만 승인식 `J_l(phi)^(-T)`로 physical spatial moment에 변환한다. 24 constrained nodes에서 `phi=0`이므로 이 변환은 identity다. Full-precision HDF5 audit에서 constrained translation과 generalized residual의 차이, constrained moment 변환 차이, constrained `phi`가 모두 exact `0`이었다. +3. Comparator는 `/model/nodal_constraint_mask`와 `(case, state, instance, node label, component)` exact key를 사용한다. 이번 실행이 schema/missing/extra/duplicate/nonfinite failure가 아니라 family tolerance report까지 도달했으므로 storage와 row mapping precheck도 통과했다. +4. Dominant RF3/RM1/RM2 mismatch는 nonlinear 전용 경로에서 생기지 않는다. FESA nonlinear-linear 최대 차이는 RF3 `2.9441580409184098e-06`, RM1 `1.3046948879491538e-05`, RM2 `1.2039316061418504e-05`이고, Abaqus nonlinear-linear 차이는 각각 `0`, `5.0022208599999994e-12`, `1.1141310098e-11`이다. 그럼에도 FESA linear와 Abaqus linear 사이에는 nonlinear과 동일한 local RF3/RM mismatch가 이미 존재한다. 예를 들어 node 31 RF3는 FESA `1059.5675655371299`, reference `339.61334199999999`; node 22 RM1은 FESA `-1564.1175318019484`, reference `-515.62542699999995`다. +5. 전체 constrained reaction 합은 FESA nonlinear `[7.9591888635377472e-12, 7.2906680692597092e-12, 100000.00000082512]`, Abaqus nonlinear `[4.5008441418303846e-13, -1.7997131562808022e-12, 99999.999592799955]`로 global balance와 sign이 일치한다. Stored `/global/equilibrium`도 `[-5.2007287365540833e-12, 2.1302730413008675e-11, 99999.999999999985, 1.5669833723712425e-11, 6.4043503405991029e-12, -3.0183203934097235e-11]`다. +6. RF1/RF2는 nonlinear에서 새로 생기는 weak geometric membrane reaction이지만 FESA extrema `±1.3774894254907935`와 Abaqus extrema `±1.9166318200000001`의 차이는 storage/mapping 오류가 아니다. Linear Abaqus reaction은 거의 zero이고, independent FESA MITC4와 Abaqus S4가 서로 다른 local nodal support-force redistribution을 만들 수 있다는 approved formulation/model limitation 안에 있다. + +따라서 demonstrated cause는 nonlinear reaction implementation이 아니라 reference blocking quantity의 model-adequacy 전제다. Approved `reference-model.md`는 linear reaction CSV를 review-only로 두면서, 같은 local RF3/RM distribution을 nonlinear에서 blocking으로 승격한다. Project contract는 FESA MITC4의 integration/stabilization/internal behavior가 Abaqus S4와 동등하다고 주장하지 않는다. Global equilibrium은 맞지만 formulation-sensitive local nodal reaction 분포가 1% RMS를 만족해야 한다는 분석적 또는 독립 benchmark 근거는 없다. 이를 code-only로 Abaqus 값에 맞추는 것은 formulation/model adequacy 또는 reference acceptance contract 변경이며 Correction Agent 범위를 벗어난다. + +### 13.4 Correction Scope + +- changed report file in this rework: `docs/nonlinear-static-newton-raphson/corrections.md` +- changed production source/header/test/CMake files in this rework: none +- preserved pre-existing dirty Step 11 files, including selector/control/log tests, comparator/reference tests, plan/phase/coordination and upstream approval edits +- excluded upstream contract files: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `docs/TOLERANCE.md` +- excluded immutable/reference files: `reference/**`, stored Abaqus CSV, HDF5 schema and tolerance policy +- prohibited actions not performed: new RED test without an implementation defect, production/comparator/test/CMake change, tolerance weakening, reference artifact generation/modification, Abaqus/Nastran/reference solver, Harness phase execution, Step 12/Physics/Release advancement, `danger-full-access`, commit, push + +No focused RED test was added because the dataflow audit disproved a bounded nonlinear computation/storage/mapping defect. The existing focused integration test is already RED for an upstream blocking/model-adequacy assumption; encoding a replacement expected result before upstream approval would itself change that contract. + +### 13.5 Verification Evidence + +Visual Studio environment는 `VsDevCmd.bat -arch=x64 -host_arch=x64`로 설정했고, `.harness/config.json`/preset가 요구한 `FESA_GTEST_SOURCE_DIR=C:/git/googletest`, `MKL_DIR=C:/Program Files (x86)/Intel/oneAPI/mkl/2026.1/lib/cmake/mkl`, `TBB_DIR=C:/Program Files (x86)/Intel/oneAPI/tbb/2023.1/lib/cmake/tbb`, `HDF5_DIR=C:/Program Files/HDF_Group/HDF5/2.1.1/cmake`를 사용했다. + +| purpose | exact command/evidence | exit/result | +| --- | --- | --- | +| focused reproduction | `ctest --preset windows-msvc-ninja-debug -R '^NonlinearStaticReference\.CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory$' --output-on-failure` | exit `8`; 0/1 passed; only three reaction-family RMS gates failed | +| reaction dataflow audit | `nonlinear_static_procedure.cpp` residual/reaction assignment, `nonlinear_analysis_state.cpp` identities, `nonlinear_hdf5_results_writer.cpp` physical-moment projection and comparator exact-key prechecks; build-local datasets dumped with `$hdf5Bin='C:\Program Files\HDF_Group\HDF5\2.1.1\bin'; $env:PATH="$hdf5Bin;$env:PATH"; & "$hdf5Bin\h5dump.exe" -m %.17g -d ` | exit `0`; constrained pipeline differences and constrained rotation were exact zero | +| nonlinear/linear audit | join build-local FESA HDF5 and immutable CSV rows by exact `(instance, node label, component)` in read-only PowerShell | exit `0`; dominant mismatch is already present in both solvers' linear results and survives nonlinear unchanged | +| targeted nonlinear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441332835013800-0/shellNL_results.h5` | SHA-256 `A82349F1AABDC2B042A7DBF643D0D917B04245B64E5D73F9507B83A2D67FDE91` | +| targeted linear output | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-441349319977100-1/shell_results.h5` | SHA-256 `167248AB523484FB6F515AE6A309C7380B4A1226B74BE03B207F4532C3064B66` | +| configure | `cmake --preset windows-msvc-ninja-debug` | exit `0`; 0.342 s; configure/generate complete | +| build | `cmake --build --preset windows-msvc-ninja-debug` | exit `0`; 0.116 s; `ninja: no work to do.` | +| CTest discovery | `ctest --preset windows-msvc-ninja-debug --show-only=json-v1` | exit `0`; 294 tests discovered | +| full MSVC CTest | `ctest --preset windows-msvc-ninja-debug --output-on-failure` | exit `8`; 293/294 passed; only test 293 failed with the same three RMS values; test 294 comparator invalid-HDF5/warning checks passed | +| source failure hash | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256` | exit `0`; `0F3B876AF84398EB1D2C90335998115797054B012899DE27E4070A6F533EEF91` | +| reference preservation | `git diff -- reference` | exit `0`; empty diff | +| repository identity | `git rev-parse HEAD` | exit `0`; `65b56b1755e4537b48b44476375b6235da732648` | +| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 production/test/CMake를 변경하지 않았다. Full preset build/CTest를 직접 실행했다. | +| Harness Python pytest | not applicable | Harness Python, Hook, agent config behavior를 변경하지 않았다. | + +### 13.6 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-019` | Step 10 reaction/HDF5 path; REWORK-008 | `CORR-NSNR-REACTION-PIPELINE-001` read-only audit | focused test 293 | report only | accepted full residual, constrained reaction and HDF5 physical moment mapping are identical at constrained zero-rotation DOFs; met | +| `FESA-REQ-NSNR-034` | Step 11 `reference-comparison-gate`; REWORK-008 | `NSNR-REF-015`, `NSNR-REF-017` via test 293 | focused test 293 and full CTest | report only | exact keys/prechecks pass, but three local reaction families exceed blocking RMS `0.01`; not met because approved reference quantity assumes unsupported local S4/MITC4 distribution agreement | +| `FESA-REQ-NSNR-034` | Step 11 model-adequacy audit | `CORR-NSNR-LINEAR-CROSSCHECK-001` | read-only HDF5/CSV audit | report only | distinguish nonlinear reaction implementation error from pre-existing formulation-sensitive local redistribution; implementation-error hypothesis rejected | + +### 13.7 Handoff Recommendation + +- recommendation: return `upstream-contract` / `needs-user-decision` to Coordinator Agent. Do not request an Implementation Agent rerun and do not advance Step 12 until an upstream alternative is explicitly selected and approved. +- recommended narrow alternative: align nonlinear local nodal RF/RM disposition with the approved linear reference contract—keep local rows as read-only model-adequacy/physics-review evidence, while blocking reaction evidence is global force/moment equilibrium plus free-residual checks. Blocking displacement comparison remains unchanged. +- local-to-global alternative: retain reaction as a blocking external quantity only after projecting it to formulation-independent global resultant force/moment families; keep exact local nodal rows as warning/characterization evidence. +- local-blocking alternative: if exact local RF/RM rows must remain blocking, Numerical Review/Reference Model owners must supply an analytical or independent formulation-appropriate benchmark, or explicitly approve Abaqus S4 local nodal reaction distribution as an FESA MITC4 model-adequacy target after a mesh/formulation study. Implementation must not calibrate reactions to Abaqus without that decision. +- excluded alternative: tolerance relaxation, row averaging/collapse, comparator weakening or reference artifact rewriting is not acceptable. + +Each viable alternative changes blocking quantity/model-adequacy ownership in `requirements.md`, `numerical-review.md`, `reference-model.md`, `io.md` and the implementation/reference plan. Correction Agent does not select or edit those contracts. + +### 13.8 Stop Condition + +- upstream ambiguity: current contracts simultaneously disclaim Abaqus S4 internal equivalence, make linear local reaction review-only, and require the same formulation-sensitive local distribution as nonlinear blocking evidence. +- implementation stop: no nonlinear reaction computation, storage or exact-key mapping defect was reproduced; a code-only pass would alter formulation/reference meaning. +- reference artifact gap: none; required artifacts exist, remained read-only and have empty reference diff. +- environment blocker: none; configure/build/discovery completed and full CTest reproduced only the intended reference failure. +- repeated failure: `REWORK-008` classification attempt `1`; no automatic implementation correction is safe before the upstream decision. +- final stop: status `needs-upstream-decision`; Step 11 remains blocked, Step 12 remains pending, and Physics/Release remain ineligible. + +## 14. REWORK-009 User-local WindowsApps PowerShell Launch Correction + +### 14.1 Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source failure report | `phases/nonlinear-static-newton-raphson/step11-output.json`; `docs/nonlinear-static-newton-raphson/coordination.md` dispatch `REWORK-009-user-windowsapps-pwsh-launch-filter-root-dispatch-required` | +| source implementation plan | `docs/nonlinear-static-newton-raphson/implementation-plan.md`; `phases/nonlinear-static-newton-raphson/step11.md` | +| status | `corrected-for-implementation-rerun` | +| owner_agent | `correction-agent` | +| date | `2026-08-28` | + +`implementation-report.md`, `build-test.md`, `reference-comparison.md`는 아직 존재하지 않는다. 따라서 current `step11-output.json` SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`, Coordinator dispatch, preserved attempt-1 TDD evidence와 attempt-2 Stop evidence를 source evidence로 사용했다. + +### 14.2 Failure Triage + +- classification: `harness` +- normalized classification: `harness-launch-path-filter-missed-user-windowsapps-pwsh-access-denied` +- attempt: `2` under `STEP11-EXECUTION-003`; attempt 1은 1,800초 timeout이고 attempt 2는 아래 shell launch failure다. +- first failed command boundary: + + ```powershell + codex exec --json --model gpt-5.6-terra --config 'model_reasoning_effort="xhigh"' --sandbox workspace-write --dangerously-bypass-hook-trust --cd C:\git\FESADev\.worktrees\nonlinear-static-newton-raphson --disable unified_exec - + ``` + +- failed target: attempt-2 nested Codex의 첫 PowerShell tool launch. +- evidence tail: nested Codex `0.150.1`이 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps\pwsh.exe`를 선택했다. `workspace-write` runner가 `CreateProcessAsUserW failed: 5 (Access denied)`로 이를 거부해 소스 확인, RED/VERIFY 명령과 Step status update가 실행되지 않았다. Codex process 자체는 `exitCode=0`이지만 blocker agent message만 반환했으므로 Step 성공 evidence가 아니다. +- state evidence: `HEAD=65b56b1755e4537b48b44476375b6235da732648`; Step 11 `pending`; Step 12 `pending`. + +### 14.3 Root Cause Summary + +이번 실패는 solver, comparator 또는 `1e-8` gate defect가 아니라 Harness child launch environment defect다. + +1. 이전 launcher filter는 `C:\Program Files\WindowsApps\Microsoft.PowerShell_*` entry만 제거했다. +2. 따라서 `C:\Users\baram\AppData\Local\Microsoft\WindowsApps` entry와 그 아래 `pwsh.exe` execution alias가 PATH에 남았다. +3. Nested Codex shell resolver는 남은 user-local alias를 선택했고, Windows native `workspace-write` sandbox는 그 alias의 child process 생성을 Windows error 5로 거부했다. +4. PATH에서 `\\WindowsApps(?:\\|$)`에 일치하는 모든 entry를 제거하면 현재 환경의 Program Files entry 세 개와 user-local entry 한 개가 함께 제거된다. 이때 `pwsh`는 resolve되지 않고 `powershell`은 `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`로 resolve된다. +5. Root가 같은 Codex CLI `0.150.1`, `gpt-5.6-terra`, `xhigh`, `--disable unified_exec`, `workspace-write`, `CODEX_HOME=C:\Users\baram\.codex` envelope에서 이 filter를 적용한 nested smoke는 위 Windows PowerShell을 선택해 exact `FESA_CODEX_SHELL_SMOKE_OK`를 출력하고 exit `0`으로 끝났다. Correction audit의 독립 direct smoke도 같은 executable, exact output과 exit `0`을 확인했다. + +따라서 repository runner나 Step 11 implementation을 고칠 필요가 없다. Rerun launch에서 PATH predicate만 전체 WindowsApps entry를 제거하도록 바로잡으면 된다. + +### 14.4 Correction Scope + +- changed report file: `docs/nonlinear-static-newton-raphson/corrections.md` +- changed source/header/test/CMake/runner/phase files: none +- excluded upstream contracts: `requirements.md`, `formulation.md`, `numerical-review.md`, `reference-model.md`, `io.md`, `implementation-plan.md`, `docs/TOLERANCE.md` +- excluded immutable evidence: `reference/**`, stored CSVs and reference inputs +- preserved dirty implementation: all existing Step 11 source, test, comparator, CMake and phase changes +- prohibited actions not performed: Harness phase execution, Step 11 implementation, Step 12, full build/CTest rerun, manual Hook execution, commit, push, `danger-full-access`, reference solver or artifact mutation + +Correction은 repository code 변경이 아니라 corrected child-launch envelope와 재실행 경계를 확정한다. Production C++ 변경이 없으므로 새 RED test는 필요하지 않다. + +### 14.5 Verification Evidence + +| purpose | exact command/evidence | exit/result | +| --- | --- | --- | +| failure artifact audit | `Get-FileHash phases/nonlinear-static-newton-raphson/step11-output.json -Algorithm SHA256`; JSON `exitCode`, `stderr`, blocker message 검사 | exit `0`; SHA-256 `BF3A1CA6DD35EA8414710018D7F1644A1D2C6C2BCF87C11F74DA2A01BBEAB3AD`; nested process path와 `CreateProcessAsUserW failed: 5` 확인 | +| filter audit | `($env:PATH -split ';') \| Where-Object { $_ -notmatch '\\WindowsApps(?:\\|$)' }`를 child-only PATH로 적용한 뒤 `Get-Command codex,pwsh,powershell` 확인 | four WindowsApps entries removed; Codex `codex-cli 0.150.1`; `pwsh=`; `powershell=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe` | +| independent direct smoke | filtered PATH에서 `powershell.exe -NoProfile -Command '[Console]::WriteLine($PSHOME); [Console]::WriteLine("FESA_CODEX_SHELL_SMOKE_OK")'` | exit `0`; `$PSHOME=C:\Windows\System32\WindowsPowerShell\v1.0`; exact `FESA_CODEX_SHELL_SMOKE_OK` | +| same-envelope nested Codex smoke | Coordinator/root evidence: Codex `0.150.1`, Terra/xhigh, `--disable unified_exec`, `workspace-write`, aligned `CODEX_HOME`, all-WindowsApps filter | exit `0`; selected system Windows PowerShell and printed exact `FESA_CODEX_SHELL_SMOKE_OK` | +| recovered attempt-1 RED | `ctest --preset windows-msvc-ninja-debug -R 'GlobalForceAndMoment' --output-on-failure` before comparator GREEN | exit `8`; preserved old `<=1e-10` rejected both `5e-9` and exact `1e-8` in `NSNR-REF-024` | +| recovered attempt-1 GREEN | same focused GlobalForceAndMoment CTest after comparator-only shared gate became `1e-8` | exit `0`; 2/2 passed, including inclusive boundary and exact-zero-scale tests | +| focused implementation evidence | attempt-1 focused procedure, HDF5 and global-balance runs; attempt-2 `LastTest.log` named-test audit | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024`, `NSNR-REF-025` all present as passed | +| attempt-2 Stop full CTest | `.harness/build-ninja-msvc-debug/Testing/Temporary/LastTest.log`, SHA-256 `41CA3D4E410F7BFD55E50FC7D40A79D00D26116945C468E74F0E38720E676447` | 302 `Testing` rows, 0 failure markers, final `302/302`; root/Coordinator records full `302/302` pass | +| new full build/CTest | not run | existing evidence was sufficient and dispatch prohibited unnecessary Harness/build/CTest rerun | +| Stop | not applicable | Correction Agent session은 Harness Step이 아니며 code/test/CMake를 변경하지 않았다. | +| Harness Python pytest | not applicable | runner, Hook 또는 agent config를 변경하지 않았다. | + +Attempt-1 RED/GREEN은 recovered immutable execution evidence이며 이 correction에서 재현하거나 새로 주장한 RED가 아니다. Current code를 old threshold로 되돌리지 않았고 reference artifact도 실행·수정하지 않았다. + +### 14.6 Traceability + +| requirement id | task id | test id | failing command | corrected file | acceptance criterion | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-019` | Step 11 `equilibrium-projection-and-reference-gate`; REWORK-009 | `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | Step 11 agent can read/run the preserved current-arm, spatial-moment and distinct global force/moment evidence under `workspace-write` | +| `FESA-REQ-NSNR-034` | Step 11 reference gate; REWORK-009 | `NSNR-REF-020..025` | nested `codex exec` first shell launch | `corrections.md` report-only launch correction | implementation-owned reference checks can complete without changing disposition, reference artifacts or tolerance | +| Harness Step execution contract | `STEP11-EXECUTION-003`; `REWORK-009` | `CORR-HARNESS-SHELL-002` | user-local WindowsApps `pwsh.exe` launch | `corrections.md` | all PATH entries matching `\\WindowsApps(?:\\|$)` are absent; system Windows PowerShell launches and exact smoke exits `0` | + +### 14.7 Handoff Recommendation + +- recommendation: return `corrected-for-implementation-rerun` to Coordinator Agent and request one bounded Implementation Agent rerun of Step 11 only. +- exact launch correction: reuse the approved `STEP11-EXECUTION-003` Step11-only wrapper and change only the launch PATH filter to the following predicate after VsDevCmd x64/dependency environment setup and before `codex exec`: + + ```powershell + $step11PathEntries = $env:PATH -split ';' | Where-Object { + $_ -and $_ -notmatch '\\WindowsApps(?:\\|$)' + } + $env:PATH = $step11PathEntries -join ';' + $env:CODEX_HOME = 'C:\Users\baram\.codex' + $env:FESA_HARNESS_CODEX_SANDBOX = 'workspace-write' + ``` + +- preserve exact runtime: Codex CLI `0.150.1`; implementation-agent `gpt-5.6-terra`/`xhigh`; `--disable unified_exec`; project PreToolUse/Stop hooks; VsDevCmd x64; approved `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, `HDF5_DIR`. +- preflight must resolve `powershell` to `C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`, leave `pwsh` unresolved, and print exact `FESA_CODEX_SHELL_SMOKE_OK` with exit `0`. +- run only Executor-selected Step 11, no `--push`; hard-stop before Step 12. Do not use `danger-full-access`, run a reference solver, mutate reference artifacts or alter runner/source/test/CMake/phase/upstream/tolerance files as part of this launch correction. + +### 14.8 Stop Condition + +- repeated failure: normalized classification count is already `2`; if the corrected all-WindowsApps filter still produces the same `CreateProcessAsUserW` failure, do not start another automatic retry. Return `needs-environment-fix` to Coordinator with the new output artifact. +- environment blocker: cleared for one bounded Step 11 rerun by the same-envelope smoke; no repository-local code fix is required. +- upstream ambiguity: none introduced by this correction; fixed `1e-8` force/moment gate and all approved contracts remain unchanged. +- reference artifact gap: none examined or changed in this correction. +- final stop: status `corrected-for-implementation-rerun`; Step 11 and Step 12 remain `pending` until Executor/Implementation owner action. diff --git a/docs/nonlinear-static-newton-raphson/formulation.md b/docs/nonlinear-static-newton-raphson/formulation.md index 93be89a..16f9d5c 100644 --- a/docs/nonlinear-static-newton-raphson/formulation.md +++ b/docs/nonlinear-static-newton-raphson/formulation.md @@ -1599,7 +1599,15 @@ on any increment/recovery/output failure: ### 14.1 Four convergence channels Let free translation and rotation-coordinate subvectors carry superscripts \(u\) -and \(\phi\). Residual channels use +and \(\phi\). Define the matching external residual-channel scales + +\[ +S_{ext}^u=\|\mathbf f_{ext,f}^u\|_\infty, +\qquad +S_{ext}^\phi=\|\mathbf f_{ext,f}^\phi\|_\infty. +\] + +When the matching external scale is nonzero, residual channels retain \[ \eta_R^u= @@ -1615,10 +1623,31 @@ and \(\phi\). Residual channels use \|\mathbf f_{ext,f}^\phi\|_\infty)} \] -when the matching denominator is nonzero. They pass iff -\(\eta_R^u\le10^{-2}\) and \(\eta_R^\phi\le10^{-2}\). -An exact-zero denominator instead passes iff the numerator is at most -\(10^{-3}\) model-consistent force or \(10^{-3}\) model-consistent force-length. +for \(S_{ext}^u>0\) and for \(S_{ext}^\phi>0\), respectively. Each nonzero-external-scale +channel passes iff its ratio is \(\le10^{-2}\). An exact-zero matching external +scale instead selects the existing typed absolute residual gate: + +\[ +\boxed{ +S_{ext}^u=0 +\ \Longrightarrow +\|\mathbf r_f^u\|_\infty\le10^{-3} +\quad\text{model-consistent force},} +\] + +\[ +\boxed{ +S_{ext}^\phi=0 +\ \Longrightarrow +\|\mathbf r_f^\phi\|_\infty\le10^{-3} +\quad\text{model-consistent force-length}.} +\] + +The exact-zero branch selector is the matching external scale itself, not +\(\max(\|\mathbf f_{int,f}\|_\infty, +\|\mathbf f_{ext,f}\|_\infty)\). Therefore a nonzero internal residual does not +select the relative branch when its matching external scale is exactly zero. When +the external scale is nonzero, only the retained relative gate applies. Let diff --git a/docs/nonlinear-static-newton-raphson/implementation-plan.md b/docs/nonlinear-static-newton-raphson/implementation-plan.md index fa1c14b..4847fd3 100644 --- a/docs/nonlinear-static-newton-raphson/implementation-plan.md +++ b/docs/nonlinear-static-newton-raphson/implementation-plan.md @@ -2,9 +2,9 @@ > For Harness workers: this plan is an approved Stage 6 planning artifact. It authorizes planning files only. It does not authorize `scripts/execute.py`, C++ implementation, build, CTest, reference solver execution, or evidence-document creation. -**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 구현하고, 승인된 nonlinear MITC4 Newton-Raphson 절차, HDF5 schema v1, log lifecycle, shellNL/shell reference comparison을 검증한다. +**Goal:** `nonlinear-static-newton-raphson` 기능을 C++17/MSVC/CMake/CTest TDD 순서로 완결하고, current-position/spatial-moment global equilibrium, accepted free residual, fine-primary/coarse-companion reference gate와 HDF5 schema v1을 검증한다. -**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않고, 기존 linear numerical/HDF5 의미는 repository-wide output name/log lifecycle 변경만 제외하고 보존한다. +**Architecture:** App layer가 argv 검증, lexical output path derivation, move-only `OutputWriteLease`, log open/close와 final HDF5 writer 호출 순서를 소유한다. 입력 parse/map은 정확히 한 번 수행하고, `StepDefinition::ProcedureKind()`로 linear와 nonlinear procedure executor를 분리한다. Nonlinear accepted state는 current arm과 spatial physical moment로 applied-plus-reaction balance error를 만들고 기존 `/global/equilibrium`에 저장하며, comparator는 existing schema-v1 nodal datasets에서 constrained reaction resultant와 accepted free residual을 별도로 재구성한다. `LinearStaticAnalysis`의 기존 private lifecycle에는 nonlinear 조건문을 넣지 않는다. **Tech Stack:** C++17, MSVC on Windows, CMake, CTest, GoogleTest, Intel oneAPI MKL/TBB, HDF5, Abaqus `.inp` approved subset, Python 3 Harness scripts. @@ -15,10 +15,10 @@ | key | value | | --- | --- | | feature_id | `nonlinear-static-newton-raphson` | -| status | `approved-planning-files-materialized` | +| status | `ready-for-implementation` | | owner_agent | `implementation-planning-agent` | -| date | `2026-08-24` | -| approval | User approved the final 13-Step draft on `2026-08-24`; Coordinator recorded `DECISION-036`. | +| date | `2026-08-28` | +| approval | User approved the original 13-Step draft on `2026-08-24`, USER-DECISION-003 revision, and delegated the Coordinator-audited REAPPROVAL-012 Stage 6 reapproval/materialization with both normalized factor-one global force and moment balance gates fixed at `<=1e-8` on `2026-08-28`. | | source_requirement | `docs/nonlinear-static-newton-raphson/requirements.md` | | source_research | `docs/nonlinear-static-newton-raphson/research.md` | | source_formulation | `docs/nonlinear-static-newton-raphson/formulation.md` | @@ -30,20 +30,51 @@ | document | SHA-256 | | --- | --- | -| `requirements.md` | `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2` | -| `research.md` | `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` | -| `formulation.md` | `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` | -| `numerical-review.md` | `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01` | -| `reference-model.md` | `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3` | -| `io.md` | `DBB959A68F17D67CA2B42569610B9C1B595A8BFB5502BC194B7E62B656031B28` | +| `requirements.md` | `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` | +| `research.md` raw | `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` | +| `formulation.md` | `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` | +| `numerical-review.md` | `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` | +| `reference-model.md` | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | +| `io.md` raw | `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9` | +| `io.md` LF-normalized | `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB` | ## Readiness Check -- Upstream document status: Stage 1 requirements approved, Stage 2 research passed, Stage 3 formulation ready for numerical review and approved downstream, Stage 4 numerical/reference review passed for I/O definition, Stage 5 I/O definition approved. +- Upstream document status: Stage 1 requirements, Stage 4 numerical/reference review and Stage 5 I/O definition are complete; REAPPROVAL-012 fixes both factor-one normalized global force and moment balance gates at `<=1e-8`. Stage 3 formulation §§11.4/13.4 already supplies the accepted residual/reaction/global-resultant meaning. - Missing decisions: none. -- Missing required comparison files: none for declared blocking/reference families. +- Missing required comparison files: none. Fine primary, coarse companion and linear-control exact inputs/CSVs are present; stress files are optional inventory only. - Planning can proceed: yes. -- `.harness/config.json`: absent during planning inspection. Each Step must recheck at execution time and use it first if it appears. +- REWORK-008의 local reaction blocking conflict는 USER-DECISION-004 option 1로 해소되었다. Local nodal RF/RM은 review-only이고 factor-one global force/moment balance와 accepted free residual이 blocking이다. `AUDIT-001` current-arm/spatial-moment implementation seam은 Step 11에서 RED-first로 닫는다. +- Step 11에는 보존해야 할 uncommitted `NSNR-CTRL-018..021`, `NSNR-LOG-012`, `NSNR-PROC-019`, + `NSNR-HDF5-014`, `NSNR-REF-001..023`, residual-selector GREEN과 comparator/CMake 작업이 있다. + 새 계획은 이를 reset/replay하지 않는다. +- `implementation-report.md`, `build-test.md`, canonical `reference-comparison.md`는 아직 없고 Step 12가 actual evidence에서만 생성한다. +- `CMakePresets.json` tracks the approved `windows-msvc-ninja-debug` contract. The ignored `.harness/config.json` selects the matching configure/build/test presets and `.harness/build-ninja-msvc-debug` binary directory. + +## Implementation Scope + +Included behavior: + +- Existing schema-v1 `/global/equilibrium [6]`에 global origin `[0,0,0]`, accepted current + position `X+u`, independently spatial-converted applied/reaction moments를 사용하는 + applied-plus-reaction balance error를 기록한다. +- Existing schema-v1 nodal datasets와 exact constraint mask에서 accepted free residual, + constrained reaction resultant와 global balance error를 서로 다른 evidence로 재구성한다. +- Fine nonlinear primary, coarse nonlinear companion와 linear control을 exact read-only artifact로 + 비교한다. U는 blocking, UR은 warning-only, local RF/RM은 review-only, RM3/stress는 excluded다. +- Internal global force/moment는 dimension-separated normalized `1e-8`, accepted free residual은 + NSNR-069으로 blocking 검증하고 external families만 `docs/TOLERANCE.md`를 사용한다. + +Excluded behavior and non-goals: + +- New HDF5 dataset/schema version, public header/API, tolerance, reference artifact 또는 solver scope + 추가가 아니다. +- `fesa.env`, runtime configuration, CLI option 또는 product solver acceptance behavior를 추가하지 + 않는다. `1e-8`은 comparator-owned internal verification gate의 fixed value다. +- Local nodal reaction을 global sum으로 대체하거나 Abaqus S4와 FESA MITC4 내부 정식화 + 동등성을 주장하지 않는다. +- Steps 0–10 구현/history replay, selector RED 재현, Abaqus/reference solver 실행, Physics/Release + 판정은 포함하지 않는다. ## Global Constraints @@ -54,8 +85,13 @@ - Do not create `implementation-report.md`, `build-test.md`, or `reference-comparison.md` before Step 12 produces actual command evidence. - Do not run Harness from this planning approval. `scripts/execute.py` requires a separate explicit request. - Implementation and Harness execution remain unauthorized by this materialized plan until the user separately requests Executor execution. -- Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and docs/TOLERANCE.md exactly. -- Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For shellNL, preserve constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` blocking, and exclude `RM3` plus stress from numeric comparison. +- Preserve source label/instance identity, deterministic row order, deterministic diagnostics, finite checks, and `docs/TOLERANCE.md` exactly. +- Residual force/moment channel은 finite-first 검사 뒤 matching external scale 자체로 분기한다. Exact zero이면 denominator output exact `0`과 typed absolute `1.0e-3`; nonzero이면 retained `max(internal,external)` denominator와 dimensionless relative `1.0e-2`만 사용한다. Tolerance band, zero clamp, `max(1,...)`, absolute/relative OR는 금지한다. +- Correction gates, four-channel logical AND, Full Newton, fixed load-factor stepping, maximum 100 iterations와 `nsnr-log-v1` 39-field label/order/TAB schema는 변경하지 않는다. +- Preserve `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. Fine/coarse constrained `RF1/RF2`, `RF3`, physical spatial `RM1/RM2` remain review-only with complete deterministic precheck/error reporting; exclude `RM3` and stress from numeric comparison. +- Preserve schema version 1 and all existing HDF5 paths/shapes/components. Do not add a summary dataset or public header. +- Keep internal global balance/free-residual gates separate from external `docs/TOLERANCE.md`; do not add a floor, `max(1,S)`, zero clamp, averaging or collapse. +- Launch every Harness process from VsDevCmd with `-arch=x64 -host_arch=x64` and inherit `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. The tracked preset selects Ninja and MSVC Debug without hard-coding machine-local dependency paths. ## Repository Seam Map @@ -67,11 +103,12 @@ | Domain | `StaticStepDefinition` in `include/fesa/model/model_types.h`; `StepDefinition` in `include/fesa/model/domain.h`. | Store procedure identity, `NLGEOM`, raw four `*STATIC` values and provenance. Do not store derived factor sequence or PRESELECT state. | | Parser mapping | `src/fesa/io/abaqus/domain_mapping_context.cpp`, `step_definition_mapper.cpp`. | Accept nonlinear static subset, warning no-op PRESELECT, reject unsupported procedure fail-closed. | | MITC4 | `include/fesa/elements/mitc4_shell.h`, `src/fesa/elements/mitc4_shell.cpp` are linear small-rotation. | Add separate nonlinear MITC4 files with `Create(...)` from four nodes, four initial frames, `ShellSection`, and `LinearElasticMaterial`; element kernels compute internal residual/tangent/recovery only. | -| Loads/control | Current loads are assembled for linear static RHS. | Step 5 owns global-once fixed CLOAD external vector `f_ext` and exact external load tangent `K_ext`, including projected moment `J_l`/map-Hessian terms, with no incident-element multiplication. Step 5 also owns exact convergence constants: relative `1.0e-2`, zero-scale `1.0e-3` with channel-specific units. Step 10 forms `r = f_int - f_ext` and `K_T = K_int - K_ext`. | +| Loads/control | Preserved partial Step 11 work already changes residual selection to matching external scale exact-zero/nonzero and adds `NSNR-CTRL-018..021`/`NSNR-LOG-012`. | Preserve without replay/redesign; run focused regression before the new equilibrium/reference gate. | +| Equilibrium projection | `src/fesa/analysis/nonlinear_static_procedure.cpp` currently sums raw full residual with initial Domain coordinates and raw rotational covectors. | Apply the constraint mask before rotational conversion; use accepted `X+u`; convert applied and constrained-reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`; store applied-plus-reaction balance only. | | Source identity | `SourceEntityId { instance_name, source_label, source_label_text }` and `EntityIndex` exist in `include/fesa/core/source_identity.h`; nodes are stored in stable Domain order. | Step 8 baseline uses both `EntityIndex` and full `SourceEntityId`, requires one node baseline per Domain node in stable internal order, rejects label-only or mismatched identities, and preserves identity into HDF5/reference mapping. | | Solver | `MklPardisoSolver` uses SPD `mtype=2` and upper-triangle copy. | Preserve unchanged; add `TangentSolver` and MKL unsymmetric full CSR `mtype=11`. | -| Results writer | `ResultsWriter` is the backend-neutral linear writer; `Hdf5ResultsWriter` writes schema-v0 single-frame linear output. | Add `NonlinearResultsWriter` backend-neutral boundary and `NonlinearHdf5ResultsWriter` schema-v1 implementation with delayed finalization after log close. | -| Tests | `fesa_unit_tests`, `fesa_integration_tests`, `fesa_reference_tests` use executable-wide labels. | Add focused test sources and use `ctest -R` regex; do not globally relabel existing tests as nonlinear. | +| Results writer | `NonlinearHdf5ResultsWriter` already writes schema-v1 `/global/equilibrium`, but its location attribute is `global-origin`. | Preserve dataset path/shape/components and change exact location identity to `global-balance-error`; no new dataset or public writer boundary. | +| Tests | Existing integration/HDF5 tests and partial nonlinear comparator are registered in existing executables. | Add RED to existing sources; preserve the current CMake registration and use focused `ctest -R` regex without a new target or global relabel. | ## Work Breakdown @@ -88,7 +125,7 @@ | 8 | `nonlinear-state-commit-rollback` | 3-7 | Factor-zero baseline construction with `EntityIndex` plus `SourceEntityId`, trial/committed nonlinear state, accepted frames, rollback/preservation. | | 9 | `nonlinear-hdf5-schema-v1-writer` | 8 | Nonlinear HDF5 schema v1 writer using `std::vector`. | | 10 | `prepared-analysis-flow-and-full-procedure` | 0-9 | Single parse/map prepared analysis flow, separate linear/nonlinear executors, delayed writer finalization. | -| 11 | `reference-comparison-gate` | 0-10 | shellNL nonlinear and shell linear real-input reference comparison. | +| 11 | `equilibrium-projection-and-reference-gate` | 0-10 | Preserve partial selector/comparator work; add new current-arm/spatial-moment, HDF5 location, fine/coarse disposition/internal-gate RED tests; make minimal procedure/writer/comparator GREEN; run focused/full verification. | | 12 | `execution-closure-and-evidence-docs` | 0-11 | Fresh MSVC evidence, deterministic repeat/reference audit, actual-output evidence docs. | ## TDD Test Plan @@ -100,34 +137,42 @@ | `NSNR-ROT-*` | finite rotation invariants, `J_l`, branch margin, director update. | 2 | | `NSNR-ELEM-KIN-*` | nonlinear MITC4 creation inputs, TL shell kinematics, fixed-size four-GP recovery rows, degeneracy fail-closed, linear limit. | 3 | | `NSNR-ELEM-TAN-*` | same-trial internal residual/tangent, directional derivative, objectivity, symmetry only for internal/no-external cases. | 4 | -| `NSNR-CTRL-*` | load factor path, absolute boundary path, global-once fixed loads and load tangent, moment admissibility, typed four convergence gates with `relative`/`zero-scale` branches and non-injectable exact thresholds/units. | 5 | +| `NSNR-CTRL-*` | Existing coverage plus preserved partial `NSNR-CTRL-018..021`: matching-external exact-zero absolute boundaries, retained nonzero relative boundaries, nonfinite-first/no-clamp selection, unchanged correction gates/four-channel AND. Do not replay/fabricate selector RED. | 5,11 | | `NSNR-SOLVER-*` | nonsymmetric tangent solve, 0x0, nonfinite/failure translation, SPD solver unchanged. | 6 | -| `NSNR-LOG-*` | serializer-owned 39-field UTF-8/LF/TAB Newton log from explicit stage/failure/channel records and fail-closed write/flush/close. | 7 | +| `NSNR-LOG-*` | Existing serializer coverage plus preserved partial `NSNR-LOG-012`: evaluator-produced zero/nonzero-external decisions retain exact denominator, branch, threshold, unit and 39 fields. | 7,11 | | `NSNR-STATE-*` | factor-zero baseline creation with stable node order and full source identity, trial/committed separation, accepted frame order, full schema-v1 state inventory, finite atomic commit, rollback. | 8 | -| `NSNR-HDF5-*` | `NonlinearResultsWriter` boundary, schema v1 metadata/model/frame datasets, factor-zero metadata, atomic finalization. | 9 | -| `NSNR-PROC-*` | full procedure orchestration, single parse/map, log close before HDF5, deterministic repeat. | 10 | -| `NSNR-REF-*` | original artifact snapshot, temp input copy run, HDF5-to-original-CSV identity mapping, tolerance, classification, report data. | 11 | -| `NSNR-EVID-*` | fresh evidence docs and diff/hash/warning audits from actual command outputs. | 12 | +| `NSNR-HDF5-*` | Existing schema-v1 coverage plus `NSNR-HDF5-014` exact `/global/equilibrium` `location=global-balance-error`; path/shape/components/version unchanged. | 9,11 | +| `NSNR-PROC-*` | Existing procedure coverage plus collision-resolved `NSNR-PROC-019` exact test `NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance`. Approved draft label `NSNR-PROC-011` is not reused because completed Step 10 already owns it. | 10,11 | +| `NSNR-REF-*` | Preserve `NSNR-REF-001..023`, including the current-case old-gate RED in `022`; add `024` inclusive `1e-8` force/moment boundary plus approved between-threshold regression and `025` exact-zero-scale force/moment regression before changing the comparator gate. | 11 | +| `NSNR-EVID-*` | `001..007` freshness, disposition, fine/internal inventory, AUDIT-001, command/provenance and actual-output report checks. | 12 | ## CMake And CTest Plan - Add C++ sources to `src/fesa/CMakeLists.txt` under existing `fesa_solver`. - Add unit tests to `fesa_unit_tests`, integration tests to `fesa_integration_tests`, reference tests to `fesa_reference_tests`. -- Preserve current executable-wide labels. Use focused regex such as `ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`. +- Preserve current executable-wide labels. Use focused regex such as `ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure`. +- Step 11 adds no target or `add_test`: procedure/HDF5 tests use existing executables and current partial `tests/CMakeLists.txt` comparator registration is preserved without unrelated edits. - If scoped per-test labels are introduced, the Step that introduces the mechanism must test it and avoid changing labels for unrelated discovered tests. - Configure/build/test commands: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` +## Candidate Files and Ownership + +Candidate paths guide the Implementation Agent and do not finalize a new public API. + +| Step | candidate files | responsibility boundary | +| --- | --- | --- | +| 11 RED | `tests/integration/analysis/nonlinear_static_procedure_test.cpp`; `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp`; existing partial `tests/reference/nonlinear_static_reference_{comparison.h,comparison.cpp,cases_test.cpp}` | New behavior must fail before production edits; comparator extensions remain test-private. | +| 11 GREEN | `src/fesa/analysis/nonlinear_static_procedure.cpp`; `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` | Current-arm/spatial-moment balance and exact dataset location only; no public header/state/schema expansion. | +| 11 preserve | `src/fesa/analysis/nonlinear_static_control.cpp`; `tests/unit/analysis/nonlinear_static_control_test.cpp`; `tests/unit/analysis/newton_iteration_log_test.cpp`; `tests/CMakeLists.txt` | Preserve uncommitted selector/tests/registration and verify them; do not reset, recreate or redesign. | +| 12 evidence | `docs/PRD.md`; `docs/ARCHITECTURE.md`; `docs/ADR.md`; feature `implementation-report.md`, `build-test.md`, `reference-comparison.md` | Directly superseded global statements and actual evidence only; no C++/test/CMake ownership. | + ## Data Flow Contract 1. CLI receives `fesa.exe `. @@ -135,40 +180,55 @@ ctest --test-dir .harness/build -C Debug --output-on-failure 3. App derives `_results.h5` and `_log.txt` beside the lexically normalized user-addressed `.inp`. 4. App acquires move-only `OutputWriteLease` and retains it until all log and HDF5 work ends. 5. App opens/truncates the log, then `PrepareAnalysisInput(input_path)` parses/maps once into `Domain`. -6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated linear or nonlinear state without opening HDF5. Nonlinear assembly forms `r = f_int - f_ext` and `K_T = K_int - K_ext` from Step 4 internal quantities and Step 5 global-once external quantities. Nonlinear state construction preserves each node's stable `EntityIndex` and full `SourceEntityId`; source label alone is never a row identity. +6. Procedure executor receives injected `ParallelFor` plus `LinearSolver` or `TangentSolver` and computes a fully validated state without opening HDF5. Nonlinear assembly forms `r=f_int-f_ext` and `K_T=K_int-K_ext`, preserves the existing convergence decisions, then computes accepted global balance in stable node order. For each node it sets `x=X+u`, masks constrained residual components before converting reaction rotation, converts applied and reaction rotational covectors independently with `InverseTransposeLeftJacobianSO3(phi)`, and accumulates `applied+reaction` force and `x cross force + spatial moment` about `[0,0,0]`. 7. App closes the log successfully before invoking injected `ResultsWriter` or `NonlinearResultsWriter`. -8. HDF5 is the authoritative solver output. CSV views are comparison/debug artifacts only. +8. HDF5 is authoritative. Existing schema-v1 `/global/equilibrium [6]` stores only the applied-plus-reaction balance error with `location=global-balance-error`; existing nodal datasets/mask reconstruct accepted free residual and constrained reaction resultant without new datasets. +9. Comparator copies exact inputs to unique build-local directories, runs only the copies, and executes `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. CSV views are comparison/debug artifacts only. ## Reference Inventory | path | role | rows | SHA-256 | | --- | --- | ---: | --- | +| `reference/shellNL-meshfine/shellNL-meshfine.inp` | primary nonlinear input | input | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning CSV | 729 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only CSV | 729 | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | +| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inventory artifact | 5,408 | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | | `reference/shellNL/shellNL.inp` | nonlinear input | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| `reference/shellNL/shellNL displacements.csv` | required displacement CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| `reference/shellNL/shellNL reactions.csv` | required reaction CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| `reference/shellNL/shellNL stresses.csv` | nonblocking inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | +| `reference/shellNL/shellNL displacements.csv` | required blocking/warning CSV | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| `reference/shellNL/shellNL reactions.csv` | required review-only CSV | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | +| `reference/shellNL/shellNL stresses.csv` | optional inventory artifact | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | | `reference/shell/shell.inp` | linear input | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | | `reference/shell/shell displacements.csv` | required displacement CSV | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | | `reference/shell/shell reactions.csv` | nonblocking inventory artifact | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | | `reference/shell/shell stresses.csv` | nonblocking inventory artifact | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | -Blocking and warning families: +External comparison families: | family | components | rows | disposition | | --- | --- | ---: | --- | | `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking | | `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only | -| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking | -| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only | -| `nonlinear.reaction_inplane_force` | `RF1,RF2`, constrained nodes | 48 | blocking | -| `nonlinear.reaction_transverse_force` | `RF3`, constrained nodes | 24 | blocking | -| `nonlinear.reaction_physical_moment` | `RM1,RM2`, constrained nodes | 48 | blocking | +| `coarse.translation` | `U1,U2,U3`, nodes `1..49` | 147 | blocking | +| `coarse.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | warning-only | +| `coarse.local_reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | review-only | +| `coarse.local_reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | review-only | +| `coarse.local_reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | review-only | +| `fine.translation` | `U1,U2,U3`, nodes `1..729` | 2,187 | blocking | +| `fine.rotation` | `UR1,UR2,UR3`, nodes `1..729` | 2,187 | warning-only | +| `fine.local_reaction_inplane_force` | `RF1,RF2`, 104 constrained nodes | 208 | review-only | +| `fine.local_reaction_transverse_force` | `RF3`, 104 constrained nodes | 104 | review-only | +| `fine.local_reaction_physical_moment` | `RM1,RM2`, 104 constrained nodes | 208 | review-only | -Constrained node labels for shellNL reactions: `1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33`. +Internal blocking families for each fine/coarse accepted factor-one state are free force residual, +free moment residual, global force balance and global moment balance. Global force/moment use separate +normalized `<=1e-8` gates; free residual uses NSNR-069. Constrained reaction resultant force `[3]` +and moment `[3]` is a distinct review-only summary. -Exact shellNL `Frame`: `Increment 10: Step Time = 1.000`. +Constrained labels: coarse `1,3..9,14..17,22..33`; fine `1,3..9,34..57,82..153`. -Step 11 must not run original reference input paths directly. It snapshots exact original artifact inventory, copies input bytes unchanged into a unique build-local temp case directory, runs `FesaApplication` on the copied `.inp`, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and then verifies original reference directory inventory, bytes, timestamps, and hashes are unchanged. HDF5 source path identity matches the copied user-addressed input; source content identity matches the approved input hash. +Exact fine and coarse nonlinear `Frame`: `Increment 10: Step Time = 1.000`. + +Step 11 must not run original reference input paths directly. It snapshots each exact original artifact inventory, copies input bytes unchanged into a unique build-local case directory, runs `FesaApplication` on the copy, consumes copied-sibling `_results.h5` and `_log.txt`, compares generated HDF5 to original read-only CSVs, and verifies original inventory, bytes, timestamps and hashes are unchanged. HDF5 path identity matches the copied input and source content identity matches the approved input hash. ## Acceptance Traceability Matrix @@ -179,10 +239,10 @@ Step 11 must not run original reference input paths directly. It snapshots exact | `FESA-REQ-NSNR-041` | 1,3,10 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` | | `FESA-REQ-NSNR-074` | 2,8,10 | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*` | | `FESA-REQ-NSNR-006` | 4,6,10 | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-007` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-069` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-070` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-008` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | +| `FESA-REQ-NSNR-007` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*`, `NSNR-REF-019` | +| `FESA-REQ-NSNR-069` | 5,10,11 | `NSNR-CTRL-018..020`, `NSNR-LOG-012`, `NSNR-REF-019` | +| `FESA-REQ-NSNR-070` | 5,10,11 | `NSNR-CTRL-021`, `NSNR-PROC-*` | +| `FESA-REQ-NSNR-008` | 5,10,11 | `NSNR-CTRL-020`, `NSNR-PROC-*`, `NSNR-REF-019` | | `FESA-REQ-NSNR-014` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | | `FESA-REQ-NSNR-046` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | | `FESA-REQ-NSNR-048` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | @@ -190,14 +250,14 @@ Step 11 must not run original reference input paths directly. It snapshots exact | `FESA-REQ-NSNR-063` | 5,10 | `NSNR-CTRL-*`, `NSNR-PROC-*` | | `FESA-REQ-NSNR-016` | 1,5 | `NSNR-IO-*`, `NSNR-CTRL-*` | | `FESA-REQ-NSNR-011` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-019` | 4,8,10 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-*` | +| `FESA-REQ-NSNR-019` | 4,8,10,11 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022`, `NSNR-REF-024..025` | | `FESA-REQ-NSNR-020` | 1 | `NSNR-IO-*` | -| `FESA-REQ-NSNR-021` | 8,9,10 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` | -| `FESA-REQ-NSNR-024` | 7,10 | `NSNR-LOG-*`, `NSNR-PROC-*` | +| `FESA-REQ-NSNR-021` | 8,9,10,11 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-HDF5-014` | +| `FESA-REQ-NSNR-024` | 7,10,11 | `NSNR-LOG-012`, `NSNR-PROC-*`, `NSNR-REF-019` | | `FESA-REQ-NSNR-083` | 0,10,12 | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` | -| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-*`, `NSNR-EVID-*` | -| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-REF-*` | -| `FESA-REQ-NSNR-034` | 11 | `NSNR-REF-*` | +| `FESA-REQ-NSNR-026` | 8,10,11,12 | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-020..023`, `NSNR-EVID-*` | +| `FESA-REQ-NSNR-030` | 2,3,4,5,6,7,8,9,10,11 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-014`, `NSNR-PROC-019`, `NSNR-REF-022`, `NSNR-REF-024..025` | +| `FESA-REQ-NSNR-034` | 11,12 | `NSNR-REF-020..023`, `NSNR-EVID-003..007` | ## Numerical Review Coverage @@ -211,42 +271,71 @@ Step 11 must not run original reference input paths directly. It snapshots exact | patch/sign recovery | 3,4 | | load/boundary path and `rho_M` | 5,10 | | Newton factor/iteration lifecycle | 5,7,10 | -| four convergence gates | 5,7,10 | +| four convergence gates | 5,7,10,11; preserved partial selector/control/log work is regression-verified in Step 11 | +| global balance/current-arm/spatial moment | 11 | +| review-only local reaction and fine/coarse reference | 11,12 | | commit/rollback/determinism | 8,10,11,12 | ## Validation Commands Each Step must: -1. Recheck `.harness/config.json`. If present, use the configured Harness build/test commands. -2. If absent, use: +1. Use the ignored `.harness/config.json` preset contract and tracked `CMakePresets.json`. +2. Confirm the Harness parent environment was initialized by VsDevCmd x64 and contains `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR`. +3. Run: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Focused CTest commands are written explicitly in each `stepN.md`. +Step 11 focused commands additionally include: + +```powershell +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure +``` Harness Python validation is not in scope unless a Step changes Harness Python behavior, hook behavior, or agent configuration. ## Risks And Downstream Handoff -- Main implementation risk: current `LinearStaticAnalysis` owns parse/map and HDF5 write internally. Step 10 must refactor through prepared analysis flow so log close precedes HDF5 finalization for both linear and nonlinear runs. -- Main numerical risk: nonlinear MITC4 tangent and finite rotation derivatives must pass internal derivative/objectivity tests before reference comparison can be meaningful. -- Main backend risk: nonlinear tangent can be nonsymmetric. Preserve SPD `MklPardisoSolver` unchanged and add separate `TangentSolver`. -- Handoff to Implementation Agent through Coordinator: execute Steps 0..12 in order, one current Step at a time, with RED observed failure evidence before GREEN implementation, then focused/full CTest. Final reference gate is Step 11; evidence-document closure is Step 12. +- Current numerical risk: nonzero prescribed motion exposes the existing raw-residual/initial-arm + shortcut. The minimal fix must preserve same-state, stable-order and mask-before-spatial-conversion + semantics; passing zero-prescribed shellNL cases alone is insufficient evidence. +- Current reference risk: fine/coarse U and internal balance/free-residual are blocking, but local RF/RM + may still show large review-only errors. Do not convert those findings into omitted rows, relaxed + tolerance or a blocking gate. +- Current worktree risk: Step 11 contains partial selector/comparator/CMake edits. Preserve and continue + those files; do not delete, reset, replay selector RED or replace the comparator design wholesale. +- Handoff to Implementation Agent through Coordinator: after a separate explicit Harness request, + resume only Executor-selected Step 11. Preserve existing `NSNR-PROC-019`, `NSNR-HDF5-014` and + `NSNR-REF-020..023`; first re-observe the current-case old-gate RED, then add `NSNR-REF-024..025` + before changing the comparator-only shared force/moment gate to `1e-8`. Verify preserved + selector/log tests, then run focused/full preset validation. + Step 12 remains actual-evidence closure. + +## Harness Step Draft + +| Step | name | one-module scope | prerequisites | stop condition | +| ---: | --- | --- | --- | --- | +| 11 | `equilibrium-projection-and-reference-gate` | Nonlinear accepted equilibrium projection, exact HDF5 location and test-private reference gate | Steps 0–10 completed; approved upstream hashes; partial Step 11 work preserved; VsDevCmd/preset dependency environment | Stop on unexpected RED, public API/schema/tolerance/reference change, reference mutation, or any focused/full failure. | +| 12 | `execution-closure-and-evidence-docs` | Fresh evidence reports plus directly superseded PRD/ARCH/ADR statements | Step 11 completed with actual command/reference evidence | Stop if Step 11 is incomplete, evidence is stale/untraceable, a code/test/CMake change is needed, or any final command fails. | + +Both Step files contain exact commands, file ownership, RED/GREEN/VERIFY order and prohibitions. +Materialization does not select or execute either Step. ## Open Issues -None. +None blocking planning. Revised upstream contracts and exact required artifacts are complete; actual +RED/GREEN/build/reference outcomes remain Step 11/12 evidence and are not pre-claimed. ## Plan Approval Boundary -The user-approved plan and pending phase files do not authorize Harness execution. `scripts/execute.py nonlinear-static-newton-raphson` requires a separate explicit user request. +The Coordinator-audited REAPPROVAL-012 revision authorizes this planning/phase materialization and +blocked-to-pending recovery. It does not itself execute Harness; Executor invocation remains under +the Coordinator's separately audited execution authority. diff --git a/docs/nonlinear-static-newton-raphson/implementation-report.md b/docs/nonlinear-static-newton-raphson/implementation-report.md new file mode 100644 index 0000000..ed704fa --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/implementation-report.md @@ -0,0 +1,84 @@ +# Nonlinear Static Newton-Raphson Implementation Report + +## Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| phase step | `12: execution-closure-and-evidence-docs` | +| owner_agent | `implementation-agent` | +| evidence date | `2026-08-28` | +| repository HEAD before this Step's documentation edits | `d275e844f27107cfab52309025e259f2156345d2` | +| classification | `pass-for-physics-evaluation` | + +## Freshness audit (RED) + +Before any build or reference command, `NSNR-EVID-001..007` failed as expected. +`implementation-report.md`, `build-test.md`, and `reference-comparison.md` were absent. The +global documents still advertised `--output`, only the prior linear output path, and did not state +the approved nonlinear current-arm/reaction and fine/coarse reference dispositions. This was an +evidence freshness failure, not a solver failure. No report was created until the fresh commands +below completed. + +## Approved inputs and preserved Step history + +The consumed upstream document SHA-256 values were: requirements +`89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`, research +`4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570`, formulation +`878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9`, numerical review +`C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C`, reference model +`B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA`, I/O +`ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9`, implementation plan +`CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C`, and corrections +`4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A`. + +Steps 0--10 remain unchanged: derived output/log lease; NLGEOM Domain controls; finite rotations; +nonlinear MITC4 kinematics/recovery; residual/tangent; load/BC/convergence gates; tangent solver; +iteration log; transactional state; nonlinear HDF5 v1; and prepared parse-once dispatch/finalization. + +## Step 11 RED to GREEN evidence + +The preserved Step 11 transcript SHA-256 is +`292FE06B7F97B1CBE267A36D875342B300E82486B76BDCBCD31EE2192A87ACE3`. +Its RED evidence covered: initial-arm/raw rotation balance (`NSNR-PROC-019`), obsolete +`location=global-origin` (`NSNR-HDF5-014`), missing fine inventory (`NSNR-REF-020`), blocking +local RF/RM (`NSNR-REF-021`), obsolete `1e-10` balance rejection (`NSNR-REF-022`), pre-tolerance +row rejection (`NSNR-REF-023`), inclusive `1e-8` boundary (`NSNR-REF-024`), and exact-zero scale +(`NSNR-REF-025`). + +The minimal GREEN slice was limited to the nonlinear procedure current-arm/spatial balance +projection, HDF5 location metadata/self-check, and test-private reference comparator/case +inventory. The relevant production files were `nonlinear_static_procedure.cpp`, +`nonlinear_hdf5_results_writer.cpp`, and `hdf5_self_check.cpp`; test changes remained in the +procedure, writer, convergence/log, and reference-comparator tests. This Step made no C++, test, +CMake, Harness, tolerance, or reference-artifact change. + +Fresh VERIFY reran the preserved controls. The focused `NonlinearStaticProcedure` and +`NonlinearHdf5ResultsWriter` command passed 7/7, including +`NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance` and +`WritesSchemaV1GlobalBalanceErrorLocation`. The reference command passed the inclusive and +exact-zero global gate tests. This closes `AUDIT-001`: the tests exercise nonzero prescribed +translation and rotation, `x=X+u`, component-mask-before-conversion, independently converted +applied and constrained rotation covectors, and `location=global-balance-error`. + +## Requirement and test traceability + +| evidence | fresh result | +| --- | --- | +| `NSNR-CTRL-018..021` convergence controls | 6/6 `NonlinearConvergence.*` passed | +| `NSNR-LOG-012` iteration-log contract | 8/8 `NewtonIterationLog.*` passed | +| `NSNR-PROC-019` current-arm balance | passed in focused 7-test procedure/writer run | +| `NSNR-HDF5-014` v1 equilibrium location | passed in focused 7-test procedure/writer run | +| `NSNR-REF-020..025` portfolio, dispositions, prechecks, 1e-8 and zero-scale | 9/9 `NonlinearStaticReference.*` passed twice and in full CTest | +| blocking external/internal final gate | all 302 CTest tests passed; detailed metrics are in `reference-comparison.md` | + +## Handoff and open issues + +Implementation-owned classification is `pass-for-physics-evaluation`. The only numerical +differences retained are six deterministic local RF/RM review-only findings; they do not alter +the blocking verdict. No warning-only UR family failed. This report does not claim physics or +release readiness, and numerical agreement does not assert Abaqus S4 internal formulation +equivalence. + +No Step 12 production behavior changed. Reference inputs and CSV files were read-only and their +pre/post inventory, byte sizes, timestamps, and SHA-256 values were identical. diff --git a/docs/nonlinear-static-newton-raphson/io.md b/docs/nonlinear-static-newton-raphson/io.md index 08070f9..bb6930c 100644 --- a/docs/nonlinear-static-newton-raphson/io.md +++ b/docs/nonlinear-static-newton-raphson/io.md @@ -4,20 +4,22 @@ - feature_id: `nonlinear-static-newton-raphson` - source_requirement: `docs/nonlinear-static-newton-raphson/requirements.md` -- source_requirement_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2` +- source_requirement_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` - source_research: `docs/nonlinear-static-newton-raphson/research.md` -- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` +- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` - source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md` -- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` +- source_formulation_sha256: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` - source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md` -- source_numerical_review_sha256: `9517E11804C45A6F3822D18821D52EA493AE20353C8FFAD61E960F4315977D01` +- source_numerical_review_sha256: `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` - source_reference_model: `docs/nonlinear-static-newton-raphson/reference-model.md` -- source_reference_model_sha256: `52D10B1D0C0500B295C5E48BCB3618B309D9696371B8070D4E3DCEE8D3D74CD3` +- source_reference_model_sha256: `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` +- decision_source: `USER-DECISION-004 option 1` +- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8` - repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/PRD.md`, `docs/ARCHITECTURE.md`, `docs/ADR.md`, `docs/TOLERANCE.md` - status: `ready-for-coordinator-review` - owner_agent: `io-definition-agent` -- date: `2026-08-23` +- date: `2026-08-28` - authoritative_output: input sibling `_results.h5` - diagnostic_log: input sibling `_log.txt` - hdf5_schema_version: `1` @@ -386,15 +388,15 @@ failure도 entered iteration이 없으면 iteration record가 없는 log file만 | 7 | `failing_stage` | `none` for completed gate records, otherwise failing stage enum | | 8 | `residual_force_channel` | literal `residual_force` or `not-evaluated(reason)` | | 9 | `residual_force_numerator_norm` | `||r_f^u||_inf` or `not-evaluated(reason)` | -| 10 | `residual_force_denominator_scale` | `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)` or `not-evaluated(reason)` | -| 11 | `residual_force_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` | +| 10 | `residual_force_denominator_scale` | matching `||f_ext,f^u||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^u||_inf,||f_ext,f^u||_inf)`; 또는 `not-evaluated(reason)` | +| 11 | `residual_force_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `not-evaluated(reason)` | | 12 | `residual_force_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` | | 13 | `residual_force_threshold_unit` | `1`, `force`, or `not-evaluated(reason)` | | 14 | `residual_force_pass` | `0`, `1`, or `not-evaluated(reason)` | | 15 | `residual_moment_channel` | literal `residual_moment` or `not-evaluated(reason)` | | 16 | `residual_moment_numerator_norm` | `||r_f^phi||_inf` or `not-evaluated(reason)` | -| 17 | `residual_moment_denominator_scale` | `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)` or `not-evaluated(reason)` | -| 18 | `residual_moment_branch` | `relative`, `zero-scale`, or `not-evaluated(reason)` | +| 17 | `residual_moment_denominator_scale` | matching `||f_ext,f^phi||_inf`가 exact zero이면 exact `0`; nonzero이면 `max(||f_int,f^phi||_inf,||f_ext,f^phi||_inf)`; 또는 `not-evaluated(reason)` | +| 18 | `residual_moment_branch` | matching external scale이 nonzero이면 `relative`, exact zero이면 `zero-scale`, 또는 `not-evaluated(reason)` | | 19 | `residual_moment_threshold` | `1e-2` for `relative`, `1e-3` for `zero-scale`, or `not-evaluated(reason)` | | 20 | `residual_moment_threshold_unit` | `1`, `force*length`, or `not-evaluated(reason)` | | 21 | `residual_moment_pass` | `0`, `1`, or `not-evaluated(reason)` | @@ -417,13 +419,29 @@ failure도 entered iteration이 없으면 iteration record가 없는 log file만 | 38 | `outcome` | `accepted`, `continue`, `nonconverged`, or `failed` | | 39 | `diagnostic_code` | `none` or approved diagnostic code | -Completed gate record는 `failing_stage=none`이고 네 channel의 identity, numerator/norm, -denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum value로 노출한다. -Denominator가 exact zero이면 branch는 `zero-scale`이고 typed threshold는 residual force -`1e-3 force`, residual moment `1e-3 force*length`, correction translation `1e-3 length`, -correction rotation `1e-3 dimensionless`다. Denominator가 nonzero이면 branch는 `relative`이고 -threshold는 dimensionless `1e-2`다. Empty free channel은 numerator와 denominator가 exact zero인 -`zero-scale` branch로 평가한다. +`nsnr-log-v1`의 39개 field label, order와 TAB-separated `label=value` serialization은 +변경하지 않는다. Completed gate record는 `failing_stage=none`이고 네 channel의 identity, +numerator/norm, denominator/scale, branch, typed threshold, pass를 모두 finite 또는 enum +value로 노출한다. + +Residual channel은 required residual/internal/external vector와 그 infinity norm을 모두 finite로 +확인한 뒤 matching external scale `S_ext^u=||f_ext,f^u||_inf` 또는 +`S_ext^phi=||f_ext,f^phi||_inf` 자체로 branch를 선택한다. Matching external scale이 exact +zero이면 `residual_*_denominator_scale=0`, `residual_*_branch=zero-scale`로 직렬화하고 numerator에 +typed absolute `1e-3 force` 또는 `1e-3 force*length`를 inclusive `<=`로 직접 적용한다. +이 exact `0`은 matching external selector를 직렬화하며 divisor 또는 internal-inclusive max가 +아니다. Selector predicate는 `S_ext==0`이고 tolerance band, zero clamp, `max(1,...)`를 쓰지 않는다. +Internal scale 또는 residual numerator가 nonzero여도 이 branch를 `relative`로 바꾸지 않는다. +Matching external scale이 nonzero이면 `residual_*_denominator_scale`은 retained +`max(||f_int,f||_inf,||f_ext,f||_inf)`이고 `residual_*_branch=relative`이며, numerator/denominator +ratio에 dimensionless `1e-2`를 inclusive `<=`로 적용한다. 이 branch에 typed absolute gate를 +OR로 추가하지 않는다. + +Correction channel은 기존 계약 그대로 current-trial incremental-solution denominator가 exact +zero이면 `zero-scale`과 typed `1e-3 length` 또는 `1e-3 dimensionless`를, nonzero이면 +`relative`와 dimensionless `1e-2`를 사용한다. Empty free channel은 exact-zero numerator/scale의 +typed `zero-scale` branch로 평가한다. 네 channel의 pass는 `combined_pass`에서 logical AND로만 +결합한다. Early failure record는 entered iteration 하나에 대응한다. 이미 계산된 earlier fields는 실제 finite value를 기록하고, 실패 stage 뒤의 모든 later field는 `not-evaluated(reason)`을 기록한다. @@ -523,19 +541,43 @@ row는 정확히 하나다. Factor zero는 이 dataset에 row를 갖지 않고 ` | generalized internal force | `/steps/Step-1/frames//nodal/generalized_internal_force` | `[node_count,6]` float64 | node row; `[FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; nodal | | generalized external force | `/steps/Step-1/frames//nodal/generalized_external_force` | `[node_count,6]` float64 | node row; `[FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3]` | `[force x3,force*length x3]`; work-conjugate to `[u,phi]`; approved physical moment projection 후 fixed-global dead loads; nodal | | generalized residual | `/steps/Step-1/frames//nodal/generalized_residual` | `[node_count,6]` float64 | node row; `[RU1,RU2,RU3,RPHI1,RPHI2,RPHI3]` | `[force x3,force*length x3]`; nonlinear solution coordinate의 full assembled `f_int-f_ext`; nodal | -| reaction / physical residual projection | `/steps/Step-1/frames//nodal/reaction` | `[node_count,6]` float64 | node row; `[RF1,RF2,RF3,RM1,RM2,RM3]` | `[force x3,force*length x3]`; global; constrained entry는 physical reaction, free entry는 same-state equilibrium evidence; rotational columns는 `J_l(phi)^(-T)` spatial moment conversion | +| reaction / spatial full-residual projection | `/steps/Step-1/frames//nodal/reaction` | `[node_count,6]` float64 | node row; `[RF1,RF2,RF3,RM1,RM2,RM3]` | `[force x3,force*length x3]`; global; translation은 full generalized residual과 같고 rotation은 `J_l(phi)^(-T)` spatial moment conversion. Constrained reaction은 mask를 generalized residual에 먼저 적용한 뒤 변환하며 accepted free residual의 authority는 이 dataset이 아니라 `nodal/generalized_residual`이다. | | shell local frame | `/steps/Step-1/frames//element/shell/local_frame` | `[element_count,4,3,3]` float64 | element row, midsurface location row `GP1..GP4`, axis row `[E1,E2,E3]`, global component column `[X,Y,Z]` | dimensionless; physical recovery용 fixed-initial shell local frame; rotating Abaqus output frame이 아님 | | generalized strain | `/steps/Step-1/frames//element/shell/generalized_strain` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[E11,E22,G12,K11,K22,K12,G13,G23]` | `[1,1,1,1/length,1/length,1/length,1,1]`; fixed-reference shell local; midsurface | | section resultant | `/steps/Step-1/frames//element/shell/section_resultant` | `[element_count,4,8]` float64 | element row, `GP1..GP4`; `[N11,N22,N12,M11,M22,M12,Q13,Q23]` | `[force/length x3,force x3,force/length x2]`; fixed-reference shell local; midsurface | | in-plane stress | `/steps/Step-1/frames//element/shell/stress` | `[element_count,4,3,3]` float64 | element row, `GP1..GP4`, section position `[BOTTOM,MIDDLE,TOP]`, component `[S11,S22,S12]` | `force/length^2`; fixed-reference shell local; direct bottom/middle/top evaluation | | physical strain energy | `/steps/Step-1/frames//global/energy` | `[1]` float64 | `[PHYSICAL_STRAIN_ENERGY]` | `force*length`; deterministic element reduction; numerical drilling stabilization 제외 | -| global equilibrium | `/steps/Step-1/frames//global/equilibrium` | `[6]` float64 | `[FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3]` | `[force x3,force*length x3]`; global Cartesian; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용 | +| global applied-plus-reaction balance error | `/steps/Step-1/frames//global/equilibrium` | `[6]` float64 | `[FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3]` | `[force x3,force*length x3]`; global Cartesian; formulation §13.4의 applied-plus-constrained-reaction balance error; moment about global origin `[0,0,0]`, current force arms와 spatial physical nodal moments 사용; `location=global-balance-error` | Trial Newton state, iteration history, line search, cutback attempt, damping, automatic stabilization, numerical drilling stress, drilling energy ratio, `S33`, `S13`, `S23`, nodal stress extrapolation, element-corner stress, averaged stress, Abaqus integration-point number에 대한 HDF5 dataset은 만들지 않는다. +#### 7.5.1 Equilibrium Projection and Schema Compatibility + +Schema version `1`과 기존 `/global/equilibrium` path/shape는 유지한다. 기존 계약이 이미 +global origin `[0,0,0]`, current force arm과 spatial physical nodal moment를 지정했으므로 이 +dataset의 authoritative meaning은 처음부터 formulation §13.4의 **global +applied-plus-reaction balance error**다. Raw full-residual sum, initial-coordinate arm 또는 raw +rotation-coordinate covector를 이 path에 쓰는 것은 schema-compatible implementation이 아니다. +이 의미 명확화는 path, shape 또는 component를 바꾸지 않으므로 schema version을 올리지 않는다. + +같은 accepted frame의 세 equilibrium quantity는 다음처럼 서로 다른 HDF5 projection으로 +재구성된다. 별도 중복 summary dataset은 만들지 않는다. + +| logical quantity | authoritative HDF5 projection | coordinates / units | disposition | +| --- | --- | --- | --- | +| accepted free residual | `/model/nodal_constraint_mask==0`인 component를 `/nodal/generalized_residual`에서 선택한다. NSNR-069 scale은 같은 free component의 `/nodal/generalized_internal_force`와 `/nodal/generalized_external_force`에서 계산한다. | translation channel은 global force, rotation-coordinate channel은 generalized force-length | `blocking-internal` | +| constrained reaction resultant | `/model/nodal_constraint_mask`를 `/nodal/generalized_residual`에 먼저 적용해 constrained generalized reaction을 만들고, rotation block만 accepted `phi`의 `J_l(phi)^(-T)`로 spatial moment로 변환한다. Current position은 `/model/nodes.coordinates + /nodal/displacement[UX,UY,UZ]`다. Stable node order로 `sum(F_react)`와 `sum(x cross F_react + M_react)`를 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `review-only-summary` | +| applied-plus-reaction balance error | required dataset `/global/equilibrium`; applied contribution은 accepted `/nodal/generalized_external_force`의 translation block과 `J_l(phi)^(-T)`로 변환한 rotational block, reaction contribution은 바로 위 constrained projection을 사용한다. Stable node order로 formulation §13.4의 합을 계산한다. | global force `[3]`, global spatial force-length moment `[3]` about `[0,0,0]` | `blocking-internal` | + +Componentwise constraint selection은 spatial moment 변환보다 먼저 수행한다. 따라서 partial +rotational constraint나 nonzero prescribed rotation에서도 constrained reaction resultant에 free +generalized residual이 섞이지 않는다. Local `/nodal/reaction` display나 full residual sum을 위 세 +quantity 중 다른 하나의 substitute로 사용하지 않는다. Nonzero prescribed translation에서는 +initial position이 아니라 accepted current position을 force arm으로 사용한다. + ### 7.6 Diagnostics Dataset `/diagnostics`는 mandatory이며 row가 0개일 수 있다. @@ -568,9 +610,13 @@ CSV는 FESA output이 아니다. HDF5에서 추출한 deterministic CSV view는 | case id | role | exact path | comparison disposition | | --- | --- | --- | --- | -| `shellnl-s4-final` | nonlinear input | `reference/shellNL/shellNL.inp` | required source input | -| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required comparison | -| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required comparison | +| `shellnl-meshfine-s4-final` | primary nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required source input | +| `shellnl-meshfine-s4-final` | displacement CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning comparison | +| `shellnl-meshfine-s4-final` | reaction CSV | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | constrained nodes/components only required review | +| `shellnl-meshfine-s4-final` | stress CSV | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional read-only inspection/order evidence only | +| `shellnl-s4-final` | companion nonlinear input | `reference/shellNL/shellNL.inp` | required source input | +| `shellnl-s4-final` | displacement CSV | `reference/shellNL/shellNL displacements.csv` | required blocking/warning comparison | +| `shellnl-s4-final` | reaction CSV | `reference/shellNL/shellNL reactions.csv` | constrained nodes/components only required review | | `shellnl-s4-final` | stress CSV | `reference/shellNL/shellNL stresses.csv` | optional read-only inspection/order evidence only | | `shell-s4-linear-limit` | linear control input | `reference/shell/shell.inp` | existing linear MITC4 contract의 required regression input | | `shell-s4-linear-limit` | displacement CSV | `reference/shell/shell displacements.csv` | required regression comparison | @@ -578,21 +624,22 @@ CSV는 FESA output이 아니다. HDF5에서 추출한 deterministic CSV view는 | `shell-s4-linear-limit` | stress CSV | `reference/shell/shell stresses.csv` | optional read-only inspection/order evidence only | Reference artifact file은 workflow에서 rename, rewrite, normalize, zero-clamp, repair, -regenerate하지 않는다. +regenerate하지 않는다. Fine과 coarse nonlinear case는 각각 자기 input/CSV에 독립적으로 +비교하며 cross-mesh row mapping이나 interpolation을 만들지 않는다. ### 8.2 Accepted-State and Frame Mapping -- `shellnl-s4-final`은 accepted factor-one HDF5 frame만 비교한다. 해당 frame은 - `/steps/Step-1/accepted_frames`에서 `is_factor_one=1`이고 `load_factor=1.0`인 unique row다. - 그 `frame_index`가 `/steps/Step-1/frames/`를 선택한다. -- Required `shellNL` CSV row는 exact `Frame` value - `Increment 10: Step Time = 1.000`만 가져야 하며, 이는 accepted factor-one state로 - 논리 매핑한다. Required row에 다른 `Frame` 값이 있으면 schema mismatch다. +- `shellnl-meshfine-s4-final`과 `shellnl-s4-final`은 각각 accepted factor-one HDF5 frame만 + 비교한다. 해당 frame은 `/steps/Step-1/accepted_frames`에서 `is_factor_one=1`이고 + `load_factor=1.0`인 unique row다. 그 `frame_index`가 + `/steps/Step-1/frames/`를 선택한다. +- 두 nonlinear case의 required CSV row는 exact `Frame` value + `Increment 10: Step Time = 1.000`만 가져야 하며, 이는 각 case의 accepted + factor-one state로 논리 매핑한다. Required row에 다른 `Frame` 값이 있으면 schema mismatch다. - `shell-s4-linear-limit` CSV에는 `Frame` column이 없으며 `docs/linear-static-mitc4-shell/io.md`의 existing linear MITC4 final frame `/steps/Step-1/frames/0`에 매핑한다. -- Trial Newton state, iteration log line, optional stress inventory row는 reference row가 - 아니다. +- Trial Newton state, iteration log line, optional stress inventory row는 reference row가 아니다. ### 8.3 Nodal Displacement Projection @@ -602,93 +649,141 @@ Required logical key는 다음과 같다. (case_id, accepted_state, canonical_instance_name, source_node_label, component) ``` -두 case 모두 instance `PART-1-1`에서 node label `1..49`가 정확히 한 번씩 필요하다. -Instance matching은 case-insensitive로 수행하되 report에는 raw spelling을 보존한다. +Instance `PART-1-1`에서 linear/coarse case는 node label `1..49`, fine case는 `1..729`를 +각각 정확히 한 번 요구한다. Instance matching은 case-insensitive로 수행하되 report에는 raw +spelling을 보존한다. Row order는 identity가 아니다. | CSV column | comparison component | nonlinear HDF5 source | linear regression HDF5 source | | --- | --- | --- | --- | -| `U-U1` | `U1` | `nodal/displacement` column `UX` | `nodal/displacement` column `UX` | -| `U-U2` | `U2` | `nodal/displacement` column `UY` | `nodal/displacement` column `UY` | -| `U-U3` | `U3` | `nodal/displacement` column `UZ` | `nodal/displacement` column `UZ` | -| `UR-UR1` | `UR1` | `nodal/displacement` column `URX` | `nodal/displacement` column `URX` | -| `UR-UR2` | `UR2` | `nodal/displacement` column `URY` | `nodal/displacement` column `URY` | -| `UR-UR3` | `UR3` | `nodal/displacement` column `URZ` | `nodal/displacement` column `URZ` | +| `U-U1` | `U1` | factor-one `nodal/displacement` column `UX` | final `nodal/displacement` column `UX` | +| `U-U2` | `U2` | factor-one `nodal/displacement` column `UY` | final `nodal/displacement` column `UY` | +| `U-U3` | `U3` | factor-one `nodal/displacement` column `UZ` | final `nodal/displacement` column `UZ` | +| `UR-UR1` | `UR1` | factor-one `nodal/displacement` column `URX` | final `nodal/displacement` column `URX` | +| `UR-UR2` | `UR2` | factor-one `nodal/displacement` column `URY` | final `nodal/displacement` column `URY` | +| `UR-UR3` | `UR3` | factor-one `nodal/displacement` column `URZ` | final `nodal/displacement` column `URZ` | -`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 두 case 모두 warning-only다. UR warning +`U1/U2/U3`는 blocking이다. `UR1/UR2/UR3`는 모든 case에서 warning-only다. UR warning exceedance는 blocking verdict를 바꾸지 않는다. -### 8.4 Nonlinear Constrained Reaction Projection +### 8.4 Nonlinear Local Reaction Review Projection -Reaction comparison은 `shellnl-s4-final`에만 적용하며 input boundary mask의 constrained node -중 아래 24개 node에만 적용한다. +Reaction review row는 input boundary mask로 선택한다. -```text -1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33 -``` +- coarse `shellnl-s4-final`: `1,3..9,14..17,22..33` — 24 nodes; +- fine `shellnl-meshfine-s4-final`: `1,3..9,34..57,82..153` — 104 nodes. -승인 input에서 이 24개 node는 여섯 global DOF가 모두 constrained다. Comparator는 required -HDF5 reaction row eligibility를 CSV zero value가 아니라 `/model/nodal_constraint_mask`와 -source node identity에서 도출한다. +승인 input에서 위 node들은 여섯 global DOF가 모두 constrained다. Comparator는 row +eligibility를 CSV zero value나 row position이 아니라 `/model/nodal_constraint_mask`와 source +node identity에서 도출한다. Translation reaction은 factor-one +`nodal/generalized_residual`의 constrained `RU1..RU3`이고, rotational reaction은 constrained +`RPHI1..RPHI3`를 먼저 선택한 뒤 accepted `phi`의 `J_l(phi)^(-T)`로 변환한 spatial physical +moment다. Stored all-six-constrained rows에서는 factor-one `/nodal/reaction`의 대응 column과 +동일해야 한다. -| CSV columns | logical family | HDF5 source | disposition | +| CSV columns | coarse family | fine family | disposition | | --- | --- | --- | --- | -| `RF-RF1`, `RF-RF2` | `nonlinear.reaction_inplane_force` | factor-one `/nodal/reaction` columns `RF1,RF2` | blocking | -| `RF-RF3` | `nonlinear.reaction_transverse_force` | factor-one `/nodal/reaction` column `RF3` | blocking | -| `RM-RM1`, `RM-RM2` | `nonlinear.reaction_physical_moment` | factor-one `/nodal/reaction` columns `RM1,RM2`; `J_l(phi)^(-T)` 변환 뒤 spatial physical moment | blocking | -| `RM-RM3` | excluded | comparison projection 없음 | blocking 및 warning-only family에서 제외 | +| `RF-RF1`, `RF-RF2` | `coarse.local_reaction_inplane_force` | `fine.local_reaction_inplane_force` | `review-only` | +| `RF-RF3` | `coarse.local_reaction_transverse_force` | `fine.local_reaction_transverse_force` | `review-only` | +| `RM-RM1`, `RM-RM2` | `coarse.local_reaction_physical_moment` | `fine.local_reaction_physical_moment` | `review-only` | +| `RM-RM3` | comparison projection 없음 | comparison projection 없음 | `excluded` | -Raw generalized rotation-coordinate residual column은 Abaqus `RM` CSV column과 직접 비교하지 -않는다. +Raw generalized rotation-coordinate residual은 Abaqus `RM` CSV column과 직접 비교하지 않는다. +Review-only family도 source key, schema, inventory, finite value와 모든 row/common-policy error를 +보고한다. 그 precheck 또는 numerical finding은 blocking verdict를 바꾸지 않는다. -### 8.5 Comparison Families +### 8.5 Internal Factor-One Equilibrium Projection + +Internal equilibrium은 Abaqus CSV comparison이 아니다. Fine primary와 coarse companion의 +각 accepted factor-one HDF5 frame에서 Section 7.5.1의 projection을 사용한다. + +| family id | exact HDF5 rows/components | gate | +| --- | --- | --- | +| `coarse.accepted_free_force_residual` | 75 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel | +| `coarse.accepted_free_moment_residual` | 75 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel | +| `coarse.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` | +| `coarse.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` | +| `fine.accepted_free_force_residual` | 1,875 free `RU1/RU2/RU3` rows와 같은 rows의 internal/external force | NSNR-069 force channel | +| `fine.accepted_free_moment_residual` | 1,875 free `RPHI1/RPHI2/RPHI3` rows와 같은 rows의 internal/external generalized moment | NSNR-069 moment channel | +| `fine.global_force_balance` | factor-one `/global/equilibrium` `FORCE_1..3` | normalized `<=1e-8` | +| `fine.global_moment_balance` | factor-one `/global/equilibrium` `MOMENT_1..3` | normalized `<=1e-8` | + +Global balance의 force scale은 applied/reaction nodal force contribution의 2-norm 합 중 큰 +값, moment scale은 current-arm force moment와 spatial physical nodal moment contribution의 +2-norm 합 중 큰 값이다. Force와 moment를 분리해 `norm(balance_error)/scale<=1e-8`을 +적용한다. Scale이 exact zero이면 balance error도 exact zero일 때만 pass한다. Absolute floor, +`max(1,S)` 또는 zero clamp는 없다. Accepted free residual은 NSNR-069의 external-channel exact-zero/ +nonzero branch를 그대로 재현한다. 이 internal gate에는 `docs/TOLERANCE.md`, Abaqus value 또는 +local reaction error를 적용하지 않는다. + +Constrained reaction resultant force `[3]`와 moment `[3]`는 Section 7.5.1의 distinct +`review-only-summary`로 함께 계산·보고한다. `/global/equilibrium`, constrained reaction +resultant와 accepted free residual 중 어느 하나를 다른 quantity의 대체 dataset으로 쓰지 않는다. + +### 8.6 External Comparison Families External tolerance source는 정확히 `docs/TOLERANCE.md`다. 별도 absolute floor, `max(1,S)` -clamp, row averaging, source-order matching, component calibration, zero clamp는 허용하지 +clamp, row averaging, source-order matching, component calibration 또는 zero clamp는 허용하지 않는다. | family id | case | components | required row count | units / coordinates | disposition | | --- | --- | --- | ---: | --- | --- | | `linear.translation` | `shell-s4-linear-limit` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking regression | | `linear.rotation` | `shell-s4-linear-limit` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only | -| `nonlinear.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking | -| `nonlinear.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only | -| `nonlinear.reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / fixed-initial global plane | blocking | -| `nonlinear.reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / fixed-initial global transverse | blocking | -| `nonlinear.reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | blocking | +| `coarse.translation` | `shellnl-s4-final` | `U1,U2,U3` on nodes `1..49` | 147 | length / global | blocking | +| `coarse.rotation` | `shellnl-s4-final` | `UR1,UR2,UR3` on nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only | +| `coarse.local_reaction_inplane_force` | `shellnl-s4-final` | `RF1,RF2` on constrained nodes | 48 | force / global shell plane | review-only | +| `coarse.local_reaction_transverse_force` | `shellnl-s4-final` | `RF3` on constrained nodes | 24 | force / global transverse | review-only | +| `coarse.local_reaction_physical_moment` | `shellnl-s4-final` | `RM1,RM2` on constrained nodes | 48 | force*length / global spatial | review-only | +| `fine.translation` | `shellnl-meshfine-s4-final` | `U1,U2,U3` on nodes `1..729` | 2,187 | length / global | blocking | +| `fine.rotation` | `shellnl-meshfine-s4-final` | `UR1,UR2,UR3` on nodes `1..729` | 2,187 | dimensionless / fixed-initial global | warning-only | +| `fine.local_reaction_inplane_force` | `shellnl-meshfine-s4-final` | `RF1,RF2` on constrained nodes | 208 | force / global shell plane | review-only | +| `fine.local_reaction_transverse_force` | `shellnl-meshfine-s4-final` | `RF3` on constrained nodes | 104 | force / global transverse | review-only | +| `fine.local_reaction_physical_moment` | `shellnl-meshfine-s4-final` | `RM1,RM2` on constrained nodes | 208 | force*length / global spatial | review-only | -Reference-model read-only scale audit value는 다음과 같다. +Reference-model read-only scale audit value는 다음과 같다. 이 값은 calibration 상수가 아니다. | family id | `S=max(abs(reference))` | `0.01*S` | | --- | ---: | ---: | | `linear.translation` | `2.37408203e-5` | `2.37408203e-7` | | `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` | -| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` | -| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` | -| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` | -| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` | -| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` | +| `coarse.translation` | `2.37408203e-5` | `2.37408203e-7` | +| `coarse.rotation` | `7.60725743e-6` | `7.60725743e-8` | +| `coarse.local_reaction_inplane_force` | `1.91663182` | `1.91663182e-2` | +| `coarse.local_reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` | +| `coarse.local_reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` | +| `fine.translation` | `2.57957054e-5` | `2.57957054e-7` | +| `fine.rotation` | `6.58704994e-6` | `6.58704994e-8` | +| `fine.local_reaction_inplane_force` | `5.38827419e-1` | `5.38827419e-3` | +| `fine.local_reaction_transverse_force` | `2.78506128e3` | `2.78506128e1` | +| `fine.local_reaction_physical_moment` | `4.71557520e3` | `4.71557520e1` | -### 8.6 Row Prechecks +### 8.7 Row Prechecks -아래 조건 중 하나라도 거짓이면 comparator는 tolerance 계산 전에 실패한다. +Tolerance 또는 internal metric 전에 다음을 검사한다. -1. Exact declared input path와 required CSV path가 존재하고 readable이다. +1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable이다. 2. Reference CSV header는 surrounding whitespace trim 뒤 필요한 column을 가진다. -3. `shellnl-s4-final` required row는 exact approved `Frame` value만 포함한다. +3. 두 nonlinear case required row는 exact approved `Frame` value만 포함한다. 4. HDF5 metadata, model rows, accepted-frame table, factor-one frame, required result dataset이 - 문서화된 shape, component name, finite value를 가진다. -5. Wide CSV row는 이 문서의 component mapping으로 component row로 expand한다. -6. Required source wide key와 expanded component key는 unique하다. Duplicate reference 또는 - HDF5 key는 실패다. -7. 각 declared family에서 FESA와 reference projected key set은 정확히 같아야 한다. Missing row와 - extra row는 모두 실패다. -8. 모든 required numeric value는 finite다. Nonfinite HDF5 또는 CSV value는 tolerance 전 실패다. -9. `shellNL` reaction row는 constrained mask와 exact 24-node list에서 선택한다. Free-node CSV - row는 inventory only이며 zero reaction target으로 해석하지 않는다. -10. Required row를 omit, synthesize, average, substitute identity로 sort, normalize, zero-clamp, - repair하지 않는다. + 문서화된 shape, component name, attributes와 finite value를 가진다. +5. Wide CSV row는 이 문서의 component mapping으로 component row로 deterministically expand한다. +6. Source wide key와 expanded component key는 unique하다. Duplicate reference 또는 HDF5 key는 + affected family를 tolerance 전에 fail한다. +7. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero value나 row + position으로 reaction identity를 추론하지 않는다. +8. 각 declared external family에서 FESA와 reference projected key set은 exact equal해야 한다. + Missing row와 extra row를 모두 fail한다. +9. Required HDF5/CSV value, derived scale, norm과 metric은 모두 finite여야 한다. +10. Internal free residual은 exact free mask와 force/moment channel을 보존한다. Global balance는 모든 + applied source와 constrained reaction을 stable source order로 정확히 한 번 사용한다. +11. Local review row를 global resultant로 collapse하거나 대체하지 않는다. Review-only precheck/error는 + deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다. +12. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를 + 변경하지 않는다. Blocking precheck failure만 전체 external comparison을 fail한다. +13. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를 + 허용하지 않는다. -### 8.7 Stress CSV Disposition +### 8.8 Stress CSV Disposition Optional stress CSV identity는 다음과 같다. @@ -697,13 +792,16 @@ Optional stress CSV identity는 다음과 같다. element_corner_node_label, section_surface, component) ``` -현재 stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`, -`S-S22`, `S-S33`, `S-S12`를 포함하며, 저장된 ascending element-label block `1..36` 순서를 -갖는다. FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다. +Stored stress CSV는 element-corner node row와 `SPOS/SNEG` section surface에서 `S-S11`, +`S-S22`, `S-S33`, `S-S12`를 포함한다. `reference/shell/shell stresses.csv`는 사용자가 +변경한 ascending element-label block `1..36` 순서를 갖지만 row order는 identity가 아니다. +Fine stress CSV의 element `1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded artifact +finding으로만 기록한다. Artifact를 수정하지 않는다. -따라서 두 case의 stress CSV는 optional read-only inspection 및 order evidence only다. HDF5 -comparison projection, `S33` synthesis, nodal extrapolation, corner averaging, Gauss-to-corner -matching, element-label-order identity는 없다. +FESA HDF5는 `GP1..GP4`와 `BOTTOM/MIDDLE/TOP`에서 direct `[S11,S22,S12]`만 emit한다. +따라서 모든 stored stress CSV는 optional read-only inspection/order evidence only다. HDF5 +numerical-comparison projection, `S33` synthesis, nodal extrapolation, corner averaging, +Gauss-to-corner matching 또는 element-label-order matching은 없다. ## 9. Validation Rules @@ -723,13 +821,14 @@ matching, element-label-order identity는 없다. | aggregate moment | exact-zero case 또는 preprocessing 및 모든 entered trial에서 `rho_M<=1e-12` | model/solver, exit `4` 또는 `5` | | nonlinear static data | 네 positive finite values, endpoint `1.0`, fixed increment sequence with final exact factor one | input, exit `3` | | Newton iteration | iteration identity `1..100`; iteration `100` acceptance 가능; iteration `101` 없음; line search/cutback/retry/fallback 없음 | solver, exit `5` | -| convergence channels | residual force, residual moment, correction translation, correction rotation이 모두 inclusive `<=` rule 또는 typed zero-scale threshold 통과 | solver, exit `5` | +| convergence channels | finite-first 평가 뒤 residual force/moment는 matching external scale exact-zero이면 typed absolute `1e-3`, nonzero이면 retained `max(internal,external)` relative `1e-2`; correction translation/rotation은 기존 denominator branch; 네 channel 모두 inclusive `<=`이고 logical AND | solver, exit `5` | | nonfinite data | required residual, tangent, correction, state, load, recovery, output value가 acceptance 전 finite | solver/output, exit `5` 또는 `6` | | commit/rollback | complete converged candidate만 commit; failure는 prior committed state와 prior authoritative final HDF5 보존 | solver/output, exit `5` 또는 `6` | -| HDF5 schema | exact paths, shapes, attributes, schema version, row identities, finite values, accepted-frame table, diagnostics; final replace는 log close success 뒤에만 허용 | output, exit `6` | +| HDF5 schema | exact paths, shapes, attributes, schema version, row identities, finite values, accepted-frame table, diagnostics; `/global/equilibrium`은 applied-plus-reaction balance error이고 accepted free residual/constrained reaction resultant와 분리됨; final replace는 log close success 뒤에만 허용 | output, exit `6` | +| equilibrium projection | accepted free rows는 generalized residual과 exact free mask, constrained reaction은 mask-before-spatial-conversion, global balance는 applied plus constrained reaction/current arm/origin `[0,0,0]`; factor-one global force와 moment는 각각 dimension-separated normalized `<=1e-8`; 세 quantity가 같은 accepted state를 공유하되 서로 대체되지 않음 | solver/output/reference internal gate | | log | UTF-8 no BOM, LF, TAB-separated fixed `label=value` schema; entered Newton iteration마다 record 하나; no per-iteration stderr duplication; no-Newton procedure는 zero-byte empty log; open/write/flush/close fail-closed | output, exit `6` | -| reference rows | exact required artifacts, headers, row keys, component keys, finite values, factor-one frame mapping | reference precheck | -| tolerance | exact `docs/TOLERANCE.md` family-scale row/RMS policy; blocking/warning disposition 보존 | reference verification | +| reference rows | fine primary/coarse companion/linear-control exact artifacts, headers, row keys, component keys, finite values, factor-one frame mapping과 disposition별 precheck | reference precheck | +| tolerance | external family에만 exact `docs/TOLERANCE.md` row/RMS policy 적용; U blocking, UR warning-only, local RF/RM review-only 보존; internal global balance/free residual gate와 혼합 금지 | reference/internal verification | Downstream test가 다뤄야 하는 approved diagnostic code는 다음을 포함한다. @@ -785,21 +884,34 @@ Downstream handoff to Implementation Planning Agent through Coordinator: MITC4 contract의 regression으로 남는지 test한다. - HDF5 schema version `1`을 위 accepted-frame schema 그대로 구현한다. Factor-zero non-frame handling, unique factor-one frame selection, triad/director projection, no - compression/chunking, no trial-state HDF5 history를 포함한다. + compression/chunking, no trial-state HDF5 history를 포함한다. `/global/equilibrium` path/shape는 + 유지하되 authoritative meaning을 applied-plus-reaction balance error로 검증한다. +- `AUDIT-001`을 별도 test로 닫는다. Accepted free residual은 generalized residual/internal/external + force와 exact free mask, constrained reaction resultant는 mask-before-`J_l(phi)^(-T)`와 accepted + current arm, global balance는 applied plus constrained reaction을 사용한다. Nonzero prescribed + translation/rotation case에서도 initial arm, raw rotational covector 또는 raw full-residual sum을 + 세 quantity의 공통 substitute로 쓰지 않는다. - 비대칭 lifecycle을 보존한다. Log는 usage validation, lexical path derivation, single-writer lock 뒤 live current-run audit이고, log create/open/truncate는 Analysis 전 abort, write/flush는 즉시 abort, close failure는 HDF5 commit을 block한다. HDF5 final은 log close와 candidate self-check 성공 뒤에만 replace하며 failure는 prior valid final과 current log를 손상하지 않는다. - Newton log parser/schema test는 UTF-8 no BOM, LF, physical TAB-separated fixed - `label=value` field order, finite round-trip numerics, escaping, completed-gate four-channel - metrics, early-failure `not-evaluated(reason)`, no-Newton zero-byte log, zero per-iteration - stderr duplication, flush-before-next/return을 포함한다. -- Exact CSV paths, trimmed headers, exact `shellNL` `Frame` value, source node/component - identity, constrained reaction mask, missing/extra/duplicate rows, nonfinite values를 - tolerance 전에 precheck한다. -- Declared family에는 `docs/TOLERANCE.md`만 적용한다. `U`는 blocking, `UR`은 warning-only, - `RF1/RF2`, `RF3`, physical spatial `RM1/RM2`는 blocking으로 유지하고 `RM3`와 모든 stress - CSV value는 제외한다. + `label=value` 39-field order, finite round-trip numerics, escaping, completed-gate four-channel + metrics, residual matching-external-scale exact-zero/nonzero branch와 retained nonzero-scale + denominator, typed thresholds, four-channel AND, early-failure `not-evaluated(reason)`, no-Newton + zero-byte log, zero per-iteration stderr duplication, flush-before-next/return을 포함한다. +- Fine primary, coarse companion과 linear control의 exact CSV path, trimmed header, 두 nonlinear + case의 exact factor-one `Frame`, source node/component identity, constrained reaction mask, + missing/extra/duplicate row와 nonfinite value를 tolerance 전에 precheck한다. Row order를 identity로 + 쓰지 않는다. +- External declared family에는 `docs/TOLERANCE.md`만 적용한다. `U1/U2/U3`는 blocking, + `UR1/UR2/UR3`는 warning-only, local `RF1/RF2/RF3`와 spatial physical `RM1/RM2`는 + review-only다. Local `RM3`와 모든 stress CSV value는 제외한다. Review-only row의 + schema/inventory/error report를 생략하거나 blocking으로 되돌리지 않는다. +- Fine/coarse factor-one global force/moment balance는 dimension-separated normalized `<=1e-8`, + accepted free force/moment residual은 NSNR-069으로 blocking 검증한다. 이 internal gate에 + Abaqus CSV나 `docs/TOLERANCE.md` scale을 사용하지 않는다. Constrained reaction resultant는 + distinct review-only summary로 보고한다. - Optional stress CSV는 read-only inventory/order evidence only로 유지한다. Nodal stress extrapolation, corner averaging, `S33` synthesis, element-label-order matching을 추가하지 않는다. diff --git a/docs/nonlinear-static-newton-raphson/numerical-review.md b/docs/nonlinear-static-newton-raphson/numerical-review.md index 2477962..0a24133 100644 --- a/docs/nonlinear-static-newton-raphson/numerical-review.md +++ b/docs/nonlinear-static-newton-raphson/numerical-review.md @@ -1,188 +1,261 @@ # Nonlinear Static Newton-Raphson 수치 검토 -## 1. Metadata and source formulation +## 1. Metadata - feature_id: `nonlinear-static-newton-raphson` - source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md` - source_formulation_status: `ready-for-numerical-review` -- source_formulation_sha256: `DFA629888041D5762FD0DF4271353464A692B325DC0C821A8D8689688C1EAFD0` +- source_formulation_sha256: `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` - source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md` -- source_requirements_sha256: `910E351F3F90FFA42F07D15206B55E62C05EAE821E250424430148337506EBF2` +- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` - source_research: `docs/nonlinear-static-newton-raphson/research.md` -- source_research_sha256: `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` +- source_research_sha256: `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` - repository_policy: `AGENTS.md`, `docs/SOLVER_AGENT_DESIGN.md`, `docs/TOLERANCE.md` -- related_linear_contracts: `docs/linear-static-mitc4-shell/numerical-review.md`, - `docs/linear-static-mitc4-shell/reference-model.md` +- decision_source: `USER-DECISION-004 option 1` +- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8` +- diagnostic_evidence: `docs/nonlinear-static-newton-raphson/corrections.md` §13, + `docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md` - status: `pass-for-io-definition` - owner_agent: `numerical-review-agent` -- date: `2026-08-23` +- date: `2026-08-28` +- post_closure_addendum_date: `2026-08-29` +- post_closure_additive_case: `shellnl-meshfine-02-s4-final` -이 검토는 정식화를 수학 및 수치 알고리즘 계약으로만 검토했다. C++ API, HDF5 schema, -implementation plan, reference solver 실행, reference artifact 생성/수정은 수행하지 않았다. +이 검토는 정식화를 수학·수치 알고리즘 계약으로 검토하고 기존 reference artifact를 +읽기 전용으로 조사했다. C++ API, 최종 HDF5 dataset path, implementation plan 또는 +reference artifact를 설계·실행·생성·수정하지 않았다. ## 2. Review Verdict - verdict: `pass-for-io-definition` -- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation - state, nonlinear `24 -> 20` map, objective drilling, fixed-global load work, - same-trial residual/tangent, Full Newton convergence, recovery와 state commit/rollback - 의미를 구현 가능한 수치 계약으로 닫고 있다. 차원, 부호, DOF 순서, 적분, reaction - 의미 또는 reference identity와 충돌하는 blocking defect는 확인되지 않았다. -- reference readiness: `reference/shellNL` 및 `reference/shell`의 선언 파일과 CSV는 - 읽을 수 있고 row identity/precheck/tolerance 계약을 정의할 수 있다. -- boundary: 이 verdict는 I/O Definition 진입 허가이며 implementation, reference comparison - pass, physics evaluation 또는 release readiness 승인이 아니다. - -`reference/shellNL`은 `nlgeom=YES`와 factor-one final frame을 갖는 저장 reference로 사용할 수 -있지만, 주요 `U3`와 stress 값은 선형 `reference/shell`과 거의 같다. 관찰된 nonlinear 신호는 -주로 약한 in-plane coupling이다(`RF1/RF2` 최대 약 `1.9166`, `U1/U2` 최대 약 -`1.29e-11`). 따라서 이 CSV 세트만으로 finite-rotation objectivity, exact tangent, -rollback 또는 큰 변위 benchmark를 통과했다고 판단하지 않는다. 해당 항목은 아래의 -blocking internal tests로 분리한다. +- reason: 승인 정식화는 fixed-initial-reference Total Lagrangian MITC4, finite rotation, + nonlinear `24 -> 20` map, objective drilling, same-trial residual/tangent, reaction의 + spatial-moment 변환과 current-arm global balance를 구현 가능한 수치 계약으로 정의한다. + Revised requirements와 충돌하는 formulation defect는 없다. +- reaction disposition: local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 exact + source-key/schema/inventory/finite/error evidence를 유지하는 `review-only`다. 이 값은 + formulation-sensitive nodal redistribution이므로 blocking verdict를 결정하지 않는다. + Local `RM3`는 계속 제외한다. +- blocking equilibrium: 각 nonlinear case의 factor-one accepted state에서 `(a)` global + applied-plus-reaction force balance, `(b)` global applied-plus-reaction moment balance, + `(c)` accepted free-DOF force/moment residual evidence가 blocking이다. `(d)` constrained + reaction resultant는 별도 quantity로 보존하지만 balance error를 대신하지 않는다. +- reference readiness: `reference/shell`, `reference/shellNL`와 + `reference/shellNL-meshfine`의 선언 input 및 필요한 displacement/reaction CSV가 존재하고 + 읽을 수 있다. Fine case는 사용자가 요청한 mesh-refined nonlinear evidence이며 coarse + case와 서로의 reference에 독립적으로 비교한다. Merge 후 추가된 read-only + `reference/shellNL-meshfine_02` bundle도 별도 verification 대상으로 inventory했다. 이 + post-closure 추가는 기존 세 case의 gate, 과거 Stage 6 comparison 또는 Release verdict를 + 소급 변경하지 않는다. +- boundary: `pass-for-io-definition`은 I/O 계약을 다시 정의할 수 있다는 뜻이며 reference + comparison pass, implementation completion, physics 또는 release 승인이 아니다. ## 3. Critical Findings -### Confirmed defects +### 3.1 Confirmed defects -없음. Formulation Agent 또는 Research Agent로 즉시 되돌릴 confirmed numerical defect는 없다. +Formulation Agent 또는 Research Agent로 반환할 confirmed defect는 없다. Formulation +§11.4는 constrained generalized reaction과 spatial physical moment를 구분하고, §13.4는 +global origin `[0,0,0]`, current nodal position과 physical spatial moment를 사용하는 +applied-plus-reaction balance를 명시한다. -### Numerical risks requiring downstream evidence +### 3.2 Required downstream correction: `AUDIT-001` -- `shellNL`의 stored reference는 geometric nonlinearity가 켜진 최종 상태 비교에는 충분하지만 - response amplitude가 작아 finite-rotation/tangent/objectivity 검증을 대신하지 못한다. -- Abaqus stress CSV는 `(instance, element label, element-corner node label, - section point, component)` identity로 완전하지만 FESA의 approved Gauss-location direct - bottom/middle/top recovery와 location이 다르다. Current stored order는 element label - `1..36` ascending block이며 이를 바꾸지 않는다. Nodal extrapolation/averaging을 만들지 - 않고 stress CSV는 comparison family에서 제외한다. -- External `UR` comparison은 기존 MITC4 정책에 따라 `warning-only`다. Rotation/director - correctness는 `Q`, `d`, branch, objectivity invariant tests에서 blocking으로 확인해야 한다. +Stage 5/6은 같은 accepted state에서 다음 세 quantity를 서로 바꿔 쓰지 않아야 한다. -### Open questions +1. **Global applied-plus-reaction balance error**: applied와 constrained reaction을 더한 + force `[3]`와 moment `[3]`; blocking. +2. **Constrained reaction resultant**: constrained reaction만 합한 force `[3]`와 current-arm + moment `[3]`; distinct nonblocking reaction summary. +3. **Accepted free residual**: stable free-DOF source/component rows와 force/moment channel gate; + blocking. -현재 I/O Definition 진입을 막는 open question은 없다. Large-response public benchmark, -MMS, broader locking/distortion characterization은 유용하지만 승인된 Stage 4 pass 조건은 아니다. +현재 nonlinear implementation helper는 full residual을 합하고 initial Domain coordinates와 +raw rotational generalized residual을 사용한다. 현재 `shellNL`/`shellNL-meshfine` support는 +prescribed `u=phi=0`이므로 initial/current support arm과 generalized/spatial support moment가 +일치하고, 이 helper는 작은 free residual을 제외하면 constrained reaction resultant에 +가깝다. 그러나 applied load를 더한 balance error는 아니며 세 quantity 중 어느 것도 +일반적으로 대체하지 못한다. 지원 범위의 nonzero prescribed translation/rotation에서는 +반드시 current position과 `J_l(phi)^(-T)` spatial-moment conversion을 적용해야 한다. + +### 3.3 Numerical risks and nonblocking artifact issue + +- Fine stress CSV에는 element `1`, `SNEG`의 `Node Label=ss` 한 행이 있다. Stress는 승인된 + FESA Gauss direct recovery와 위치가 다르고 수치 comparison에서 제외되므로 이 optional + inspection artifact의 malformed identity는 I/O 진입 blocker가 아니다. Artifact를 repair, + normalize 또는 rewrite하지 않는다. +- Coarse/fine Abaqus `S4`와 FESA MITC4가 동일한 local support reaction distribution을 + 만들어야 한다는 formulation evidence는 없다. Global balance와 free residual로 blocking + physics를 검증하고 local rows는 오차를 숨기지 않은 채 review-only로 남긴다. +- Stored cases의 response는 weak geometric-nonlinear regime다. Reference displacement pass가 + tangent, objectivity, finite-rotation 또는 rollback 검증을 대신하지 않는다. +- `shellNL-meshfine_02`는 topology와 constraint inventory는 fine case와 같지만 source load가 + `F1=+1e8`, `F2=+1e8`, `F3=-1e8`이다. 기존 fine case의 `F3=-1e5`와 같은 물리 case 또는 + mesh-only refinement로 취급하지 않으며 각자의 reference에만 비교한다. + +### 3.4 Open questions + +I/O Definition 진입을 막는 open question은 없다. Public large-response benchmark, shell MMS와 +broader locking/distortion portfolio는 useful future evidence지만 이번 gate의 추가 조건이 아니다. ## 4. Numerical Risk Assessment | risk label | assessment | required control / downstream evidence | | --- | --- | --- | -| `rigid_body_modes` | 물리/internal/drill energy가 finite rigid motion에서 objective해야 하며 pure drill만 regularized 되어야 한다. | finite rigid translation/rotation superposition에서 strain, stress, physical energy, drill gamma, residual을 blocking invariant로 확인한다. | -| `patch_test` | Green-Lagrange direct strain과 MITC tied shear가 같은 trial geometry와 같은 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch를 linear limit와 finite valid trial perturbation에서 각각 확인한다. | -| `symmetry` | applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric이다. | no-moment case만 scaled symmetry check 대상으로 두고, moment case를 임의 symmetrization하지 않는다. | -| `positive_definiteness` | nonlinear tangent는 load state, compression, near-buckling에서 indefinite일 수 있다. Positive definiteness는 일반 gate가 아니다. | stress-free constrained linear limit의 nonsingular solve와 singular negative case를 분리하고, factorization failure를 숨기지 않는다. | -| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이므로 one-point reduced hourglass path는 승인 범위 밖이다. | source type으로 reduced/selective integration 또는 hourglass stabilization을 선택하지 않는 unit/integration test가 필요하다. | -| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 모든 thin-shell mesh에서 locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로 두고 broader thin/thick convergence는 nonblocking characterization으로 둔다. | -| `volumetric_locking` | approved plane-stress shell, St. Venant-Kirchhoff-type material restriction에서는 `N/A`다. | 3-D incompressible material 또는 `nu >= 0.5` 의미로 확장하지 않는다. | -| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear meshes에서 membrane locking 위험이 남는다. | known limitation으로 기록한다. MITC4+ 성능 또는 Abaqus S4/S4R internal equivalence를 주장하지 않는다. | -| `distortion` | positive Jacobian이라도 severe distortion/warpage는 conditioning과 stress accuracy를 악화할 수 있다. | 모든 Gauss/tying/center/recovery location의 finite, positive predicate를 fail-closed로 적용한다. 추가 quality cutoff는 요구하지 않는다. | -| `singular_jacobian` | `J0 <= 0`, `j <= 0`, invalid reciprocal basis, invalid polar stretch는 residual/tangent를 무효화한다. | failed location을 omit/average/clamp/repair하지 않고 model/trial failure로 처리한다. | -| `conditioning` | thin shells, small fixed drill scale, near-mechanism constraints는 Kff conditioning을 악화시킬 수 있다. | scaled matrix diagnostics만 사용하고 solver regularization/fallback으로 singularity를 숨기지 않는다. | -| `convergence` | Full Newton은 same-trial consistent tangent에 의존한다. No line search/cutback이므로 difficult step은 deterministic nonconvergence가 될 수 있다. | NSNR-069/070 four-channel gates, iteration `1..100`, nonfinite rejection, no hidden retry를 integration tests로 고정한다. | +| `rigid_body_modes` | Physical/internal/drill energy는 finite rigid motion에서 objective하고 pure drill만 regularized 되어야 한다. | finite rigid superposition에서 strain, stress, physical energy, drill gamma/energy와 residual covariance를 blocking invariant로 확인한다. | +| `patch_test` | Green-Lagrange direct strain과 MITC tied shear는 같은 trial 및 first/second variation을 써야 한다. | membrane, bending, twist, transverse-shear patch와 linear limit을 확인한다. | +| `symmetry` | Applied nodal moment가 없으면 physical/drill tangent는 exact arithmetic에서 symmetric이다. Fixed-spatial moment work tangent는 일반적으로 nonsymmetric다. | no-moment case만 scaled symmetry gate를 적용하고 moment case는 derivative consistency로 검증한다. | +| `positive_definiteness` | Nonlinear tangent는 compression/near-buckling에서 indefinite일 수 있다. | positive definiteness를 global gate로 만들지 않고 singular/malformed tangent와 물리적 indefiniteness를 구분한다. | +| `hourglass` | S4/S4R 모두 `2 x 2 x 2` full integration이며 reduced/hourglass path는 범위 밖이다. | source label로 integration 또는 stabilization을 바꾸지 않는 test가 필요하다. | +| `shear_locking` | MITC shear tying은 transverse-shear locking을 완화하지만 general locking-free를 보장하지 않는다. | patch/reference evidence를 blocking으로, broader thin/thick study를 characterization으로 둔다. | +| `volumetric_locking` | approved plane-stress shell과 `nu < 0.5` 범위에서는 `N/A`다. | 3-D incompressible behavior claim으로 확장하지 않는다. | +| `membrane_locking` | original-style MITC4는 curved/distorted nonlinear mesh에서 membrane locking 위험이 남는다. | known limitation으로 보존하고 MITC4+ 또는 Abaqus 내부 성능을 상속한다고 주장하지 않는다. | +| `distortion` | positive Jacobian만으로 accuracy는 보장되지 않지만 별도 calibrated quality cutoff는 승인되지 않았다. | 모든 Gauss/tying/center/recovery location을 fail-closed 검사한다. | +| `singular_jacobian` | `J0<=0`, `j<=0`, invalid reciprocal basis/polar stretch는 residual/tangent를 무효화한다. | failed point를 omit, average, clamp 또는 repair하지 않는다. | +| `conditioning` | thin geometry, small fixed drill scale와 near mechanism은 conditioning을 악화시킨다. | scale-aware diagnostics를 쓰고 hidden regularization/fallback을 금지한다. | +| `convergence` | Full Newton은 same-trial consistent tangent에 의존하고 line search/cutback이 없다. | NSNR-069/070, four-channel AND, iteration `1..100`, finite-first와 no retry를 고정한다. | +| `reaction_distribution` | local nodal support distribution은 element formulation/mesh/stabilization에 민감하다. | exact local error report는 유지하되 global balance/free residual만 blocking한다. | ## 5. Consistency Checks | check | result | evidence | | --- | --- | --- | -| units and dimensions | `pass` | Translation/force, rotation/moment, stress/resultant dimensions are separated. Convergence channels keep force, force-length, length and dimensionless rotation separate. | -| signs and residual convention | `pass` | Global residual is `f_int - f_ext`; constrained full residual is reaction and free residual is equilibrium evidence. Fixed-global dead force has no configuration derivative. | -| DOF ordering and free/constrained assumptions | `pass` | Per-node global order is `[UX, UY, UZ, URX, URY, URZ]`; Newton solve uses stable free coordinates with `Delta q_c = 0`. Valid `0 x 0` free system is trivial success. | -| coordinate transforms | `pass` | `Q=Exp(phi^)Q0`, left-spatial update, `J_l` variation, physical swing map and spatial reaction moment conversion are explicitly defined. | -| kinematic operator / B matrix | `pass` | Green-Lagrange strain, MITC shear projection and both first/second variations use the same trial identity. | -| constitutive contract | `pass` | Constant symmetric `C5` maps engineering Green-Lagrange strain to second Piola-Kirchhoff stress; no material history is introduced. | -| Jacobian rules | `pass` | Fixed reference `J0` is integration measure; current `j` and `det F_c` are validity checks. Failed locations are not skipped. | -| integration policy | `pass` | S4 and S4R share four midsurface Gauss points times two thickness points; reduced/selective integration is prohibited. | -| residual/tangent consistency | `pass` | Complete tangent includes material, geometric, map-Hessian, objective drill Hessian and fixed-spatial moment work derivative terms. | -| tangent symmetry expectation | `pass` | Symmetric only for conservative no-applied-moment case; generally nonsymmetric moment tangent must remain unsymmetrized. | -| output locations | `pass-with-handoff` | Nodal U/UR/RF/RM and shell stress/resultant logical quantities are defined; exact HDF5 projection remains I/O-owned. Current nodal SPOS/SNEG stress CSV는 Gauss direct recovery와 일대일 대응하지 않으므로 external numerical comparison은 N/A다. | +| units and dimensions | `pass` | Translation residual/reaction은 force, rotation residual/reaction moment는 force-length다. Force와 moment family 및 norm scale을 혼합하지 않는다. | +| signs | `pass` | `r=f_int-f_ext`; constrained entry는 reaction, free entry는 equilibrium evidence다. Balance는 `applied+reaction`이고 reaction resultant는 reaction만 합한다. | +| DOF ordering | `pass` | Global node order `[UX,UY,UZ,URX,URY,URZ]`; stable free/constrained partition과 `Delta q_c=0`을 보존한다. | +| coordinates and moment conversion | `pass-with-handoff` | Global origin `[0,0,0]`, current arm `X+u`, spatial moment `J_l(phi)^(-T) r_phi`가 승인 의미다. `AUDIT-001` 구현 projection audit가 남는다. | +| kinematic operator | `pass` | Green-Lagrange strain, MITC shear projection 및 first/second variation은 same-trial identity다. | +| constitutive contract | `pass` | Constant symmetric `C5`가 fixed-reference engineering strain을 second Piola-Kirchhoff stress로 매핑하며 material history가 없다. | +| Jacobian rules | `pass` | Fixed `J0`가 integration measure, current `j`와 `det(Fc)`가 validity predicate다. | +| integration | `pass` | S4/S4R 공통 four midsurface by two thickness points; reduced/selective integration은 금지한다. | +| residual/tangent | `pass` | Material/geometric/map-Hessian/drill/moment-work derivative가 complete same-trial tangent를 이룬다. | +| recovery locations | `pass-with-handoff` | Nodal U/UR/reaction 및 Gauss direct shell recovery logical meaning은 정의되었다. Final dataset projection은 I/O-owned다. | +| reference identity | `pass` | Case/state/instance/source label/component로 match하고 row order를 identity로 쓰지 않는다. | ## 6. Verification Readiness -### Blocking internal numerical tests +### 6.1 Blocking internal numerical tests -Implementation Planning shall carry these as feature-required tests before any reference-comparison success claim: +기존 승인 수치 portfolio를 유지한다. -Mixed translation/rotation 검사는 fixed-reference characteristic length -`L=max(||X_I-X_J||)`와 node block `Dq=diag(L I3,I3)`를 사용한다. Tangent test direction은 -`||p_hat||inf=1`, perturbation은 `q +/- h Dq p_hat`으로 두고 -`h={1e-3,3e-4,1e-4,3e-5,1e-5,3e-6,1e-6,3e-7}` 전부를 검사한다. Roundoff plateau 전 -최소 두 interval에서 centered-difference observed order `>=1.5`이고 한 interior point가 -scaled error `<=1e-6`여야 한다. Single-`h` 우연 통과는 허용하지 않는다. +1. Stress-free `q=0` linear MITC4 residual/tangent/recovery와 physical/drill split. +2. `||Q^TQ-I||_F<=1e-12`, `|det(Q)-1|<=1e-12`, `d=Qe3` 및 branch margin. +3. Mixed translation/rotation scaled tangent directional derivative schedule와 interior scaled + error `<=1e-6`; zero analytical direction `<=1e-10`. +4. No-applied-moment scaled tangent symmetry `<=1e-12`; applied moment는 derivative + consistency만 검사한다. +5. Finite rigid objectivity의 scaled physical strain/stress/energy/drill/residual `<=1e-10`. +6. Membrane/bending/twist/shear patch, component order와 bottom/top stress sign. +7. Fixed-global force/moment identity, `rho_M<=1e-12`, absolute prescribed path와 zero + constrained Newton correction. +8. Exact fixed-factor sequence, factor one, iterations `1..100`, pass at 100, no 101/cutback/retry. +9. NSNR-069/070의 finite-first exact-zero/nonzero branches, inclusive thresholds와 four-channel AND. +10. Trial/recovery/solve/output failure rollback과 deterministic assembly/frame/row/diagnostic order. -1. Linear limit: at stress-free `q=0`, nonlinear element residual/tangent/recovery reduce to approved linear MITC4 signs, `2 x 2 x 2` integration and physical/drill split. -2. Rotation state invariants: every committed/trial `Q` satisfies `||Q^T Q-I||_F <= 1e-12`, - `|det(Q)-1| <= 1e-12`, and `d=Q e3`. Global/swing/twist `pi` branch angular margin은 - `sqrt(epsilon_double)`, 약 `1.4901161193847656e-8` rad보다 커야 한다. -3. Tangent directional derivative: compare `Dq^T K_T Dq p_hat` with the central - residual derivative under the schedule above in separated force and moment channels. - Zero analytical directions require exact-zero construction and scaled absolute error - `<=1e-10`; nonfinite metric은 허용하지 않는다. -4. No-moment tangent symmetry: after work-conjugate congruence `Dq^T K_T Dq`, no-applied-moment - tangent scaled Frobenius symmetry error `<=1e-12`; applied fixed-spatial moment cases are checked for - exact derivative consistency, not symmetry. -5. Finite rigid objectivity: superposed finite rigid motion leaves physical strain/stress, - physical energy, drill gamma/energy and internal residual at scaled `<=1e-10` levels. -6. Patch/sign recovery: membrane, bending, twist and transverse shear patch states preserve - component order and bottom/top stress signs. - Analytical strain/resultant/stress error is relative `<=1e-9`. -7. Load and boundary path: fixed-global force/moment source identity, `rho_M <= 1e-12` - rejection/projection, absolute factor-one boundary path and zero constrained Newton - correction are tested independently. -8. Newton lifecycle: factor identities use ordinal `j*h` values strictly below one, - followed by one exact assigned `1.0`; cumulative `lambda += h`와 tolerance-based duplicate - endpoint는 금지한다. For `shellNL` the expected intended factors are `0.1, 0.2, ..., - 1.0`. Iterations are `1..100`, pass at `100` is allowed, iteration `101` is forbidden. -9. Convergence gates: NSNR-069/070 four-channel inclusive `<=` rules, typed zero-scale - `1e-3` thresholds and nonfinite rejection are tested without adding energy or line-search gates. -10. Commit/rollback and determinism: failed trial, recovery, solve or output does not mutate - the prior committed state or prior authoritative final result; row/diagnostic order is stable. +### 6.2 Factor-one blocking equilibrium contract -### Downstream reference comparisons +각 nonlinear case의 accepted factor-one state에 대해 -The required stored-reference cases and logical quantities are defined in -`docs/nonlinear-static-newton-raphson/reference-model.md`. +\[ +\mathbf a_{F,I}=\mathbf F_I^{appl},\qquad +\mathbf c_{F,I}=\mathbf F_I^{react}, +\] -- `shellnl-s4-final` is the primary nonlinear external reference at accepted factor one. -- `shell-s4-linear-limit` is the read-only linear-limit/reference-identity regression for the - same S4 mesh. Current stress element-label ordering is inventoried without becoming a - comparison quantity. +\[ +\mathbf a_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{appl} ++\mathbf M_I^{appl},\qquad +\mathbf c_{M,I}=(\mathbf x_I-\mathbf 0)\times\mathbf F_I^{react} ++\mathbf M_I^{react} +\] -External comparison uses only accepted-state quantities and `docs/TOLERANCE.md`. Missing, -extra, duplicate or nonfinite required rows fail before tolerance. The comparison result itself -is Implementation Agent ownership. +를 stable source-node order로 계산한다. `x=X+u`이고 applied physical moment는 formulation +§13.4의 effective physical-work moment다. Define + +\[ +\mathbf e_F=\sum_I(\mathbf a_{F,I}+\mathbf c_{F,I}),\quad +S_F=\max\left(\sum_I\|\mathbf a_{F,I}\|_2, + \sum_I\|\mathbf c_{F,I}\|_2\right), +\] + +\[ +\mathbf e_M=\sum_I(\mathbf a_{M,I}+\mathbf c_{M,I}),\quad +S_M=\max\left(\sum_I\|\mathbf a_{M,I}\|_2, + \sum_I\|\mathbf c_{M,I}\|_2\right). +\] + +Force와 moment는 각각 `rho_F=||e_F||2/S_F`, `rho_M=||e_M||2/S_M`로 검사하고 둘 다 +`<=1e-8`이어야 한다. 이 threshold는 승인된 nonlinear acceptance value이며, +unclamped sum-of-contribution scale과 dimension-separated form은 승인된 linear MITC4 +global-equilibrium convention을 유지한다. `S=0`이면 balance도 +exact zero일 때만 `0`, 아니면 fail하며 absolute floor, `max(1,S)` 또는 zero clamp를 두지 않는다. + +Accepted free residual은 cross-unit combined norm을 만들지 않는다. Factor-one accepted trial의 +free translation-force와 free rotation-moment rows가 각각 NSNR-069의 exact gate를 다시 +재현해야 한다: matching external scale이 nonzero이면 approved infinity-norm relative gate +`<=1e-2`, exact zero이면 typed absolute `<=1e-3` force 또는 force-length다. 두 channel 모두 +finite-first로 통과해야 한다. + +### 6.3 Downstream reference comparisons + +- `shellnl-meshfine-s4-final`: 사용자가 요청한 mesh-refined primary nonlinear case. +- `shellnl-s4-final`: coarse nonlinear companion regression. +- `shell-s4-linear-limit`: existing linear-limit/source-identity regression. +- `shellnl-meshfine-02-s4-final`: merge 후 추가된 post-closure nonlinear case. 과거 canonical + Stage 6 `reference-comparison.md`의 비교 대상이 아니며 merge된 current code로 별도 실행·비교한다. + +각 case의 `U1/U2/U3`는 blocking이고 `UR1/UR2/UR3`는 warning-only다. Coarse/fine은 각자의 +input/CSV와 독립 family로 비교하며 cross-mesh interpolation, row collapse 또는 observed-order +claim을 만들지 않는다. Local RF/RM family는 common external tolerance로 오차를 전부 +기록하지만 review-only다. `RM3`와 stress는 수치 comparison에서 제외한다. + +### 6.4 Post-closure additive case boundary + +`shellnl-meshfine-02-s4-final`은 729 nodes, 676 S4 elements, `NLGEOM=YES`, +`*STATIC 0.1,1.,0.001,0.1`, all-six-DOF `Set-2` 104 constrained nodes를 가진다. Exact +factor-one displacement/reaction/stress CSV는 각각 729/729/5,408 rows이며 audited key는 +unique이고 required numeric value는 finite다. U1/U2/U3 2,187 rows는 blocking, +UR1/UR2/UR3 2,187 rows는 warning-only, local RF1/RF2 208 rows, RF3 104 rows와 physical +spatial RM1/RM2 208 rows는 review-only다. RM3와 stress는 excluded다. + +Internal factor-one families는 fine case와 같은 row/gate 구조를 사용한다: free force residual +1,875 rows, free moment residual 1,875 rows, global force balance 3 components와 global moment +balance 3 components다. External family는 `docs/TOLERANCE.md`, internal free residual과 global +balance는 Sections 6.2의 승인 gate를 그대로 사용한다. 이 문서 addendum은 comparison success를 +판정하지 않으며 Implementation Agent가 merge된 current code의 별도 evidence를 소유한다. ## 7. Required Revisions ### Formulation Agent -None before I/O Definition. The current formulation is numerically sufficient for the I/O -contract. Current source element/node SPOS/SNEG stress CSV에 맞추기 위한 extrapolation, -averaging 또는 새 recovery 의미는 추가하지 않는다. +없음. §11.4/§13.4의 reaction, spatial moment와 global balance 의미는 revised requirements를 +충족한다. ### Research Agent -None before I/O Definition. Public large-response benchmarks and shell MMS remain useful future -evidence, but the current Stage 4 gate does not require another research pass. +없음. Stored fine-mesh case와 internal invariant portfolio가 이번 I/O gate에 충분하다. ### I/O Definition Agent -Define parser/semantic/HDF5/log projection for the logical quantities and row identities in -`reference-model.md`. Preserve the split between blocking internal nonlinear tests and external -stored reference comparison; do not claim Abaqus internal equivalence. +`reference-model.md`의 logical quantities와 source identity를 최종 projection으로 연결한다. +`AUDIT-001`의 balance error, constrained reaction resultant, accepted free residual을 별도 +quantity로 유지한다. Current-arm/spatial-moment semantics와 factor-one identity를 보존하고 +local RF/RM review-only disposition을 blocking으로 되돌리지 않는다. ## 8. Downstream Handoff -For I/O Definition Agent through Coordinator: +Coordinator를 통해 I/O Definition Agent에 전달한다. -- Use accepted factor-one frames only for external reference comparison; trial Newton states are - not reference quantities. -- Preserve required source identity: case, accepted state, instance, node label and component. - Stress artifact의 element/node/section identity와 stored element-label order는 read-only - inventory로 보존하되 FESA comparison row로 합성하지 않는다. -- Keep `U1/U2/U3` blocking and `UR1/UR2/UR3` warning-only. For `shellNL`, compare - constrained `RF1/RF2`, `RF3`, and spatial physical `RM1/RM2` in the separate blocking - families from `reference-model.md`. `RM3`와 stress는 comparison에서 제외한다. -- Apply `docs/TOLERANCE.md` exactly; do not add an independent absolute floor, row averaging, - source-order matching, or calibration gate. -- Treat `shellNL` as weak but valid nonlinear final-state reference evidence; require the - blocking internal tests above for tangent/objectivity/rollback/finite-rotation correctness. +- `pass-for-io-definition`; blockers: 없음. +- External families는 `docs/TOLERANCE.md`를 그대로 사용한다. Independent absolute floor, + averaging, collapse, source-order matching, clamp 또는 calibration gate를 추가하지 않는다. +- Internal factor-one global force/moment balance는 Section 6.2의 dimension-separated normalized + `1e-8` gate, accepted free residual은 NSNR-069 force/moment gate를 사용한다. +- Fine primary와 coarse companion nonlinear cases 모두 U blocking/UR warning-only를 유지한다. +- Post-closure `shellnl-meshfine-02-s4-final`도 같은 U/UR 및 local RF/RM disposition을 사용하되, + 과거 canonical comparison/Release verdict에 소급 포함하지 않고 별도 current-code verification으로 + 보고한다. +- Local RF1/RF2, RF3, spatial RM1/RM2는 separate review-only families이며 error/precheck를 + 생략하지 않는다. RM3/stress는 excluded다. +- Fine optional stress identity anomaly는 그대로 기록하고 artifact를 수정하지 않는다. +- Abaqus S4와 FESA MITC4의 formulation, integration, stabilization 또는 내부 알고리즘 + 동등성을 주장하지 않는다. diff --git a/docs/nonlinear-static-newton-raphson/physics-evaluation.md b/docs/nonlinear-static-newton-raphson/physics-evaluation.md new file mode 100644 index 0000000..4e04b9d --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/physics-evaluation.md @@ -0,0 +1,138 @@ +# Nonlinear Static Newton-Raphson Physics Evaluation + +## 1. Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| source reference comparison report | `docs/nonlinear-static-newton-raphson/reference-comparison.md` | +| source reference comparison SHA-256 | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` | +| source reference model | `docs/nonlinear-static-newton-raphson/reference-model.md` | +| source reference model SHA-256 | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | +| status | `pass-for-release-agent` | +| owner_agent | `physics-evaluation-agent` | +| date | `2026-08-28` | + +이 평가는 승인된 물리 acceptance scope와 이미 생성된 accepted-state evidence만 사용한다. +Abaqus 또는 다른 reference solver를 실행하지 않았고, 외부 solver의 내부 정식화·적분·안정화· +결과 복구 동등성을 주장하지 않는다. + +## 2. Input Evidence + +### 2.1 Gate-entry audit + +- `implementation-report.md`와 `build-test.md`의 Stage 6 owner classification은 + `pass-for-physics-evaluation`이며 full CTest `302/302`, nonlinear reference `9/9` 통과를 + 기록한다. +- Corrected required source `reference-comparison.md`는 overall handoff status를 + `pass-for-physics-evaluation`로 명시한다. Detailed verdict + `blocking-pass-with-review-only-findings`는 모든 blocking numerical family가 통과하고 six + local RF/RM findings만 review-only라는 세부 분류로 함께 유지된다. 두 status는 서로 + 모순되지 않으며 `PHYS-STATUS-001`은 해소되었다. +- `requirements.md` metadata의 `status: draft`, `approved_by: pending user re-approval` 및 + `FESA-REQ-NSNR-069`의 historical `draft` 표시는 내용상 physics blocker가 아니다. + Authoritative `coordination.md` Stage 1 record는 현재 requirements SHA-256 + `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E`가 + `2026-08-27` 사용자에게 명시적으로 재승인되었고 Stage 1이 `passed`임을 기록한다. + 따라서 이 stale metadata를 승인 부재로 재해석하지 않는다. + +### 2.2 Solver outputs and logs + +| case | checked authoritative/generated evidence | SHA-256 / observed identity | +| --- | --- | --- | +| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_results.h5` | `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | +| `shellnl-meshfine-s4-final` | build-local `shellNL-meshfine_log.txt` | `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | +| `shellnl-s4-final` | build-local `shellNL_results.h5` | `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; accepted frames 10; unique factor-one frame 9/increment 10; 2 iterations per increment | +| `shellnl-s4-final` | build-local `shellNL_log.txt` | `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906`; 20 entered-iteration records; each increment continues once and accepts on iteration 2 | +| `shell-s4-linear-limit` | build-local `shell_results.h5`, `shell_log.txt` | HDF5 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; zero-byte log `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | + +HDF5는 `reference-comparison.md`에 적힌 build-local exact path에서 직접 읽었다. Optional FESA +debug CSV view는 선언되거나 필요하지 않아 사용하지 않았다. Factor-one +`nodal/displacement`, `global/equilibrium`, `global/energy`, direct shell stress와 +`accepted_frames`를 확인했다. + +### 2.3 Read-only reference evidence + +Canonical reference bundle은 `reference-comparison.md`가 inventoried한 12개 exact file을 사용했다. + +- `reference/shellNL-meshfine/`: input, displacement, reaction, stress inventory +- `reference/shellNL/`: input, displacement, reaction, stress inventory +- `reference/shell/`: linear input, displacement, reaction inventory, stress inventory + +각 SHA-256은 `reference-model.md`와 `reference-comparison.md` inventory에 일치한다. 비교량은 +fine/coarse/linear `U1/U2/U3` blocking, `UR1/UR2/UR3` warning-only, fine/coarse local +`RF1/RF2/RF3`와 physical spatial `RM1/RM2` review-only다. `RM3`와 stored element-corner +stress는 numerical comparison에서 제외되었다. + +Reference model의 목적은 중앙 `DOF 3=-100000` fixed-global dead load를 받고 둘레의 all-six +DOF가 고정된 `10 x 10`, thickness `0.5` square plate의 coarse/fine nonlinear response와 +linear-limit source identity를 검증하는 것이다. Nonlinear cases는 `0.1` 간격으로 factor one까지 +진행한다. + +## 3. Physics Checks + +| physics check | result | evidence and interpretation | +| --- | --- | --- | +| global equilibrium | `pass` | Fine normalized force `2.09625758e-12`, moment `2.74546602e-10`; coarse force `8.25122661e-12`, moment `1.41375091e-10`. 네 값 모두 approved inclusive `<=1e-8`다. HDF5 `/global/equilibrium`은 `location=global-balance-error`, current arm, global origin `[0,0,0]`, spatial moment 의미를 가진다. | +| reaction consistency | `pass` | Applied `F3=-100000`에 대해 constrained-reaction resultant `F3`는 fine/coarse 모두 약 `+100000`이고 다른 force components는 roundoff 수준이다. Applied-plus-reaction force/moment와 accepted free force/moment residual이 각각 blocking gate를 통과했다. Local RF/RM six-family discrepancy는 승인 계약상 review-only nodal redistribution evidence이며 global reaction/resultant identity를 대체하지 않는다. | +| displacement direction | `pass` | Downward load에 대해 node 2 final `U3`는 fine `-2.56338e-5`, coarse `-2.35504e-5`; reference도 각각 `-2.57957054e-5`, `-2.37408203e-5`다. HDF5 path는 factor `0.1..1.0`에서 fine `-2.56338e-6 .. -2.56338e-5`, coarse `-2.35504e-6 .. -2.35504e-5`로 부호 반전·jump·rollback 없이 진행한다. | +| symmetry / expected zero | `pass` | Center node 2의 factor-one `U1/U2`와 rotations는 fine/coarse에서 약 `1e-17` 이하로, centered load와 symmetric all-edge constraint의 expected-zero response와 일치한다. Fresh physics-focused CTest에서 finite rigid objectivity, zero internal force, rigid translation nullspace와 no-moment tangent symmetry checks가 통과했다. | +| element force balance | `covered-by-approved-invariants` | 승인 HDF5에는 standalone element nodal-action balance dataset이 없고 external element-force comparison도 요구되지 않는다. 대신 complete element residual/tangent same-trial identity, patch recovery, stable assembly covariance tests와 accepted global/free equilibrium gate가 문서화된 expectation을 충족한다. 별도 element-force output을 invent하지 않았다. | +| stress/strain | `pass-sanity-evidence` | HDF5 direct fixed-reference Gauss stress는 finite다. Element 1/GP1의 `[S11,S22,S12]`는 fine bottom `[-264846,-77843.6,914.879]`, middle `[1.94695,0.530775,-0.0224511]`, top `[264850,77844.8,-914.925]`; coarse도 bottom/top sign이 반대이고 middle이 작아 centered plate bending sign/thickness pattern과 일치한다. Stored CSV는 corner/SPOS-SNEG identity로 위치가 달라 numerical stress comparison이 승인되지 않았으므로 이를 tolerance pass로 재분류하지 않는다. | +| rigid body mode | `pass` | 둘레 all-six-DOF support가 global rigid-body motion을 제거하고, accepted path에 비정상 large translation 또는 singular/nonfinite 증상이 없다. Fresh focused tests에서 proper triad/director, finite rigid objectivity, zero internal force, rigid nullspace와 invalid branch rejection을 확인했다. | +| energy/residual | `pass-sanity-evidence` | Factor-one physical strain energy는 fine `1.28169`, coarse `1.17752`로 finite positive이며 near-linear relation `0.5*100000*abs(U3_center)`와 일치한다. 이는 secondary sanity evidence이고 승인 energy convergence gate는 아니다. Fine/coarse accepted free force/moment residual은 NSNR-069 blocking gate를 통과했고 log에는 nonfinite/failed accepted state가 없다. | +| model coverage | `pass` | Fine 729-node/676-element primary, coarse 49-node/36-element companion, linear control과 internal linear-limit/tangent/objectivity/patch/rollback portfolio가 승인 NSNR-030 scope를 덮는다. Stored response는 weak geometric-nonlinear regime이고 original-style MITC4의 curved/distorted membrane-locking risk는 알려진 한계지만 Numerical Review가 이번 release의 additional benchmark/convergence gate로 승인하지 않았으므로 model-coverage gap을 새로 만들지 않는다. | + +Fresh physics-focused verification command: + +```powershell +ctest --preset windows-msvc-ninja-debug -R '^(NonlinearMitc4Shell|NonlinearMitc4Recovery|NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch|FiniteRotation|NonlinearStaticProcedure)\.' --output-on-failure +``` + +Result: `23/23` passed, exit `0`, total real time `5.12 s`. + +## 4. Failure Classification + +- blocking classification: 없음 +- resolved finding: `PHYS-STATUS-001`; corrected `reference-comparison.md`가 required overall + `pass-for-physics-evaluation` handoff와 detailed + `blocking-pass-with-review-only-findings` verdict의 관계를 명시했다. +- observed failures: `equilibrium-failure`, `reaction-inconsistency`, + `displacement-direction-failure`, `symmetry-failure`, `stress-location-failure`, + `element-force-inconsistency`, `rigid-body-mode-suspected`, `nonfinite-result`, + `model-coverage-gap`, `upstream-contract`, `environment` 모두 없음. + +## 5. Evaluation Verdict + +- verdict: `pass-for-release-agent` +- physics evidence disposition: documented equilibrium, reaction, displacement, symmetry/objectivity, + stress/strain sanity, rigid-body, residual/path and model-coverage checks show no physical failure. +- pass disposition: documented physical expectations passed and no physics/model-coverage/I/O/upstream + blocker remains. +- release meaning: this verdict authorizes Release Agent evaluation through Coordinator only. It is + not Release approval, publish/deploy/package/tag authorization, or external-solver equivalence. + +## 6. Handoff Recommendation + +- handoff: `Release Agent`, always through `Coordinator Agent` +- recommendation: Release Agent는 current approved hashes, Stage 6 + `pass-for-physics-evaluation`, 이 문서의 `pass-for-release-agent`, known limitations와 + review-only findings를 사용해 release readiness만 audit한다. +- boundary: Physics Evaluation Agent는 release readiness, final release checklist, release notes, + publish/deploy/package/tag를 승인하지 않는다. + +## 7. No-Change Assertion + +이 Stage 7 작업은 `docs/nonlinear-static-newton-raphson/physics-evaluation.md`만 생성했다. +Source code, tests, CMake, Harness, requirements, research, formulation, numerical review, +reference model, I/O contract, implementation reports, reference artifacts와 tolerance policy를 +수정하지 않았다. Abaqus, Nastran 또는 다른 reference solver를 실행하지 않았다. + +## 8. Open Issues + +| id | severity | issue | gate effect | +| --- | --- | --- | --- | +| `PHYS-META-001` | nonblocking | `requirements.md`의 draft/pending metadata가 authoritative Coordinator/user reapproval record와 stale함 | 현재 hash의 explicit approval로 physics authority는 해소됨; Release traceability audit에서 투명하게 유지 | +| `PHYS-LOCAL-001` | nonblocking | six local RF/RM families have review-only discrepancies | approved disposition 유지; global force/moment balance와 free residual을 blocking evidence로 사용 | +| `PHYS-STRESS-001` | nonblocking | stored corner/SPOS-SNEG stress와 FESA direct Gauss recovery 위치가 다르고 fine optional stress row 하나의 node label이 malformed | stress numerical comparison 제외 유지; artifact를 repair하지 않음 | +| `PHYS-LIMIT-001` | known limitation | stored cases are weak geometric-nonlinear plate responses; original MITC4 has known curved/distorted membrane-locking risk | approved current portfolio에서는 blocker 아님; broader claim 금지 | diff --git a/docs/nonlinear-static-newton-raphson/reference-comparison.md b/docs/nonlinear-static-newton-raphson/reference-comparison.md new file mode 100644 index 0000000..22e156f --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/reference-comparison.md @@ -0,0 +1,112 @@ +# Nonlinear Static Newton-Raphson Reference Comparison + +## Verdict + +`blocking-pass-with-review-only-findings`. FESA HDF5 is the authoritative solver output. The +Abaqus CSV files are read-only external comparison evidence; the observed agreement does not imply +Abaqus S4 internal formulation, integration, stabilization, or recovery equivalence. + +Overall handoff status: `pass-for-physics-evaluation`. This handoff classification records that +all blocking comparisons passed; the detailed verdict above remains +`blocking-pass-with-review-only-findings` because the six local RF/RM findings are review-only. + +The literal execution order was `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. + +The `COMPARE` commands were +`ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure` +(exit 0, 905.404 s, 9/9 passed), followed by +`ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure` +(exit 0, 930.617 s, 9/9 matched tests passed). The fresh full CTest run then passed 302/302; +its command and output tail are recorded in `build-test.md`. + +## Artifact check + +Every input, displacement CSV, reaction CSV, and stress-inventory CSV was readable, finite where +required, unique by declared source key, and identical before and after all copied-input executions. + +| case / role | exact path | bytes | pre/post UTC mtime | SHA-256 | +| --- | --- | ---: | --- | --- | +| fine primary input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `2026-08-25T13:53:49.1919675Z` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| fine U | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `2026-08-25T14:06:00.1262830Z` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| fine local reaction | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 108,951 | `2026-08-25T14:05:06.2950127Z` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | +| fine stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 1,036,869 | `2026-08-25T14:04:24.2027682Z` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | +| coarse companion input | `reference/shellNL/shellNL.inp` | 4,778 | `2026-08-23T16:36:23.9302881Z` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | +| coarse U | `reference/shellNL/shellNL displacements.csv` | 7,542 | `2026-08-23T16:36:23.9282815Z` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| coarse local reaction | `reference/shellNL/shellNL reactions.csv` | 7,443 | `2026-08-23T16:36:23.9292877Z` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | +| coarse stress inventory | `reference/shellNL/shellNL stresses.csv` | 54,720 | `2026-08-23T16:36:23.9302881Z` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | +| linear control input | `reference/shell/shell.inp` | 4,770 | `2026-08-23T16:36:23.9272805Z` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | +| linear U | `reference/shell/shell displacements.csv` | 5,592 | `2026-08-23T16:36:23.9262810Z` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | +| linear reaction inventory | `reference/shell/shell reactions.csv` | 5,524 | `2026-08-23T16:36:23.9262810Z` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | +| linear stress inventory | `reference/shell/shell stresses.csv` | 43,502 | `2026-08-23T16:36:23.9272805Z` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | + +Fine and coarse required nonlinear CSV rows had exact `Frame=Increment 10: Step Time = 1.000`. +The HDF5 `/steps/Step-1/accepted_frames` table had exactly one factor-one row: frame 9, increment +10, load factor 1.0, two Newton iterations. Reference copies and generated artifacts were confined +to these build-local directories: + +| case | copied input | generated results / log | +| --- | --- | --- | +| fine | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_results.h5`, SHA-256 `2E9817E173D73FD91C2D34864B69A1EC37483CB25951FB7CCE85895A6C87D2C6`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL-meshfine/shellnl-meshfine-s4-final-72767400538200-0/shellNL-meshfine_log.txt`, SHA-256 `1DB6FE4AAA2F1443ACC7F9B3F919CC8DD873C90392121DAB6509F1693435DA27` | +| coarse | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_results.h5`, SHA-256 `130E2E7B73B022F216A7A34C88D58114A62595ADD556A0D202B8A7FAC7391F39`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-73175241456500-1/shellNL_log.txt`, SHA-256 `3D5C4F1B20384655F9012ADE842B99E3B06B3799FC9AB16DD6FD141E18B77906` | +| linear | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell.inp` | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_results.h5`, SHA-256 `8AEE34D5BC80382D7E6DE85C51F0F8BCBF451CD5F5C7B8DDA6C585EB22B31763`; `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shell/shell-s4-linear-limit-72742739390700-2/shell_log.txt`, zero bytes, SHA-256 `E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855` | + +## Compare and classify + +Rows were matched by `(case_id, accepted_state, canonical_instance_name, source_node_label, +component)`, never CSV order. Required HDF5 projections were factor-one +`/steps/Step-1/frames/9/nodal/displacement`, `generalized_internal_force`, +`generalized_external_force`, `generalized_residual`, `reaction`, `/model/nodal_constraint_mask`, +and `/global/equilibrium`; the linear control uses `/steps/Step-1/frames/0/nodal/displacement`. +All required source keys, components, uniqueness and finite checks passed before tolerance. + +External families use `docs/TOLERANCE.md`: reference-only scale, near-zero band `0.01*S`, row +relative limit `0.05`, and family RMS limit `0.01`. `rows passed` is the deterministic per-row +decision count; U is blocking and UR is warning-only. + +| family | disposition | rows passed | scale | max abs | max relative | relative RMS | result | +| --- | --- | ---: | ---: | ---: | ---: | ---: | --- | +| fine.translation | blocking | 2187/2187 | 2.57957054e-05 | 1.6193812501e-07 | 6.27771648e-03 | 2.27230258e-04 | pass | +| fine.rotation | warning-only | 2187/2187 | 6.58704994e-06 | 3.0109969916e-08 | 3.54510604e-02 | 4.68253850e-04 | pass | +| coarse.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037855439e-07 | 8.57111694e-03 | 1.03327572e-03 | pass | +| coarse.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828551252e-08 | 4.69071871e-02 | 2.97713732e-03 | pass | +| linear.translation | blocking | 147/147 | 2.37408203e-05 | 1.9037853492e-07 | 8.57111604e-03 | 1.03327567e-03 | pass | +| linear.rotation | warning-only | 147/147 | 7.60725743e-06 | 6.8828549627e-08 | 4.69071860e-02 | 2.97713730e-03 | pass | + +Worst absolute rows were fine U `PART-1-1/node 2/U3`, fine UR +`PART-1-1/node 442/UR1`, coarse U `PART-1-1/node 2/U3`, coarse UR +`PART-1-1/node 37/UR1`, linear U `PART-1-1/node 2/U3`, and linear UR +`PART-1-1/node 44/UR1`. No warning-only family failed. + +The eight blocking internal families are independent of Abaqus CSV tolerance. + +| family | rows | numerator | scale | metric | gate | result | +| --- | ---: | ---: | ---: | ---: | --- | --- | +| fine.global_force_balance | 3 | 2.6775524023e-07 | 1.2773012379e+05 | 2.09625758e-12 | `<=1e-8` | pass | +| fine.global_moment_balance | 3 | 1.3258637157e-04 | 4.8292847478e+05 | 2.74546602e-10 | `<=1e-8` | pass | +| fine.accepted_free_force_residual | 1875 | 3.8659904671e-03 | 1.0000000000e+05 | 3.86599047e-08 | `<=1e-2` | pass | +| fine.accepted_free_moment_residual | 1875 | 1.3760745787e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | +| coarse.global_force_balance | 3 | 8.2512269735e-07 | 1.0000000439e+05 | 8.25122661e-12 | `<=1e-8` | pass | +| coarse.global_moment_balance | 3 | 4.1788609354e-05 | 2.9558678960e+05 | 1.41375091e-10 | `<=1e-8` | pass | +| coarse.accepted_free_force_residual | 75 | 3.1462885132e-02 | 1.0000000000e+05 | 3.14628851e-07 | `<=1e-2` | pass | +| coarse.accepted_free_moment_residual | 75 | 3.3292052422e-06 | 0 | exact-zero typed `<=1e-3` | exact-zero branch | pass | + +The constrained-reaction resultant remains a distinct review summary: fine force +`[1.2306822228e-12, -3.5943123478e-12, 1.0000000000e+05]`, moment +`[2.7057467378e-11, -5.6934368331e-10, -1.3258637157e-04]`; coarse force +`[7.9591888635e-12, 7.2906680693e-12, 1.0000000000e+05]`, moment +`[-1.7826096155e-10, -2.5829649530e-10, -4.1788609352e-05]`. + +Local reaction RF/RM source-key/inventory/finite prechecks passed, but the following direct +row/RMS findings remain review-only and therefore do not change the blocking classification. + +| review family | rows passed | relative RMS | worst absolute row | finding | +| --- | ---: | ---: | --- | --- | +| coarse in-plane RF | 4/48 | 1.1437709953e-01 | node 3/RF1, 5.3914239451e-01 | review-only failure | +| coarse RF3 | 4/24 | 4.8448360241e-02 | node 31/RF3, 7.1995422354e+02 | review-only failure | +| coarse physical RM1/RM2 | 32/48 | 2.7464126167e-02 | node 22/RM1, 1.0484921048e+03 | review-only failure | +| fine in-plane RF | 12/208 | 1.1971372918e-01 | node 1/RF2, 1.5298653299e-01 | review-only failure | +| fine RF3 | 92/104 | 5.3476362434e-03 | node 9/RF3, 4.6176964624e+01 | review-only row failure | +| fine physical RM1/RM2 | 112/208 | 3.3719303859e-03 | node 52/RM2, 3.1549617088e+01 | review-only row failure | + +`RM3` and stress were not numerically compared. Artifact inventory, byte size, timestamp, and +SHA-256 equality before/after all runs prove that no reference artifact changed. diff --git a/docs/nonlinear-static-newton-raphson/reference-model.md b/docs/nonlinear-static-newton-raphson/reference-model.md index fb5416c..dd4cf4b 100644 --- a/docs/nonlinear-static-newton-raphson/reference-model.md +++ b/docs/nonlinear-static-newton-raphson/reference-model.md @@ -4,234 +4,343 @@ - feature_id: `nonlinear-static-newton-raphson` - source_requirements: `docs/nonlinear-static-newton-raphson/requirements.md` +- source_requirements_sha256: `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` - source_research: `docs/nonlinear-static-newton-raphson/research.md` - source_formulation: `docs/nonlinear-static-newton-raphson/formulation.md` - source_numerical_review: `docs/nonlinear-static-newton-raphson/numerical-review.md` +- decision_source: `USER-DECISION-004 option 1` +- balance_gate_decision: user-approved factor-one global force/moment normalized gate `<=1e-8` - status: `pass-for-io-definition` - owner_agent: `numerical-review-agent` -- date: `2026-08-23` +- date: `2026-08-28` +- post_closure_addendum_date: `2026-08-29` +- post_closure_additive_case: `shellnl-meshfine-02-s4-final` - artifact_policy: `read-only-existing-files` -- tolerance_policy: `docs/TOLERANCE.md` +- external_tolerance_policy: `docs/TOLERANCE.md` -이 문서는 logical reference quantity, source identity, component matching, row precheck와 -blocking/warning 분류만 정의한다. 최종 HDF5 dataset projection은 I/O Definition Agent 소유다. +이 문서는 logical quantity, source identity, component matching, row precheck와 +blocking/warning-only/review-only 분류를 정의한다. 최종 HDF5 dataset projection은 I/O +Definition Agent 소유이며 이 문서에는 dataset path를 정의하지 않는다. ## 2. Reference Acceptance Scope -Required scope는 두 stored case다. +승인 closure 계약의 세 stored case를 유지하고 merge 후 별도 검증할 한 case를 추가한다. -- `shellnl-s4-final`: `nlgeom=YES` nonlinear static S4 final accepted state를 비교하는 - primary external reference case. -- `shell-s4-linear-limit`: 같은 S4 mesh의 `nlgeom=NO` read-only linear-limit/reference-identity - regression case. 이 case는 nonlinear response evidence가 아니며, 현재 stress CSV의 element-label - ordering을 row-order matching으로 사용하지 않는다. +- `shellnl-meshfine-s4-final`: 사용자가 추가하고 검증을 요청한 729-node/676-element + mesh-refined nonlinear primary case. External `U1/U2/U3`와 factor-one internal equilibrium은 + blocking이다. +- `shellnl-s4-final`: 49-node/36-element coarse nonlinear companion regression. Fine case와 + 별도 reference에 대해 external `U1/U2/U3`와 factor-one internal equilibrium을 blocking으로 + 검증한다. +- `shell-s4-linear-limit`: 같은 coarse topology의 `NLGEOM=NO` linear-limit/source-identity + regression. Nonlinear response evidence로 부르지 않는다. +- `shellnl-meshfine-02-s4-final`: 729-node/676-element post-closure nonlinear additive case. + 과거 canonical Stage 6 `reference-comparison.md`에는 포함되지 않았으며 merge된 current code로 + 별도 verification한다. 이 pending comparison은 기존 세 case의 승인 gate 또는 Release verdict를 + 소급 변경하지 않는다. -`shellNL`은 final-state reference comparison에는 충분하지만 weak nonlinear response다. Dominant -`U3`/stress 값이 linear case와 거의 같으므로 finite-rotation objectivity, consistent tangent, -commit/rollback과 convergence lifecycle은 `numerical-review.md`의 blocking internal tests로 검증한다. +모든 selected case에서 displacement `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 +warning-only다. Coarse/fine/post-closure local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 +common external policy로 exact error/precheck evidence를 만들되 review-only이고 전체 blocking +verdict를 바꾸지 않는다. Local `RM3`와 stress는 numerical comparison에서 제외한다. -## 3. Reference Case Inventory with exact input and required CSV paths +Coarse와 fine은 각자의 input/CSV에 독립적으로 비교한다. 두 mesh 사이 node interpolation, +row pairing, averaging, collapse, observed convergence order 또는 direct coarse/fine equality +gate를 만들지 않는다. Fine case 추가는 Abaqus S4와 FESA MITC4의 element formulation, +integration, stabilization 또는 internal behavior equivalence를 의미하지 않는다. +`shellnl-meshfine-02-s4-final`도 자기 input/CSV에만 독립적으로 비교하고 기존 fine case와 +cross-case equality 또는 mesh-convergence gate를 만들지 않는다. -| case id | artifact role | required comparison artifact | exact path | observed status | +## 3. Reference Case Inventory + +### 3.1 Exact input and CSV paths + +| case id | purpose | exact path | required disposition | observed status | | --- | --- | --- | --- | --- | -| `shellnl-s4-final` | nonlinear input | yes | `reference/shellNL/shellNL.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` | -| `shellnl-s4-final` | displacement reference | yes | `reference/shellNL/shellNL displacements.csv` | 49 finite unique node rows; one factor-one Frame | -| `shellnl-s4-final` | reaction reference | yes | `reference/shellNL/shellNL reactions.csv` | 49 finite unique node rows; one factor-one Frame | -| `shellnl-s4-final` | stress review evidence | no | `reference/shellNL/shellNL stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks | -| `shell-s4-linear-limit` | linear control input | yes | `reference/shell/shell.inp` | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` | -| `shell-s4-linear-limit` | displacement reference | yes | `reference/shell/shell displacements.csv` | 49 finite unique node rows; no `Frame` column | -| `shell-s4-linear-limit` | reaction review evidence | no | `reference/shell/shell reactions.csv` | 49 finite unique node rows | -| `shell-s4-linear-limit` | stress review evidence | no | `reference/shell/shell stresses.csv` | 288 finite unique rows; element labels `1..36` in stored ascending blocks | +| `shell-s4-linear-limit` | linear input | `reference/shell/shell.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=NO` | +| `shell-s4-linear-limit` | displacement reference | `reference/shell/shell displacements.csv` | required blocking/warning | 49 unique finite rows; single final static state | +| `shell-s4-linear-limit` | reaction inventory | `reference/shell/shell reactions.csv` | inspection-only | 49 unique finite rows | +| `shell-s4-linear-limit` | stress ordering inventory | `reference/shell/shell stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks | +| `shellnl-s4-final` | coarse nonlinear input | `reference/shellNL/shellNL.inp` | required | readable; S4, 49 nodes, 36 elements, `NLGEOM=YES` | +| `shellnl-s4-final` | displacement reference | `reference/shellNL/shellNL displacements.csv` | required blocking/warning | 49 unique finite rows; exact factor-one Frame | +| `shellnl-s4-final` | local reaction reference | `reference/shellNL/shellNL reactions.csv` | required review-only | 49 unique finite inventory rows; exact factor-one Frame | +| `shellnl-s4-final` | stress inventory | `reference/shellNL/shellNL stresses.csv` | optional inspection | 288 rows; element labels `1..36` in contiguous ascending blocks | +| `shellnl-meshfine-s4-final` | fine nonlinear input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | required | readable; S4, 729 nodes, 676 elements, `NLGEOM=YES` | +| `shellnl-meshfine-s4-final` | displacement reference | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | required blocking/warning | 729 unique finite rows; exact factor-one Frame | +| `shellnl-meshfine-s4-final` | local reaction reference | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | required review-only | 729 unique finite inventory rows; exact factor-one Frame | +| `shellnl-meshfine-s4-final` | stress inventory | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | optional inspection | 5,408 rows in ascending element blocks; one malformed optional node label `ss` | +| `shellnl-meshfine-02-s4-final` | post-closure nonlinear input | `reference/shellNL-meshfine_02/shellNL-meshfine_02.inp` | required for separate verification | readable; S4, 729 nodes, 676 elements, `NLGEOM=YES` | +| `shellnl-meshfine-02-s4-final` | displacement reference | `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | required blocking/warning | 729 unique finite rows; exact factor-one Frame | +| `shellnl-meshfine-02-s4-final` | local reaction reference | `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | required review-only | 729 unique finite inventory rows; exact factor-one Frame | +| `shellnl-meshfine-02-s4-final` | stress inventory | `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | optional inspection | 5,408 unique finite inventory rows; excluded from numerical comparison | -`required comparison artifact=no`인 파일도 이번 review에서 읽기 가능성, row identity, -finite values와 current ordering을 확인했다. 그러나 해당 파일은 missing-required-artifact -판정이나 tolerance family를 만들지 않는다. +`reference/shell/shell stresses.csv`는 사용자 변경 후 element label `1..36` 순서로 저장되어 +있음을 확인했다. Row order는 matching identity가 아니며 deterministic inspection display에만 +사용한다. Fine stress의 `Element Label=1`, `SNEG`, `Node Label=ss` 한 행은 optional excluded +artifact issue다. 이 파일을 rename, repair, normalize 또는 rewrite하지 않는다. -두 `.inp`는 같은 node/element/connectivity, material/section, instance, boundary와 center-node -`CLOAD`를 사용한다. Text 차이는 heading identity, `NLGEOM=NO -> YES`, 그리고 `*STATIC` -data `1.,1.,1e-05,1. -> 0.1,1.,0.001,0.1`이다. 따라서 `shellNL`은 실제 nonlinear -selector와 승인된 fixed increment `0.1`을 갖지만, 두 deck 차이를 오직 `NLGEOM` 하나의 -isolated effect라고 표현하지 않는다. +Coarse와 fine nonlinear input은 homogeneous isotropic material `E=2.1e11`, `nu=0.3`, +shell thickness `0.5`, center node-set load `DOF 3 = -100000`, all-six-DOF perimeter support, +`*STATIC 0.1,1.,0.001,0.1`을 사용한다. Fine case는 같은 physical setup의 refined topology다. -Read-only SHA-256 observations: +Post-closure `_02` input은 같은 fine topology, material, section, `Set-2` 104-node all-six-DOF +support와 `*STATIC`을 사용하지만 source load는 `F1=+1e8`, `F2=+1e8`, `F3=-1e8`이다. +따라서 기존 fine case의 `F3=-1e5`와 동일 case로 취급하지 않는다. -| path | SHA-256 | +### 3.2 Read-only artifact hashes + +| exact path | SHA-256 | | --- | --- | -| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | | `reference/shell/shell.inp` | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | | `reference/shell/shell displacements.csv` | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | | `reference/shell/shell reactions.csv` | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | | `reference/shell/shell stresses.csv` | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | +| `reference/shellNL/shellNL.inp` | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | +| `reference/shellNL/shellNL displacements.csv` | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| `reference/shellNL/shellNL reactions.csv` | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | +| `reference/shellNL/shellNL stresses.csv` | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | +| `reference/shellNL-meshfine/shellNL-meshfine.inp` | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | +| `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02.inp` | `DAEC7592489837B165D55382CAEAF53E21D84D804AA38C73CBF35E5CC0BAC3E5` | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | `18EC051D265E0BD2C441FE73C08E097B83EE85BC2EB32FFBE3AF0DCB9CB89672` | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | `59348996E0CE80687C9EB2747EEABF84ACED4CE97F8A56F0FFDDBDCA404A57A3` | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | `933A72025A0E897FD65F81C913E53D1730BD551CE95CBDEA96F9F99B10BE8B18` | + +Post-closure artifact byte counts는 input `56,554`, displacement `110,555`, reaction +`109,000`, stress `1,036,916`이다. Hash와 byte count는 read-only audit evidence이며 artifact를 +rewrite하거나 canonical Stage 6 evidence로 소급 재분류하지 않는다. ## 4. Source Identity and Component Contract -### 4.1 Accepted-state identity +### 4.1 Case and accepted-state identity -- Abaqus identifiers are case-insensitive semantic identities. Input spelling - `Part-1-1` and CSV spelling `PART-1-1` match as one instance while original text is - retained in artifacts and reports; no file or row is rewritten. -- `shellnl-s4-final` rows require exact CSV `Frame` value - `Increment 10: Step Time = 1.000`, mapped logically to the accepted factor-one state. -- `shell-s4-linear-limit` rows have no `Frame` column and map to the single final static state. -- Row order is never a matching identity. It may only be used for deterministic reporting after - source keys are matched. +- Instance identity는 case-insensitive semantic match다. Artifact spelling `Part-1-1`과 + `PART-1-1`은 같은 instance이지만 file text를 rewrite하지 않는다. +- 세 nonlinear case required rows의 exact CSV Frame은 + `Increment 10: Step Time = 1.000`이며 accepted factor-one state에 대응한다. +- Linear case에는 `Frame` column이 없고 single final static state로 해석한다. +- Row order는 identity가 아니다. Stable key match 후 deterministic reporting order로만 정렬한다. -### 4.2 Nodal displacement contract +### 4.2 Nodal displacement and rotation -Required mapping is `U-U1/U-U2/U-U3 -> U1/U2/U3` and -`UR-UR1/UR-UR2/UR-UR3 -> UR1/UR2/UR3`. U is global length; UR is the -dimensionless fixed-initial global rotation-vector output. Logical key is +CSV `U-U1/U-U2/U-U3`는 logical `U1/U2/U3`, `UR-UR1/UR-UR2/UR-UR3`는 +logical `UR1/UR2/UR3`에 대응한다. Key는 ```text (case_id, accepted_state, canonical_instance_name, source_node_label, component) ``` -Both cases require source node labels `1..49` exactly once. U components form one -blocking translation family and UR components form one warning-only rotation family, -preserving the project MITC4 classification. +이다. Coarse/linear은 labels `1..49`, fine과 post-closure `_02`는 `1..729`를 각각 정확히 한 번 요구한다. +U는 global length/blocking, UR은 fixed-initial global rotation-vector/warning-only다. -### 4.3 Nonlinear reaction contract +### 4.3 Local reaction review contract -Reaction comparison applies only to `shellnl-s4-final` and only to the input boundary -`Set-2` nodes: +Reaction source rows는 input `Set-2` constraint mask로 선택한다. -```text -1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33 -``` +- coarse: `1, 3..9, 14..17, 22..33` — 24 nodes, all six DOFs constrained. +- fine: `1, 3..9, 34..57, 82..153` — 104 nodes, all six DOFs constrained. +- post-closure `_02`: fine과 같은 exact `Set-2` inventory — 104 nodes, all six DOFs constrained. -All six global components are constrained at these 24 nodes. Other CSV node rows remain -part of file/schema/finite inventory but are not numerical reaction rows: FESA free entries -are equilibrium residual evidence, not Abaqus free-node zero reactions. +다른 CSV node rows는 file/schema/finite inventory지만 local reaction numerical rows가 아니다. +Free FESA entries는 reaction이 아니라 accepted free residual evidence다. -| CSV components | logical quantity | FESA meaning | disposition | +| CSV components | logical quantity | matching FESA meaning | disposition | | --- | --- | --- | --- | -| `RF-RF1`, `RF-RF2` | fixed-initial shell-plane reaction force | constrained translational full residual, global force | blocking family | -| `RF-RF3` | fixed-initial transverse reaction force | constrained translational full residual, global force | blocking family | -| `RM-RM1`, `RM-RM2` | tangent-plane spatial reaction moment | `J_l(phi)^(-T)` conversion of the constrained generalized reaction, global force-length | blocking family | -| `RM-RM3` | director/drilling-axis reaction review value | stabilization-dependent; no physical external equivalence target | excluded | +| `RF-RF1`, `RF-RF2` | in-plane local reaction force | constrained translational full residual, global force | `review-only` | +| `RF-RF3` | transverse local reaction force | constrained translational full residual, global force | `review-only` | +| `RM-RM1`, `RM-RM2` | tangent-plane physical reaction moment | constrained generalized residual converted by `J_l(phi)^(-T)`, global spatial force-length | `review-only` | +| `RM-RM3` | director/drilling-axis row | no approved physical external equivalence target | `excluded` | -In-plane and transverse force are distinct model-fixed logical projections and therefore -use distinct families. Raw generalized rotation-coordinate residual is not matched directly -to the CSV `RM` value. +Raw generalized rotational residual을 CSV RM에 직접 match하지 않는다. Review-only는 row omission을 +허용한다는 뜻이 아니다. Exact row precheck와 common-policy error/RMS를 모두 보고하되 그 결과가 +blocking verdict를 변경하지 않는다는 뜻이다. -### 4.4 Stress review identity and comparison exclusion +### 4.4 Distinct factor-one equilibrium quantities -Stress rows have read-only identity +각 nonlinear case에서 같은 accepted factor-one state를 사용한다. + +| logical quantity | source identity / projection | components | disposition | +| --- | --- | --- | --- | +| accepted free residual | input mask로 결정한 stable free `(instance,node,global DOF component)` rows; force와 moment channel 분리 | free `UX/UY/UZ`; free `URX/URY/URZ` generalized covectors | `blocking-internal` | +| constrained reaction resultant | constrained source rows만 current arm과 spatial physical moment로 합산 | force `[1,2,3]`; moment `[1,2,3]` | `review-only-summary` | +| applied-plus-reaction balance error | all resolved applied sources plus constrained reactions; global origin `[0,0,0]`; `x=X+u`; physical spatial nodal moments | force `[1,2,3]`; moment `[1,2,3]` | `blocking-internal` | + +Constrained reaction resultant force is `sum(F_react)`. Its moment is +`sum(x cross F_react + M_react)`. Balance error adds the corresponding applied force and +`x cross F_appl + M_appl`. Accepted free residual is neither sum. 세 quantity는 exact +source/state identity를 공유하지만 interchangeable하지 않다. + +현재 stored case의 constrained prescribed `u=phi=0` 때문에 support current arm과 initial arm, +generalized moment와 spatial moment가 수치적으로 일치한다. 이는 supported general nonzero +prescribed translation/rotation에서 initial arm/raw rotational residual을 재사용할 근거가 아니다. + +### 4.5 Stress inventory and exclusion + +Stress inspection key는 ```text (case_id, accepted_state, instance, element label, element-corner node label, SPOS/SNEG section surface, component) ``` -Every current element has its four connectivity nodes and one `SPOS` plus one `SNEG` -row per node. The files are ordered in contiguous ascending element-label blocks `1..36`; -this exact artifact order is retained and no node/surface secondary reorder is applied. +이다. Stored stress는 element-corner SPOS/SNEG rows이고 FESA 승인 recovery는 midsurface Gauss +locations의 direct bottom/middle/top `[S11,S22,S12]`다. Nodal extrapolation/averaging을 만들지 +않으며 `S-S11/S-S22/S-S12/S-S33` 어느 것도 external family에 포함하지 않는다. -The identity is nevertheless not the approved FESA recovery location: FESA emits direct -`[S11,S22,S12]` at four midsurface Gauss locations and bottom/middle/top positions, without -nodal extrapolation or averaging, and does not emit `S33`. Consequently no stress column -forms a blocking or warning-only comparison family. Stress files remain optional read-only -review evidence only. +### 4.6 External comparison families -### 4.5 Comparison families - -| family id | components and source set | row count | units / coordinates | disposition | +| family id | components / source rows | rows | units / coordinates | disposition | | --- | --- | ---: | --- | --- | -| `linear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking regression | -| `linear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only | -| `nonlinear.translation` | `U1,U2,U3`, nodes `1..49` | 147 | length / global | blocking | -| `nonlinear.rotation` | `UR1,UR2,UR3`, nodes `1..49` | 147 | dimensionless / fixed-initial global | warning-only | -| `nonlinear.reaction_inplane_force` | `RF1,RF2`, 24 constrained nodes | 48 | force / fixed-initial global plane | blocking | -| `nonlinear.reaction_transverse_force` | `RF3`, 24 constrained nodes | 24 | force / fixed-initial global transverse | blocking | -| `nonlinear.reaction_physical_moment` | `RM1,RM2`, 24 constrained nodes | 48 | force-length / global spatial | blocking | +| `linear.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` | +| `linear.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` | +| `coarse.translation` | U1/U2/U3; nodes `1..49` | 147 | length / global | `blocking` | +| `coarse.rotation` | UR1/UR2/UR3; nodes `1..49` | 147 | dimensionless / fixed-initial global | `warning-only` | +| `coarse.local_reaction_inplane_force` | RF1/RF2; 24 constrained nodes | 48 | force / global shell plane | `review-only` | +| `coarse.local_reaction_transverse_force` | RF3; 24 constrained nodes | 24 | force / global transverse | `review-only` | +| `coarse.local_reaction_physical_moment` | RM1/RM2; 24 constrained nodes | 48 | force-length / global spatial | `review-only` | +| `fine.translation` | U1/U2/U3; nodes `1..729` | 2,187 | length / global | `blocking` | +| `fine.rotation` | UR1/UR2/UR3; nodes `1..729` | 2,187 | dimensionless / fixed-initial global | `warning-only` | +| `fine.local_reaction_inplane_force` | RF1/RF2; 104 constrained nodes | 208 | force / global shell plane | `review-only` | +| `fine.local_reaction_transverse_force` | RF3; 104 constrained nodes | 104 | force / global transverse | `review-only` | +| `fine.local_reaction_physical_moment` | RM1/RM2; 104 constrained nodes | 208 | force-length / global spatial | `review-only` | +| `meshfine02.translation` | U1/U2/U3; nodes `1..729` | 2,187 | length / global | `blocking` | +| `meshfine02.rotation` | UR1/UR2/UR3; nodes `1..729` | 2,187 | dimensionless / fixed-initial global | `warning-only` | +| `meshfine02.local_reaction_inplane_force` | RF1/RF2; 104 constrained nodes | 208 | force / global shell plane | `review-only` | +| `meshfine02.local_reaction_transverse_force` | RF3; 104 constrained nodes | 104 | force / global transverse | `review-only` | +| `meshfine02.local_reaction_physical_moment` | RM1/RM2; 104 constrained nodes | 208 | force-length / global spatial | `review-only` | + +### 4.7 Internal blocking verification families + +| family id | exact rows/components | gate | +| --- | --- | --- | +| `coarse.accepted_free_force_residual` | 75 free translation DOFs | NSNR-069 force channel, factor one | +| `coarse.accepted_free_moment_residual` | 75 free rotation DOFs | NSNR-069 moment channel, factor one | +| `coarse.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` | +| `coarse.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` | +| `fine.accepted_free_force_residual` | 1,875 free translation DOFs | NSNR-069 force channel, factor one | +| `fine.accepted_free_moment_residual` | 1,875 free rotation DOFs | NSNR-069 moment channel, factor one | +| `fine.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` | +| `fine.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` | +| `meshfine02.accepted_free_force_residual` | 1,875 free translation DOFs | NSNR-069 force channel, factor one | +| `meshfine02.accepted_free_moment_residual` | 1,875 free rotation DOFs | NSNR-069 moment channel, factor one | +| `meshfine02.global_force_balance` | 3 global balance-error components | normalized `<=1e-8` | +| `meshfine02.global_moment_balance` | 3 global balance-error components | normalized `<=1e-8` | + +이 internal families에는 Abaqus CSV value 또는 `docs/TOLERANCE.md`를 적용하지 않는다. +Approved analytical/invariant gates이며 exact definitions는 `numerical-review.md` §6.2다. ## 5. Row Prechecks -Before tolerance, the comparator shall fail the affected comparison if any required condition -below is false. +Tolerance 또는 internal metric 전에 다음을 검사한다. -1. Exact declared input path and every `required comparison artifact=yes` CSV path for the - case exist and are readable. -2. Required headers are present after trimming surrounding whitespace from header names. -3. `shellnl-s4-final` contains only the exact required `Frame` value for required rows. -4. Wide CSV rows expand to component rows using the component contract in Section 4. -5. Required source row keys are unique. Duplicate wide keys or duplicate expanded component keys fail. -6. Displacement projection requires all 49 source nodes and declared components. Nonlinear - reaction projection derives the exact 24-node/component set from the input constraint mask; - it does not infer reaction identity from CSV zero values. -7. FESA and reference required projected row-key sets are exactly equal: missing and extra rows - both fail. -8. Every required numeric value is finite. Nonfinite required FESA or CSV value fails before tolerance. -9. Optional stress inventory uses `(instance, element label, node label, section point)` and verifies - the current ascending element-label blocks, connectivity nodes and SPOS/SNEG pair. This inspection - does not create a stress equality gate. -10. Required rows are not omitted, synthesized, normalized, averaged, sorted into a different identity, - zero-clamped, or repaired. +1. 각 case의 exact declared input과 해당 disposition에 필요한 CSV가 존재하고 readable하다. +2. Header는 surrounding whitespace만 trim하고 required names/components가 모두 있어야 한다. +3. Nonlinear required rows의 Frame은 exact factor-one identity여야 한다. +4. Wide CSV는 Section 4 contract로 component rows에 결정적으로 expand한다. +5. Wide key와 expanded key는 unique해야 한다. Duplicate는 affected family를 tolerance 전에 fail한다. +6. Input node inventory와 source constraint mask로 expected key set을 만든다. CSV zero values 또는 + row position에서 reaction identity를 추론하지 않는다. +7. FESA와 reference projected key sets는 exact equal해야 한다. Missing과 extra rows를 모두 fail한다. +8. Required FESA/CSV/internal values와 derived scales/norms는 모두 finite여야 한다. +9. Internal free residual rows는 exact free mask와 force/moment partition을 보존한다. Global balance는 + 모든 applied source와 constrained reaction을 stable source order로 한 번씩만 사용한다. +10. Local review rows는 global resultant로 collapse하거나 대체하지 않는다. Review precheck failure는 + deterministic review failure로 기록하지만 blocking verdict를 변경하지 않는다. +11. Warning-only precheck/tolerance failure는 deterministic warning을 만들고 blocking verdict를 + 변경하지 않는다. Blocking precheck failure는 전체 comparison을 fail한다. +12. Row omission/synthesis, averaging, source-order matching, clamp, normalization 또는 artifact repair를 + 허용하지 않는다. -Observed read-only inventory used for this contract: +Observed read-only nodal CSV audit: -| CSV | observed wide key columns | duplicate wide keys | nonfinite observed values | observed element labels | -| --- | --- | ---: | ---: | --- | -| `reference/shellNL/shellNL displacements.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A | -| `reference/shellNL/shellNL reactions.csv` | `Frame`, `Part Instance Name`, `Node Label` | 0 | 0 | N/A | -| `reference/shellNL/shellNL stresses.csv` | `Frame`, `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` | -| `reference/shell/shell displacements.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A | -| `reference/shell/shell reactions.csv` | `Part Instance Name`, `Node Label` | 0 | 0 | N/A | -| `reference/shell/shell stresses.csv` | `Part Instance Name`, `Element Label`, `Node Label`, `Section Point` | 0 | 0 | `1..36` | +| CSV | wide rows | duplicate keys | nonfinite required values | status | +| --- | ---: | ---: | ---: | --- | +| `reference/shell/shell displacements.csv` | 49 | 0 | 0 | readable | +| `reference/shellNL/shellNL displacements.csv` | 49 | 0 | 0 | readable | +| `reference/shellNL/shellNL reactions.csv` | 49 | 0 | 0 | readable | +| `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 729 | 0 | 0 | readable | +| `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 729 | 0 | 0 | readable | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 displacements.csv` | 729 | 0 | 0 | readable | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 reactions.csv` | 729 | 0 | 0 | readable | +| `reference/shellNL-meshfine_02/shellNL-meshfine_02 stresses.csv` | 5,408 | 0 | 0 | readable; optional excluded inventory | ## 6. Tolerance and Blocking/Warning Policy -Use exactly `docs/TOLERANCE.md` for every external reference family. This report does not invent -or calibrate tolerance values. +### 6.1 External families -For each comparison family: +Section 4.6의 모든 external blocking, warning-only와 review-only error report는 +`docs/TOLERANCE.md`를 그대로 사용한다. -- `S = max(abs(reference_value_i))`, using reference values only. -- near-zero band is `0.01*S`. -- if `abs(reference_value_i) <= 0.01*S`, row passes iff `abs(fesa-reference) <= 0.01*S`. -- otherwise row passes iff relative error `<= 0.05`. -- family relative RMS is `RMS(error)/S <= 0.01`. -- no independent absolute-error floor, `max(1, S)` clamp, row omission, averaging, or zero clamp is allowed. -- if `S = 0`, the family passes only when all FESA values are exactly zero; otherwise report - `zero-reference-scale-nonzero-error`. +- Reference-only `S=max(abs(reference_i))`, near-zero band `B=0.01*S`. +- `abs(reference_i)<=B`이면 `abs(fesa-reference)<=B`. +- 그 외 row는 relative error `<=0.05`. +- 모든 row와 `RMS(error)/S<=0.01`이 함께 pass해야 family가 pass한다. +- Independent absolute floor, `max(1,S)`, omission, averaging 또는 zero clamp는 없다. +- `S=0`이면 모든 FESA 값도 exact zero일 때만 pass한다. -Families are separated by the exact case/logical quantities in Section 4.5. Current -reference-only scales provide a reproducible reader/comparator audit: +Observed reference-only scales는 reader/family audit evidence이며 calibration 값이 아니다. -| family | `S` | `B=0.01*S` | -| --- | ---: | ---: | -| `linear.translation` | `2.37408203e-5` | `2.37408203e-7` | -| `linear.rotation` | `7.60725743e-6` | `7.60725743e-8` | -| `nonlinear.translation` | `2.37408203e-5` | `2.37408203e-7` | -| `nonlinear.rotation` | `7.60725743e-6` | `7.60725743e-8` | -| `nonlinear.reaction_inplane_force` | `1.91663182` | `1.91663182e-2` | -| `nonlinear.reaction_transverse_force` | `1.17769805e4` | `1.17769805e2` | -| `nonlinear.reaction_physical_moment` | `1.95418418e4` | `1.95418418e2` | +| family | rows | `S` | `B=0.01*S` | +| --- | ---: | ---: | ---: | +| `linear.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` | +| `linear.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` | +| `coarse.translation` | 147 | `2.37408203e-5` | `2.37408203e-7` | +| `coarse.rotation` | 147 | `7.60725743e-6` | `7.60725743e-8` | +| `coarse.local_reaction_inplane_force` | 48 | `1.91663182` | `1.91663182e-2` | +| `coarse.local_reaction_transverse_force` | 24 | `1.17769805e4` | `1.17769805e2` | +| `coarse.local_reaction_physical_moment` | 48 | `1.95418418e4` | `1.95418418e2` | +| `fine.translation` | 2,187 | `2.57957054e-5` | `2.57957054e-7` | +| `fine.rotation` | 2,187 | `6.58704994e-6` | `6.58704994e-8` | +| `fine.local_reaction_inplane_force` | 208 | `5.38827419e-1` | `5.38827419e-3` | +| `fine.local_reaction_transverse_force` | 104 | `2.78506128e3` | `2.78506128e1` | +| `fine.local_reaction_physical_moment` | 208 | `4.71557520e3` | `4.71557520e1` | +| `meshfine02.translation` | 2,187 | `0.0257712454` | `0.000257712454` | +| `meshfine02.rotation` | 2,187 | `0.00658291345` | `0.0000658291345` | +| `meshfine02.local_reaction_inplane_force` | 208 | `3347707` | `33477.07` | +| `meshfine02.local_reaction_transverse_force` | 104 | `2802821.5` | `28028.215` | +| `meshfine02.local_reaction_physical_moment` | 208 | `4722449.5` | `47224.495` | -Any `blocking` family row or RMS failure fails the reference comparison for the feature. -`warning-only` failures produce deterministic warning evidence but do not change the blocking -verdict. `RM3` and stress artifacts create neither a blocking nor warning-only tolerance family. +Blocking family의 precheck/row/RMS failure만 전체 external-reference verdict를 fail한다. +Warning-only는 warning, review-only는 deterministic review finding/error table을 남기지만 +blocking verdict를 바꾸지 않는다. `RM3`와 stress는 family를 만들지 않는다. + +### 6.2 Internal equilibrium families + +- Accepted free force/moment residual은 factor-one accepted trial에서 NSNR-069을 그대로 + 재현한다. Nonzero matching external scale이면 infinity-norm relative `<=1e-2`; exact-zero + scale이면 typed absolute `<=1e-3` force 또는 force-length다. +- Global force/moment balance는 `numerical-review.md` §6.2의 sum-of-contribution scale과 + dimension-separated normalized metric을 사용하며 각각 `<=1e-8`이다. +- Internal gate에 external family tolerance, absolute floor, reference-derived scale 또는 local + nodal reaction error를 섞지 않는다. ## 7. Open Issues and I/O Handoff Open issues blocking I/O Definition: 없음. -I/O Definition Agent handoff: +Post-closure verification status: `shellnl-meshfine-02-s4-final`은 artifact/schema/family contract가 +준비되었지만 과거 canonical Stage 6 comparison에는 포함되지 않았다. Merge된 current code의 +별도 실행과 comparison evidence는 Implementation Agent 소유이며 이 inventory는 pass/fail을 +선언하지 않는다. 이 pending evidence는 기존 feature closure 또는 Release verdict를 바꾸지 않는다. -- Project only the comparison quantities in Sections 4.2, 4.3 and 4.5 to authoritative FESA - result datasets without changing source identity or final comparison disposition. -- Preserve `Frame` handling for `shellnl-s4-final` as accepted factor-one state identity; do not expose - trial Newton history as reference rows. -- Derive constrained reaction identity from the input mask. Compare `RM1/RM2` with the global - spatial physical reaction moment, not the raw generalized rotation-coordinate covector. -- Preserve approved Gauss direct stress recovery. Do not create element-corner stress, - extrapolation, averaging or a stress CSV projection for the current optional SPOS/SNEG artifacts. -- Keep `RM3`, `S-S33`, `S-S11`, `S-S22` and `S-S12` out of current comparison families. -- Use the common tolerance policy exactly as written above and in `docs/TOLERANCE.md`. +I/O Definition Agent handoff through Coordinator: -Reference artifact status: complete for I/O Definition. No declared required input or required -comparison CSV is missing or unreadable. Optional stress CSVs are present and readable as inventory -evidence only. No reference artifact was generated, renamed, repaired, normalized, or modified. +- Fine primary와 coarse companion nonlinear case의 accepted factor-one identity를 보존한다. +- Post-closure `_02`는 기존 fine case와 독립 case/family로 projection하고 별도 current-code + verification에 사용한다. +- Section 4.4의 `(a)` applied-plus-reaction balance error, `(b)` constrained reaction resultant, + `(c)` accepted free residual을 separate logical quantities로 최종 projection한다. +- Global moment는 origin `[0,0,0]`, current `X+u` force arm과 spatial physical nodal moment를 + 사용한다. General nonzero prescribed translation/rotation에서도 initial arm/raw rotational + residual을 재사용하지 않는다. +- Local RF/RM은 exact source-key/schema/inventory/finite/error reporting이 있는 review-only다. + Local rows를 global sum으로 대체하거나 blocking으로 되돌리지 않는다. +- Approved Gauss direct stress recovery를 유지한다. Optional element-corner stress artifact에 + 맞춘 extrapolation/averaging 또는 stress comparison projection을 만들지 않는다. +- Common external tolerance와 exact prechecks를 변경하지 않는다. + +Reference artifact status: required input/displacement/reaction artifacts are present and readable. +Optional fine stress identity issue는 transparent nonblocking inventory finding이다. 어떤 reference +artifact도 생성, rename, repair, normalize 또는 수정하지 않았다. diff --git a/docs/nonlinear-static-newton-raphson/release.md b/docs/nonlinear-static-newton-raphson/release.md new file mode 100644 index 0000000..6e4d182 --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/release.md @@ -0,0 +1,266 @@ +# Nonlinear Static Newton-Raphson Release Readiness + +## 1. Metadata + +| key | value | +| --- | --- | +| feature_id | `nonlinear-static-newton-raphson` | +| status | `ready-for-release` | +| owner_agent | `release-agent` | +| date | `2026-08-28` | +| authoritative requirements | `requirements.md`, SHA-256 `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` | +| implementation evidence | `implementation-report.md`, `build-test.md`, `reference-comparison.md` | +| physics evidence | `physics-evaluation.md`, SHA-256 `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538` | +| audit baseline | local/origin `feat-nonlinear-static-newton-raphson` HEAD `06861608da5ffa4c09b786c3f5052dc7c6604e1b` before the Coordinator-owned Stage 8 update | +| release meaning | FESA feature workflow closure readiness only; publish, deploy, package, tag 또는 external release 권한이 아님 | + +Literal `feature_id`를 선언한 모든 source report는 `nonlinear-static-newton-raphson`과 일치한다. +`reference-comparison.md`에는 literal `feature_id` field가 없지만 exact bundle path +`docs/nonlinear-static-newton-raphson/reference-comparison.md`, title, current SHA-256와 Stage 6 +handoff chain, 그리고 Physics report의 exact source hash가 같은 feature에 결정적으로 연결한다. +상충하는 feature identity는 없으므로 upstream report를 변경하지 않고 nonblocking metadata +omission으로 기록한다. `requirements.md`의 `status: draft`, `approved_by: pending user re-approval`과 +`FESA-REQ-NSNR-069 status: draft`는 stale metadata다. +Authoritative `coordination.md`는 현재 exact requirements hash가 `2026-08-27` 사용자에게 명시적으로 +재승인되었고 Stage 1이 `passed`임을 기록한다. Current Stage 4/5/6 문서도 같은 hash를 입력으로 +사용하므로 실제 승인·수치 계약과의 모순은 없다. + +## 2. Release Scope + +### Included + +- No-prior-history baseline에서 정확히 하나의 geometrically nonlinear static step을 수행하는 별도 + `Full Newton-Raphson` procedure. +- Fixed-initial-reference Total Lagrangian `FESA-MITC4`; source `S4`와 `S4R`은 같은 internal + formulation과 `2 x 2 x 2` integration에 매핑된다. +- Homogeneous isotropic materially linear elasticity, centered single-layer shell section, + six global nodal DOFs와 committed/trial finite-rotation triad/director state. +- Fixed scalar load-factor increments, final factor-one shortening, common proportional path, + fixed-global dead `*CLOAD`, factor-one absolute `*BOUNDARY` target. +- Same-trial residual/consistent tangent, fresh factorization/solve, four-channel convergence, + iteration limit `100`, no line search/cutback/retry. +- Accepted-increment-only HDF5 schema version `1`, deterministic Newton text log, atomic candidate/final + result lifecycle, stable source/result/diagnostic ordering. +- Factor-one accepted free residual과 current-arm/spatial-moment global applied-plus-reaction force/moment + balance; normalized global force와 moment gate는 각각 inclusive `<=1e-8`이다. +- Fine nonlinear primary, coarse nonlinear companion, linear control reference portfolio. External + `U1/U2/U3`는 blocking, `UR1/UR2/UR3`는 warning-only, local RF/RM은 review-only다. + +### Supported input and output subset + +- 주요 supported input: `*HEADING`, `*PART`, `*NODE`, `*NSET`, `*ELEMENT` (`S4`/`S4R`), + `*ELSET`, `*MATERIAL`, `*ELASTIC`, `*SHELL SECTION`, one identity `*ASSEMBLY`/`*INSTANCE`, + `*BOUNDARY`, `*CLOAD`, one `*STEP, NLGEOM=YES`, one four-value `*STATIC`. +- Exact allowlisted `VARIABLE=PRESELECT` output requests와 일부 generator/restart output syntax는 + warning no-op이며 FESA mandatory output을 바꾸지 않는다. +- Public invocation은 `fesa.exe `다. Authoritative output은 input sibling + `_results.h5`, current-run diagnostic은 `_log.txt`다. Literal `--output`을 포함한 + argv token은 compatibility alias 없이 pre-input exit `2`로 거부한다. +- CSV는 external reference 또는 deterministic debug view일 뿐 FESA official output이 아니다. + +### Excluded + +- Material nonlinearity/history, Updated Lagrangian, corotational procedure, multiple/mixed nonlinear + steps와 cross-step propagation. +- Modified/quasi-Newton, tangent reuse, line search, damping, adaptive growth/cutback/retry, + controlled-displacement와 arc-length/path-following. +- Follower/non-proportional/distributed/body/pressure/edge loads, `*DLOAD`, contact, MPC, transforms, + amplitude, composite/offset/oriented shell section과 unsupported model-affecting keywords. +- Reduced integration/hourglass behavior selected by source `S4R`, MITC4+, trial-state HDF5 history, + nodal stress extrapolation/averaging, `RM3`와 stored stress numerical comparison. +- Abaqus, Midas 또는 다른 solver의 formulation, integration, stabilization, state update, + recovery 또는 internal algorithm equivalence claim. + +## 3. Gate Evidence Inventory + +| gate artifact | current SHA-256 | audited status / release disposition | +| --- | --- | --- | +| `requirements.md` | `89C1AB5F1BEDB7C5F6AD0726ED62F0982181EA8746EDE4661183FD3D18A2408E` | Coordinator Stage 1 `passed`; current hash explicitly user re-approved; 24/24 must records and Matrix rows | +| `research.md` | raw `4F63D23E03D1A68E5F8563B678FDD6F761F9558165778EF0433133EFAD303570` | `passed`; LF-normalized hash matches recorded approved `C920A6B02381230D1DB419D73FE767D611B36720D27D6410507BA88C3CA28EEE` | +| `formulation.md` | `878028F7B8EC1B91DA9BF00AF78825F50EB0B71046E840A0EEA595AFFD5E14B9` | `ready-for-numerical-review`; Coordinator Stage 3 `passed`, explicit user approval; current Stage 4 review found no formulation defect | +| `numerical-review.md` | `C00994EF4BB23A237547459E157EE5BDA96B28CAF08F712CD31A8E0ABBF62D2C` | `pass-for-io-definition`; blockers 없음 | +| `reference-model.md` | `B2E6845AB59A32F78261B7A47506C27F7BF4B61401B34BC5DE3DAD4F03D6ADDA` | `pass-for-io-definition`; required files present, exact family/disposition contract complete | +| `io.md` | raw `ED23274F4F15F7D1DFF886FA8158961362C75960990271D24A5FD010A8D51FD9` | `ready-for-coordinator-review`; Coordinator Stage 5 `passed`; LF-normalized hash `53AFBB1DF27FBD9CE6C2E23EE34480882241A859D3FC1993E82DB61ACC6637EB` | +| `implementation-plan.md` | `CA3EF7D2E95AA1F15757CD138CEF67E06E51195F59FB8DBE676E5772CC1D6C2C` | `ready-for-implementation`; 24/24 requirement-to-Step/test mapping | +| `corrections.md` | `4DC996E3D4CA2D515D19E5D244C3A112AF0C9429335698E03089B77B5E79346A` | Historical environment/upstream issues resolved; current status `corrected-for-implementation-rerun`, followed by passing Step 11/12 evidence | +| `implementation-report.md` | `D75C8B5922C9EEF7C7262B01BFB12D5F7609B1A6DB3A7C6D5AE47CB45ADAD578` | `pass-for-physics-evaluation`; no implementation-owned blocker | +| `build-test.md` | `ED6B1B6CFD9478B09B92E7ADE3891622FEA1AA521AD29550D6F4C78C952E8DDA` | full CTest `302/302`; all recorded commands exit `0` | +| `reference-comparison.md` | `22867B0F2E3C06C5AB908485D94160CA33CBAF1274EE099847979FA511ECC241` | overall `pass-for-physics-evaluation`; detailed `blocking-pass-with-review-only-findings`; reference `9/9` | +| `physics-evaluation.md` | `C49011637D57D2F2B71738CA3AF48BEF3256D25078BE049499EBDDDE66DB8538` | `pass-for-release-agent`; blockers 없음 | + +Historical source hashes embedded in earlier research/formulation metadata reflect their original gate inputs. +Current Numerical Review, I/O, Planning, Implementation, reference and Physics reports consume or audit the +current approved hashes and report no semantic contradiction. No stale or failed gate overrides this inventory. + +## 4. Acceptance Traceability + +`N/A (internal)`은 해당 acceptance가 external reference value가 아니라 deterministic CTest/invariant로 +검증된다는 뜻이다. 모든 row의 final disposition은 current release scope에서 `included-pass`다. + +| requirement id | acceptance criterion | test id / passing evidence | reference model id | verification report | release disposition | +| --- | --- | --- | --- | --- | --- | +| `FESA-REQ-NSNR-001` | 정확히 한 supported source/semantic nonlinear step만 별도 procedure를 선택하고 zero/multiple/mixed는 increment 전 fail-closed | `NSNR-IO-*`, `NSNR-PROC-*`; full CTest `302/302` | N/A (internal) | `implementation-plan.md`, `build-test.md` | `included-pass` | +| `FESA-REQ-NSNR-003` | `S4/S4R`를 homogeneous isotropic materially linear geometric-only FESA-MITC4로 처리하고 material/combined nonlinearity는 거부 | `NSNR-IO-*`, `NSNR-ELEM-*`, `NSNR-PROC-*` | `shellnl-meshfine-s4-final`, `shellnl-s4-final`, `shell-s4-linear-limit` | `implementation-report.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-041` | 모든 increment가 하나의 fixed initial reference를 유지하고 current geometry로 re-base하지 않음 | `NSNR-IO-*`, `NSNR-ELEM-KIN-*`, `NSNR-PROC-*` | N/A (internal TL/objectivity) | `implementation-plan.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-074` | global six DOF, dimensionless rotation correction, separate trial/committed proper triad/director와 multiplicative update/rollback | `NSNR-ROT-*`, `NSNR-STATE-*`, `NSNR-PROC-*`; Physics focused suite 포함 | N/A (internal invariant) | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-006` | residual/tangent/factorization/correction이 동일 trial이고 entered iteration마다 fresh factorization/solve | `NSNR-ELEM-TAN-*`, `NSNR-SOLVER-*`, `NSNR-PROC-*` | N/A (internal tangent) | `implementation-plan.md`, `build-test.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-007` | free residual과 same-iteration correction의 네 channel을 logical AND로 통과하고 constrained residual은 reaction으로 유지 | `NSNR-CTRL-021`, `NSNR-PROC-*`, `NSNR-REF-019`; control/log `14/14` | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md` | `included-pass` | +| `FESA-REQ-NSNR-069` | matching external residual scale nonzero 시 relative `<=1e-2`, exact zero 시 typed force/moment absolute `<=1e-3` | `NSNR-CTRL-018..020`, `NSNR-LOG-012`, `NSNR-REF-019`; exact-zero fine/coarse moment residual pass | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md` | `included-pass` | +| `FESA-REQ-NSNR-070` | translation/rotation correction을 nonzero relative 또는 typed exact-zero gate로 각각 inclusive 판정 | `NSNR-CTRL-021`, `NSNR-PROC-*`; control/log `14/14` | N/A (internal convergence) | `implementation-report.md`, `build-test.md` | `included-pass` | +| `FESA-REQ-NSNR-008` | required Newton data finite, iteration `1..100`, iteration 100 pass 허용, iteration 101 금지 | `NSNR-CTRL-020`, `NSNR-PROC-*`, `NSNR-REF-019` | fine/coarse logs: accepted increments each use two iterations | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-014` | fresh correction을 변경 없이 적용하고 line search/damping/fallback/energy gate를 사용하지 않음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | N/A (internal lifecycle) | `implementation-plan.md`, `build-test.md` | `included-pass` | +| `FESA-REQ-NSNR-046` | fixed positive factor increment, factor one final shortening, growth/cutback/retry 없음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse factor `0.1..1.0`, unique factor-one frame | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-048` | 모든 approved CLOAD/BOUNDARY target이 하나의 common proportional factor를 사용 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse nonlinear load path | `implementation-plan.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-018` | CLOAD force/moment source direction은 fixed global dead load이고 follower tangent가 없음 | `NSNR-CTRL-*`, `NSNR-PROC-*` | fine/coarse centered fixed-global `F3=-100000` | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-063` | prescribed BOUNDARY는 factor-one absolute target이고 constrained correction과 분리되며 failure 시 start state 보존 | `NSNR-CTRL-*`, `NSNR-PROC-*`, `NSNR-PROC-019` | N/A (nonzero prescribed-motion internal case) | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-016` | nonlinear STATIC 네 값을 exact arity/finite/positive/endpoint rule로 mapping하고 third/fourth는 stepping에 미사용 | `NSNR-IO-*`, `NSNR-CTRL-*` | fine/coarse `*STATIC 0.1,1.,0.001,0.1` | `io.md`, `reference-model.md`, `build-test.md` | `included-pass` | +| `FESA-REQ-NSNR-011` | trial state를 분리하고 converged complete state만 atomic commit하며 모든 실패에서 prior state/final 보존 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*` | fine/coarse accepted-frame evidence; failure paths internal | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-019` | stable source/order와 free residual, constrained resultant, applied-plus-reaction balance를 분리하고 current arm/spatial moment 사용 | `NSNR-ELEM-TAN-*`, `NSNR-STATE-*`, `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-022/024/025`; procedure/writer `7/7` | `shellnl-meshfine-s4-final`, `shellnl-s4-final` | `implementation-report.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-020` | approved element/material/load/boundary/step/solver inventory 밖의 meaning을 authoritative output 전 fail-closed | `NSNR-IO-*` negative inventory | N/A (internal rejection) | `io.md`, `implementation-plan.md`, `build-test.md` | `included-pass` | +| `FESA-REQ-NSNR-021` | committed increment와 accepted HDF5 frame이 일대일이고 factor one 포함, trial history 없음, failed candidate는 final이 아님 | `NSNR-STATE-*`, `NSNR-HDF5-*`, `NSNR-PROC-*`, `NSNR-HDF5-014` | fine/coarse 10 accepted frames, unique frame 9/increment 10/factor 1 | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-024` | invocation-start log replacement과 entered iteration당 deterministic summary 하나, controlled failure에도 current log 유지 | `NSNR-LOG-012`, `NSNR-PROC-*`, `NSNR-REF-019`; `NewtonIterationLog.*` `8/8` | fine/coarse 20 records, two per increment | `implementation-report.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-083` | derived result/log names, every literal `--output` form pre-input exit `2`, no alias, independent asymmetric lifecycles와 linear regression | `NSNR-CLI-*`, `NSNR-PROC-*`, `NSNR-EVID-*` | all three stored case executions use derived sibling outputs | `implementation-report.md`, `build-test.md`, `reference-comparison.md` | `included-pass` | +| `FESA-REQ-NSNR-026` | factor/iteration/assembly/frame/result/log ordering이 same input/runtime에서 deterministic | `NSNR-STATE-*`, `NSNR-PROC-*`, `NSNR-REF-020..023`, `NSNR-EVID-*`; reference `9/9` twice | all three stored cases | `implementation-report.md`, `reference-comparison.md` | `included-pass` | +| `FESA-REQ-NSNR-030` | linear limit, tangent, global balance/free residual, symmetry/objectivity와 commit/rollback portfolio가 모두 통과 | `NSNR-ROT-*`, `NSNR-ELEM-*`, `NSNR-CTRL-*`, `NSNR-SOLVER-*`, `NSNR-LOG-*`, `NSNR-STATE-*`, `NSNR-HDF5-014`, `NSNR-PROC-019`, `NSNR-REF-022/024/025`; Physics focused `23/23` | fine primary, coarse companion, linear control | `build-test.md`, `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | +| `FESA-REQ-NSNR-034` | exact source/component precheck 후 U blocking, UR warning-only, RF/RM review-only, RM3/stress excluded, common external tolerance 적용 | `NSNR-REF-020..023`, `NSNR-EVID-003..007`; nonlinear reference `9/9` | fine primary, coarse companion, linear control | `reference-comparison.md`, `physics-evaluation.md` | `included-pass` | + +## 5. Validation Evidence + +Fresh Stage 6 commands and results are recorded in `build-test.md`: + +```powershell +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug --output-on-failure +``` + +- Configure/build/discovery: exit `0`; 302 tests discovered. +- Focused control/log `14/14`, procedure/writer `7/7`. +- Nonlinear reference `9/9`; extended matched reference `9/9`. +- Full MSVC x64 Debug CTest `302/302`, failed-test inventory 없음, 새 compiler/linker warning 없음. +- Stage 7 Physics-focused CTest `23/23`, exit `0`. +- Harness Python pytest는 Step 12가 Python, hooks 또는 agent configuration을 변경하지 않아 applicable하지 + 않았고 필수 제품 검증으로 재분류하지 않았다. +- `reference-comparison.md`: overall `pass-for-physics-evaluation`; external translation blocking families, + warning-only UR families와 eight internal blocking families 통과. Global balance metrics의 worst value는 + fine moment `2.74546602e-10 <=1e-8`이다. +- `physics-evaluation.md`: `pass-for-release-agent`; equilibrium, reactions, displacement direction/path, + symmetry/objectivity, stress sanity, rigid-body, energy/residual과 model coverage에 물리 blocker 없음. +- Declared canonical reference 12개는 current SHA-256가 `reference-model.md`와 일치하고 tracked diff가 없다. + +## 6. Known Limitations + +1. Coarse/fine local nodal `RF1/RF2/RF3`와 physical spatial `RM1/RM2`에는 six review-only + discrepancy families가 남아 있다. Exact source-key/schema/inventory/finite/error report는 유지하지만 + blocking verdict는 global force/moment balance와 accepted free residual이 결정한다. +2. Local `RM3`는 approved physical external comparison target이 없어 excluded다. +3. Stored corner `SPOS/SNEG` stress와 FESA direct Gauss `BOTTOM/MIDDLE/TOP` stress는 위치·복구 identity가 + 다르므로 numerical comparison에서 제외된다. Fine optional stress CSV에는 element `1`, `SNEG`의 + malformed `Node Label=ss` 한 행이 있으며 artifact를 repair하지 않는다. +4. `UR1/UR2/UR3` external comparison은 warning-only다. Current portfolio에서는 모두 통과했지만 향후 + warning exceedance가 blocking failure로 자동 승격되지는 않는다. +5. Stored nonlinear plate responses는 weak geometric-nonlinear regime다. Finite-rotation/tangent/objectivity/ + rollback은 internal invariant tests로 보강했지만 broad large-response benchmark 또는 experimental + validation claim은 하지 않는다. +6. Original-style MITC4는 curved/distorted/thin nonlinear mesh에서 membrane-locking과 conditioning + 위험이 있다. MITC4+ 또는 Abaqus `S4/S4R` 성능을 상속한다고 주장하지 않는다. +7. 첫 release는 one-step, materially linear, fixed-increment Full Newton 범위다. Limit-point traversal, + material nonlinearity, follower/distributed load, adaptive increment와 broader Abaqus keyword compatibility는 + 지원하지 않고 fail-closed한다. +8. Rotation-vector principal chart, director/swing/twist branch와 geometry/Jacobian validity 밖의 상태는 + fail-closed한다. No line search/cutback/retry이므로 difficult path의 automatic recovery를 보장하지 않는다. +9. Global force/moment `<=1e-8`은 comparator-owned internal verification gate이며 runtime user setting이나 + `fesa.env` 계약이 아니다. External CSV families에는 별도로 `docs/TOLERANCE.md`만 적용한다. +10. Numerical agreement은 Abaqus formulation, integration, stabilization, state update 또는 recovery의 + internal equivalence evidence가 아니다. + +## 7. Release Notes Draft + +### 기능 요약 + +FESA에 fixed-initial-reference Total Lagrangian 기반 geometric-nonlinear `FESA-MITC4` static +procedure가 추가되었다. Solver는 fixed load-factor path에서 Full Newton-Raphson을 수행하고, +수렴한 increment만 HDF5 schema v1 accepted frame으로 commit한다. Trial/committed finite-rotation state, +deterministic per-iteration log, rollback-safe output lifecycle, current-arm/spatial-moment global equilibrium +evidence를 포함한다. + +### 사용과 산출물 + +- 실행: `fesa.exe ` +- 결과: input sibling `_results.h5` +- 진단: input sibling `_log.txt` +- 지원 핵심 범위: one `*STEP, NLGEOM=YES`, one four-value `*STATIC`, source `S4/S4R`, isotropic + linear elastic shell, `*CLOAD`, `*BOUNDARY`의 approved subset. +- Literal `--output`은 제거되었고 alias/deprecation form 없이 exit `2`로 거부된다. + +### 검증 범위 + +MSVC x64 Debug full CTest `302/302`, nonlinear/extended reference `9/9`, Physics focused `23/23`이 +통과했다. Fine/coarse nonlinear plate와 linear control의 `U1/U2/U3` blocking comparison, +warning-only UR, accepted free residual 및 normalized global force/moment `<=1e-8`을 검증했다. + +### 사용자에게 알려진 제한 + +Local nodal RF/RM discrepancy는 review-only이며 `RM3`와 stored stress comparison은 제외된다. +Fine optional stress CSV의 malformed node label은 read-only로 유지한다. UR은 warning-only다. +Stored nonlinear cases는 weak response이고 original MITC4는 curved/distorted mesh membrane-locking 위험이 +있으므로 broader large-response, locking-free 또는 external-solver internal-equivalence claim을 하지 않는다. +Material nonlinearity, multiple/mixed steps, follower/distributed loads, line search/cutback/retry, +arc-length와 broad Abaqus keyword compatibility는 지원 범위 밖이다. + +### Evidence artifacts + +- `docs/nonlinear-static-newton-raphson/implementation-report.md` +- `docs/nonlinear-static-newton-raphson/build-test.md` +- `docs/nonlinear-static-newton-raphson/reference-comparison.md` +- `docs/nonlinear-static-newton-raphson/physics-evaluation.md` +- Authoritative solver artifact: each input sibling `_results.h5` + +## 8. Release Verdict + +- verdict: `ready-for-release` +- gate basis: full build/test evidence passed, reference comparison overall status is + `pass-for-physics-evaluation`, Physics status is `pass-for-release-agent`, 24/24 must requirements have + explicit acceptance/test/reference/release disposition, and no blocking evidence gap remains. +- qualification: six local RF/RM findings, stress/RM3 exclusions, warning-only UR와 model-coverage limitations are + approved and disclosed nonblocking limitations, not unresolved implementation defects. +- feature identity disposition: `reference-comparison.md`의 literal `feature_id` omission은 exact + path/title/hash/handoff binding으로 해소되고 contradictory identity가 없으므로 verdict를 낮추지 않는다. +- authority boundary: 이 verdict는 internal feature delivery closure recommendation이다. Publish, deploy, + package, tag, external release 또는 solver equivalence claim을 승인하지 않는다. + +## 9. Handoff Recommendation + +Coordinator Agent가 이 보고서의 exact path/hash와 `ready-for-release`를 독립 audit한 뒤 Stage 8을 +`passed`로 기록하고 8-stage workflow를 closure할 것을 권고한다. Evidence gap return 또는 owning +sub-agent rework는 필요하지 않다. 사용자가 요청한 commit/push는 Coordinator/root가 Release gate +audit 후 별도로 수행해야 하며, 이 Release Agent는 commit, push, tag 또는 publish를 수행하지 않는다. + +## 10. No-Change Assertion + +이 Stage 8 작업은 `docs/nonlinear-static-newton-raphson/release.md` 하나만 생성했다. Coordinator가 +동시에 소유한 pre-existing `coordination.md` 변경은 읽기만 했고 수정·revert하지 않았다. Source code, +headers, tests, CMake, Harness, requirements, research, formulation, numerical review, reference model, +I/O, implementation/physics reports, reference artifacts와 `docs/TOLERANCE.md`를 변경하지 않았다. +Abaqus, Nastran 또는 다른 reference solver, build, CTest, Harness, publish/deploy/package/tag 작업을 +실행하지 않았다. + +## 11. Open Issues + +Blocking open issue는 없다. + +| id | severity | disposition | +| --- | --- | --- | +| `RELEASE-META-001` | nonblocking documentation | `requirements.md`의 historical draft/pending metadata는 current-hash explicit user approval와 Coordinator Stage 1 pass로 해소된다. Upstream 문서는 이 gate에서 수정하지 않았다. | +| `RELEASE-META-002` | nonblocking documentation | `reference-comparison.md`에는 literal `feature_id` field가 없지만 exact bundle path/title/SHA-256/Stage 6 handoff와 Physics source hash가 feature identity를 결정적으로 고정한다. Contradictory identity는 없고 upstream report는 변경하지 않았다. | +| `RELEASE-LOCAL-001` | accepted risk | Six local RF/RM families remain review-only findings; global balance/free residual blocking evidence passed. | +| `RELEASE-STRESS-001` | accepted limitation | `RM3`와 stored stress numerical comparison은 excluded; fine optional malformed stress row는 read-only로 유지한다. | +| `RELEASE-COVERAGE-001` | known limitation | Weak nonlinear stored response와 original MITC4 curved/distorted membrane-locking risk가 broader claims를 제한한다. | + +Missing required report, failed pass status, unresolved defect, missing declared comparison file 또는 +contradictory acceptance evidence는 발견되지 않았다. diff --git a/docs/nonlinear-static-newton-raphson/requirements.md b/docs/nonlinear-static-newton-raphson/requirements.md index 74f2fd3..2a7b053 100644 --- a/docs/nonlinear-static-newton-raphson/requirements.md +++ b/docs/nonlinear-static-newton-raphson/requirements.md @@ -3,11 +3,11 @@ ## 1. Metadata - feature_id: `nonlinear-static-newton-raphson` - title: `Nonlinear Static Analysis Using Newton–Raphson` -- status: `approved` +- status: `draft` - owner_agent: `requirement-agent` -- date: `2026-08-22` -- approved_by: user -- approval_date: `2026-08-23` +- date: `2026-08-27` +- approved_by: pending user re-approval +- approval_date: pending - authoritative_scope: materially linear, geometrically nonlinear `S4/S4R -> FESA-MITC4` - independence: FESA는 독립 solver이며 Abaqus 또는 Midas의 내부 알고리즘 동등성을 주장하지 않는다. - unit_policy: `.inp` 단위계를 추론하거나 변환하지 않고 사용자가 일관되게 제공한 단위계를 보존한다. @@ -26,7 +26,7 @@ FESA는 하나의 지원 nonlinear static step을 scalar load factor로 증가 - factor-1 absolute prescribed `*BOUNDARY` targets와 four-value nonlinear `*STATIC` - four-channel residual/correction convergence, maximum 100 iterations, no line search - separate trial state, atomic commit/rollback, accepted-frame HDF5와 per-iteration text log -- deterministic assembly, iteration, frame, result, diagnostic order와 stored-reference verification +- deterministic assembly, iteration, frame, result, diagnostic order와 factor-one global reaction/equilibrium 및 stored-reference verification ## 4. Out Of Scope - material nonlinearity, nonlinear material history, combined material/geometric nonlinearity @@ -138,16 +138,16 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]} status: approved - id: FESA-REQ-NSNR-069 - statement: "The FESA solver shall evaluate translational-force and rotational-moment free-residual convergence with channel-separated infinity-norm gates." + statement: "The FESA solver shall evaluate translational-force and rotational-moment free-residual convergence with channel-separated infinity-norm gates selected by each matching external residual-channel scale." category: numerical rationale: "Force and moment dimensions require separate scales." source: user priority: must verification_method: test - acceptance_criteria: "For a nonzero matching-channel denominator max(||internal||inf, ||external||inf), the same-trial residual ratio passes iff <=1e-2; an exact-zero denominator instead passes iff its numerator is <=1e-3 model-consistent force or <=1e-3 model-consistent force-length, respectively." - tolerance: "Relative 1e-2 dimensionless; zero-scale absolute 1e-3 force and 1e-3 force-length." + acceptance_criteria: "For each residual channel, a nonzero matching external-channel scale retains denominator max(||internal||inf, ||external||inf), and the same-trial residual ratio passes iff <=1e-2; an exact-zero matching external-channel scale instead applies the typed absolute gate, which passes iff its numerator is <=1e-3 model-consistent force or <=1e-3 model-consistent force-length, respectively." + tolerance: "Relative 1e-2 dimensionless for nonzero matching external-channel scale; exact-zero matching external-channel absolute 1e-3 force and 1e-3 force-length." trace_to: {parent_need: "NEED-NSNR-002", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]} - status: approved + status: draft - id: FESA-REQ-NSNR-070 statement: "The FESA solver shall evaluate translational and rotational free-correction convergence with channel-separated infinity-norm gates." category: numerical @@ -248,14 +248,14 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det trace_to: {parent_need: "NEED-NSNR-003", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "Implementation Planning Agent"]} status: approved - id: FESA-REQ-NSNR-019 - statement: "The FESA solver shall preserve stable source identity and stable assembly order and shall derive free residual and constrained reaction from the complete assembled equilibrium at the same state." + statement: "The FESA solver shall preserve stable source identity and stable assembly order and shall keep the accepted free residual, constrained reaction resultant, and global applied-plus-reaction balance error as distinct equilibrium quantities derived at the same accepted state." category: physics - rationale: "Equilibrium evidence must remain traceable to source entities and DOFs." + rationale: "Reaction and equilibrium evidence must remain traceable without treating physically distinct projections as interchangeable." source: docs priority: must verification_method: test - acceptance_criteria: "Input instance/label/component maps deterministically through assembly, state, diagnostic, result, and comparison; full residual at a trial or accepted state yields free-equilibrium evidence and constrained reactions." - tolerance: "Source/component identity and discrete order exact; equilibrium uses approved numerical tolerances." + acceptance_criteria: "Input instance/label/component maps deterministically through assembly, state, diagnostic, result, and comparison; accepted free entries remain free-equilibrium evidence, constrained entries form physical reactions, and the constrained-reaction resultant remains distinct from the global applied-plus-reaction balance error. Blocking factor-one equilibrium quantities are global applied-plus-reaction force [3] and moment [3] balance errors plus accepted free residual. Every global moment is about global origin [0,0,0] and uses current force arms plus spatial physical nodal moments." + tolerance: "Source/component, quantity identity, origin, and discrete order exact; equilibrium and reference values use their separately approved numerical tolerances." trace_to: {parent_need: "NEED-NSNR-002, NEED-NSNR-004", downstream_agents: ["Formulation Agent", "Numerical Review Agent", "I/O Definition Agent"]} status: approved - id: FESA-REQ-NSNR-020 @@ -314,25 +314,25 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det trace_to: {parent_need: "NEED-NSNR-003, NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "Implementation Planning Agent"]} status: approved - id: FESA-REQ-NSNR-030 - statement: "The FESA solver shall pass an approved verification portfolio covering the materially linear small-displacement limit, tangent consistency, equilibrium/reaction, symmetry or objectivity, and commit/rollback behavior." + statement: "The FESA solver shall pass an approved verification portfolio covering the materially linear small-displacement limit, tangent consistency, factor-one global applied-plus-reaction balance and accepted free residual, symmetry or objectivity, and commit/rollback behavior." category: verification rationale: "Convergence alone does not establish nonlinear solver correctness." source: docs priority: must verification_method: analysis - acceptance_criteria: "Numerical Review defines blocking cases and quantities for every listed category, and implementation passes each approved analytical, invariant, physics, or comparison gate." - tolerance: "Case-specific tolerances are owned by Numerical Review; existing linear-limit tolerance remains unchanged." + acceptance_criteria: "Numerical Review defines blocking cases and quantities for every listed category, and implementation passes each approved analytical, invariant, physics, or comparison gate. Reaction/equilibrium acceptance separately blocks on factor-one global applied-plus-reaction force [3] and moment [3] balance errors and accepted free-DOF residual evidence; constrained-reaction resultants retain a distinct identity, and local nodal reaction distribution does not decide the blocking verdict." + tolerance: "Case-specific invariant tolerances are owned by Numerical Review; external comparisons use docs/TOLERANCE.md; existing linear-limit tolerance remains unchanged." trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Research Agent", "Formulation Agent", "Numerical Review Agent"]} status: approved - id: FESA-REQ-NSNR-034 - statement: "The FESA solver shall compare only approved accepted-state quantities against stored reference artifacts using stable source/component matching and the common docs/TOLERANCE.md policy." + statement: "The FESA solver shall compare only approved accepted-state quantities against stored reference artifacts using stable source/component matching, the approved blocking/warning/review disposition, and the common docs/TOLERANCE.md policy." category: verification rationale: "Reference acceptance must be deterministic and independent of solver execution." source: docs priority: must verification_method: reference-comparison - acceptance_criteria: "Numerical Review selects the exact existing input and required CSV quantities; precheck rejects missing, extra, duplicate, or nonfinite required rows before blocking/warning family comparison, without averaging or row-order matching." - tolerance: "docs/TOLERANCE.md family-scale policy; exact artifacts and families are a Numerical Review-owned readiness gap." + acceptance_criteria: "Numerical Review selects the exact existing input and required CSV quantities; precheck rejects missing, extra, duplicate, or nonfinite required rows before numerical comparison, without averaging, collapse, row-order matching, zero clamp, or reference repair. U1/U2/U3 remain blocking and UR1/UR2/UR3 remain warning-only. Local nodal RF1/RF2/RF3 and physical spatial RM1/RM2 retain deterministic source-key/schema/finite/inventory/error reporting but are review-only and never change the blocking verdict; local RM3 and stress remain excluded from numerical comparison." + tolerance: "docs/TOLERANCE.md family-scale policy for external blocking, warning-only, and review-only error reporting; exact artifact roles, local review projection, family membership, and row schema are a Numerical Review-owned readiness gap." trace_to: {parent_need: "NEED-NSNR-004", downstream_agents: ["Numerical Review Agent", "I/O Definition Agent"]} status: approved ``` @@ -341,7 +341,10 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det | quantity | dimension / coordinates | role | | --- | --- | --- | | nodal displacement and committed rotation/director state | length and dimensionless rotation; global | accepted-state kinematics and rollback | -| full residual and constrained reaction | force or force-length; global DOF | equilibrium and reaction evidence | +| accepted free-DOF residual | force or force-length; global DOF | blocking accepted-state equilibrium evidence | +| local nodal `RF1/RF2/RF3`, physical spatial `RM1/RM2` | force or force-length; global | deterministic review-only/nonblocking distribution evidence; `RM3` excluded | +| constrained-reaction resultant force `[3]` and moment `[3]` | force and force-length; global; moment about `[0,0,0]` with current arms and spatial physical moments | distinct reaction summary; not interchangeable with global balance error | +| applied-plus-reaction balance error force `[3]` and moment `[3]` | force and force-length; global; same origin/arm/moment convention | blocking factor-one reaction/equilibrium evidence | | MITC4 internal force, stress and strain | model-consistent dimensions; approved element frame/configuration | formulation, physics and reference verification | | scalar load factor and accepted frame identity | dimensionless | path, commit and output ordering | | four convergence channels | typed as NSNR-069/070 | internal iteration acceptance only | @@ -349,13 +352,14 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det ## 10. Tolerance Policy - `.inp` values remain in the user's consistent unit system; FESA performs no unit inference or conversion. -- Only nonzero-scale convergence ratios are dimensionless and pass with `<=1e-2`. -- Exact-zero residual thresholds are `1e-3` force and `1e-3` force-length; correction thresholds are `1e-3` length and `1e-3` dimensionless rotation. Equal literals do not merge their dimensions. -- External comparisons use `docs/TOLERANCE.md`; internal invariant, tangent, endpoint-arithmetic and physics tolerances are fixed by Numerical Review before implementation. +- Residual ratios with nonzero matching external-channel scale and correction ratios with nonzero current-trial incremental-solution denominator are dimensionless and pass with `<=1e-2`. +- Exact-zero matching external-channel residual thresholds are `1e-3` force and `1e-3` force-length; exact-zero correction-denominator thresholds are `1e-3` length and `1e-3` dimensionless rotation. Equal literals do not merge their dimensions. +- External blocking, warning-only, and review-only error reporting use `docs/TOLERANCE.md` without changing their verdict disposition; internal invariant, tangent, endpoint-arithmetic, free-residual and global-balance tolerances are fixed by Numerical Review before implementation. ## 11. Reference Case Requirements -- The current Stage-1 gap is selection of exact stored nonlinear input and only the CSV quantities required for acceptance. -- Numerical Review owns artifact readiness, blocking/warning families, source/component identity and HDF5 projection; this gap does not require another Stage-1 user question. +- Stored nonlinear candidates use exact read-only input/displacement pairs `reference/shellNL/shellNL.inp` with `reference/shellNL/shellNL displacements.csv`, and `reference/shellNL-meshfine/shellNL-meshfine.inp` with `reference/shellNL-meshfine/shellNL-meshfine displacements.csv`. Exact local-reaction review artifacts are `reference/shellNL/shellNL reactions.csv` and `reference/shellNL-meshfine/shellNL-meshfine reactions.csv`; they are not missing-required blocking artifacts. The existing linear-limit pair is `reference/shell/shell.inp` and `reference/shell/shell displacements.csv`. +- Numerical Review shall fix which exact nonlinear candidate case or cases are blocking versus diagnostic, the factor-one HDF5 projection, required source rows/components and comparison families, and the internal tolerances for global balance/free-residual gates. `U1/U2/U3` are blocking, `UR1/UR2/UR3` are warning-only, local nodal RF/RM rows are review-only, and `RM3` and stress have no numerical comparison projection. +- All selected local review rows retain deterministic identity, schema, finite-value, inventory, and error reporting even though they cannot fail the blocking verdict. A physical global resultant sum is not a substitute identity for those local rows, and no row is averaged, collapsed, omitted, zero-clamped, or repaired. - Agents do not run Abaqus, Nastran or another reference solver and do not create, rename, repair or normalize stored reference artifacts. ## 12. Requirement Verification Matrix @@ -367,7 +371,7 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det | `NSNR-074` | physics | user | must | analysis | finite committed/trial triad/director state and rollback | invariant tolerance downstream | Formulation; Numerical Review | approved | | `NSNR-006` | numerical | user | must | test | same-trial residual/tangent and fresh factorization/solve | identity/order exact | Formulation; Numerical Review; Planning | approved | | `NSNR-007` | numerical | user | must | test | all four free-DOF gates pass; constrained residual is reaction | NSNR-069/070 | Numerical Review; Planning | approved | -| `NSNR-069` | numerical | user | must | test | force/moment residual relative or typed zero-scale gates | `1e-2`; typed `1e-3` | Numerical Review; Planning | approved | +| `NSNR-069` | numerical | user | must | test | force/moment residual relative gate for nonzero external scale; typed absolute gate for exact-zero external scale | `1e-2`; typed `1e-3` | Numerical Review; Planning | draft | | `NSNR-070` | numerical | user | must | test | translation/rotation correction relative or typed zero-scale gates | `1e-2`; typed `1e-3` | Numerical Review; Planning | approved | | `NSNR-008` | numerical | user | must | test | finite data, iterations 1..100, pass at 100 allowed | predicates/count exact | Numerical Review; Planning | approved | | `NSNR-014` | constraint | user | must | test | unchanged full correction; no line search/fallback/energy gate | identity exact | Numerical Review; Planning | approved | @@ -377,21 +381,21 @@ Exact Total Lagrangian shell equations, strain/stress measures, rotation map det | `NSNR-063` | physics | user | must | test | absolute factor-one BC target and separate correction | path/source exact | Formulation; Numerical Review | approved | | `NSNR-016` | input | user | must | test | four-value STATIC mapping and validation | endpoint exact | I/O; Planning | approved | | `NSNR-011` | functional | user | must | test | separate trial, atomic commit, prior-state preservation | state exact | Formulation; Numerical Review; Planning | approved | -| `NSNR-019` | physics | docs | must | test | stable source/assembly and full-equilibrium residual/reaction | identity/order exact | Formulation; Numerical Review; I/O | approved | +| `NSNR-019` | physics | docs | must | test | distinct free residual, constrained-reaction resultants and applied+reaction balance; current-arm/spatial-moment semantics | quantity/origin/identity/order exact | Formulation; Numerical Review; I/O | approved | | `NSNR-020` | input | docs | must | test | unsupported meaning fails closed | inventory exact | I/O; Planning | approved | | `NSNR-021` | output | user | must | test | accepted commit/frame bijection and failure-safe HDF5 final | identity exact | Numerical Review; I/O; Planning | approved | | `NSNR-024` | output | user | must | test | one ordered diagnostic summary per entered iteration and persistent live log | semantic identity exact | I/O; Planning | approved | | `NSNR-083` | output | user | must | test | repository names; every literal --output form unrecognized with pre-input/pre-Analysis/pre-output exit 2 and no alias/deprecation; asymmetric lifecycle; linear regression | public identity/precedence exact | I/O; Planning; Numerical Review | approved | | `NSNR-026` | constraint | docs | must | test | deterministic factor/iteration/assembly/frame/result/log order | discrete order exact | Numerical Review; Planning | approved | -| `NSNR-030` | verification | docs | must | analysis | blocking small-limit/tangent/physics/rollback portfolio | case-specific downstream | Research; Formulation; Numerical Review | approved | -| `NSNR-034` | verification | docs | must | reference-comparison | stored artifacts, deterministic matching and precheck | docs/TOLERANCE.md | Numerical Review; I/O | approved | +| `NSNR-030` | verification | docs | must | analysis | blocking small-limit/tangent/global applied+reaction balance/free-residual/physics/rollback portfolio | case-specific downstream; external policy unchanged | Research; Formulation; Numerical Review | approved | +| `NSNR-034` | verification | docs | must | reference-comparison | U blocking, UR warning-only, local RF/RM review-only, exact matching/precheck | docs/TOLERANCE.md | Numerical Review; I/O | approved | ## 13. Open Questions 없음. Specialist gaps are owned by downstream stages and are escalated only if they would change approved scope, physics, tolerance, authoritative output or public compatibility. ## 14. Downstream Handoff -- Research/Formulation: exact Total Lagrangian MITC4 equations, strain/stress measures, rotation map/side/frame, drilling and consistent derivatives. -- Numerical Review: endpoint arithmetic, tangent/objectivity/state-invariant checks, benchmark portfolio, performance adequacy and exact reference artifacts/quantities. -- I/O Definition: HDF5 schema/projection/chunking/factor-0 handling, log representation/failure presentation and path/collision conventions. -- Implementation Planning: backend adapters, output ownership primitive, candidate filename, performance targets and requirement-traced TDD plan. +- Research/Formulation: exact Total Lagrangian MITC4 equations, strain/stress measures, rotation map/side/frame, drilling and consistent derivatives; Formulation propagates NSNR-069's exact-zero matching external-channel typed absolute branch and retained nonzero external-scale relative denominator. +- Numerical Review: verify the revised NSNR-069 branch and unchanged thresholds/four-channel AND, endpoint arithmetic, tangent/objectivity/state-invariant checks, benchmark portfolio and performance adequacy. Fix exact coarse/fine reference roles, local review projection/families, and factor-one global balance/free-residual tolerances while preserving local RF/RM review-only, `RM3` exclusion, displacement/rotation disposition, exact prechecks, immutable artifacts and common external tolerance. +- I/O Definition: HDF5 schema/projection/chunking/factor-0 handling, log representation/failure presentation and path/collision conventions. Audit and keep separately identifiable `(a)` global applied-plus-reaction balance error, `(b)` constrained-reaction resultant and `(c)` accepted free residual; global moments use current positions and spatial physical nodal moments about `[0,0,0]`, including supported nonzero prescribed translation/rotation cases. +- Implementation Planning: backend adapters, output ownership primitive, candidate filename, performance targets and requirement-traced TDD plan. Stage 6 must test the three equilibrium identities separately and must not reuse one implementation dataset as another without proving its approved projection semantics. - Coordinator: escalate only a downstream proposal that changes the approved scope, physics, convergence tolerance, authoritative-result meaning or public output contract; do not advance the workflow on this document alone. diff --git a/docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md b/docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md new file mode 100644 index 0000000..99810de --- /dev/null +++ b/docs/nonlinear-static-newton-raphson/translation-displacement-comparison.md @@ -0,0 +1,186 @@ +# Translation Displacement Comparison Report + +## 1. Metadata and scope + +- feature_id: `nonlinear-static-newton-raphson` +- report_id: `TRANSLATION-REPORT-001` +- date: `2026-08-26` +- owner_agent: `implementation-agent` (bounded diagnostic dispatch) +- dispatch coordination SHA-256: `D7CE6264EE3FD20FB6CD74CF1FC28E05EEEEFA67B25AF737D2DF989059A72D6F` +- status: `translation-diagnostic-pass-not-a-gate` +- tolerance source: `docs/TOLERANCE.md` + +This focused report recomputes only global translational displacement components +`U1/U2/U3` for the existing coarse `reference/shellNL` case and the added fine +`reference/shellNL-meshfine` case. It is diagnostic evidence for the observed +mesh sensitivity; it does not create or replace the canonical Stage 6 +`reference-comparison.md`. In particular, it is not Step 12 implementation +evidence and does not change any workflow gate. + +The two meshes are compared separately to their own read-only Abaqus CSV +artifacts. No coarse-to-fine node interpolation, row pairing, averaging, or +direct FESA-to-FESA error was used. + +## 2. Artifact inventory and accepted-frame identity + +All paths below are relative to the feature worktree. SHA-256 and byte counts +were recomputed before comparison. + +| mesh | artifact | path | bytes | SHA-256 | +| --- | --- | --- | ---: | --- | +| coarse | input | `reference/shellNL/shellNL.inp` | 4,778 | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | +| coarse | translation CSV | `reference/shellNL/shellNL displacements.csv` | 7,542 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| coarse | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/nonlinear-static-reference/shellNL/shellnl-s4-final-441600152250700-0/shellNL_results.h5` | 934,602 | `9744814BEBF33486F526F821EDC7D96F072F34E988D70A00AC7AA063570FFA40` | +| fine | input | `reference/shellNL-meshfine/shellNL-meshfine.inp` | 56,516 | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| fine | translation CSV | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 111,184 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| fine | FESA HDF5 | `.harness/build-ninja-msvc-debug/reference/meshfine-diagnostic/run-1787669003801/shellNL-meshfine_results.h5` | 10,547,651 | `81A3C431E2977D2482D212877C3C306FFBB19CD1F0C47FBF1C936AE06CC93ACA` | + +For both HDF5 artifacts, `/steps/Step-1/accepted_frames` has ten accepted rows. +The unique row satisfying `is_factor_one=1` and `load_factor=1.0` is +`frame_index=9`, `increment_index=10`, and `iteration_count=2`. Translation +values were projected only from +`/steps/Step-1/frames/9/nodal/displacement`, columns `[UX, UY, UZ]`: + +| mesh | HDF5 node rows | displacement shape | CSV wide rows | exact CSV Frame | +| --- | ---: | --- | ---: | --- | +| coarse | 49 | `[49, 6]` | 49 | `Increment 10: Step Time = 1.000` | +| fine | 729 | `[729, 6]` | 729 | `Increment 10: Step Time = 1.000` | + +## 3. Source identity and prechecks + +The comparison key is + +```text +(accepted_state=factor-one, canonical_instance_name, source_node_label, component) +``` + +`canonical_instance_name` is matched case-insensitively; the CSV/HDF5 source +spelling itself is not rewritten. CSV columns were selected after trimming only +surrounding header whitespace. The `U-U1/U-U2/U-U3` columns map respectively to +HDF5 `UX/UY/UZ`. Row order is not part of the identity and was not used for +matching. + +| mesh | component rows | duplicate CSV wide/component/HDF5 keys | nonfinite CSV/HDF5 values | missing HDF5 keys | extra HDF5 keys | precheck | +| --- | ---: | --- | --- | ---: | ---: | --- | +| coarse | 147 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass | +| fine | 2,187 | `0 / 0 / 0` | `0 / 0` | 0 | 0 | pass | + +Each CSV contains only the exact factor-one `Frame` value shown above. Thus the +row prechecks required before numerical tolerance evaluation pass for the +translation projection in each mesh. + +## 4. Applied tolerance policy + +`U1/U2/U3` remain one global-length, blocking translation family within each +case. The component rows in Section 6 are diagnostics only: they use the same +case-family scale and near-zero band below and do not introduce a component +scale, component-specific tolerance, or a new approved family. + +For the reference values `r_i` and FESA values `f_i`, `docs/TOLERANCE.md` is +applied exactly: + +\[ +S=\max_i|r_i|,\qquad B=0.01S,\qquad e_i=|f_i-r_i|. +\] + +- If `|r_i| <= B`, the row passes iff `e_i <= B`. +- Otherwise, the row passes iff `e_i / |r_i| <= 0.05`. +- The whole family also requires `RMS(e_i) / S <= 0.01`. +- There is no independent absolute-error gate, `max(1,S)` floor, zero clamp, + row omission, or averaging. A zero-scale family would require exact FESA + zero; neither translation family has zero reference scale. + +## 5. Translation-family results + +| mesh | rows | `S` | `B=0.01S` | near-zero / significant rows | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | relative RMS | verdict | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| coarse | 147 | `2.3740820300000001e-05` | `2.3740820300000003e-07` | 122 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `2.4530813178127803e-08` | `2.9742030342848264e-07` | `1.0332757195473908e-03` | pass | +| fine | 2,187 | `2.5795705400000001e-05` | `2.5795705400000002e-07` | 1,626 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `5.8615647876386634e-09` | `2.7411825664926473e-07` | `2.2723025777921402e-04` | pass | + +Both sets have zero row failures and relative RMS values below the common +`0.01` threshold. This is a translation-only diagnostic pass; it is not a +full external-reference verdict for the nonlinear-static feature. + +## 6. Component diagnostics under the unchanged family scale + +The `near-zero/significant` counts and every row decision below use the Section 5 +family band `B`, not a component-derived scale. A dash for maximum relative +error means all rows of that component were near-zero and were therefore judged +only by the approved absolute-band rule. + +### 6.1 Coarse mesh + +| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| U1 | 49 | 49 / 0 | 0 | `5.9371608358817413e-12` | — | `1.7563955953584068e-12` | `1.2294769167508847e-11` | `12; -8.7994083858817417e-12; -2.8622475500000000e-12; 5.9371608358817413e-12` | +| U2 | 49 | 49 / 0 | 0 | `5.9379769034414602e-12` | — | `1.7566506185832881e-12` | `1.2296554330083018e-11` | `19; 8.7996068934414599e-12; 2.8616299900000001e-12; 5.9379769034414602e-12` | +| U3 | 49 | 24 / 25 | 0 | `1.9037855439354404e-07` | `8.5711169439298945e-03` | `4.2488614702881049e-08` | `2.9742030292016737e-07` | `2; -2.3550441745606457e-05; -2.3740820300000001e-05; 1.9037855439354404e-07` | + +### 6.2 Fine mesh + +| component | rows | near-zero / significant | row failures | max absolute error | max significant-row relative error | RMS error | `L2(error)` | worst row `(node; fesa; reference; abs error)` | +| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- | +| U1 | 729 | 729 / 0 | 0 | `5.6550975712048108e-12` | — | `1.5513648050863109e-12` | `4.1886849737330394e-11` | `27; -1.1143569120481096e-13; 5.5436618799999999e-12; 5.6550975712048108e-12` | +| U2 | 729 | 729 / 0 | 0 | `5.6547834814404039e-12` | — | `1.5512360377367428e-12` | `4.1883373018892053e-11` | `16; -1.1132282144040392e-13; 5.5434606599999999e-12; 5.6547834814404039e-12` | +| U3 | 729 | 168 / 561 | 0 | `1.6193812501096337e-07` | `6.2777164841928829e-03` | `1.0152527787009038e-08` | `2.7411825024924402e-07` | `2; -2.5633767274989038e-05; -2.5795705400000001e-05; 1.6193812501096337e-07` | + +## 7. Deterministically ordered largest absolute-error rows + +Rows are listed by descending absolute error, then source node label and +component for a deterministic display. `part-1-1` below is the canonical +case-insensitive instance identity. + +| mesh | rank | key `(instance, node, component)` | FESA | reference | absolute error | applied rule and metric | +| --- | ---: | --- | ---: | ---: | ---: | --- | +| coarse | 1 | `(part-1-1, 2, U3)` | `-2.3550441745606457e-05` | `-2.3740820300000001e-05` | `1.9037855439354404e-07` | relative; `8.0190386005130586e-03` | +| coarse | 2 | `(part-1-1, 35, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` | +| coarse | 3 | `(part-1-1, 39, U3)` | `-1.2104431681576916e-05` | `-1.2190867900000000e-05` | `8.6436218423083233e-08` | relative; `7.0902432158323394e-03` | +| fine | 1 | `(part-1-1, 2, U3)` | `-2.5633767274989038e-05` | `-2.5795705400000001e-05` | `1.6193812501096337e-07` | relative; `6.2777164841928829e-03` | +| fine | 2 | `(part-1-1, 21, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` | +| fine | 3 | `(part-1-1, 69, U3)` | `-2.3863834908375246e-05` | `-2.3782464300000001e-05` | `8.1370608375244783e-08` | relative; `3.4214540322150206e-03` | + +## 8. Mesh trend interpretation + +The fine-mesh translation relative RMS divided by the coarse-mesh translation +relative RMS is + +\[ +\frac{2.2723025777921402\times10^{-4}} + {1.0332757195473908\times10^{-3}} +=0.21991251074664606. +\] + +This is a `78.008748925335397%` reduction in the separately measured +reference-normalized translation RMS. It is consistent with the hypothesis +that the coarse-case discrepancy is mesh-sensitive, and the fine case also +passes the same row/RMS policy. + +It is not an observed order of convergence, a proof of monotonic convergence, +or a solution-accuracy claim outside these translation rows: the two models have +different meshes and distinct external-reference outputs, and no common-mesh +interpolation or mesh-size-rate study was performed. + +## 9. Explicit exclusions and no-change assertion + +This report deliberately excludes: + +- all reaction quantities; +- `UR1/UR2/UR3` rotations; +- all stress quantities, including the user-noted `reference/shell` element-label + ordering change; +- Newton convergence lifecycle and iteration-log acceptance beyond identifying + the accepted factor-one HDF5 frame; +- `USER-DECISION-004` disposition; +- Step 11 and Step 12 status, Physics Evaluation, and Release readiness. + +No source, test, CMake, comparator, tolerance policy, phase file, canonical +reference-comparison report, declared input, or reference artifact was modified +for this report. The report also does not create `implementation-report.md`, +`build-test.md`, or `reference-comparison.md`. + +## 10. Handoff + +Within this narrow scope there is no artifact, identity, finite-value, or +translation-tolerance blocker. The report is handed to the Coordinator as +translation-only diagnostic evidence; gate ownership and all excluded work remain +unchanged. diff --git a/include/fesa/analysis/analysis.h b/include/fesa/analysis/analysis.h index 8a11b03..29a95a4 100644 --- a/include/fesa/analysis/analysis.h +++ b/include/fesa/analysis/analysis.h @@ -7,10 +7,11 @@ namespace fesa { -/// @brief Carries input and authoritative output paths for one analysis run. +/// @brief Carries input, authoritative output, and diagnostic-log paths. struct AnalysisRequest { std::filesystem::path input_path; std::filesystem::path output_path; + std::filesystem::path log_path; }; /// @brief Defines the minimal execution contract shared by analysis procedures. diff --git a/include/fesa/analysis/linear_static_analysis.h b/include/fesa/analysis/linear_static_analysis.h index 8911bde..f0e7595 100644 --- a/include/fesa/analysis/linear_static_analysis.h +++ b/include/fesa/analysis/linear_static_analysis.h @@ -1,18 +1,7 @@ #ifndef FESA_ANALYSIS_LINEAR_STATIC_ANALYSIS_H_ #define FESA_ANALYSIS_LINEAR_STATIC_ANALYSIS_H_ -#include -#include - #include "fesa/analysis/analysis.h" -#include "fesa/analysis/analysis_model.h" -#include "fesa/analysis/analysis_state.h" -#include "fesa/constraints/essential_constraint_policy.h" -#include "fesa/elements/element.h" -#include "fesa/fem/dof_manager.h" -#include "fesa/math/sparse_matrix.h" -#include "fesa/math/vector.h" -#include "fesa/model/domain.h" namespace fesa { @@ -20,9 +9,8 @@ class LinearSolver; class ParallelFor; class ResultsWriter; -/// @brief Orchestrates the single-step linear-static procedure. -/// @note Factorization, substitution, recovery, and writing remain separately -/// observable through injected backend boundaries. +/// @brief Retains the legacy Analysis facade for linear-static callers. +/// @note Numerical stages are owned by LinearStaticProcedureExecutor. class LinearStaticAnalysis final : public Analysis { public: /// @brief Creates a procedure using non-owned backend adapters. @@ -31,42 +19,14 @@ class LinearStaticAnalysis final : public Analysis { LinearSolver& linear_solver, ResultsWriter& results_writer); - /// @brief Runs the approved eight-stage linear-static lifecycle. + /// @brief Prepares, executes, and writes a linear-static analysis. /// @return The first stage failure or successful result finalization. Status Run(const AnalysisRequest& request) override; private: - /// @brief Initializes owned input and Domain state for a run candidate. - Status InitializeCandidate(const AnalysisRequest& request); - /// @brief Builds the non-owning active-model view. - Status BuildAnalysisModel(); - /// @brief Creates runtime elements, stable DOFs, and the sparse pattern. - Status BuildDofMapAndSparsePattern(); - /// @brief Assembles full stiffness and stable constraint partitions. - Status AssembleAndPartitionStiffness(); - /// @brief Factorizes Kff before any load assembly. - Status FactorizeFreeSystem(); - /// @brief Assembles loads and forms Ff-Kfc*dc without solving. - Status AssembleLoadsAndEffectiveRhs(); - /// @brief Substitutes the retained factorization and reconstructs full d. - Status SubstituteAndReconstruct(); - /// @brief Recovers a complete candidate before writing authoritative output. - Status RecoverAndWrite(); - const ParallelFor& parallel_for_; LinearSolver& linear_solver_; ResultsWriter& results_writer_; - AnalysisRequest request_; - std::unique_ptr domain_; - std::unique_ptr model_; - std::vector> elements_; - ElementView element_view_; - std::unique_ptr dofs_; - std::unique_ptr state_; - std::unique_ptr full_stiffness_; - std::unique_ptr partitioned_stiffness_; - std::unique_ptr effective_rhs_; - std::vector diagnostics_; }; } // namespace fesa diff --git a/include/fesa/analysis/linear_static_procedure.h b/include/fesa/analysis/linear_static_procedure.h new file mode 100644 index 0000000..fe02c04 --- /dev/null +++ b/include/fesa/analysis/linear_static_procedure.h @@ -0,0 +1,31 @@ +#ifndef FESA_ANALYSIS_LINEAR_STATIC_PROCEDURE_H_ +#define FESA_ANALYSIS_LINEAR_STATIC_PROCEDURE_H_ + +#include "fesa/analysis/prepared_analysis.h" + +namespace fesa { + +class LinearSolver; +class ParallelFor; + +/// @brief Executes the approved linear-static procedure on a prepared Domain. +class LinearStaticProcedureExecutor { + public: + /// @brief Creates a procedure executor with caller-owned backend adapters. + /// @param parallel_for Deterministic element-local execution adapter. + /// @param linear_solver Factorization and substitution adapter. + LinearStaticProcedureExecutor(const ParallelFor& parallel_for, + LinearSolver& linear_solver); + + /// @brief Computes linear-static state without writing HDF5 output. + /// @return A validated state and sorted diagnostics, or a procedure failure. + Result Execute(const Domain& domain) const; + + private: + const ParallelFor& parallel_for_; + LinearSolver& linear_solver_; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_LINEAR_STATIC_PROCEDURE_H_ diff --git a/include/fesa/analysis/newton_iteration_log.h b/include/fesa/analysis/newton_iteration_log.h new file mode 100644 index 0000000..6c2b9c4 --- /dev/null +++ b/include/fesa/analysis/newton_iteration_log.h @@ -0,0 +1,89 @@ +#ifndef FESA_ANALYSIS_NEWTON_ITERATION_LOG_H_ +#define FESA_ANALYSIS_NEWTON_ITERATION_LOG_H_ + +#include +#include +#include +#include + +#include "fesa/analysis/nonlinear_static_control.h" +#include "fesa/core/status.h" + +namespace fesa { + +/// @brief Identifies the latest Newton procedure stage reached by a record. +enum class NewtonIterationStage { + kEntered, + kKinematicsEvaluated, + kInternalAssembled, + kExternalAssembled, + kSolvedCorrection, + kConvergenceEvaluated, + kAccepted, + kFailed, +}; + +/// @brief Carries the controlled failure that ended one Newton iteration. +struct NewtonIterationFailure { + bool present; + NewtonIterationStage stage; + std::string diagnostic_code; + std::string reason; +}; + +/// @brief Carries one fixed-schema Newton iteration diagnostic record. +struct NewtonIterationLogRecord { + std::string step_name; + std::uint32_t increment_index; + double load_factor; + std::uint32_t iteration; + NewtonIterationStage last_completed_stage; + NewtonIterationFailure failure; + std::string transition; + std::string outcome; + std::string diagnostic_code; + NewtonChannelDecision force_residual; + NewtonChannelDecision moment_residual; + NewtonChannelDecision translation_correction; + NewtonChannelDecision rotation_correction; + bool combined_passed; +}; + +/// @brief Writes deterministic, line-oriented Newton iteration diagnostics. +/// @note A write, flush, or close failure permanently prevents a successful +/// log lifecycle for this writer instance. +class NewtonIterationLogWriter { + public: + /// @brief Opens and truncates the diagnostic log before Newton execution. + /// @param log_path Derived application-owned diagnostic-log path. + /// @return Success when the writer owns an empty binary log, otherwise an + /// output failure with code `log-output-failure`. + Status Open(const std::filesystem::path& log_path); + + /// @brief Writes one complete LF-terminated Newton iteration record. + /// @param record Explicit stage, outcome, and typed convergence decision. + /// @return Success after writing a complete record, otherwise an output + /// failure with code `log-output-failure`. + Status Write(const NewtonIterationLogRecord& record); + + /// @brief Flushes every complete record written so far to the log. + /// @return Success after the stream flush, otherwise an output failure with + /// code `log-output-failure`. + Status Flush(); + + /// @brief Closes the log before authoritative result finalization. + /// @return Success after close, otherwise an output failure with code + /// `log-output-failure`. + Status Close(); + + private: + enum class State { kReady, kOpen, kClosed, kFailed }; + + std::ofstream stream_; + std::filesystem::path log_path_; + State state_{State::kReady}; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_NEWTON_ITERATION_LOG_H_ diff --git a/include/fesa/analysis/nonlinear_analysis_state.h b/include/fesa/analysis/nonlinear_analysis_state.h new file mode 100644 index 0000000..7efee97 --- /dev/null +++ b/include/fesa/analysis/nonlinear_analysis_state.h @@ -0,0 +1,118 @@ +#ifndef FESA_ANALYSIS_NONLINEAR_ANALYSIS_STATE_H_ +#define FESA_ANALYSIS_NONLINEAR_ANALYSIS_STATE_H_ + +#include +#include +#include + +#include "fesa/core/source_identity.h" +#include "fesa/core/status.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/math/vector.h" +#include "fesa/model/domain.h" +#include "fesa/results/result_records.h" + +namespace fesa { + +/// @brief Stores one fixed-reference baseline orientation for a source node. +struct NonlinearNodeBaseline { + EntityIndex node_index; + SourceEntityId source_id; + std::array, 3> triad; + std::array director; +}; + +/// @brief Carries the complete stable-order nonlinear node baseline. +struct NonlinearStateBaselineInput { + std::vector node_baselines; +}; + +/// @brief Owns one complete nonlinear trial or committed state identity. +struct NonlinearTrialState { + std::uint32_t increment_index; + double load_factor; + bool is_factor_zero_baseline; + std::vector nodal_internal_order; + std::vector nodal_source_ids; + Vector generalized_coordinates; + Vector displacement; + Vector rotation_vector; + std::vector, 3>> nodal_triad; + std::vector> nodal_director; + Vector internal_force; + Vector external_force; + Vector residual; + Vector reaction; + std::vector shell_results; + double physical_strain_energy; + std::array global_equilibrium; +}; + +/// @brief Stores one authoritative nonlinear increment frame. +struct AcceptedFrameState { + std::uint32_t frame_index; + std::uint32_t increment_index; + double load_factor; + std::uint32_t iteration_count; + bool is_factor_one; + std::vector nodal_internal_order; + std::vector nodal_source_ids; + Vector generalized_coordinates; + Vector displacement; + Vector rotation_vector; + std::vector, 3>> nodal_triad; + std::vector> nodal_director; + Vector internal_force; + Vector external_force; + Vector residual; + Vector reaction; + std::vector shell_results; + double physical_strain_energy; + std::array global_equilibrium; +}; + +/// @brief Owns committed nonlinear state and validated accepted frames. +class NonlinearAnalysisState { + public: + /// @brief Creates the factor-zero committed state from fixed node baselines. + /// @param domain Immutable owner of stable node and shell-element identities. + /// @param dofs Owner of the full global [u, phi] dimension. + /// @param baseline One finite triad/director entry per Domain node. + /// @return A factor-zero state or a structured model failure. + static Result Create( + const Domain& domain, const DofManager& dofs, + const NonlinearStateBaselineInput& baseline); + + /// @brief Returns an independent trial initialized from committed state. + /// @return A copy that the caller may mutate without changing committed state. + Result BeginTrialFromCommitted() const; + + /// @brief Atomically appends one complete validated accepted frame. + /// @param frame Converged factor-ordered state with full residual evidence. + /// @return Success after replacing committed state and appending the frame. + Status CommitAcceptedFrame(const AcceptedFrameState& frame); + + /// @brief Discards caller-owned trial work without changing committed state. + void DiscardTrial() noexcept; + + /// @brief Returns accepted frames in stable load-factor order. + const std::vector& AcceptedFrames() const noexcept; + + /// @brief Returns the current committed factor-zero or accepted state. + const NonlinearTrialState& CommittedState() const noexcept; + + private: + /// @brief Retains the validated immutable inventory for frame commits. + NonlinearAnalysisState(NonlinearTrialState committed_state, + std::size_t full_dof_count, + std::vector shell_element_order); + + NonlinearTrialState committed_state_; + std::size_t full_dof_count_; + std::vector shell_element_order_; + std::vector accepted_frames_; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_NONLINEAR_ANALYSIS_STATE_H_ diff --git a/include/fesa/analysis/nonlinear_static_control.h b/include/fesa/analysis/nonlinear_static_control.h new file mode 100644 index 0000000..82a0be1 --- /dev/null +++ b/include/fesa/analysis/nonlinear_static_control.h @@ -0,0 +1,131 @@ +#ifndef FESA_ANALYSIS_NONLINEAR_STATIC_CONTROL_H_ +#define FESA_ANALYSIS_NONLINEAR_STATIC_CONTROL_H_ + +#include +#include +#include + +#include "fesa/core/diagnostic.h" +#include "fesa/core/status.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/math/sparse_matrix.h" +#include "fesa/math/vector.h" +#include "fesa/math/vector3.h" +#include "fesa/model/domain.h" + +namespace fesa { + +/// @brief Identifies one deterministic nonlinear load-factor increment. +struct LoadFactorIncrement { + std::uint32_t increment_index; + double load_factor; + bool is_factor_one; +}; + +/// @brief Identifies the physical dimension of a convergence threshold. +enum class NewtonChannelUnit { + kForce, + kForceLength, + kLength, + kDimensionless, +}; + +inline constexpr double kNewtonRelativeThreshold = 1.0e-2; +inline constexpr double kNewtonZeroScaleThreshold = 1.0e-3; + +/// @brief Carries one same-trial free residual convergence channel. +struct NewtonResidualChannelInput { + std::string identity; + Vector free_residual; + Vector free_internal; + Vector free_external; +}; + +/// @brief Carries one same-iteration free correction convergence channel. +struct NewtonCorrectionChannelInput { + std::string identity; + Vector fresh_correction; + Vector current_increment; +}; + +/// @brief Groups the four approved Newton convergence channels. +struct NewtonConvergenceInput { + NewtonResidualChannelInput force_residual; + NewtonResidualChannelInput moment_residual; + NewtonCorrectionChannelInput translation_correction; + NewtonCorrectionChannelInput rotation_correction; +}; + +/// @brief Identifies the only approved Newton convergence comparison branch. +enum class NewtonConvergenceBranch { kRelative, kZeroScale }; + +/// @brief Records the deterministic decision for one Newton channel. +struct NewtonChannelDecision { + std::string identity; + double numerator_norm; + double denominator_scale; + NewtonConvergenceBranch branch; + double threshold; + NewtonChannelUnit threshold_unit; + bool passed; +}; + +/// @brief Groups all four channel decisions and their logical conjunction. +struct NewtonConvergenceResult { + NewtonChannelDecision force_residual; + NewtonChannelDecision moment_residual; + NewtonChannelDecision translation_correction; + NewtonChannelDecision rotation_correction; + bool combined_passed; +}; + +/// @brief Stores the full-space fixed-load vector and its exact tangent. +struct GlobalFixedLoadContribution { + Vector generalized_external_force; + SparseMatrix generalized_external_tangent; + std::vector diagnostics; +}; + +/// @brief Derives the fixed nonlinear factor path from raw static controls. +/// @param step Immutable nonlinear static step that owns raw source controls. +/// @return Ordered factors ending in an exactly assigned factor one, or an +/// input failure. +Result> BuildFixedLoadFactorSequence( + const StepDefinition& step); + +/// @brief Scales factor-one prescribed targets from the zero step-start state. +/// @param step Immutable nonlinear step whose boundary order fixes output +/// order. +/// @param load_factor Current finite factor in the closed interval [0, 1]. +/// @return One absolute prescribed value per step boundary component, or an +/// input failure. +Result ApplyAbsolutePrescribedDisplacementTarget( + const StepDefinition& step, double load_factor); + +/// @brief Assembles fixed-global CLOAD work once in full generalized space. +/// @param domain Immutable nonlinear semantic model with one active step. +/// @param dofs Stable full-DOF mapping for domain nodes. +/// @param trial_generalized_coordinates Current full global [u, phi] trial. +/// @param load_factor Current finite factor in the closed interval [0, 1]. +/// @return External vector and tangent for r=f_int-f_ext and K=K_int-K_ext, +/// or a structured model/solver failure. +Result AssembleGlobalFixedLoadContribution( + const Domain& domain, const DofManager& dofs, + const Vector& trial_generalized_coordinates, double load_factor); + +/// @brief Rejects a nonzero source moment with director-parallel work. +/// @param director Current finite unit director in global coordinates. +/// @param source_moment Immutable fixed-global source moment. +/// @return Success when rho_M is at most 1e-12 or the source moment is zero. +Status CheckMomentAdmissibility(const Vector3& director, + const Vector3& source_moment); + +/// @brief Evaluates the four immutable, typed Newton convergence gates. +/// @param input Same-trial free residuals and same-iteration corrections. +/// @return Per-channel decision records and their logical conjunction. +NewtonConvergenceResult EvaluateNewtonConvergence( + const NewtonConvergenceInput& input); + +} // namespace fesa + +#endif // FESA_ANALYSIS_NONLINEAR_STATIC_CONTROL_H_ diff --git a/include/fesa/analysis/nonlinear_static_procedure.h b/include/fesa/analysis/nonlinear_static_procedure.h new file mode 100644 index 0000000..ba12a38 --- /dev/null +++ b/include/fesa/analysis/nonlinear_static_procedure.h @@ -0,0 +1,33 @@ +#ifndef FESA_ANALYSIS_NONLINEAR_STATIC_PROCEDURE_H_ +#define FESA_ANALYSIS_NONLINEAR_STATIC_PROCEDURE_H_ + +#include "fesa/analysis/prepared_analysis.h" + +namespace fesa { + +class NewtonIterationLogWriter; +class ParallelFor; +class TangentSolver; + +/// @brief Executes fixed-load-factor full-Newton nonlinear static analysis. +class NonlinearStaticProcedureExecutor { + public: + /// @brief Creates a procedure executor with caller-owned backend adapters. + /// @param parallel_for Deterministic element-local execution adapter. + /// @param tangent_solver Fresh unsymmetric tangent solve adapter. + NonlinearStaticProcedureExecutor(const ParallelFor& parallel_for, + TangentSolver& tangent_solver); + + /// @brief Computes accepted nonlinear frames and appends iteration records. + /// @return A validated nonlinear state without writing HDF5 output. + Result Execute( + const Domain& domain, NewtonIterationLogWriter& log) const; + + private: + const ParallelFor& parallel_for_; + TangentSolver& tangent_solver_; +}; + +} // namespace fesa + +#endif // FESA_ANALYSIS_NONLINEAR_STATIC_PROCEDURE_H_ diff --git a/include/fesa/analysis/prepared_analysis.h b/include/fesa/analysis/prepared_analysis.h new file mode 100644 index 0000000..22d7b4b --- /dev/null +++ b/include/fesa/analysis/prepared_analysis.h @@ -0,0 +1,71 @@ +#ifndef FESA_ANALYSIS_PREPARED_ANALYSIS_H_ +#define FESA_ANALYSIS_PREPARED_ANALYSIS_H_ + +#include +#include +#include + +#include "fesa/analysis/analysis_state.h" +#include "fesa/analysis/nonlinear_analysis_state.h" +#include "fesa/core/diagnostic.h" +#include "fesa/core/status.h" +#include "fesa/model/domain.h" + +namespace fesa { + +class LinearStaticProcedureExecutor; +class NewtonIterationLogWriter; +class NonlinearResultsWriter; +class NonlinearStaticProcedureExecutor; +class ResultsWriter; +struct DerivedOutputPaths; + +/// @brief Owns one parsed and semantically mapped analysis input. +struct PreparedAnalysisInput { + Domain domain; + std::vector diagnostics; +}; + +/// @brief Parses and maps an input file exactly once for procedure execution. +/// @param input_path Source Abaqus input path. +/// @return A movable Domain and sorted mapping diagnostics, or an input +/// failure. +Result PrepareAnalysisInput( + const std::filesystem::path& input_path); + +/// @brief Stores a completed linear-static calculation before result writing. +struct LinearStaticExecutionResult { + AnalysisState state; + std::vector diagnostics; +}; + +/// @brief Stores a completed nonlinear-static calculation before result +/// writing. +struct NonlinearStaticExecutionResult { + NonlinearAnalysisState state; + std::vector diagnostics; +}; + +using PreparedAnalysisOutcome = + std::variant; + +/// @brief Selects the approved procedure from a prepared Domain. +/// @pre The executors and log outlive this call. +/// @return A validated procedure outcome without opening a result file. +Result ExecutePreparedAnalysis( + const Domain& domain, LinearStaticProcedureExecutor& linear_executor, + NonlinearStaticProcedureExecutor& nonlinear_executor, + NewtonIterationLogWriter& log); + +/// @brief Writes an already computed outcome to its authoritative result file. +/// @pre The Newton log has closed successfully before this function is called. +/// @return Success after the selected writer atomically finalizes its result. +Status FinalizePreparedAnalysisResult( + const DerivedOutputPaths& paths, const Domain& domain, + const PreparedAnalysisOutcome& outcome, + const std::vector& diagnostics, ResultsWriter& linear_writer, + NonlinearResultsWriter& nonlinear_writer); + +} // namespace fesa + +#endif // FESA_ANALYSIS_PREPARED_ANALYSIS_H_ diff --git a/include/fesa/app/fesa_application.h b/include/fesa/app/fesa_application.h index 3d0f447..a4ea467 100644 --- a/include/fesa/app/fesa_application.h +++ b/include/fesa/app/fesa_application.h @@ -9,8 +9,8 @@ namespace fesa { /// @brief Owns the argv-independent CLI contract and stable process exit codes. class FesaApplication { public: - /// @brief Runs one solver invocation from operands and options after argv[0]. - /// @param arguments Input path and optional `--output` pair. + /// @brief Runs one solver invocation from arguments after argv[0]. + /// @param arguments One input path with no unsupported option token. /// @return The stable CLI exit code for usage, input, model, solver, or /// output status. int Run(const std::vector& arguments); diff --git a/include/fesa/app/output_paths.h b/include/fesa/app/output_paths.h new file mode 100644 index 0000000..a90d1bb --- /dev/null +++ b/include/fesa/app/output_paths.h @@ -0,0 +1,58 @@ +#ifndef FESA_APP_OUTPUT_PATHS_H_ +#define FESA_APP_OUTPUT_PATHS_H_ + +#include +#include +#include +#include + +#include "fesa/core/status.h" + +namespace fesa { + +/// @brief Names the input and user-addressed output files for one invocation. +struct DerivedOutputPaths { + std::filesystem::path input_path; + std::filesystem::path results_path; + std::filesystem::path log_path; +}; + +/// @brief Retains exclusive ownership of one derived output pair. +/// @note The lease owns a platform-private lock and must outlive output I/O. +class OutputWriteLease { + public: + OutputWriteLease(const OutputWriteLease&) = delete; + OutputWriteLease& operator=(const OutputWriteLease&) = delete; + OutputWriteLease(OutputWriteLease&&) noexcept; + OutputWriteLease& operator=(OutputWriteLease&&) noexcept; + ~OutputWriteLease(); + + private: + class Impl; + + friend Result AcquireOutputWriteLease( + const DerivedOutputPaths& paths); + + explicit OutputWriteLease(std::unique_ptr impl) noexcept; + + std::unique_ptr impl_; +}; + +/// @brief Validates CLI operands and derives lexical sibling output paths. +/// @param arguments Arguments after argv[0]. +/// @param invocation_cwd Lexical base for a relative input path. +/// @return The input/result/log path triplet or a usage failure. +/// @note This function does not resolve symlinks, junctions, or short names. +Result DeriveSingleInputOutputPaths( + const std::vector& arguments, + const std::filesystem::path& invocation_cwd); + +/// @brief Acquires exclusive ownership for writes to one output pair. +/// @return A move-only lease or an output-busy failure. +/// @note The lease does not create, truncate, or replace public output files. +Result AcquireOutputWriteLease( + const DerivedOutputPaths& paths); + +} // namespace fesa + +#endif // FESA_APP_OUTPUT_PATHS_H_ diff --git a/include/fesa/elements/finite_rotation.h b/include/fesa/elements/finite_rotation.h new file mode 100644 index 0000000..29513b5 --- /dev/null +++ b/include/fesa/elements/finite_rotation.h @@ -0,0 +1,63 @@ +#ifndef FESA_ELEMENTS_FINITE_ROTATION_H_ +#define FESA_ELEMENTS_FINITE_ROTATION_H_ + +#include "fesa/core/status.h" +#include "fesa/math/matrix.h" +#include "fesa/math/vector3.h" + +namespace fesa { + +/// @brief Stores one finite-rotation coordinate and its derived triad state. +struct FiniteRotationState { + /// @brief Fixed-global principal-chart rotation coordinate in radians. + Vector3 phi; + + /// @brief Proper orthogonal triad computed as exp(phi^) times the initial + /// frame. + Matrix q; + + /// @brief Current director computed from the third column of q. + Vector3 director; +}; + +/// @brief Computes Rodrigues' exponential of the three-dimensional skew map. +/// @param phi Fixed-global rotation coordinate in radians. +/// @return The 3-by-3 rotation tensor exp(phi^). +/// @pre phi is finite and lies inside the approved principal chart. +Matrix ExpSkew(const Vector3& phi); + +/// @brief Computes the SO(3) left Jacobian for a fixed-global coordinate. +/// @param phi Fixed-global rotation coordinate in radians. +/// @return The 3-by-3 left Jacobian that maps coordinate variations to spatial +/// rotations. +/// @pre phi is finite and lies inside the approved principal chart. +Matrix LeftJacobianSO3(const Vector3& phi); + +/// @brief Computes the inverse transpose of the SO(3) left Jacobian. +/// @param phi Fixed-global rotation coordinate in radians. +/// @return The 3-by-3 inverse-transpose left Jacobian. +/// @pre phi is finite and lies inside the approved principal chart. +Matrix InverseTransposeLeftJacobianSO3(const Vector3& phi); + +/// @brief Builds a checked finite-rotation state from its reference frame. +/// @param phi Fixed-global principal-chart rotation coordinate in radians. +/// @param initial_frame Valid initial right-handed 3-by-3 triad. +/// @return A complete finite state or an `invalid-accepted-state` failure. +/// @note The input frame is validated but never normalized or repaired. +Result MakeFiniteRotationState( + const Vector3& phi, const Matrix& initial_frame); + +/// @brief Applies a fixed-global Newton rotation increment to one state. +/// @param committed Fully validated state that remains unchanged by this call. +/// @param delta_phi Fixed-global additive rotation correction in radians. +/// @param initial_frame Valid initial right-handed 3-by-3 triad. +/// @return A rebuilt trial state or an `invalid-accepted-state` failure. +/// @note The result is recomputed from phi plus delta_phi and initial_frame; +/// incremental tensors are not successively composed. +Result ApplyGlobalRotationIncrement( + const FiniteRotationState& committed, const Vector3& delta_phi, + const Matrix& initial_frame); + +} // namespace fesa + +#endif // FESA_ELEMENTS_FINITE_ROTATION_H_ diff --git a/include/fesa/elements/nonlinear_mitc4_shell.h b/include/fesa/elements/nonlinear_mitc4_shell.h new file mode 100644 index 0000000..bab0476 --- /dev/null +++ b/include/fesa/elements/nonlinear_mitc4_shell.h @@ -0,0 +1,112 @@ +#ifndef FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_ +#define FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_ + +#include +#include + +#include "fesa/core/status.h" +#include "fesa/elements/mitc4_shell.h" +#include "fesa/math/matrix.h" +#include "fesa/math/vector.h" +#include "fesa/math/vector3.h" +#include "fesa/model/model_types.h" +#include "fesa/results/result_records.h" + +namespace fesa { + +/// @brief Stores one four-node nonlinear shell trial in global coordinates. +struct NonlinearMitc4TrialDofs { + std::array displacement; + std::array rotation_vector; +}; + +/// @brief Stores physical shell recovery at one midsurface Gauss location. +struct NonlinearMitc4RecoveryPoint { + ShellMidsurfaceLocation location; + std::array natural_coordinates; + Mitc4LocalFrame local_frame; + std::array generalized_strain; + std::array section_resultant; + std::array stress; +}; + +/// @brief Stores the fixed four-row nonlinear physical recovery inventory. +struct NonlinearMitc4Recovery { + std::array gauss_points; + double physical_strain_energy; +}; + +/// @brief Stores complete internal equilibrium data for one nonlinear trial. +struct NonlinearMitc4InternalEquilibrium { + Vector internal_residual; + Matrix internal_tangent; + Vector internal_force; + NonlinearMitc4Recovery recovery; + double physical_strain_energy; +}; + +class NonlinearMitc4Shell; + +/// @brief Evaluates the internal residual and tangent at one complete trial. +/// @param element Immutable nonlinear MITC4 reference evaluator. +/// @param trial Complete global translation and rotation trial coordinates. +/// @return Internal force, consistent tangent and physical recovery, or +/// failure. +/// @note External load vectors and their tangents are intentionally excluded. +Result EvaluateInternalResidualAndTangent( + const NonlinearMitc4Shell& element, const NonlinearMitc4TrialDofs& trial); + +/// @brief Evaluates fixed-reference Total Lagrangian MITC4 kinematics. +/// @note This class owns no mutable trial or accepted analysis state. +class NonlinearMitc4Shell { + public: + /// @brief Creates one checked nonlinear MITC4 element kinematics object. + /// @param nodes Four non-owning source nodes in natural source order. + /// @param initial_frames Matching fixed initial node frames in source order. + /// @param section Centered positive-thickness shell section. + /// @param material Homogeneous isotropic material with shell-valid constants. + /// @return A checked evaluator or a structured model failure. + static Result Create( + std::array nodes, + std::array initial_frames, + const ShellSection& section, const LinearElasticMaterial& material); + + /// @brief Evaluates trial physical kinematics and fixed recovery rows. + /// @param trial Global nodal translation and fixed-global rotation vectors. + /// @return Physical recovery or a fail-closed trial diagnostic. + [[nodiscard]] Result EvaluateKinematics( + const NonlinearMitc4TrialDofs& trial) const; + + /// @brief Recovers the same physical quantities for one complete trial. + /// @param trial Global nodal translation and fixed-global rotation vectors. + /// @return Four ordered Gauss rows without nodal stress projection. + [[nodiscard]] Result RecoverState( + const NonlinearMitc4TrialDofs& trial) const; + + private: + /// @brief Retains validated fixed-reference data without analysis ownership. + NonlinearMitc4Shell(std::array coordinates, + std::array initial_frames, + std::array initial_directors, + double thickness, double youngs_modulus, + double poisson_ratio, double drilling_stiffness, + SourceLocation source_location, std::string identity); + + friend Result + EvaluateInternalResidualAndTangent(const NonlinearMitc4Shell& element, + const NonlinearMitc4TrialDofs& trial); + + std::array coordinates_; + std::array initial_frames_; + std::array initial_directors_; + double thickness_; + double youngs_modulus_; + double poisson_ratio_; + double drilling_stiffness_; + SourceLocation source_location_; + std::string identity_; +}; + +} // namespace fesa + +#endif // FESA_ELEMENTS_NONLINEAR_MITC4_SHELL_H_ diff --git a/include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h b/include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h new file mode 100644 index 0000000..691787a --- /dev/null +++ b/include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h @@ -0,0 +1,22 @@ +#ifndef FESA_IO_HDF5_NONLINEAR_HDF5_RESULTS_WRITER_H_ +#define FESA_IO_HDF5_NONLINEAR_HDF5_RESULTS_WRITER_H_ + +#include "fesa/results/nonlinear_results_writer.h" + +namespace fesa { + +/// @brief Writes authoritative schema-v1 nonlinear HDF5 results atomically. +/// @note HDF5 and platform types remain private to the implementation. +class NonlinearHdf5ResultsWriter final : public NonlinearResultsWriter { + public: + /// @brief Writes and self-checks committed nonlinear frames before publish. + /// @return Success only after atomic replacement or structured output failure. + /// @note Factor-zero state remains metadata and is not an accepted frame. + Status Write(const std::filesystem::path& output_path, + const Domain& domain, const NonlinearAnalysisState& state, + const std::vector& diagnostics) override; +}; + +} // namespace fesa + +#endif // FESA_IO_HDF5_NONLINEAR_HDF5_RESULTS_WRITER_H_ diff --git a/include/fesa/model/domain.h b/include/fesa/model/domain.h index d86ce24..a338f3b 100644 --- a/include/fesa/model/domain.h +++ b/include/fesa/model/domain.h @@ -74,6 +74,12 @@ class StepDefinition { const DomainCollectionView& ConcentratedLoads() const noexcept; + /// @brief Returns the approved static procedure identity. + StaticProcedureKind ProcedureKind() const noexcept; + + /// @brief Reports whether this step uses the nonlinear static procedure. + bool IsNonlinearStatic() const noexcept; + /// @brief Returns the static initial increment provenance value. double InitialIncrement() const noexcept; @@ -103,6 +109,8 @@ class StepDefinition { std::vector> loads_; LoadView loads_view_; DomainCollectionView concentrated_loads_view_; + StaticProcedureKind procedure_kind_; + bool nlgeom_; double initial_increment_; double time_period_; double minimum_increment_; diff --git a/include/fesa/model/model_types.h b/include/fesa/model/model_types.h index fc8bc22..0f8558b 100644 --- a/include/fesa/model/model_types.h +++ b/include/fesa/model/model_types.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "fesa/core/diagnostic.h" @@ -52,11 +53,59 @@ struct NodalLoad { SourceLocation location; }; -/// @brief Stores the approved single linear-static step definition. +/// @brief Identifies the approved static procedure semantics for one step. +enum class StaticProcedureKind { + kLinearSmallDisplacement, + kNonlinearFullNewton +}; + +/// @brief Stores the approved single static step definition. struct StaticStepDefinition { + /// @brief Creates a static step with its mapped procedure identity. + StaticStepDefinition( + std::string step_name, + std::vector step_boundaries, + std::vector step_loads, + StaticProcedureKind step_procedure_kind, + bool step_nlgeom, + double step_initial_increment, + double step_time_period, + double step_minimum_increment, + double step_maximum_increment, + SourceLocation step_location) + : name{std::move(step_name)}, + boundaries{std::move(step_boundaries)}, + loads{std::move(step_loads)}, + procedure_kind{step_procedure_kind}, + nlgeom{step_nlgeom}, + initial_increment{step_initial_increment}, + time_period{step_time_period}, + minimum_increment{step_minimum_increment}, + maximum_increment{step_maximum_increment}, + location{std::move(step_location)} {} + + /// @brief Creates a legacy linear static step definition. + StaticStepDefinition( + std::string step_name, + std::vector step_boundaries, + std::vector step_loads, + double step_initial_increment, + double step_time_period, + double step_minimum_increment, + double step_maximum_increment, + SourceLocation step_location) + : StaticStepDefinition( + std::move(step_name), std::move(step_boundaries), + std::move(step_loads), + StaticProcedureKind::kLinearSmallDisplacement, false, + step_initial_increment, step_time_period, step_minimum_increment, + step_maximum_increment, std::move(step_location)) {} + std::string name; std::vector boundaries; std::vector loads; + StaticProcedureKind procedure_kind; + bool nlgeom; double initial_increment; double time_period; double minimum_increment; diff --git a/include/fesa/results/nonlinear_results_writer.h b/include/fesa/results/nonlinear_results_writer.h new file mode 100644 index 0000000..841c16d --- /dev/null +++ b/include/fesa/results/nonlinear_results_writer.h @@ -0,0 +1,33 @@ +#ifndef FESA_RESULTS_NONLINEAR_RESULTS_WRITER_H_ +#define FESA_RESULTS_NONLINEAR_RESULTS_WRITER_H_ + +#include +#include + +#include "fesa/analysis/nonlinear_analysis_state.h" +#include "fesa/core/diagnostic.h" +#include "fesa/core/status.h" +#include "fesa/model/domain.h" + +namespace fesa { + +/// @brief Isolates nonlinear authoritative result storage from solver code. +class NonlinearResultsWriter { + public: + virtual ~NonlinearResultsWriter() = default; + + /// @brief Writes complete accepted nonlinear frames. + /// @param output_path Final authoritative path in the model input directory. + /// @param domain Immutable source and semantic model identity. + /// @param state Committed state containing every accepted increment frame. + /// @param diagnostics Deterministically ordered run diagnostics. + /// @return Success only after backend-specific finalization completes. + virtual Status Write(const std::filesystem::path& output_path, + const Domain& domain, + const NonlinearAnalysisState& state, + const std::vector& diagnostics) = 0; +}; + +} // namespace fesa + +#endif // FESA_RESULTS_NONLINEAR_RESULTS_WRITER_H_ diff --git a/include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h b/include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h new file mode 100644 index 0000000..640f14e --- /dev/null +++ b/include/fesa/solvers/linear/mkl_pardiso_tangent_solver.h @@ -0,0 +1,32 @@ +#ifndef FESA_SOLVERS_LINEAR_MKL_PARDISO_TANGENT_SOLVER_H_ +#define FESA_SOLVERS_LINEAR_MKL_PARDISO_TANGENT_SOLVER_H_ + +#include + +#include "fesa/solvers/linear/tangent_solver.h" + +namespace fesa { + +/// @brief Adapts full-CSR unsymmetric oneMKL PARDISO tangent solves. +class MklPardisoTangentSolver final : public TangentSolver { + public: + /// @brief Constructs an empty, unfactorized PARDISO tangent adapter. + MklPardisoTangentSolver(); + + /// @brief Releases retained PARDISO tangent backend state. + ~MklPardisoTangentSolver() override; + + /// @brief Validates and factorizes one fresh nonlinear tangent matrix. + Status FactorizeFresh(const SparseMatrix& matrix) override; + + /// @brief Solves one correction without refactorizing the tangent. + Status SolveCorrection(const Vector& rhs, Vector& correction) const override; + + private: + class Impl; + std::unique_ptr impl_; +}; + +} // namespace fesa + +#endif // FESA_SOLVERS_LINEAR_MKL_PARDISO_TANGENT_SOLVER_H_ diff --git a/include/fesa/solvers/linear/tangent_solver.h b/include/fesa/solvers/linear/tangent_solver.h new file mode 100644 index 0000000..eb3e2cd --- /dev/null +++ b/include/fesa/solvers/linear/tangent_solver.h @@ -0,0 +1,31 @@ +#ifndef FESA_SOLVERS_LINEAR_TANGENT_SOLVER_H_ +#define FESA_SOLVERS_LINEAR_TANGENT_SOLVER_H_ + +#include "fesa/core/status.h" + +namespace fesa { + +class SparseMatrix; +class Vector; + +/// @brief Factorizes one nonlinear tangent and solves its correction. +class TangentSolver { + public: + /// @brief Destroys a backend-neutral nonlinear tangent solver. + virtual ~TangentSolver() = default; + + /// @brief Replaces any retained state with a fresh tangent factorization. + /// @return Success or a structured solver failure. + virtual Status FactorizeFresh(const SparseMatrix& matrix) = 0; + + /// @brief Solves one correction using the current tangent factorization. + /// @param rhs Immutable free-DOF residual right-hand side. + /// @param correction Updated only after successful finite substitution. + /// @return Success or a structured solver failure. + virtual Status SolveCorrection(const Vector& rhs, Vector& correction) const = + 0; +}; + +} // namespace fesa + +#endif // FESA_SOLVERS_LINEAR_TANGENT_SOLVER_H_ diff --git a/phases/index.json b/phases/index.json index e6f8923..483c0e4 100644 --- a/phases/index.json +++ b/phases/index.json @@ -16,7 +16,8 @@ }, { "dir": "nonlinear-static-newton-raphson", - "status": "pending" + "status": "completed", + "completed_at": "2026-08-28T21:08:58+0900" } ] -} +} \ No newline at end of file diff --git a/phases/nonlinear-static-newton-raphson/index.json b/phases/nonlinear-static-newton-raphson/index.json index b597dda..4bd35b4 100644 --- a/phases/nonlinear-static-newton-raphson/index.json +++ b/phases/nonlinear-static-newton-raphson/index.json @@ -5,67 +5,108 @@ { "step": 0, "name": "cli-output-lease-and-derived-names", - "status": "pending" + "status": "completed", + "summary": "Derived lexical sibling result/log paths, removed --output, and added an exclusive output lease with regression coverage.", + "started_at": "2026-08-24T01:41:01+0900", + "completed_at": "2026-08-24T10:42:14+0900" }, { "step": 1, "name": "nonlinear-static-domain-contract", - "status": "pending" + "status": "completed", + "summary": "Mapped NLGEOM static procedure identity and raw controls while keeping PRESELECT output requests warning-only no-ops.", + "started_at": "2026-08-24T10:42:14+0900", + "completed_at": "2026-08-24T13:17:17+0900" }, { "step": 2, "name": "finite-rotation-state", - "status": "pending" + "status": "completed", + "summary": "Added checked SO(3) finite-rotation state, Jacobians, branch rejection, and unit coverage.", + "started_at": "2026-08-24T13:17:18+0900", + "completed_at": "2026-08-24T13:26:00+0900" }, { "step": 3, "name": "nonlinear-mitc4-kinematics-and-recovery", - "status": "pending" + "status": "completed", + "summary": "Added nonlinear MITC4 fixed-reference kinematics, MITC recovery rows, and finite-rotation/objectivity coverage.", + "started_at": "2026-08-24T13:26:00+0900", + "completed_at": "2026-08-24T13:36:34+0900" }, { "step": 4, "name": "nonlinear-mitc4-residual-and-tangent", - "status": "pending" + "status": "completed", + "summary": "Added same-trial nonlinear MITC4 internal residual/tangent with objective drilling and directional, symmetry, objectivity, patch, and nonfinite coverage.", + "started_at": "2026-08-24T13:36:35+0900", + "completed_at": "2026-08-24T14:00:06+0900" }, { "step": 5, "name": "load-boundary-path-and-convergence-gates", - "status": "pending" + "status": "completed", + "started_at": "2026-08-24T14:00:07+0900", + "summary": "Implemented fixed nonlinear load/boundary control, external tangent assembly, and typed Newton convergence gates with regression coverage.", + "completed_at": "2026-08-24T14:13:14+0900" }, { "step": 6, "name": "backend-neutral-tangent-solver", - "status": "pending" + "status": "completed", + "started_at": "2026-08-24T14:13:14+0900", + "summary": "Added an unsymmetric full-CSR PARDISO tangent solver with fail-closed pivot handling and regression coverage while preserving SPD solver behavior.", + "completed_at": "2026-08-24T14:25:05+0900" }, { "step": 7, "name": "newton-iteration-log-writer", - "status": "pending" + "status": "completed", + "started_at": "2026-08-24T14:25:05+0900", + "summary": "Added fixed-schema Newton iteration log serialization with fail-closed file lifecycle and regression coverage.", + "completed_at": "2026-08-24T14:34:19+0900" }, { "step": 8, "name": "nonlinear-state-commit-rollback", - "status": "pending" + "status": "completed", + "summary": "Added transactional nonlinear committed/trial state with stable full source identities, validated accepted frames, and rollback regression coverage.", + "started_at": "2026-08-24T14:34:19+0900", + "completed_at": "2026-08-24T14:52:08+0900" }, { "step": 9, "name": "nonlinear-hdf5-schema-v1-writer", - "status": "pending" + "status": "completed", + "summary": "Added atomic schema-v1 nonlinear HDF5 accepted-frame output with deterministic diagnostics and regression coverage.", + "started_at": "2026-08-24T14:52:08+0900", + "completed_at": "2026-08-24T15:19:06+0900" }, { "step": 10, "name": "prepared-analysis-flow-and-full-procedure", - "status": "pending" + "status": "completed", + "summary": "Prepared parse-once analysis flow, separated linear/nonlinear procedures, and delayed HDF5 finalization until log close.", + "started_at": "2026-08-24T15:19:07+0900", + "completed_at": "2026-08-24T15:49:07+0900" }, { "step": 11, - "name": "reference-comparison-gate", - "status": "pending" + "name": "equilibrium-projection-and-reference-gate", + "status": "completed", + "summary": "Verified accepted current-arm spatial balance output and the comparator-only inclusive 1e-8/zero-scale global balance gates with focused boundary and schema/procedure checks.", + "started_at": "2026-08-24T15:49:08+0900", + "completed_at": "2026-08-28T09:22:33+0900" }, { "step": 12, "name": "execution-closure-and-evidence-docs", - "status": "pending" + "status": "completed", + "summary": "Collected fresh MSVC/CTest and nonlinear reference evidence, wrote Stage 6 reports, and synchronized directly superseded documentation contracts.", + "started_at": "2026-08-28T19:44:23+0900", + "completed_at": "2026-08-28T21:08:58+0900" } - ] -} + ], + "created_at": "2026-08-24T01:41:01+0900", + "completed_at": "2026-08-28T21:08:58+0900" +} \ No newline at end of file diff --git a/phases/nonlinear-static-newton-raphson/step0.md b/phases/nonlinear-static-newton-raphson/step0.md index 46afd04..470a55c 100644 --- a/phases/nonlinear-static-newton-raphson/step0.md +++ b/phases/nonlinear-static-newton-raphson/step0.md @@ -95,8 +95,8 @@ struct AnalysisRequest { 실행: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure ``` 기대: 새 테스트가 컴파일 실패 또는 assertion 실패로 실패한다. 새 테스트가 예상 없이 통과하면 구현을 중단하고 Coordinator에게 보고한다. @@ -110,18 +110,14 @@ ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --outpu ## VERIFY -실행 전 `Test-Path .harness\config.json`으로 Harness config를 재확인한다. 있으면 그 설정을 우선한다. 없으면 다음 순서로 실행한다. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. Run: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FesaApplication|OutputPath" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FesaApplication|OutputPath" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step1.md b/phases/nonlinear-static-newton-raphson/step1.md index b5ecc7a..73f9b0d 100644 --- a/phases/nonlinear-static-newton-raphson/step1.md +++ b/phases/nonlinear-static-newton-raphson/step1.md @@ -95,8 +95,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "Domain|DomainMapping|Abaqus" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops the Step. @@ -111,18 +111,14 @@ Expected: new tests fail. Unexpected pass stops the Step. ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "Domain|DomainMapping|Abaqus" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "Domain|DomainMapping|Abaqus" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before using these defaults. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step10.md b/phases/nonlinear-static-newton-raphson/step10.md index b165923..83d26e1 100644 --- a/phases/nonlinear-static-newton-raphson/step10.md +++ b/phases/nonlinear-static-newton-raphson/step10.md @@ -134,11 +134,15 @@ Add tests first. - `NSNR-PROC-017`: failed nonlinear run preserves prior final HDF5 according to output lifecycle. - `NSNR-PROC-018`: deterministic repeat produces same sparse structure, nodal source-identity order, result row order, diagnostics, and log line ordering. +### USER-DECISION-003 option-1 revision addendum + +Step 10의 completed status, summary, timestamps와 commits는 보존한다. Existing procedure는 same-trial free residual/internal/external vectors를 force와 moment channel별로 분리하여 `EvaluateNewtonConvergence`에 전달하고 fresh same-iteration correction을 별도로 전달한다. 따라서 option 1의 production correction은 Step 11의 `nonlinear_static_control.cpp`에 한정하며 `nonlinear_static_procedure.cpp`, prepared-analysis API와 log writer production 변경은 예상하지 않는다. Step 11의 shellNL copied-input run과 log assertions이 unloaded rotational external channel의 exact-zero branch, loaded force channel의 retained relative branch, four-channel AND 및 intended factors `0.1..1.0`을 integration 수준에서 검증한다. + Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -150,18 +154,14 @@ Refactor current parse/map and linear compute/recovery out of `LinearStaticAnaly ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "LinearStaticAnalysis|NonlinearStaticProcedure|FesaApplication" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 @@ -175,3 +175,4 @@ Update only Step 10 status and one-line payload. Executor owns timestamps, commi - Do not insert nonlinear branches into `LinearStaticAnalysis` private lifecycle. 이유: new procedure owns its own lifecycle. - Do not replace final HDF5 on failed analysis, log failure, or HDF5 failure. 이유: asymmetric preservation contract requires prior valid final preservation. - Do not construct MKL/TBB/HDF5 backends inside procedure executors. 이유: dependencies are injected so tests can observe lifecycle and no backend type crosses analysis/core public boundaries. +- Do not duplicate the option-1 selector in the procedure or log writer. 이유: the existing procedure already transports the three residual vectors separately and convergence ownership remains in `nonlinear_static_control`. diff --git a/phases/nonlinear-static-newton-raphson/step11.md b/phases/nonlinear-static-newton-raphson/step11.md index 1bfc07e..eec9c14 100644 --- a/phases/nonlinear-static-newton-raphson/step11.md +++ b/phases/nonlinear-static-newton-raphson/step11.md @@ -1,79 +1,143 @@ -# Step 11: reference-comparison-gate +# Step 11: equilibrium-projection-and-reference-gate + +## 목적 + +USER-DECISION-004 option 1과 `AUDIT-001`을 구현·검증한다. 같은 accepted factor-one state에서 +accepted free residual, constrained reaction resultant, global applied-plus-reaction balance error를 +서로 다른 quantity로 재구성하고, 기존 schema-v1 `/global/equilibrium`에는 balance error만 저장한다. +Fine nonlinear case는 primary, coarse nonlinear case는 companion으로 검증한다. Local nodal +`RF1/RF2/RF3`와 physical spatial `RM1/RM2`는 deterministic review-only evidence이고 blocking +verdict를 바꾸지 않는다. Global force와 moment balance는 각각 fixed normalized `<=1e-8` +comparator gate를 사용하며 runtime configuration 또는 product solver acceptance로 노출하지 않는다. ## 읽어야 할 파일 - `AGENTS.md` +- `docs/PRD.md` +- `docs/ARCHITECTURE.md` +- `docs/ADR.md` +- `docs/CODINGSTYLE.md` - `docs/TOLERANCE.md` -- `docs/nonlinear-static-newton-raphson/reference-model.md` -- `docs/nonlinear-static-newton-raphson/io.md` -- `docs/nonlinear-static-newton-raphson/numerical-review.md` +- `docs/nonlinear-static-newton-raphson/requirements.md` +- `docs/nonlinear-static-newton-raphson/research.md` +- `docs/nonlinear-static-newton-raphson/formulation.md` §§11.4, 13.1, 13.4, 14.1 +- `docs/nonlinear-static-newton-raphson/numerical-review.md` §§3.2, 6.2, 6.3 +- `docs/nonlinear-static-newton-raphson/reference-model.md` §§3–6 +- `docs/nonlinear-static-newton-raphson/io.md` §§7.3–7.5.1, 8.1–8.7 +- `docs/nonlinear-static-newton-raphson/implementation-plan.md` +- `docs/nonlinear-static-newton-raphson/corrections.md` §13 +- `phases/nonlinear-static-newton-raphson/index.json` +- `include/fesa/analysis/nonlinear_analysis_state.h` +- `include/fesa/analysis/nonlinear_static_procedure.h` +- `include/fesa/analysis/nonlinear_static_control.h` +- `src/fesa/analysis/nonlinear_static_procedure.cpp` +- `src/fesa/analysis/nonlinear_static_control.cpp` +- `include/fesa/results/nonlinear_results_writer.h` +- `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` +- `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` +- `tests/integration/analysis/nonlinear_static_procedure_test.cpp` +- `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` +- `tests/unit/analysis/nonlinear_static_control_test.cpp` +- `tests/unit/analysis/newton_iteration_log_test.cpp` - `tests/reference/reference_tolerance_policy.h` - `tests/reference/reference_tolerance_policy.cpp` -- `tests/reference/reference_comparison.h` -- `tests/reference/reference_comparison.cpp` -- `tests/reference/mitc4_reference_comparison.h` -- `tests/reference/mitc4_reference_comparison.cpp` -- Step 9 files: `include/fesa/results/nonlinear_results_writer.h`, `include/fesa/io/hdf5/nonlinear_hdf5_results_writer.h` -- Step 10 files: `include/fesa/analysis/prepared_analysis.h`, `src/fesa/app/fesa_application.cpp` +- `tests/reference/nonlinear_static_reference_comparison.h` +- `tests/reference/nonlinear_static_reference_comparison.cpp` +- `tests/reference/nonlinear_static_reference_cases_test.cpp` +- `tests/CMakeLists.txt` +- `.harness/config.json` +- `CMakePresets.json` -## 이전 Step 전제 +## 이전 Step과 보존 전제 -Step 10 runs copied input files through FESA and writes authoritative HDF5 outputs after log close. +- Steps 0–10은 completed다. 그 status, summary, timestamp, commit 또는 구현을 replay, amend, + reset하거나 다시 작성하지 않는다. +- 현재 worktree의 `NSNR-CTRL-018..021`, `NSNR-LOG-012`, `NSNR-PROC-019`, + `NSNR-HDF5-014`, residual-selector GREEN과 `NSNR-REF-001..023` comparator/CMake 작업은 + 이전 blocked Step 11에서 생성된 보존 대상이다. 삭제·재생성·reset하지 말고 현재 내용에서 + 계속한다. +- 현재 comparator의 shared `<=1e-10` global force/moment gate는 이전 blocker를 재현하는 + 보존된 implementation state다. 새 RED가 approved between-threshold metric을 거부하는 것을 + 증명한 뒤 comparator 내부 gate만 `<=1e-8`로 변경한다. +- Selector RED는 이미 과거 실행 evidence에 속한다. 이 재실행에서 selector RED를 fabricate하거나 + 다시 실패시키지 않는다. 기존 테스트가 계속 green인지 focused VERIFY에서 확인한다. +- Step 12는 pending이며 이 Step에서 시작하지 않는다. ## 소유 파일 -- Create: `tests/reference/nonlinear_static_reference_comparison.h` -- Create: `tests/reference/nonlinear_static_reference_comparison.cpp` -- Create: `tests/reference/nonlinear_static_reference_cases_test.cpp` -- Modify: `tests/CMakeLists.txt` +RED test를 먼저 추가한 뒤 필요한 production file만 최소 수정한다. -## 인터페이스 +- Modify test first: `tests/integration/analysis/nonlinear_static_procedure_test.cpp` +- Modify test first: `tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp` +- Preserve and extend test-private comparator: `tests/reference/nonlinear_static_reference_comparison.h` +- Preserve and extend test-private comparator: `tests/reference/nonlinear_static_reference_comparison.cpp` +- Preserve and extend tests: `tests/reference/nonlinear_static_reference_cases_test.cpp` +- Preserve existing registration; edit only if the current sources are not registered: + `tests/CMakeLists.txt` +- Minimal GREEN: `src/fesa/analysis/nonlinear_static_procedure.cpp` +- Minimal GREEN: `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp` +- Preserve existing partial GREEN/tests without redesign: + `src/fesa/analysis/nonlinear_static_control.cpp`, + `tests/unit/analysis/nonlinear_static_control_test.cpp`, + `tests/unit/analysis/newton_iteration_log_test.cpp` + +No public header, new CMake target, new HDF5 dataset, schema-version change or reference artifact is +owned by this Step. + +## Authoritative HDF5 입력과 test-private report 경계 + +Comparator는 아래 existing schema-v1 paths만 읽는다. + +```text +/model/nodes [node_count] +/model/nodal_constraint_mask [node_count,6] +/steps/Step-1/accepted_frames unique factor-one row +/steps/Step-1/frames//nodal/displacement [node_count,6] +/steps/Step-1/frames//nodal/generalized_internal_force [node_count,6] +/steps/Step-1/frames//nodal/generalized_external_force [node_count,6] +/steps/Step-1/frames//nodal/generalized_residual [node_count,6] +/steps/Step-1/frames//nodal/reaction [node_count,6] +/steps/Step-1/frames//global/equilibrium [6] +``` + +`/global/equilibrium` component order is +`FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3` and its required +`location` is `global-balance-error`. + +Preserve the current test-private types and make only the extensions needed by the approved +dispositions and distinct internal evidence. Add the required standard `` and `` +includes to the test-private header. Candidate signature-level shape: ```cpp namespace fesa::test { -struct NonlinearReferenceCase { - std::string case_id; - std::filesystem::path original_input_path; - std::filesystem::path displacement_csv_path; - std::filesystem::path reaction_csv_path; - std::filesystem::path stress_inventory_path; - std::filesystem::path execution_directory; -}; - -struct ArtifactSnapshot { - std::filesystem::path path; - std::string sha256; - std::uintmax_t byte_size; - std::filesystem::file_time_type last_write_time; -}; - enum class NonlinearReferenceDisposition { kBlocking, kWarningOnly, - kExcluded + kReviewOnly, + kExcluded, }; -struct NonlinearReferenceRowKey { - std::string case_id; - std::string accepted_state; - std::string instance_name; - std::int64_t source_node_label; - std::string component; -}; - -struct NonlinearReferenceFamilyReport { +struct NonlinearReferencePrecheckFinding { std::string family_identity; - std::vector components; NonlinearReferenceDisposition disposition; - std::size_t row_count; - ReferenceToleranceFamilyDecision tolerance; + std::string diagnostic_code; + std::vector affected_keys; }; -struct GeneratedRunArtifacts { - std::filesystem::path copied_input_path; - std::filesystem::path generated_results_hdf5; - std::filesystem::path generated_log_path; +struct NonlinearInternalEquilibriumReport { + std::string family_identity; + std::size_t row_count; + double numerator; + double scale; + std::optional normalized_metric; + bool passed; + std::string diagnostic_code; +}; + +struct ConstrainedReactionResultantReport { + std::array force; + std::array moment; }; struct NonlinearReferenceComparisonReport { @@ -85,107 +149,257 @@ struct NonlinearReferenceComparisonReport { std::vector pre_run_artifacts; std::vector post_run_artifacts; std::vector families; + std::vector precheck_findings; + std::vector internal_equilibrium; + ConstrainedReactionResultantReport constrained_reaction_resultant; + bool external_blocking_passed; + bool internal_blocking_passed; bool blocking_passed; }; -enum class NonlinearReferenceClassification { - kPassed, - kFailed, - kWarningOnlyDifferences -}; - -Result> ArtifactCheck( - const NonlinearReferenceCase& reference_case); -Result CopyInputToExecutionDirectory( - const NonlinearReferenceCase& reference_case); -Result RunFesaApplicationOnCopiedInput( - const NonlinearReferenceCase& reference_case, - const std::filesystem::path& copied_input_path); -Result CompareHdf5ToReferenceCsv( - const NonlinearReferenceCase& reference_case, - const std::filesystem::path& hdf5_results_path); -NonlinearReferenceClassification ClassifyReferenceComparison( - const NonlinearReferenceComparisonReport& report); -NonlinearReferenceComparisonReport BuildReferenceComparisonReport( - const NonlinearReferenceCase& reference_case, - const std::filesystem::path& hdf5_results_path); - } // namespace fesa::test ``` +These are test-support interfaces only. Match the existing aggregate/data style and avoid a public +solver API. For an exact-zero internal scale, leave `normalized_metric` empty and use +`diagnostic_code` plus the exact-zero numerator/pass rule instead of writing NaN or Inf. + +## Required physical algorithm + +For each node in stable Domain order at the accepted state: + +1. Read `X` from Domain/model identity and `u, phi` from the accepted state. Set `x=X+u`. +2. Read generalized applied force/covector from `generalized_external_force`. +3. Build constrained generalized reaction by applying the exact component mask to + `generalized_residual` before any rotational conversion. +4. Convert applied and constrained-reaction rotational covectors independently with + `InverseTransposeLeftJacobianSO3(phi)`. Do not convert their sum as a shortcut and do not mix + free generalized residual into reaction. +5. Accumulate, about global origin `[0,0,0]`: + +```text +F_applied += applied spatial force +M_applied += x cross F_applied_node + applied spatial physical moment +F_reaction += constrained reaction spatial force +M_reaction += x cross F_reaction_node + reaction spatial physical moment +global balance error = [F_applied + F_reaction, + M_applied + M_reaction] +``` + +Store only the six-component balance error in the existing accepted-frame +`global_equilibrium` and existing `/global/equilibrium` dataset. Reconstruct the constrained +reaction resultant and accepted free residual separately in the comparator; do not add summary +datasets or a public header. + +For internal blocking gates: + +- Force scale is `max(sum(||F_applied_node||2), sum(||F_reaction_node||2))`. +- Moment scale is + `max(sum(||x cross F_applied_node + M_applied_node||2), + sum(||x cross F_reaction_node + M_reaction_node||2))`. +- Force and moment use separate `||balance_error||2/scale <= 1e-8` gates. If scale is exact zero, + only exact-zero balance passes. No floor, `max(1,scale)` or clamp is allowed. +- Accepted free translation-force and rotation-moment rows use the exact free mask and reproduce + NSNR-069: nonzero matching external scale uses + `||residual||inf/max(||internal||inf,||external||inf) <= 1e-2`; exact-zero external scale uses + typed absolute `<=1e-3`. Finite checks occur first. +- `docs/TOLERANCE.md` is not used for these internal gates. + ## RED -Add tests first. +기존 dirty `NSNR-PROC-019`, `NSNR-HDF5-014`, `NSNR-REF-020..023`은 재작성하지 않는다. +먼저 existing `NSNR-REF-022`를 실행해 old shared gate failure를 다시 관찰·기록한 뒤, +`NSNR-REF-024..025`를 comparator threshold 변경 전에 test-first로 추가한다. Procedure/HDF5 +behavior는 threshold rework를 위해 추가 변경하지 않는다. -- `NSNR-REF-001`: artifact check verifies exact pre-run SHA-256 for every declared input/CSV path. -- `NSNR-REF-002`: original `reference/shellNL/shellNL.inp` bytes are copied unchanged into a unique build-local temp case directory and only the copied `.inp` is passed to `FesaApplication`. -- `NSNR-REF-003`: original `reference/shell/shell.inp` bytes are copied unchanged into a unique build-local temp case directory and only the copied `.inp` is passed to `FesaApplication`. -- `NSNR-REF-004`: copied shellNL run produces copied-sibling `shellNL_results.h5` and `shellNL_log.txt`; copied shell run produces copied-sibling `shell_results.h5` and `shell_log.txt`. -- `NSNR-REF-005`: HDF5 source path identity matches the copied user-addressed input path, and source content identity matches the approved original input hash. -- `NSNR-REF-006`: exact post-run SHA-256, byte size, timestamp, and inventory for all original declared reference artifacts match pre-run snapshots. -- `NSNR-REF-007`: shellNL displacement/reaction rows require exact `Frame` value `Increment 10: Step Time = 1.000`. -- `NSNR-REF-008`: required CSV wide rows expand to unique `(case_id, accepted_state, instance, source_node_label, component)` keys. -- `NSNR-REF-009`: HDF5 rows and CSV rows reject missing, extra, duplicate, and nonfinite required rows before tolerance. -- `NSNR-REF-010`: `linear.translation` has 147 blocking rows. -- `NSNR-REF-011`: `linear.rotation` has 147 warning-only rows. -- `NSNR-REF-012`: `nonlinear.translation` has 147 blocking rows. -- `NSNR-REF-013`: `nonlinear.rotation` has 147 warning-only rows. -- `NSNR-REF-014`: shellNL constrained nodes select only labels `1,3,4,5,6,7,8,9,14,15,16,17,22,23,24,25,26,27,28,29,30,31,32,33`. -- `NSNR-REF-015`: `RF1/RF2` has 48 blocking rows, `RF3` has 24 blocking rows, and `RM1/RM2` has 48 blocking rows. -- `NSNR-REF-016`: `RM3` and stress quantities create no numeric comparison family. -- `NSNR-REF-017`: docs/TOLERANCE.md family policy is applied exactly and warning-only failures do not change blocking verdict. -- `NSNR-REF-018`: stress CSV files are hash-audited as nonblocking inventory artifacts and their schema/order is not a blocking verdict. +- Approved draft label `NSNR-PROC-011` collides with completed Step 10's historical + `NSNR-PROC-011` increment-loop identity. Preserve that history and use collision-resolved test ID + `NSNR-PROC-019` with exact GTest symbol + `NonlinearStaticProcedure.NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance`. + Use a supported nonlinear shell input with nonzero prescribed translation and rotation plus a + resolved fixed-global load. Independently reconstruct the six balance components from accepted + `X,u,phi`, external force and masked residual. Expected RED: the current helper uses initial + coordinates, raw full-residual summation and raw rotational residual, so the current-arm/spatial + expected vector or distinct constrained/free projection assertion fails. +- `NSNR-HDF5-014` + `NonlinearHdf5ResultsWriter.WritesSchemaV1GlobalBalanceErrorLocation` checks existing path/shape, + exact component names, schema version 1 and `location=global-balance-error`. Expected RED: current + writer emits `location=global-origin`. +- `NSNR-REF-020` + `NonlinearStaticReference.AuditsFinePrimaryAndCoarseCompanionArtifacts` checks all exact fine, + coarse and linear input/CSV hashes, fine/coarse independent execution directories and case roles. + Expected RED: current case inventory supports only coarse nonlinear and linear cases. +- `NSNR-REF-021` + `NonlinearStaticReference.ReviewOnlyLocalReactionsCannotChangeBlockingVerdict` injects or observes + failing local RF/RM row/RMS decisions while U and internal blocking families pass. It requires + deterministic local error/precheck reporting and an unchanged blocking pass. Expected RED: + current local RF/RM dispositions are `kBlocking`. +- `NSNR-REF-022` + `NonlinearStaticReference.BlocksOnGlobalBalanceAndAcceptedFreeResidual` fails each coarse/fine + global-force, global-moment, free-force-residual and free-moment-residual family one at a time, + then passes all. It also asserts the constrained reaction resultant is a distinct review summary. + Expected RED for this re-execution: the preserved comparator applies the old shared `<=1e-10` + gate, so the approved coarse metric `1.413750912531167e-10` and fine metric + `2.7454660159924086e-10` are rejected even though both are below `1e-8`. +- `NSNR-REF-023` + `NonlinearStaticReference.RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings` + covers blocking, warning-only and review-only families. Blocking precheck failure changes the + blocking verdict; warning/review failures remain ordered findings. Expected RED: the current + comparator cannot retain review-only precheck findings independently of the blocking verdict. +- `NSNR-REF-024` + `NonlinearStaticReference.GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate` uses a + test-private balance evaluator for distinct force and moment family identities. It requires an + approved between-threshold metric such as `5e-9` and exact `1e-8` to pass, and + `nextafter(1e-8,+infinity)` to fail for both identities. Expected decisive RED: the preserved + shared `<=1e-10` comparison rejects `5e-9` and `1e-8`. +- `NSNR-REF-025` + `NonlinearStaticReference.GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance` exercises + force and moment identities independently and requires exact-zero scale plus exact-zero numerator + to pass while any nonzero numerator fails without NaN/Inf or a fabricated normalized metric. This + is an unchanged-contract regression and may already pass in the RED batch; it must be present + before GREEN. -Run: +Run and record the observed failures: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter|NonlinearStaticReference)\." --output-on-failure ``` -Expected: new tests fail. Unexpected pass stops. +The new tests must fail for the stated reasons. A compile failure caused only by the test-first +enum/report extension is valid RED when the diagnostic identifies the missing planned production/ +test-support behavior. An unexpected pass or unrelated failure stops the Step for classification. -## GREEN +## Minimal GREEN -Implement `ARTIFACT CHECK -> COPY -> RUN -> COMPARE -> CLASSIFY -> REPORT` while preserving the required public gate wording `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` in reports. The runner never passes the original reference input path to `FesaApplication`; it copies input bytes unchanged into a unique build-local temp case directory, runs the copied `.inp`, consumes copied-sibling `_results.h5` and `_log.txt`, and compares HDF5 data to original read-only CSVs. Use exact declared paths and hashes: +1. Replace the private raw-residual/initial-coordinate global helper in + `src/fesa/analysis/nonlinear_static_procedure.cpp` with the Required physical algorithm above. + Keep stable node order, mask-before-conversion, independent applied/reaction conversion and + finite failure behavior. Do not change the public procedure header or accepted-state layout. +2. In `src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp`, preserve the path, shape, component + names and schema version; change the exact `/global/equilibrium` location attribute to + `global-balance-error` and keep writer validation finite/fail-closed. +3. Extend the existing comparator without deleting its partial work: + - add fine primary inventory and keep coarse companion/linear control independent; + - add `kReviewOnly` and keep local RF/RM key/schema/inventory/finite/row/RMS evidence; + - reconstruct the constrained reaction resultant and accepted free residual from the exact HDF5 + paths/mask; never use `/nodal/reaction` or `/global/equilibrium` as a substitute for all three; + - apply internal gates exactly as specified above, using one test-private/internal shared + `1.0e-8` constant for both distinct force and moment families; + - keep U blocking, UR warning-only, local RF/RM review-only, RM3/stress excluded; + - reject blocking missing/extra/duplicate/nonfinite rows before tolerance and retain ordered + nonblocking findings; + - set overall blocking verdict from blocking external U families AND all internal global/free + families only. +4. Preserve existing `NSNR-CTRL-018..021`, `NSNR-LOG-012`, Full Newton, fixed factors, iteration + limit, 39-field log schema and the already corrected residual selector unchanged. +5. Do not change production solver/configuration behavior for the balance threshold. No `fesa.env`, + environment variable, CLI option, public API or HDF5 schema change is part of this GREEN. -| path | rows | SHA-256 | -| --- | ---: | --- | -| `reference/shellNL/shellNL.inp` | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | -| `reference/shellNL/shellNL displacements.csv` | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | -| `reference/shellNL/shellNL reactions.csv` | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | -| `reference/shellNL/shellNL stresses.csv` | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | -| `reference/shell/shell.inp` | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | -| `reference/shell/shell displacements.csv` | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | -| `reference/shell/shell reactions.csv` | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | -| `reference/shell/shell stresses.csv` | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | +## Exact read-only artifact inventory -Use docs/TOLERANCE.md exactly: family scale `S=max(abs(reference))`, near-zero band `0.01*S`, non-near relative error `<=0.05`, family `RMS(error)/S<=0.01`, zero-scale exact zero only. Original reference directory inventory, bytes, timestamps, and hashes must be unchanged after the run. +| case | exact path | rows | SHA-256 | +| --- | --- | ---: | --- | +| fine primary | `reference/shellNL-meshfine/shellNL-meshfine.inp` | input | `40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220` | +| fine primary | `reference/shellNL-meshfine/shellNL-meshfine displacements.csv` | 729 | `740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F` | +| fine primary | `reference/shellNL-meshfine/shellNL-meshfine reactions.csv` | 729 | `AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363` | +| fine optional | `reference/shellNL-meshfine/shellNL-meshfine stresses.csv` | 5,408 | `6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782` | +| coarse companion | `reference/shellNL/shellNL.inp` | input | `4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2` | +| coarse companion | `reference/shellNL/shellNL displacements.csv` | 49 | `4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786` | +| coarse companion | `reference/shellNL/shellNL reactions.csv` | 49 | `001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069` | +| coarse optional | `reference/shellNL/shellNL stresses.csv` | 288 | `5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F` | +| linear control | `reference/shell/shell.inp` | input | `4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF` | +| linear control | `reference/shell/shell displacements.csv` | 49 | `C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B` | +| linear optional | `reference/shell/shell reactions.csv` | 49 | `0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41` | +| linear optional | `reference/shell/shell stresses.csv` | 288 | `2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7` | -## VERIFY +For every case, snapshot original inventory, bytes, SHA-256, size and timestamp; copy only the `.inp` +bytes to a unique build-local directory; run only the copy; consume copied-sibling `_results.h5` and +`_log.txt`; compare against original read-only CSVs; then prove the original inventory is unchanged. + +## External comparison and classification + +- Fine and coarse `U1/U2/U3` are separate blocking families. +- Linear `U1/U2/U3` is a blocking regression family. +- All `UR1/UR2/UR3` families are warning-only. +- Fine/coarse local `RF1/RF2`, `RF3`, spatial `RM1/RM2` are separate review-only families with exact + mask-derived keys and complete common-policy error reports. +- `RM3` and all stress values have no numerical family. Stress files remain hash-audited optional + inventory; the known fine malformed optional stress key is not repaired. +- External families use exactly `docs/TOLERANCE.md`: reference-only `S=max(abs(reference))`, + `B=0.01*S`, near-zero row `abs(error)<=B`, other-row relative `<=0.05`, family + `RMS(error)/S<=0.01`, exact-zero family exact-zero FESA only. No absolute floor, averaging, + collapse, row-order identity, clamp or tolerance relaxation. + +The final gate order is literally: + +```text +ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT +``` + +## Focused and full VERIFY + +After minimal GREEN, run in this order and retain command, exit code, duration and output tail for +Step 12: ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference|ReferenceTolerance|Mitc4Reference" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +The Harness launch environment must be VsDevCmd x64 and inherit `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, +`TBB_DIR`, and `HDF5_DIR`. Do not substitute the solution-only MSBuild path. + +## Acceptance Criteria + +- New RED tests fail first for their declared current behavior, then pass after minimal GREEN. +- `/global/equilibrium` remains schema v1 `[6]` with the same component names and stores only the + current-arm/spatial-moment applied-plus-reaction balance error with + `location=global-balance-error`. +- Fine/coarse global force and moment normalized metrics are each `<=1e-8`; exact-zero scale follows + the exact-zero rule. +- Fine/coarse accepted free force and moment residual gates pass NSNR-069 independently. +- Fine/coarse U blocking and linear U regression pass `docs/TOLERANCE.md`. +- UR differences remain warning-only. Local RF/RM findings remain review-only and cannot fail the + blocking verdict. RM3/stress remain excluded. +- Missing/extra/duplicate/nonfinite blocking rows fail before tolerance; warning/review findings are + deterministic and nonblocking. +- Original reference artifact content, inventory, size, timestamp and hash are unchanged. +- Focused tests, test discovery and full CTest pass without new compiler warnings. ## 상태 기록 -Update only Step 11 status and one-line payload. Executor owns timestamps, commits, retry, and advancement. +On success, update only Step 11 to `completed` and add one concise `summary`. On an implementation, +build, test or reference-comparison failure, classify it and update only the Executor-selected Step's +allowed payload. Executor owns retry, timestamps, commits, advancement and top-level status. Do not +start Step 12. ## 금지사항 -- Do not rewrite, rename, normalize, or repair `.inp` or CSV artifacts. 이유: reference artifacts are immutable external evidence. -- Do not run `FesaApplication` on original `reference/shellNL/shellNL.inp` or `reference/shell/shell.inp`. 이유: CLI derives sibling outputs and would mutate the reference directory. -- Do not compare `RM3`. 이유: approved contract excludes stabilization-dependent drilling reaction. -- Do not numerically compare stress CSV data. 이유: stress artifacts are nonblocking inventory only in this feature. -- Do not average, omit, synthesize, or row-order match reference rows. 이유: source/component identity prechecks are mandatory. +- Do not edit any reference artifact. 이유: exact stored files are immutable external evidence. +- Do not run FESA on an original reference `.inp`. 이유: derived sibling outputs would mutate the + reference directory. +- Do not add HDF5 datasets, change schema version/path/shape/components or add public headers. 이유: + Stage 5 requires reconstruction from existing schema-v1 datasets. +- Do not use initial coordinates or raw rotational covectors for global physical moment. 이유: + `AUDIT-001` requires accepted current arms and spatial moment conversion. +- Do not apply the constraint mask after spatial conversion. 이유: partial rotational constraints + would mix free residual into reaction. +- Do not use `/global/equilibrium`, local `/nodal/reaction` or a raw full-residual sum as a substitute + for all three equilibrium quantities. 이유: their physical identities differ. +- Do not make local reaction rows blocking or omit their review evidence. 이유: USER-DECISION-004 + fixes review-only with deterministic findings. +- Do not compare `RM3` or stress values, average/collapse rows, match by row order, clamp zero values, + add `max(1,S)`, relax tolerance or repair CSVs. 이유: approved identity/tolerance contracts forbid it. +- Do not add `fesa.env`, runtime configuration, product solver acceptance, CLI or public API behavior + for the `1e-8` gate. 이유: this fixed threshold belongs only to comparator-owned internal verification. +- Do not replay or fabricate selector RED, delete partial Step 11 work, reset history, commit, push, + run a reference solver, start Step 12, or claim Physics/Release readiness. +- Stop and return a classified blocker if the required behavior needs an upstream contract, public + API, HDF5 schema, tolerance or reference-artifact change. diff --git a/phases/nonlinear-static-newton-raphson/step12.md b/phases/nonlinear-static-newton-raphson/step12.md index cb953e7..1fc8873 100644 --- a/phases/nonlinear-static-newton-raphson/step12.md +++ b/phases/nonlinear-static-newton-raphson/step12.md @@ -1,5 +1,11 @@ # Step 12: execution-closure-and-evidence-docs +## 목적 + +Step 11이 실제로 통과한 뒤에만 fresh MSVC/CTest와 reference gate evidence를 수집하고 Stage 6 +canonical reports를 actual output으로 작성한다. 직접 superseded된 PRD/ARCHITECTURE/ADR 문장만 +최소 동기화한다. 이 Step은 solver 동작을 새로 구현하지 않는다. + ## 읽어야 할 파일 - `AGENTS.md` @@ -8,89 +14,219 @@ - `docs/ADR.md` - `docs/CODINGSTYLE.md` - `docs/TOLERANCE.md` -- `docs/nonlinear-static-newton-raphson/implementation-plan.md` +- `docs/SOLVER_AGENT_DESIGN.md` +- `docs/HARNESS.md` +- `docs/HARNESS_WORKFLOW.md` - `docs/nonlinear-static-newton-raphson/requirements.md` -- `docs/nonlinear-static-newton-raphson/numerical-review.md` -- `docs/nonlinear-static-newton-raphson/reference-model.md` -- `docs/nonlinear-static-newton-raphson/io.md` +- `docs/nonlinear-static-newton-raphson/formulation.md` §§11.4, 13.1, 13.4, 14.1 +- `docs/nonlinear-static-newton-raphson/numerical-review.md` §§3.2, 6.2, 6.3 +- `docs/nonlinear-static-newton-raphson/reference-model.md` §§3–6 +- `docs/nonlinear-static-newton-raphson/io.md` §§7.5.1, 8.1–8.7 +- `docs/nonlinear-static-newton-raphson/implementation-plan.md` +- `docs/nonlinear-static-newton-raphson/corrections.md` §13 - `phases/nonlinear-static-newton-raphson/index.json` -- Step 0-11 modified source/test/CMake files +- `phases/nonlinear-static-newton-raphson/step11.md` +- All source/test/CMake files actually changed by Steps 0–11 +- `.harness/config.json` +- `CMakePresets.json` -## 이전 Step 전제 +## 시작 전 hard gate -Steps 0-11 have implemented and verified CLI lifecycle, Domain contract, nonlinear MITC4, controls, tangent solver, log, state, HDF5 schema v1, full prepared procedure, and reference comparison tests. +- Steps 0–10의 completed history를 그대로 유지한다. +- Step 11 must be `completed` with an actual summary and passing RED/GREEN/VERIFY evidence. +- If Step 11 is not completed, stop without creating/updating evidence docs or global docs. +- Do not infer Step 11 success from a prior blocked run, diagnostic spike or translation-only report. ## 소유 파일 -- Modify: `docs/PRD.md` -- Modify: `docs/ARCHITECTURE.md` -- Modify: `docs/ADR.md` -- Create: `docs/nonlinear-static-newton-raphson/implementation-report.md` -- Create: `docs/nonlinear-static-newton-raphson/build-test.md` -- Create: `docs/nonlinear-static-newton-raphson/reference-comparison.md` +- Modify only directly superseded statements: `docs/PRD.md` +- Modify only directly superseded statements: `docs/ARCHITECTURE.md` +- Modify only directly superseded decisions or add the minimum accepted decision record: + `docs/ADR.md` +- Create from actual outputs: `docs/nonlinear-static-newton-raphson/implementation-report.md` +- Create from actual outputs: `docs/nonlinear-static-newton-raphson/build-test.md` +- Create from actual outputs: `docs/nonlinear-static-newton-raphson/reference-comparison.md` -No C++ production file is owned by this Step. +No C++ production, public header, test, CMake, Harness, reference or tolerance file is owned by this +Step. -## 인터페이스 +## RED: evidence freshness audit -Evidence documents must record actual observed outputs: +Perform this audit before writing reports. The expected initial result is failure because the three +canonical reports are missing or do not contain this Step's fresh evidence. -```text -implementation-report.md: RED/GREEN/VERIFY command log, Step summaries, diagnostics, implementation-owned decisions. -build-test.md: fresh configure/build/discovery/full CTest commands, exit codes, duration, stdout/stderr tail, warning audit, failure classification. -reference-comparison.md: exact artifact inventory, HDF5 paths, projection, row prechecks, tolerance, per-family decisions, classification, no-change assertion. -``` +- `NSNR-EVID-001`: `implementation-report.md` is missing or stale unless it records every Step 11 new + RED test, the observed reason, minimal GREEN diff, focused/full VERIFY and preserved + `NSNR-CTRL-018..021`/`NSNR-LOG-012` evidence. +- `NSNR-EVID-002`: `build-test.md` is missing or stale unless it records fresh configure, build, + discovery, focused/full CTest commands with exit code, duration, output tail, MSVC x64 Debug + environment, warning audit and failure classification. +- `NSNR-EVID-003`: `reference-comparison.md` is missing or stale unless it records the literal + `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT` run with exact paths/hashes, generated HDF5/log + paths, projection, row decisions, metrics, classification and no-change evidence. +- `NSNR-EVID-004`: evidence or global docs are stale if they still classify local RF/RM as blocking, + omit review-only findings, identify coarse shellNL as the only nonlinear case, or describe + `/global/equilibrium` as raw full-residual/initial-arm evidence. +- `NSNR-EVID-005`: reference evidence is stale if it lacks fine-primary/coarse-companion/linear-control + inventory, separate U/UR/local reaction families, four coarse and four fine internal blocking + equilibrium families, the inclusive `1e-8` force/moment boundary and exact-zero-scale regressions, + and the distinct constrained-reaction summary. +- `NSNR-EVID-006`: implementation evidence is stale unless it closes `AUDIT-001` with actual tests for + nonzero prescribed translation/rotation, `x=X+u`, mask-before-conversion, independent + `InverseTransposeLeftJacobianSO3(phi)` conversion, and `location=global-balance-error`. +- `NSNR-EVID-007`: command evidence is stale if copied from an earlier run, omits artifact pre/post + immutability, lacks command output/exit/duration, changes the required stage order, or claims a + verdict before CLASSIFY. -## RED +Record this expected failing freshness audit in `implementation-report.md` only after fresh evidence +has been collected. If the audit unexpectedly passes before this Step's commands, stop and report the +evidence provenance conflict. -Before writing evidence docs, run an evidence freshness audit by checking that the three evidence docs do not already contain current command outputs from this final Step. +## GREEN: fresh evidence execution -- `NSNR-EVID-001`: missing or stale `implementation-report.md` is a failing precondition. -- `NSNR-EVID-002`: missing or stale `build-test.md` is a failing precondition. -- `NSNR-EVID-003`: missing or stale `reference-comparison.md` is a failing precondition. -- `NSNR-EVID-004`: PRD/ARCHITECTURE/ADR still contain directly superseded global CLI/procedure/output statements. -- `NSNR-EVID-005`: reference artifact pre-run SHA inventory must match Step 11 values. +Use the ignored `.harness/config.json` and tracked `windows-msvc-ninja-debug` preset. The parent +environment must be VsDevCmd x64 and contain `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and +`HDF5_DIR`. -Expected: evidence freshness audit fails before this Step writes docs. If it unexpectedly passes with current evidence already present, stop and report to Coordinator. - -## GREEN - -- Run fresh MSVC x64 Debug configure/build/discovery/full CTest. -- Run focused nonlinear reference comparison repeat. -- Run deterministic repeat/reference checks required by Step 11. -- Run warning audit from build output. -- Run `git diff --check` and `git status --short`. -- Run reference artifact post-run SHA audit and compare to pre-run values. -- Update only directly superseded PRD/ARCHITECTURE/ADR statements for CLI removal, prepared linear/nonlinear procedure boundary, output naming, log lifecycle, and nonlinear HDF5 schema. -- Create the three Stage 6 evidence docs from actual command outputs only. - -## VERIFY - -Recheck `.harness/config.json`. If absent, use: +### 1. Fresh build and regression evidence + +```powershell +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearConvergence|NewtonIterationLog)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticProcedure|NonlinearHdf5ResultsWriter)\." --output-on-failure +ctest --preset windows-msvc-ninja-debug --output-on-failure +``` + +Record command, working directory, exit code, duration, stdout/stderr tail and failed-test inventory. +Audit new compiler warnings. Stop at the first decisive failure and classify it as +`configure | compile | link | test | reference-comparison | harness | environment | upstream-contract`. + +### 2. Final reference gate in literal order + +#### ARTIFACT CHECK + +- Verify every exact fine/coarse/linear input/CSV path and SHA-256 from `reference-model.md` and + `step11.md`. +- Verify readable headers, exact nonlinear factor-one Frame, source node/component inventories, + uniqueness and finite required values. +- Snapshot original inventory, size, timestamps and hashes before any copied-input run. +- Verify generated results will be written only under unique build-local copied-input directories. + +#### COMPARE + +```powershell +ctest --preset windows-msvc-ninja-debug -R "^NonlinearStaticReference\." --output-on-failure +ctest --preset windows-msvc-ninja-debug -R "^(NonlinearStaticReference|ReferenceTolerance|Mitc4Reference)\." --output-on-failure +``` + +Compare by `(case_id, accepted_state, canonical_instance_name, source_node_label, component)`, never +by row order. Apply `docs/TOLERANCE.md` only to external U/UR/local-review families. Apply internal +`1e-8` force/moment balance and NSNR-069 free-residual gates separately. Preserve the exact +blocking/warning/review/excluded dispositions. + +#### CLASSIFY + +- Blocking pass requires fine/coarse U families, linear U regression and all eight fine/coarse + internal equilibrium families to pass. +- UR failure is warning-only. +- Local RF/RM precheck/row/RMS failure is a deterministic review finding and cannot change blocking + pass/fail. +- RM3/stress values are excluded. +- Any blocking missing/extra/duplicate/nonfinite row fails before tolerance. +- Classify actual failures without relaxing tolerance, changing artifacts or claiming external solver + internal equivalence. + +#### REPORT + +Only after CLASSIFY, write the three canonical reports from actual outputs. + +## Report contracts + +### `implementation-report.md` + +Record metadata, approved upstream hashes, Steps 0–10 preserved summaries, Step 11 RED failures, +minimal GREEN file/symbol changes, focused/full VERIFY commands and results, `AUDIT-001` closure, +requirement/test traceability, no-change assertion, classification and open issues. Do not invent +unobserved output. + +### `build-test.md` + +Use `owner_agent: implementation-agent`. Record execution environment, exact commands, working +directories, exit codes, durations, output tails, discovered test inventory, focused/full results, +new-warning audit, failure classification, failed tests, handoff recommendation, no-change assertion +and open issues. + +### `reference-comparison.md` + +Record exact input/CSV SHA inventory, copied input and generated HDF5/log paths, accepted factor-one +frame, every HDF5 projection/path/component, stable source-key matching, row prechecks, external +common tolerance, internal gates, per-family/per-row decisions, max absolute error, applicable +relative error, RMS/scale metric, constrained-reaction summary, warnings/review findings, final +classification, original artifact post-run identity, no-change assertion and open issues. + +The report must explicitly state that FESA HDF5 is authoritative, CSV is external comparison +evidence, and numerical agreement does not imply Abaqus S4 internal formulation equivalence. + +## Minimal PRD/ARCHITECTURE/ADR sync + +After actual passing evidence exists, update only statements directly superseded by the implemented +feature: + +- repository-wide derived result/log names and removal of `--output`; +- prepared parse-once linear/nonlinear procedure boundary and separate nonlinear state/solver/writer; +- nonlinear HDF5 schema v1 accepted-frame meaning; +- `/global/equilibrium` as current-arm/spatial-moment applied-plus-reaction balance error; +- distinct accepted free residual and constrained reaction resultant projections; +- fine primary/coarse companion, U blocking, UR warning-only, local RF/RM review-only and RM3/stress + exclusion. + +Do not rewrite unrelated V0 history, refactor architecture prose or add future scope. + +## Final validation ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticReference" --output-on-failure git diff --check git status --short ``` -Record command, exit code, duration, stdout/stderr tail, and failure classification for every command in the evidence docs. +Confirm the original reference pre/post hashes, sizes, timestamps and inventory are equal. Confirm +that every required report statement is backed by a command or deterministic artifact observation. +Harness Python validation is not required because this Step does not change Harness Python, hooks or +agent configuration. + +## Acceptance Criteria + +- Evidence freshness audit initially fails for the declared stale/missing reason and is recorded. +- Fresh configure/build/discovery/focused/full CTest all pass with MSVC x64 Debug and no new warnings. +- Final gate executes in exact order `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. +- All blocking external and internal families pass; warnings and review findings remain + nonblocking and are fully reported. +- `AUDIT-001`, fine/coarse roles and reaction disposition have direct test/output evidence. +- Three canonical Stage 6 reports contain reproducible commands, metrics, classifications and + no-change assertions. +- PRD/ARCHITECTURE/ADR edits are limited to directly superseded statements. +- `git diff --check` passes and reference artifacts remain byte-for-byte unchanged. ## 상태 기록 -Update only Step 12 status and one-line payload. Executor owns timestamps, commits, retry, top-level phase completion, and advancement. +On success, update only Step 12 to `completed` and add one concise `summary`. Executor owns +timestamps, commits, top-level completion and advancement. A passing Step 12 returns Stage 6 evidence +to Coordinator; it does not itself dispatch Physics or Release. ## 금지사항 -- Do not claim success before the commands above actually pass. 이유: Stage 6 evidence docs must be output-backed. -- Do not broadly rewrite global docs. 이유: Step 12 only synchronizes directly superseded CLI/procedure/output statements. -- Do not change reference artifact content. 이유: SHA pre/post immutability is part of the acceptance evidence. -- Do not run `scripts/execute.py` from this Step. 이유: Executor already owns Harness execution. +- Do not create or update evidence reports before actual fresh output exists. 이유: Stage 6 reports + are execution evidence, not predictions. +- Do not change C++ code, tests, CMake, Harness configuration, tolerance or reference artifacts. + 이유: Step 12 is evidence closure only. +- Do not run `scripts/execute.py` from this Step. 이유: Executor already owns the active Step session. +- Do not reorder or collapse `ARTIFACT CHECK -> COMPARE -> CLASSIFY -> REPORT`. 이유: schema and + identity failures must precede tolerance and verdict. +- Do not make local RF/RM blocking, omit their errors, or compare RM3/stress. 이유: + USER-DECISION-004 fixes the disposition. +- Do not use Abaqus CSV/tolerance for internal balance/free-residual gates or claim Abaqus internal + equivalence. 이유: external comparison and internal physics evidence are distinct. +- Do not broadly rewrite PRD/ARCHITECTURE/ADR, alter Steps 0–11 history, commit, push, run a reference + solver, or claim Physics/Release readiness. diff --git a/phases/nonlinear-static-newton-raphson/step2.md b/phases/nonlinear-static-newton-raphson/step2.md index 8324ed3..6db7f0d 100644 --- a/phases/nonlinear-static-newton-raphson/step2.md +++ b/phases/nonlinear-static-newton-raphson/step2.md @@ -64,8 +64,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FiniteRotation" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure ``` Expected: tests fail because the rotation module does not exist. Unexpected pass stops. @@ -77,18 +77,14 @@ Implement the SO(3) helper functions with finite checks and principal-branch val ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "FiniteRotation" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "FiniteRotation" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before using default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step3.md b/phases/nonlinear-static-newton-raphson/step3.md index 004bee2..77647fd 100644 --- a/phases/nonlinear-static-newton-raphson/step3.md +++ b/phases/nonlinear-static-newton-raphson/step3.md @@ -87,8 +87,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure ``` Expected: compile or test failure because nonlinear MITC4 files do not exist. Unexpected pass stops. @@ -100,18 +100,14 @@ Implement nonlinear MITC4 creation, kinematics, and recovery using approved 2x2x ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Shell|NonlinearMitc4Recovery" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step4.md b/phases/nonlinear-static-newton-raphson/step4.md index d050874..e494133 100644 --- a/phases/nonlinear-static-newton-raphson/step4.md +++ b/phases/nonlinear-static-newton-raphson/step4.md @@ -61,8 +61,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -74,18 +74,14 @@ Implement same-trial internal residual/tangent, exact rotation derivative terms ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearMitc4Residual|NonlinearMitc4Tangent|NonlinearMitc4Objectivity|NonlinearMitc4Patch" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step5.md b/phases/nonlinear-static-newton-raphson/step5.md index 1fc2b2e..750fd42 100644 --- a/phases/nonlinear-static-newton-raphson/step5.md +++ b/phases/nonlinear-static-newton-raphson/step5.md @@ -136,34 +136,39 @@ Add tests first. - `NSNR-CTRL-016`: empty free channels evaluate with `numerator_norm=0`, `denominator_scale=0`, branch `kZeroScale`, exact zero-scale threshold/unit, and pass. - `NSNR-CTRL-017`: iteration numbering remains `1..100` with no iteration `101`. +### USER-DECISION-003 option-1 revision addendum + +Step 5의 completed status, summary, timestamps와 commits는 보존한다. 다음 correction tests와 minimal GREEN은 재실행된 Step 5가 아니라 Executor-selected Step 11 안에서 수행한다. + +- `NSNR-CTRL-018`: force와 force-length residual channel 각각에서 matching external vector가 finite exact zero이고 internal/residual이 nonzero여도 `kZeroScale`을 선택한다. Numerator exact `1.0e-3`은 pass, `std::nextafter(1.0e-3, +infinity)`는 fail이며 decision denominator는 exact `0`, threshold unit은 각각 `kForce`, `kForceLength`다. Empty free channel pass도 유지한다. +- `NSNR-CTRL-019`: matching external scale이 nonzero이면 internal-dominant와 external-dominant case 모두 denominator `max(||f_int||inf,||f_ext||inf)`를 쓴다. Ratio exact `1.0e-2`는 pass, 바로 위는 fail이다. Numerator가 typed `1.0e-3`보다 작아도 relative ratio가 실패하는 case를 포함하여 absolute/relative OR가 없음을 증명한다. +- `NSNR-CTRL-020`: residual/internal/external vector 또는 derived norm의 NaN/Inf는 branch/tolerance acceptance 전에 fail하고 combined pass를 만들지 않는다. `std::nextafter(0.0,+infinity)`인 matching external scale은 tolerance band, zero clamp, `max(1,...)` 없이 nonzero relative branch를 선택한다. +- `NSNR-CTRL-021`: force residual, moment residual, translation correction, rotation correction을 하나씩 실패시키는 truth table과 네 channel 모두 pass하는 case로 logical AND를 고정한다. NSNR-070 correction selector, denominators, thresholds와 units는 변경하지 않는다. + Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. ## GREEN -Implement factor sequence derivation, load/BC scaling, global-once fixed-load external vector `f_ext` and external tangent `K_ext` assembly, moment admissibility, and typed convergence-channel evaluation. Residual denominator scale is derived from the provided free internal/external channel values, correction denominator scale from the provided current increment channel values, and zero-scale branches use only `kZeroScale`. Thresholds and threshold units are not caller inputs; `EvaluateNewtonConvergence` assigns the exact branch/channel constants from `requirements.md` and `io.md`. Return structured diagnostics for invalid nonlinear static data, unsupported drilling load, nonfinite Newton data, and nonconvergence readiness. +Implement factor sequence derivation, load/BC scaling, global-once fixed-load external vector `f_ext` and external tangent `K_ext` assembly, moment admissibility, and typed convergence-channel evaluation. For the USER-DECISION-003 correction, validate the residual/internal/external values and norms first, select a residual branch from the matching external scale itself, emit denominator exact `0` and typed absolute `1.0e-3` when that scale is exact zero, and otherwise emit retained `max(internal,external)` with relative `1.0e-2`. Correction denominator selection remains derived from current increment values. Thresholds and threshold units are not caller inputs; `EvaluateNewtonConvergence` assigns the exact branch/channel constants from `requirements.md` and `io.md`. Return structured diagnostics for invalid nonlinear static data, unsupported drilling load, nonfinite Newton data, and nonconvergence readiness. ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearStaticControl|NonlinearConvergence|NonlinearLoadBoundary" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 @@ -177,3 +182,4 @@ Update only Step 5 status and one-line payload. Executor owns timestamps, commit - Do not distribute full source-node CLOAD into every incident element. 이유: this would multiply loads by incident element count and violate formulation §11.2. - Do not emit convergence branch labels outside `relative` and `zero-scale`. 이유: io.md exposes exactly those two branches. - Do not accept per-call convergence thresholds or units. 이유: NSNR-069/070 fix branch thresholds and typed units globally. +- Do not use internal scale, tolerance bands, clamps, `max(1,...)`, or absolute/relative OR to select a residual branch. 이유: revised NSNR-069 selects only from the finite matching external scale's exact-zero identity. diff --git a/phases/nonlinear-static-newton-raphson/step6.md b/phases/nonlinear-static-newton-raphson/step6.md index 72a8ed9..d96916b 100644 --- a/phases/nonlinear-static-newton-raphson/step6.md +++ b/phases/nonlinear-static-newton-raphson/step6.md @@ -68,8 +68,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "TangentSolver|MklPardiso" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -81,18 +81,14 @@ Implement backend-neutral tangent solver boundary and MKL full-CSR adapter. Fact ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "TangentSolver|MklPardiso" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "TangentSolver|MklPardiso" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step7.md b/phases/nonlinear-static-newton-raphson/step7.md index 273b24d..b5257e9 100644 --- a/phases/nonlinear-static-newton-raphson/step7.md +++ b/phases/nonlinear-static-newton-raphson/step7.md @@ -91,34 +91,36 @@ Add tests first. - `NSNR-LOG-010`: write/flush/close failure returns `log-output-failure` and prevents success classification. - `NSNR-LOG-011`: non-Newton controlled failure path can leave a zero-byte log owned by app lifecycle. +### USER-DECISION-003 option-1 revision addendum + +Step 7의 completed status, summary, timestamps와 commits는 보존한다. Executor-selected Step 11에서 `tests/unit/analysis/newton_iteration_log_test.cpp`에 다음 RED assertion을 추가한다. + +- `NSNR-LOG-012`: synthetic `NewtonChannelDecision`이 아니라 `EvaluateNewtonConvergence`가 만든 residual decisions를 record에 넣는다. Exact-zero matching external channel은 denominator exact `0`, branch `zero-scale`, threshold `1.0e-3`, force 또는 force-length unit으로 직렬화하고, nonzero matching external channel은 retained denominator, branch `relative`, threshold `1.0e-2`, unit `1`로 직렬화한다. 같은 line이 기존 39 labels/order, TAB separation, LF termination을 그대로 유지해야 하므로 기존 selector에서는 RED가 된다. + Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NewtonIterationLog" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. ## GREEN -Implement a small log writer with explicit open/write/flush/close state, serializer-owned 39-field order, deterministic escaping, finite numeric formatting, `relative`/`zero-scale` convergence branch mapping, typed `not-evaluated(reason)` substitution, and structured `Status` failures. +Implement a small log writer with explicit open/write/flush/close state, serializer-owned 39-field order, deterministic escaping, finite numeric formatting, `relative`/`zero-scale` convergence branch mapping, typed `not-evaluated(reason)` substitution, and structured `Status` failures. USER-DECISION-003는 evaluator-produced decision semantics만 바꾸므로 log writer production 또는 `nsnr-log-v1` schema 변경은 예상하지 않는다. ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NewtonIterationLog" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NewtonIterationLog" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 @@ -130,3 +132,4 @@ Update only Step 7 status and one-line payload. Executor owns timestamps, commit - Do not accept arbitrary caller-provided field vectors. 이유: io.md requires an exact fixed schema and order. - Do not write HDF5 trial history. 이유: log is diagnostic and HDF5 stores accepted frames only. - Do not continue after log write/flush/close failure. 이유: log failure blocks result commit. +- Do not add, remove, rename, reorder, or re-delimit any `nsnr-log-v1` field. 이유: option 1 changes only residual decision values, not the approved 39-field external log contract. diff --git a/phases/nonlinear-static-newton-raphson/step8.md b/phases/nonlinear-static-newton-raphson/step8.md index d612d11..f543ae0 100644 --- a/phases/nonlinear-static-newton-raphson/step8.md +++ b/phases/nonlinear-static-newton-raphson/step8.md @@ -130,8 +130,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -143,18 +143,14 @@ Implement `NonlinearAnalysisState::Create` as the only construction seam for a v ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearAnalysisState|CommitRollback" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/phases/nonlinear-static-newton-raphson/step9.md b/phases/nonlinear-static-newton-raphson/step9.md index 44f224a..6231257 100644 --- a/phases/nonlinear-static-newton-raphson/step9.md +++ b/phases/nonlinear-static-newton-raphson/step9.md @@ -80,8 +80,8 @@ Add tests first. Run: ```powershell -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure ``` Expected: new tests fail. Unexpected pass stops. @@ -93,18 +93,14 @@ Implement `include/fesa/results/nonlinear_results_writer.h` as the backend-neutr ## VERIFY ```powershell -cmake --fresh -S . -B .harness/build -G "Visual Studio 18 2026" -A x64 ` - "-DFESA_GTEST_SOURCE_DIR=$gtestSource" ` - "-DMKL_DIR=$mklDir" ` - "-DTBB_DIR=$tbbDir" ` - "-DHDF5_DIR=$hdf5Dir" -cmake --build .harness/build --config Debug -ctest --test-dir .harness/build -C Debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure -ctest --test-dir .harness/build -C Debug --show-only=json-v1 -ctest --test-dir .harness/build -C Debug --output-on-failure +cmake --preset windows-msvc-ninja-debug +cmake --build --preset windows-msvc-ninja-debug +ctest --preset windows-msvc-ninja-debug -R "NonlinearHdf5|Hdf5ResultsWriter" --output-on-failure +ctest --preset windows-msvc-ninja-debug --show-only=json-v1 +ctest --preset windows-msvc-ninja-debug --output-on-failure ``` -Recheck `.harness/config.json` before default commands. +Use the ignored `.harness/config.json` preset contract. The Harness process must inherit VsDevCmd x64 and `FESA_GTEST_SOURCE_DIR`, `MKL_DIR`, `TBB_DIR`, and `HDF5_DIR` from its parent launch environment. ## 상태 기록 diff --git a/reference/shellNL/shellNL displacements.csv b/reference/shellNL/shellNL displacements.csv new file mode 100644 index 0000000..0d80e02 --- /dev/null +++ b/reference/shellNL/shellNL displacements.csv @@ -0,0 +1,50 @@ +Frame,Part Instance Name, Node Label, U-U1, U-U2, U-U3, UR-UR1, UR-UR2, UR-UR3 +Increment 10: Step Time = 1.000,PART-1-1,1,2.188126210E-37,9.534856260E-37,-5.888490180E-33,-5.374006350E-32,8.671701910E-33,-1.594921620E-38 +Increment 10: Step Time = 1.000,PART-1-1,2,-3.424411360E-22,1.492887960E-22,-2.374082030E-05,-7.875144140E-22,2.028240650E-22,-1.149104880E-16 +Increment 10: Step Time = 1.000,PART-1-1,3,9.535853540E-37,2.187793030E-37,-5.888490180E-33,-8.671701910E-33,5.374006350E-32,1.594560640E-38 +Increment 10: Step Time = 1.000,PART-1-1,4,1.062323950E-38,1.061095850E-38,-5.745323700E-44,2.326155450E-43,-2.326155450E-43,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,5,-2.188126210E-37,-9.534856260E-37,-5.888490180E-33,5.374006350E-32,-8.671701910E-33,-1.594921620E-38 +Increment 10: Step Time = 1.000,PART-1-1,6,-9.535853540E-37,-2.187793030E-37,-5.888490180E-33,8.671701910E-33,-5.374006350E-32,1.594560640E-38 +Increment 10: Step Time = 1.000,PART-1-1,7,-1.062323950E-38,-1.061095850E-38,-5.745323700E-44,-2.326155450E-43,2.326155450E-43,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,8,1.062266630E-38,-1.062298160E-38,-5.745323700E-44,-2.326155450E-43,-2.326155450E-43,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,9,-1.062266630E-38,1.062298160E-38,-5.745323700E-44,2.326155450E-43,2.326155450E-43,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,10,3.474719200E-16,1.293161410E-11,-5.102237540E-06,-5.626068290E-06,-2.931340880E-21,1.443065280E-18 +Increment 10: Step Time = 1.000,PART-1-1,11,-1.726116560E-16,-2.861629990E-12,-1.615657860E-05,-7.607257430E-06,2.311731110E-21,1.197342750E-16 +Increment 10: Step Time = 1.000,PART-1-1,12,-2.862247550E-12,2.104234190E-16,-1.615657860E-05,-8.289949670E-22,7.607257430E-06,-2.532911570E-17 +Increment 10: Step Time = 1.000,PART-1-1,13,1.293132790E-11,-3.742547580E-16,-5.102237540E-06,-2.244465530E-21,5.626068290E-06,-8.173356410E-17 +Increment 10: Step Time = 1.000,PART-1-1,14,8.146328670E-37,2.214433850E-37,-3.862132240E-33,-6.214571210E-33,5.544442450E-32,8.122889990E-39 +Increment 10: Step Time = 1.000,PART-1-1,15,3.634199410E-37,1.481777840E-37,-3.437612470E-34,-8.176467610E-33,2.944981870E-32,5.496142010E-39 +Increment 10: Step Time = 1.000,PART-1-1,16,-7.869300370E-38,1.742082370E-37,4.147901210E-36,-5.905084850E-33,-9.006172110E-34,-5.283594460E-39 +Increment 10: Step Time = 1.000,PART-1-1,17,-1.479949420E-37,4.792022820E-37,-2.420134220E-33,-2.430273740E-32,-3.378631580E-33,3.810077280E-39 +Increment 10: Step Time = 1.000,PART-1-1,18,-3.474720260E-16,-1.293161410E-11,-5.102237540E-06,5.626068290E-06,2.810486080E-21,1.443040570E-18 +Increment 10: Step Time = 1.000,PART-1-1,19,1.726114710E-16,2.861629990E-12,-1.615657860E-05,7.607257430E-06,-1.391752080E-21,1.197341820E-16 +Increment 10: Step Time = 1.000,PART-1-1,20,2.862247550E-12,-2.104233920E-16,-1.615657860E-05,-1.940186480E-22,-7.607257430E-06,-2.532916040E-17 +Increment 10: Step Time = 1.000,PART-1-1,21,-1.293132790E-11,3.742547580E-16,-5.102237540E-06,1.972326950E-21,-5.626068290E-06,-8.173357070E-17 +Increment 10: Step Time = 1.000,PART-1-1,22,-8.146328670E-37,-2.214433850E-37,-3.862132240E-33,6.214571210E-33,-5.544442450E-32,8.122889990E-39 +Increment 10: Step Time = 1.000,PART-1-1,23,-3.634199410E-37,-1.481777840E-37,-3.437612470E-34,8.176467610E-33,-2.944981870E-32,5.496142010E-39 +Increment 10: Step Time = 1.000,PART-1-1,24,7.869300370E-38,-1.742082370E-37,4.147901210E-36,5.905084850E-33,9.006172110E-34,-5.283594460E-39 +Increment 10: Step Time = 1.000,PART-1-1,25,1.479949420E-37,-4.792022820E-37,-2.420134220E-33,2.430273740E-32,3.378631580E-33,3.810077280E-39 +Increment 10: Step Time = 1.000,PART-1-1,26,-1.479506160E-37,-4.791990990E-37,-2.420134220E-33,2.430273740E-32,-3.378631580E-33,-3.811062390E-39 +Increment 10: Step Time = 1.000,PART-1-1,27,-7.868808240E-38,-1.742969890E-37,4.147901210E-36,5.905084850E-33,-9.006172110E-34,5.284864030E-39 +Increment 10: Step Time = 1.000,PART-1-1,28,1.742451080E-37,7.874333840E-38,4.147901210E-36,-9.006172110E-34,5.905084850E-33,-5.278797810E-39 +Increment 10: Step Time = 1.000,PART-1-1,29,4.792355100E-37,1.479843930E-37,-2.420134220E-33,-3.378631580E-33,2.430273740E-32,3.807350350E-39 +Increment 10: Step Time = 1.000,PART-1-1,30,1.479506160E-37,4.791990990E-37,-2.420134220E-33,-2.430273740E-32,3.378631580E-33,-3.811062390E-39 +Increment 10: Step Time = 1.000,PART-1-1,31,7.868808240E-38,1.742969890E-37,4.147901210E-36,-5.905084850E-33,9.006172110E-34,5.284864030E-39 +Increment 10: Step Time = 1.000,PART-1-1,32,-1.742451080E-37,-7.874333840E-38,4.147901210E-36,9.006172110E-34,-5.905084850E-33,-5.278797810E-39 +Increment 10: Step Time = 1.000,PART-1-1,33,-4.792355100E-37,-1.479843930E-37,-2.420134220E-33,3.378631580E-33,-2.430273740E-32,3.807350350E-39 +Increment 10: Step Time = 1.000,PART-1-1,34,3.081383890E-12,6.508823860E-12,-3.974393620E-06,-4.570336390E-06,1.467334870E-06,3.177270510E-12 +Increment 10: Step Time = 1.000,PART-1-1,35,-2.225679490E-12,-2.225569340E-12,-1.219086790E-05,-4.710196210E-06,4.710196210E-06,1.743015530E-16 +Increment 10: Step Time = 1.000,PART-1-1,36,2.972663780E-12,2.971908740E-12,-1.432399700E-06,-1.720654950E-06,1.720654950E-06,1.102082510E-16 +Increment 10: Step Time = 1.000,PART-1-1,37,6.507956070E-12,3.080830080E-12,-3.974393620E-06,-1.467334870E-06,4.570336390E-06,-3.177153200E-12 +Increment 10: Step Time = 1.000,PART-1-1,38,-3.081383890E-12,-6.508823860E-12,-3.974393620E-06,4.570336390E-06,-1.467334870E-06,3.177270510E-12 +Increment 10: Step Time = 1.000,PART-1-1,39,2.225679490E-12,2.225569340E-12,-1.219086790E-05,4.710196210E-06,-4.710196210E-06,1.743015530E-16 +Increment 10: Step Time = 1.000,PART-1-1,40,-2.972663780E-12,-2.971908740E-12,-1.432399700E-06,1.720654950E-06,-1.720654950E-06,1.102082440E-16 +Increment 10: Step Time = 1.000,PART-1-1,41,-6.507956070E-12,-3.080830080E-12,-3.974393620E-06,1.467334870E-06,-4.570336390E-06,-3.177153200E-12 +Increment 10: Step Time = 1.000,PART-1-1,42,-2.225000130E-12,2.225258390E-12,-1.219086790E-05,4.710196210E-06,4.710196210E-06,-3.872236930E-17 +Increment 10: Step Time = 1.000,PART-1-1,43,3.081102650E-12,-6.508646050E-12,-3.974393620E-06,4.570336390E-06,1.467334870E-06,-3.177290030E-12 +Increment 10: Step Time = 1.000,PART-1-1,44,6.509021620E-12,-3.081479950E-12,-3.974393620E-06,1.467334870E-06,4.570336390E-06,3.177015940E-12 +Increment 10: Step Time = 1.000,PART-1-1,45,2.972907290E-12,-2.971156740E-12,-1.432399700E-06,1.720654950E-06,1.720654950E-06,2.753750600E-17 +Increment 10: Step Time = 1.000,PART-1-1,46,2.225000130E-12,-2.225258390E-12,-1.219086790E-05,-4.710196210E-06,-4.710196210E-06,-3.872236930E-17 +Increment 10: Step Time = 1.000,PART-1-1,47,-3.081102650E-12,6.508646050E-12,-3.974393620E-06,-4.570336390E-06,-1.467334870E-06,-3.177290030E-12 +Increment 10: Step Time = 1.000,PART-1-1,48,-6.509021620E-12,3.081479950E-12,-3.974393620E-06,-1.467334870E-06,-4.570336390E-06,3.177015940E-12 +Increment 10: Step Time = 1.000,PART-1-1,49,-2.972907290E-12,2.971156740E-12,-1.432399700E-06,-1.720654950E-06,-1.720654950E-06,2.753751100E-17 diff --git a/reference/shellNL/shellNL reactions.csv b/reference/shellNL/shellNL reactions.csv new file mode 100644 index 0000000..866bed1 --- /dev/null +++ b/reference/shellNL/shellNL reactions.csv @@ -0,0 +1,50 @@ +Frame,Part Instance Name, Node Label, RF-RF1, RF-RF2, RF-RF3, RM-RM1, RM-RM2, RM-RM3 +Increment 10: Step Time = 1.000,PART-1-1,1,-5.232752760E-06,-1.916590210E+00,1.177698050E+04,1.954184180E+04,-9.094947020E-13,4.615960170E-07 +Increment 10: Step Time = 1.000,PART-1-1,2,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,3,-1.916631820E+00,-2.101437890E-05,1.177698050E+04,-2.955857780E-12,-1.954184180E+04,4.971754490E-07 +Increment 10: Step Time = 1.000,PART-1-1,4,-9.471606460E-02,-9.471402320E-02,-2.073950580E+01,1.594132080E+03,-1.594132080E+03,9.451013090E-19 +Increment 10: Step Time = 1.000,PART-1-1,5,5.232753210E-06,1.916590210E+00,1.177698050E+04,-1.954184180E+04,1.250555210E-11,4.615961590E-07 +Increment 10: Step Time = 1.000,PART-1-1,6,1.916631820E+00,2.101437710E-05,1.177698050E+04,6.139089240E-12,1.954184180E+04,4.971754490E-07 +Increment 10: Step Time = 1.000,PART-1-1,7,9.471606460E-02,9.471402320E-02,-2.073950580E+01,-1.594132080E+03,1.594132080E+03,1.053521530E-18 +Increment 10: Step Time = 1.000,PART-1-1,8,-9.472383560E-02,9.475927800E-02,-2.073950580E+01,-1.594132080E+03,-1.594132080E+03,-6.776825030E-19 +Increment 10: Step Time = 1.000,PART-1-1,9,9.472383560E-02,-9.475927800E-02,-2.073950580E+01,1.594132080E+03,1.594132080E+03,-6.743083810E-19 +Increment 10: Step Time = 1.000,PART-1-1,10,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,11,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,12,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,13,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,14,-1.292096260E+00,-7.747494430E-02,6.282266110E+03,5.156254270E+02,-1.449948340E+04,-1.273409110E-03 +Increment 10: Step Time = 1.000,PART-1-1,15,-5.106337670E-01,-4.954520240E-02,3.396133420E+02,1.322881960E+03,-6.428164550E+03,-2.987184560E-03 +Increment 10: Step Time = 1.000,PART-1-1,16,-4.952526470E-02,-5.106006860E-01,3.396133420E+02,6.428164550E+03,-1.322881960E+03,2.988364310E-03 +Increment 10: Step Time = 1.000,PART-1-1,17,-7.749996330E-02,-1.292100550E+00,6.282266110E+03,1.449948340E+04,-5.156254270E+02,1.273998990E-03 +Increment 10: Step Time = 1.000,PART-1-1,18,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,19,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,20,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,21,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,22,1.292096260E+00,7.747494430E-02,6.282266110E+03,-5.156254270E+02,1.449948340E+04,-1.273409110E-03 +Increment 10: Step Time = 1.000,PART-1-1,23,5.106337670E-01,4.954520240E-02,3.396133420E+02,-1.322881960E+03,6.428164550E+03,-2.987184560E-03 +Increment 10: Step Time = 1.000,PART-1-1,24,4.952526470E-02,5.106006860E-01,3.396133420E+02,-6.428164550E+03,1.322881960E+03,2.988364310E-03 +Increment 10: Step Time = 1.000,PART-1-1,25,7.749996330E-02,1.292100550E+00,6.282266110E+03,-1.449948340E+04,5.156254270E+02,1.273998990E-03 +Increment 10: Step Time = 1.000,PART-1-1,26,-7.753752920E-02,1.292116640E+00,6.282266110E+03,-1.449948340E+04,-5.156254270E+02,-1.273704110E-03 +Increment 10: Step Time = 1.000,PART-1-1,27,-4.947229850E-02,5.106329920E-01,3.396133420E+02,-6.428164550E+03,-1.322881960E+03,-2.988364310E-03 +Increment 10: Step Time = 1.000,PART-1-1,28,-5.106223230E-01,4.947446290E-02,3.396133420E+02,-1.322881960E+03,-6.428164550E+03,2.986004580E-03 +Increment 10: Step Time = 1.000,PART-1-1,29,-1.292139170E+00,7.751832160E-02,6.282266110E+03,-5.156254270E+02,-1.449948340E+04,1.274293990E-03 +Increment 10: Step Time = 1.000,PART-1-1,30,7.753752920E-02,-1.292116640E+00,6.282266110E+03,1.449948340E+04,5.156254270E+02,-1.273704110E-03 +Increment 10: Step Time = 1.000,PART-1-1,31,4.947229850E-02,-5.106329920E-01,3.396133420E+02,6.428164550E+03,1.322881960E+03,-2.988364310E-03 +Increment 10: Step Time = 1.000,PART-1-1,32,5.106223230E-01,-4.947446290E-02,3.396133420E+02,1.322881960E+03,6.428164550E+03,2.986004580E-03 +Increment 10: Step Time = 1.000,PART-1-1,33,1.292139170E+00,-7.751832160E-02,6.282266110E+03,5.156254270E+02,1.449948340E+04,1.274293990E-03 +Increment 10: Step Time = 1.000,PART-1-1,34,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,35,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,36,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,37,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,38,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,39,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,40,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,41,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,42,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,43,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,44,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,45,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,46,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,47,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,48,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,49,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00,0.000000000E+00 diff --git a/reference/shellNL/shellNL stresses.csv b/reference/shellNL/shellNL stresses.csv new file mode 100644 index 0000000..89093bd --- /dev/null +++ b/reference/shellNL/shellNL stresses.csv @@ -0,0 +1,289 @@ +Frame,Part Instance Name, Element Label, Node Label,Section Point, S-S11, S-S22, S-S33, S-S12 +Increment 10: Step Time = 1.000,PART-1-1,1,1,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.842519530E+04,1.947512500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,1,1,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.842390620E+04,-1.947457810E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,1,10,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,1,10,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,1,17,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746073830E+04,-1.582024380E+05,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,1,17,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054690E+05,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,1,34,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,1,34,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,2,10,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,2,10,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,2,11,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,2,11,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,2,34,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,2,34,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,2,35,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,2,35,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,3,2,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",3.423297500E+05,3.423297500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,3,2,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-3.423234380E+05,-3.423234380E+05,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,3,11,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,3,11,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,3,12,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,3,12,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,3,35,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,3,35,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,16,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,16,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,17,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746073830E+04,-1.582024380E+05,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,17,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054690E+05,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,34,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,34,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,36,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,4,36,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,34,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,34,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,35,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,35,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,36,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,36,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,37,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,5,37,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,6,12,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,6,12,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,6,13,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,6,13,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,6,35,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,6,35,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,6,37,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,6,37,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,4,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.421875000E-02,7.324218750E-02,0.000000000E+00,1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,7,4,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",7.226562500E-02,7.421875000E-02,0.000000000E+00,-1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,7,15,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,15,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850590E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,16,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,16,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,36,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,7,36,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,14,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,14,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,15,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,15,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850590E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,36,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,36,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,37,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,8,37,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,9,3,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.947457500E+05,-5.842390620E+04,0.000000000E+00,4.882812500E-04 +Increment 10: Step Time = 1.000,PART-1-1,9,3,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.947512500E+05,5.842519530E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,9,13,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,9,13,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,9,14,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,9,14,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,9,37,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,9,37,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,10,5,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.842390620E+04,-1.947457810E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,10,5,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.842519530E+04,1.947512500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,10,18,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,10,18,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,10,25,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746073830E+04,-1.582024380E+05,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,10,25,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054690E+05,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,10,38,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,10,38,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,11,18,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,11,18,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,11,19,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,11,19,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,11,38,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,11,38,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,11,39,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,11,39,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,12,2,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",3.423297500E+05,3.423297500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,12,2,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-3.423234380E+05,-3.423234380E+05,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,12,19,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,12,19,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,12,20,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,12,20,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,12,39,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,12,39,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,24,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,24,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,25,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746073830E+04,-1.582024380E+05,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,25,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054690E+05,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,38,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,38,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,40,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,13,40,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,38,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,38,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,39,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,39,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,40,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,40,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,41,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,14,41,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,15,20,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,15,20,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,15,21,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,15,21,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,15,39,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,15,39,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,-7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,15,41,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,15,41,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,7,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.421875000E-02,7.324218750E-02,0.000000000E+00,1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,16,7,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",7.226562500E-02,7.421875000E-02,0.000000000E+00,-1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,16,23,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,23,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850590E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,24,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,24,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,40,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,16,40,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,22,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,22,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,23,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,23,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850590E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,40,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,40,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,-5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,41,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,17,41,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,18,6,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.947457500E+05,-5.842390620E+04,0.000000000E+00,4.882812500E-04 +Increment 10: Step Time = 1.000,PART-1-1,18,6,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.947512500E+05,5.842519530E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,18,21,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,18,21,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,18,22,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,-1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,18,22,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,18,41,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324136720E+03,0.000000000E+00,-5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,18,41,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422360E+03,0.000000000E+00,5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,19,2,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",3.423297500E+05,3.423297500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,19,2,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-3.423234380E+05,-3.423234380E+05,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,19,12,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,19,12,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,19,19,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,19,19,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,19,42,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,19,42,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,20,18,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,20,18,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,20,19,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,20,19,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,20,42,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,20,42,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,20,43,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,20,43,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,21,5,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.842390620E+04,-1.947457810E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,21,5,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.842519530E+04,1.947512500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,21,18,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,21,18,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,21,26,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746074220E+04,-1.582024380E+05,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,21,26,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054840E+05,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,21,43,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,21,43,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,22,12,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,22,12,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,22,13,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,22,13,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,22,42,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,22,42,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,22,44,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,22,44,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,42,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,42,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,43,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,43,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,44,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,44,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,45,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,23,45,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,26,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746074220E+04,-1.582024380E+05,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,26,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054840E+05,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,27,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,27,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,43,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,43,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,45,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,24,45,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,25,3,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.947512500E+05,5.842519530E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,25,3,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.947457500E+05,-5.842390620E+04,0.000000000E+00,4.882812500E-04 +Increment 10: Step Time = 1.000,PART-1-1,25,13,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,25,13,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,25,29,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,25,29,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,25,44,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,25,44,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,28,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,28,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850780E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,29,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,29,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,44,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,44,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,45,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,26,45,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,8,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",7.421875000E-02,7.617187500E-02,0.000000000E+00,1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,27,8,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.421875000E-02,7.421875000E-02,0.000000000E+00,-1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,27,27,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,27,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,28,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,28,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850780E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,45,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,27,45,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,28,2,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",3.423297500E+05,3.423297500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,28,2,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-3.423234380E+05,-3.423234380E+05,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,28,11,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,28,11,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,28,20,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,28,20,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,28,46,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,28,46,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,29,10,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,29,10,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,29,11,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.922590620E+05,1.462908440E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,29,11,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.922560470E+05,-1.462848280E+05,0.000000000E+00,-9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,29,46,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,29,46,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,29,47,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,29,47,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,30,1,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.842390620E+04,-1.947457810E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,30,1,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.842519530E+04,1.947512500E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,30,10,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.129284770E+04,1.164291560E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,30,10,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.129343950E+04,-1.164235700E+05,0.000000000E+00,2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,30,30,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746074220E+04,-1.582024380E+05,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,30,30,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054840E+05,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,30,47,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,30,47,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,31,20,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.462848440E+05,-1.922560470E+05,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,31,20,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.462908440E+05,1.922590620E+05,0.000000000E+00,9.765625000E-04 +Increment 10: Step Time = 1.000,PART-1-1,31,21,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,31,21,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,31,46,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,31,46,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,31,48,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,31,48,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,46,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-1.028310310E+05,-1.028310310E+05,0.000000000E+00,-7.438760940E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,46,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",1.028341250E+05,1.028341250E+05,0.000000000E+00,7.438745310E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,47,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,47,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,48,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,48,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,49,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,32,49,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,30,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-4.746074220E+04,-1.582024380E+05,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,30,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",4.746164060E+04,1.582054840E+05,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,31,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,31,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,47,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",-5.323422850E+03,7.259001560E+04,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,47,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",5.324135740E+03,-7.258690620E+04,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,49,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,33,49,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,34,6,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.947512500E+05,5.842519530E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,34,6,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.947457500E+05,-5.842390620E+04,0.000000000E+00,4.882812500E-04 +Increment 10: Step Time = 1.000,PART-1-1,34,21,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.164291560E+05,-1.129284860E+04,0.000000000E+00,-2.441406250E-04 +Increment 10: Step Time = 1.000,PART-1-1,34,21,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.164235700E+05,1.129344040E+04,0.000000000E+00,0.000000000E+00 +Increment 10: Step Time = 1.000,PART-1-1,34,33,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,34,33,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,34,48,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,34,48,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,32,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,32,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850780E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,33,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.582024380E+05,-4.746074220E+04,0.000000000E+00,1.777732030E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,33,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.582054840E+05,4.746164060E+04,0.000000000E+00,-1.777733200E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,48,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.259001560E+04,-5.323422850E+03,0.000000000E+00,-5.219074610E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,48,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-7.258690620E+04,5.324135740E+03,0.000000000E+00,5.219067970E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,49,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,35,49,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,9,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",7.421875000E-02,7.617187500E-02,0.000000000E+00,1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,36,9,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",7.421875000E-02,7.421875000E-02,0.000000000E+00,-1.953125000E-03 +Increment 10: Step Time = 1.000,PART-1-1,36,31,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-1.786817190E+04,-5.956060940E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,31,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",1.786850590E+04,5.956166410E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,32,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-5.956060940E+04,-1.786817190E+04,0.000000000E+00,2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,32,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",5.956166410E+04,1.786850780E+04,0.000000000E+00,-2.084639450E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,49,"shell < MATERIAL-1 > < 5 section points > : SNEG, (fraction = -1.0)",-3.301455860E+04,-3.301455860E+04,0.000000000E+00,5.537136720E+04 +Increment 10: Step Time = 1.000,PART-1-1,36,49,"shell < MATERIAL-1 > < 5 section points > : SPOS, (fraction = 1.0)",3.301550780E+04,3.301550780E+04,0.000000000E+00,-5.537141410E+04 diff --git a/reference/shellNL/shellNL.inp b/reference/shellNL/shellNL.inp new file mode 100644 index 0000000..849d3a1 --- /dev/null +++ b/reference/shellNL/shellNL.inp @@ -0,0 +1,164 @@ +*Heading +** Job name: shellNL Model name: Model-1-NL +** Generated by: Abaqus/CAE Learning Edition 2024 +*Preprint, echo=NO, model=NO, history=NO, contact=NO +** +** PARTS +** +*Part, name=Part-1 +*Node + 1, 0., -5., 0. + 2, 0., 0., 0. + 3, -5., 0., 0. + 4, -5., -5., 0. + 5, 0., 5., 0. + 6, 5., 0., 0. + 7, 5., 5., 0. + 8, -5., 5., 0. + 9, 5., -5., 0. + 10, 0., -3.33333325, 0. + 11, 0., -1.66666663, 0. + 12, -1.66666663, 0., 0. + 13, -3.33333325, 0., 0. + 14, -5., -1.66666663, 0. + 15, -5., -3.33333325, 0. + 16, -3.33333325, -5., 0. + 17, -1.66666663, -5., 0. + 18, 0., 3.33333325, 0. + 19, 0., 1.66666663, 0. + 20, 1.66666663, 0., 0. + 21, 3.33333325, 0., 0. + 22, 5., 1.66666663, 0. + 23, 5., 3.33333325, 0. + 24, 3.33333325, 5., 0. + 25, 1.66666663, 5., 0. + 26, -1.66666663, 5., 0. + 27, -3.33333325, 5., 0. + 28, -5., 3.33333325, 0. + 29, -5., 1.66666663, 0. + 30, 1.66666663, -5., 0. + 31, 3.33333325, -5., 0. + 32, 5., -3.33333325, 0. + 33, 5., -1.66666663, 0. + 34, -1.66666663, -3.33333325, 0. + 35, -1.66666663, -1.66666663, 0. + 36, -3.33333325, -3.33333325, 0. + 37, -3.33333325, -1.66666663, 0. + 38, 1.66666663, 3.33333325, 0. + 39, 1.66666663, 1.66666663, 0. + 40, 3.33333325, 3.33333325, 0. + 41, 3.33333325, 1.66666663, 0. + 42, -1.66666663, 1.66666663, 0. + 43, -1.66666663, 3.33333325, 0. + 44, -3.33333325, 1.66666663, 0. + 45, -3.33333325, 3.33333325, 0. + 46, 1.66666663, -1.66666663, 0. + 47, 1.66666663, -3.33333325, 0. + 48, 3.33333325, -1.66666663, 0. + 49, 3.33333325, -3.33333325, 0. +*Element, type=S4 + 1, 1, 10, 34, 17 + 2, 10, 11, 35, 34 + 3, 11, 2, 12, 35 + 4, 17, 34, 36, 16 + 5, 34, 35, 37, 36 + 6, 35, 12, 13, 37 + 7, 16, 36, 15, 4 + 8, 36, 37, 14, 15 + 9, 37, 13, 3, 14 +10, 5, 18, 38, 25 +11, 18, 19, 39, 38 +12, 19, 2, 20, 39 +13, 25, 38, 40, 24 +14, 38, 39, 41, 40 +15, 39, 20, 21, 41 +16, 24, 40, 23, 7 +17, 40, 41, 22, 23 +18, 41, 21, 6, 22 +19, 2, 19, 42, 12 +20, 19, 18, 43, 42 +21, 18, 5, 26, 43 +22, 12, 42, 44, 13 +23, 42, 43, 45, 44 +24, 43, 26, 27, 45 +25, 13, 44, 29, 3 +26, 44, 45, 28, 29 +27, 45, 27, 8, 28 +28, 2, 11, 46, 20 +29, 11, 10, 47, 46 +30, 10, 1, 30, 47 +31, 20, 46, 48, 21 +32, 46, 47, 49, 48 +33, 47, 30, 31, 49 +34, 21, 48, 33, 6 +35, 48, 49, 32, 33 +36, 49, 31, 9, 32 +*Nset, nset=Set-1, generate + 1, 49, 1 +*Elset, elset=Set-1, generate + 1, 36, 1 +** Section: Section-1 +*Shell Section, elset=Set-1, material=Material-1 +0.5, 5 +*End Part +** +** +** ASSEMBLY +** +*Assembly, name=Assembly +** +*Instance, name=Part-1-1, part=Part-1 +*End Instance +** +*Nset, nset=Set-1, instance=Part-1-1 + 2, +*Nset, nset=Set-2, instance=Part-1-1 + 1, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, 22, 23, 24, 25 + 26, 27, 28, 29, 30, 31, 32, 33 +*Elset, elset=Set-2, instance=Part-1-1 + 1, 4, 7, 8, 9, 10, 13, 16, 17, 18, 21, 24, 25, 26, 27, 30 + 33, 34, 35, 36 +*End Assembly +** +** MATERIALS +** +*Material, name=Material-1 +*Elastic + 2.1e+11, 0.3 +** +** BOUNDARY CONDITIONS +** +** Name: BC-1 Type: Displacement/Rotation +*Boundary +Set-2, 1, 1 +Set-2, 2, 2 +Set-2, 3, 3 +Set-2, 4, 4 +Set-2, 5, 5 +Set-2, 6, 6 +** ---------------------------------------------------------------- +** +** STEP: Step-1 +** +*Step, name=Step-1, nlgeom=YES +*Static +0.1, 1., 0.001, 0.1 +** +** LOADS +** +** Name: Load-1 Type: Concentrated force +*Cload +Set-1, 3, -100000. +** +** OUTPUT REQUESTS +** +*Restart, write, frequency=0 +** +** FIELD OUTPUT: F-Output-1 +** +*Output, field, variable=PRESELECT +** +** HISTORY OUTPUT: H-Output-1 +** +*Output, history, variable=PRESELECT +*End Step diff --git a/scripts/execute.py b/scripts/execute.py index 451e511..6b7bc92 100644 --- a/scripts/execute.py +++ b/scripts/execute.py @@ -66,8 +66,12 @@ class StepExecutor: """Phase 디렉토리 안의 step들을 순차 실행하는 하네스.""" MAX_RETRIES = 3 + CODEX_TIMEOUT_SECONDS = 1800 CODEX_SANDBOX_ENV = "FESA_HARNESS_CODEX_SANDBOX" CODEX_SANDBOX_MODES = frozenset({"workspace-write", "danger-full-access"}) + IMPLEMENTATION_AGENT_PROFILE = Path( + ".codex/agents/implementation-agent.toml" + ) FEAT_MSG = "feat({phase}): step {num} - {name}" CHORE_MSG = "chore({phase}): step {num} output" TZ = timezone(timedelta(hours=9)) @@ -253,6 +257,35 @@ class StepExecutor: ) return mode + def _implementation_agent_settings(self) -> tuple[str, str]: + profile_path = Path(self._root) / self.IMPLEMENTATION_AGENT_PROFILE + try: + profile_lines = profile_path.read_text(encoding="utf-8").splitlines() + except OSError as exc: + raise CodexEnvironmentError( + f"Implementation Agent profile을 읽을 수 없습니다: {profile_path}" + ) from exc + + settings = {} + for line in profile_lines: + key, separator, value = line.partition("=") + key = key.strip() + if separator and key in {"model", "model_reasoning_effort"}: + try: + settings[key] = json.loads(value.strip()) + except json.JSONDecodeError as exc: + raise CodexEnvironmentError( + f"Implementation Agent profile의 {key} 값이 올바른 문자열이 아닙니다." + ) from exc + + model = settings.get("model") + reasoning_effort = settings.get("model_reasoning_effort") + if not isinstance(model, str) or not isinstance(reasoning_effort, str): + raise CodexEnvironmentError( + "Implementation Agent profile에 model과 model_reasoning_effort 문자열이 필요합니다." + ) + return model, reasoning_effort + def _invoke_codex(self, step: dict, preamble: str) -> dict: step_num, step_name = step["step"], step["name"] step_file = self._phase_dir / f"step{step_num}.md" @@ -262,12 +295,20 @@ class StepExecutor: sys.exit(1) prompt = preamble + step_file.read_text(encoding="utf-8") + sandbox_mode = self._codex_sandbox_mode() + model, reasoning_effort = self._implementation_agent_settings() command = [ "codex", "exec", + "--disable", + "unified_exec", "--json", + "--model", + model, + "--config", + f"model_reasoning_effort={json.dumps(reasoning_effort)}", "--sandbox", - self._codex_sandbox_mode(), + sandbox_mode, "--dangerously-bypass-hook-trust", "--cd", self._root, @@ -281,12 +322,22 @@ class StepExecutor: capture_output=True, text=True, encoding="utf-8", - timeout=1800, + timeout=self.CODEX_TIMEOUT_SECONDS, ) except FileNotFoundError as exc: raise CodexEnvironmentError( "Codex CLI를 찾을 수 없습니다. codex를 설치하고 PATH를 확인하세요." ) from exc + except subprocess.TimeoutExpired as exc: + timeout_message = f"Codex timed out after {exc.timeout} seconds." + stderr = exc.stderr or "" + if stderr: + stderr = f"{timeout_message}\n{stderr}" + else: + stderr = timeout_message + result = subprocess.CompletedProcess( + command, 124, stdout=exc.stdout or "", stderr=stderr + ) if result.returncode != 0: print(f"\n WARN: Codex가 비정상 종료됨 (code {result.returncode})") diff --git a/src/fesa/CMakeLists.txt b/src/fesa/CMakeLists.txt index 6013f2b..5de593c 100644 --- a/src/fesa/CMakeLists.txt +++ b/src/fesa/CMakeLists.txt @@ -4,7 +4,14 @@ add_library( analysis/analysis_model.cpp analysis/analysis_state.cpp analysis/linear_static_analysis.cpp + analysis/linear_static_procedure.cpp + analysis/newton_iteration_log.cpp + analysis/nonlinear_analysis_state.cpp + analysis/nonlinear_static_control.cpp + analysis/nonlinear_static_procedure.cpp + analysis/prepared_analysis.cpp app/fesa_application.cpp + app/output_paths.cpp assembly/load_assembler.cpp assembly/parallel_for.cpp assembly/sparse_assembler.cpp @@ -16,7 +23,9 @@ add_library( core/status.cpp elements/element_factory.cpp elements/euler_beam_3d.cpp + elements/finite_rotation.cpp elements/mitc4_shell.cpp + elements/nonlinear_mitc4_shell.cpp fem/dof_manager.cpp io/abaqus/domain_builder.cpp io/abaqus/domain_mapping_context.cpp @@ -27,6 +36,7 @@ add_library( io/abaqus/topology_mapper.cpp io/hdf5/hdf5_atomic_file.cpp io/hdf5/hdf5_model_writer.cpp + io/hdf5/nonlinear_hdf5_results_writer.cpp io/hdf5/hdf5_primitives.cpp io/hdf5/hdf5_result_writer.cpp io/hdf5/hdf5_results_writer.cpp @@ -49,6 +59,7 @@ add_library( results/result_recovery.cpp results/shell_result_recovery.cpp solvers/linear/mkl_pardiso_solver.cpp + solvers/linear/mkl_pardiso_tangent_solver.cpp ) target_include_directories( diff --git a/src/fesa/analysis/linear_static_analysis.cpp b/src/fesa/analysis/linear_static_analysis.cpp index 80a6524..8377207 100644 --- a/src/fesa/analysis/linear_static_analysis.cpp +++ b/src/fesa/analysis/linear_static_analysis.cpp @@ -2,50 +2,12 @@ #include -#include "fesa/assembly/load_assembler.h" -#include "fesa/assembly/parallel_for.h" -#include "fesa/assembly/sparse_assembler.h" -#include "fesa/elements/element_factory.h" -#include "fesa/io/abaqus/domain_mapper.h" -#include "fesa/io/abaqus/input_reader.h" -#include "fesa/results/result_recovery.h" +#include "fesa/analysis/linear_static_procedure.h" +#include "fesa/analysis/prepared_analysis.h" #include "fesa/results/results_writer.h" -#include "fesa/solvers/linear/linear_solver.h" namespace fesa { -Status LinearStaticAnalysis::Run(const AnalysisRequest& request) { - Status status = InitializeCandidate(request); - if (!status.IsOk()) { - return status; - } - status = BuildAnalysisModel(); - if (!status.IsOk()) { - return status; - } - status = BuildDofMapAndSparsePattern(); - if (!status.IsOk()) { - return status; - } - status = AssembleAndPartitionStiffness(); - if (!status.IsOk()) { - return status; - } - status = FactorizeFreeSystem(); - if (!status.IsOk()) { - return status; - } - status = AssembleLoadsAndEffectiveRhs(); - if (!status.IsOk()) { - return status; - } - status = SubstituteAndReconstruct(); - if (!status.IsOk()) { - return status; - } - return RecoverAndWrite(); -} - LinearStaticAnalysis::LinearStaticAnalysis(const ParallelFor& parallel_for, LinearSolver& linear_solver, ResultsWriter& results_writer) @@ -53,138 +15,23 @@ LinearStaticAnalysis::LinearStaticAnalysis(const ParallelFor& parallel_for, linear_solver_{linear_solver}, results_writer_{results_writer} {} -Status LinearStaticAnalysis::InitializeCandidate( - const AnalysisRequest& request) { - // Clear dependent objects in reverse ownership order so a reused analysis - // never exposes a view into a Domain from an earlier run. - effective_rhs_.reset(); - partitioned_stiffness_.reset(); - full_stiffness_.reset(); - state_.reset(); - dofs_.reset(); - element_view_.clear(); - elements_.clear(); - model_.reset(); - domain_.reset(); - diagnostics_.clear(); - request_ = request; - - const auto parsed = AbaqusInputReader{}.Read(request_.input_path); - if (!parsed.HasValue()) { - return parsed.GetStatus(); - } - auto domain = AbaqusDomainMapper{}.Map(parsed.Value()); - if (!domain.HasValue()) { - return domain.GetStatus(); +Status LinearStaticAnalysis::Run(const AnalysisRequest& request) { + Result prepared = + PrepareAnalysisInput(request.input_path); + if (!prepared.HasValue()) { + return prepared.GetStatus(); } - domain_ = std::make_unique(std::move(domain.Value())); - diagnostics_ = domain_->Warnings(); - SortDiagnostics(diagnostics_); - return Status::Ok(); -} - -Status LinearStaticAnalysis::BuildAnalysisModel() { - auto model = AnalysisModel::Create(*domain_); - if (!model.HasValue()) { - return model.GetStatus(); - } - model_ = std::make_unique(std::move(model.Value())); - return Status::Ok(); -} - -Status LinearStaticAnalysis::BuildDofMapAndSparsePattern() { - std::vector> elements; - ElementView element_view; - elements.reserve(model_->ActiveElements().size()); - element_view.reserve(model_->ActiveElements().size()); - const ElementFactory factory; - for (const EntityIndex element_index : model_->ActiveElements()) { - auto element = factory.Create(domain_->Elements()[element_index], *domain_); - if (!element.HasValue()) { - return element.GetStatus(); - } - element_view.emplace_back(*element.Value()); - elements.push_back(std::move(element.Value())); + LinearStaticProcedureExecutor executor(parallel_for_, linear_solver_); + Result execution = + executor.Execute(prepared.Value().domain); + if (!execution.HasValue()) { + return execution.GetStatus(); } - DofManager dofs; - const Status dof_status = dofs.Build(*model_, element_view); - if (!dof_status.IsOk()) { - return dof_status; - } - - elements_ = std::move(elements); - element_view_ = std::move(element_view); - dofs_ = std::make_unique(std::move(dofs)); - state_ = std::make_unique( - AnalysisState::Create(*dofs_, {"Step-1", 0U})); - return Status::Ok(); -} - -Status LinearStaticAnalysis::AssembleAndPartitionStiffness() { - auto stiffness = - SparseAssembler::Assemble(element_view_, *dofs_, parallel_for_); - if (!stiffness.HasValue()) { - return stiffness.GetStatus(); - } - full_stiffness_ = - std::make_unique(std::move(stiffness.Value())); - - auto partitioned = - EssentialConstraintPolicy{}.Partition(*full_stiffness_, *dofs_); - if (!partitioned.HasValue()) { - return partitioned.GetStatus(); - } - partitioned_stiffness_ = - std::make_unique(std::move(partitioned.Value())); - return Status::Ok(); -} - -Status LinearStaticAnalysis::FactorizeFreeSystem() { - // This call intentionally precedes all load assembly in Run. - return linear_solver_.Factorize(partitioned_stiffness_->k_ff); -} - -Status LinearStaticAnalysis::AssembleLoadsAndEffectiveRhs() { - auto full_load = LoadAssembler::AssembleFullNodalLoad(*model_, *dofs_); - if (!full_load.HasValue()) { - return full_load.GetStatus(); - } - state_->ExternalForce() = std::move(full_load.Value()); - - auto rhs = LoadAssembler::EffectiveFreeRhs(state_->ExternalForce(), - partitioned_stiffness_->k_fc, - dofs_->PrescribedValues(), *dofs_); - if (!rhs.HasValue()) { - return rhs.GetStatus(); - } - effective_rhs_ = std::make_unique(std::move(rhs.Value())); - return Status::Ok(); -} - -Status LinearStaticAnalysis::SubstituteAndReconstruct() { - Vector free_displacement{dofs_->FreeDofCount()}; - const Status solve_status = - linear_solver_.Solve(*effective_rhs_, free_displacement); - if (!solve_status.IsOk()) { - return solve_status; - } - - state_->Displacement() = EssentialConstraintPolicy{}.ReconstructFull( - free_displacement, dofs_->PrescribedValues(), *dofs_); - return Status::Ok(); -} - -Status LinearStaticAnalysis::RecoverAndWrite() { - const Status recovery_status = ResultRecovery::Recover( - *model_, element_view_, *dofs_, *full_stiffness_, state_->Displacement(), - state_->ExternalForce(), *state_); - if (!recovery_status.IsOk()) { - return recovery_status; - } - return results_writer_.Write(request_.output_path, *domain_, *state_, - diagnostics_); + return results_writer_.Write(request.output_path, prepared.Value().domain, + execution.Value().state, + execution.Value().diagnostics); } } // namespace fesa diff --git a/src/fesa/analysis/linear_static_procedure.cpp b/src/fesa/analysis/linear_static_procedure.cpp new file mode 100644 index 0000000..cbe74df --- /dev/null +++ b/src/fesa/analysis/linear_static_procedure.cpp @@ -0,0 +1,105 @@ +#include "fesa/analysis/linear_static_procedure.h" + +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/assembly/load_assembler.h" +#include "fesa/assembly/parallel_for.h" +#include "fesa/assembly/sparse_assembler.h" +#include "fesa/constraints/essential_constraint_policy.h" +#include "fesa/elements/element.h" +#include "fesa/elements/element_factory.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/results/result_recovery.h" +#include "fesa/solvers/linear/linear_solver.h" + +namespace fesa { + +LinearStaticProcedureExecutor::LinearStaticProcedureExecutor( + const ParallelFor& parallel_for, LinearSolver& linear_solver) + : parallel_for_(parallel_for), linear_solver_(linear_solver) {} + +Result LinearStaticProcedureExecutor::Execute( + const Domain& domain) const { + Result model = AnalysisModel::Create(domain); + if (!model.HasValue()) { + return Result::Failure(model.GetStatus()); + } + + std::vector> elements; + ElementView element_view; + elements.reserve(model.Value().ActiveElements().size()); + element_view.reserve(model.Value().ActiveElements().size()); + const ElementFactory factory; + for (const EntityIndex element_index : model.Value().ActiveElements()) { + Result> element = + factory.Create(domain.Elements()[element_index], domain); + if (!element.HasValue()) { + return Result::Failure(element.GetStatus()); + } + element_view.emplace_back(*element.Value()); + elements.push_back(std::move(element.Value())); + } + + DofManager dofs; + const Status dof_status = dofs.Build(model.Value(), element_view); + if (!dof_status.IsOk()) { + return Result::Failure(dof_status); + } + + AnalysisState state = AnalysisState::Create(dofs, {"Step-1", 0U}); + Result stiffness = + SparseAssembler::Assemble(element_view, dofs, parallel_for_); + if (!stiffness.HasValue()) { + return Result::Failure(stiffness.GetStatus()); + } + + Result partitions = + EssentialConstraintPolicy{}.Partition(stiffness.Value(), dofs); + if (!partitions.HasValue()) { + return Result::Failure(partitions.GetStatus()); + } + + const Status factorized = linear_solver_.Factorize(partitions.Value().k_ff); + if (!factorized.IsOk()) { + return Result::Failure(factorized); + } + + Result external = + LoadAssembler::AssembleFullNodalLoad(model.Value(), dofs); + if (!external.HasValue()) { + return Result::Failure(external.GetStatus()); + } + state.ExternalForce() = std::move(external.Value()); + + Result rhs = LoadAssembler::EffectiveFreeRhs( + state.ExternalForce(), partitions.Value().k_fc, dofs.PrescribedValues(), + dofs); + if (!rhs.HasValue()) { + return Result::Failure(rhs.GetStatus()); + } + + Vector free_displacement{dofs.FreeDofCount()}; + const Status solved = linear_solver_.Solve(rhs.Value(), free_displacement); + if (!solved.IsOk()) { + return Result::Failure(solved); + } + state.Displacement() = EssentialConstraintPolicy{}.ReconstructFull( + free_displacement, dofs.PrescribedValues(), dofs); + + const Status recovered = ResultRecovery::Recover( + model.Value(), element_view, dofs, stiffness.Value(), + state.Displacement(), state.ExternalForce(), state); + if (!recovered.IsOk()) { + return Result::Failure(recovered); + } + + std::vector diagnostics = domain.Warnings(); + SortDiagnostics(diagnostics); + return Result::Success( + {std::move(state), std::move(diagnostics)}); +} + +} // namespace fesa diff --git a/src/fesa/analysis/newton_iteration_log.cpp b/src/fesa/analysis/newton_iteration_log.cpp new file mode 100644 index 0000000..9c96ee7 --- /dev/null +++ b/src/fesa/analysis/newton_iteration_log.cpp @@ -0,0 +1,328 @@ +#include "fesa/analysis/newton_iteration_log.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace fesa { +namespace { + +struct ChannelSpec { + std::string_view label_prefix; + std::string_view identity; +}; + +Status LogOutputFailure(const std::filesystem::path& log_path, + const std::string& message) { + return Status::Failure( + FailureCategory::kOutput, + {{Severity::kError, + "log-output-failure", + {{}, 0U}, + "", + log_path.generic_u8string(), + message}}); +} + +std::string EscapeText(const std::string_view value) { + constexpr char kHexDigits[] = "0123456789ABCDEF"; + std::string escaped; + escaped.reserve(value.size()); + for (const unsigned char byte : value) { + switch (byte) { + case '\\': + escaped += "\\\\"; + break; + case '\t': + escaped += "\\t"; + break; + case '\n': + escaped += "\\n"; + break; + case '\r': + escaped += "\\r"; + break; + case '\0': + escaped += "\\0"; + break; + default: + if (byte < 0x20U || byte == 0x7FU) { + escaped += "\\x"; + escaped += kHexDigits[byte >> 4U]; + escaped += kHexDigits[byte & 0x0FU]; + } else { + escaped += static_cast(byte); + } + break; + } + } + return escaped; +} + +Result FormatFiniteNumber(const double value, + const std::filesystem::path& log_path) { + if (!std::isfinite(value)) { + return Result::Failure( + LogOutputFailure(log_path, "A Newton log numeric value is nonfinite.")); + } + + std::array buffer{}; + const auto conversion = std::to_chars( + buffer.data(), buffer.data() + buffer.size(), value, + std::chars_format::general, std::numeric_limits::max_digits10); + if (conversion.ec != std::errc{}) { + return Result::Failure( + LogOutputFailure(log_path, "A Newton log numeric value could not format.")); + } + return Result::Success( + std::string{buffer.data(), conversion.ptr}); +} + +Result BranchLabel( + const NewtonConvergenceBranch branch, + const std::filesystem::path& log_path) { + switch (branch) { + case NewtonConvergenceBranch::kRelative: + return Result::Success("relative"); + case NewtonConvergenceBranch::kZeroScale: + return Result::Success("zero-scale"); + } + return Result::Failure(LogOutputFailure( + log_path, "A Newton log convergence branch is not supported.")); +} + +Result UnitLabel(const NewtonChannelUnit unit, + const std::filesystem::path& log_path) { + switch (unit) { + case NewtonChannelUnit::kForce: + return Result::Success("force"); + case NewtonChannelUnit::kForceLength: + return Result::Success("force*length"); + case NewtonChannelUnit::kLength: + return Result::Success("length"); + case NewtonChannelUnit::kDimensionless: + return Result::Success("1"); + } + return Result::Failure(LogOutputFailure( + log_path, "A Newton log threshold unit is not supported.")); +} + +std::string StageLabel(const NewtonIterationStage stage) { + switch (stage) { + case NewtonIterationStage::kEntered: + return "iteration-entered"; + case NewtonIterationStage::kKinematicsEvaluated: + return "trial-state"; + case NewtonIterationStage::kInternalAssembled: + return "residual"; + case NewtonIterationStage::kExternalAssembled: + return "load-boundary"; + case NewtonIterationStage::kSolvedCorrection: + return "correction"; + case NewtonIterationStage::kConvergenceEvaluated: + return "convergence-gates"; + case NewtonIterationStage::kAccepted: + return "commit"; + case NewtonIterationStage::kFailed: + return "failed"; + } + return "failed"; +} + +bool AreChannelsEvaluated(const NewtonIterationLogRecord& record) { + if (!record.failure.present) { + return true; + } + return record.last_completed_stage == + NewtonIterationStage::kConvergenceEvaluated || + record.last_completed_stage == NewtonIterationStage::kAccepted; +} + +void AppendField(std::vector* fields, const std::string_view label, + const std::string& value) { + fields->push_back(std::string{label} + "=" + value); +} + +Status AppendChannelFields( + std::vector* fields, const ChannelSpec spec, + const NewtonChannelDecision& decision, const bool evaluated, + const std::string& not_evaluated, const std::filesystem::path& log_path) { + const std::string prefix{spec.label_prefix}; + if (!evaluated) { + for (const std::string_view suffix : + {"channel", "numerator_norm", "denominator_scale", "branch", + "threshold", "threshold_unit", "pass"}) { + AppendField(fields, prefix + "_" + std::string{suffix}, not_evaluated); + } + return Status::Ok(); + } + + if (decision.identity != spec.identity) { + return LogOutputFailure(log_path, + "A Newton log channel identity is invalid."); + } + const auto numerator = FormatFiniteNumber(decision.numerator_norm, log_path); + if (!numerator.HasValue()) { + return numerator.GetStatus(); + } + const auto denominator = + FormatFiniteNumber(decision.denominator_scale, log_path); + if (!denominator.HasValue()) { + return denominator.GetStatus(); + } + const auto branch = BranchLabel(decision.branch, log_path); + if (!branch.HasValue()) { + return branch.GetStatus(); + } + const auto threshold = FormatFiniteNumber(decision.threshold, log_path); + if (!threshold.HasValue()) { + return threshold.GetStatus(); + } + const auto unit = UnitLabel(decision.threshold_unit, log_path); + if (!unit.HasValue()) { + return unit.GetStatus(); + } + + AppendField(fields, prefix + "_channel", decision.identity); + AppendField(fields, prefix + "_numerator_norm", numerator.Value()); + AppendField(fields, prefix + "_denominator_scale", denominator.Value()); + AppendField(fields, prefix + "_branch", std::string{branch.Value()}); + AppendField(fields, prefix + "_threshold", threshold.Value()); + AppendField(fields, prefix + "_threshold_unit", std::string{unit.Value()}); + AppendField(fields, prefix + "_pass", decision.passed ? "1" : "0"); + return Status::Ok(); +} + +Result SerializeRecord(const NewtonIterationLogRecord& record, + const std::filesystem::path& log_path) { + const auto load_factor = FormatFiniteNumber(record.load_factor, log_path); + if (!load_factor.HasValue()) { + return Result::Failure(load_factor.GetStatus()); + } + + const bool channels_evaluated = AreChannelsEvaluated(record); + const std::string not_evaluated = + "not-evaluated(" + EscapeText(record.failure.reason) + ")"; + std::vector fields; + fields.reserve(39U); + AppendField(&fields, "record", "newton-iteration"); + AppendField(&fields, "schema", "nsnr-log-v1"); + AppendField(&fields, "increment", std::to_string(record.increment_index)); + AppendField(&fields, "target_factor", load_factor.Value()); + AppendField(&fields, "iteration", std::to_string(record.iteration)); + AppendField(&fields, "last_completed_stage", + StageLabel(record.last_completed_stage)); + AppendField(&fields, "failing_stage", + record.failure.present ? StageLabel(record.failure.stage) : "none"); + + const std::array specs{{ + {"residual_force", "residual_force"}, + {"residual_moment", "residual_moment"}, + {"correction_translation", "correction_translation"}, + {"correction_rotation", "correction_rotation"}, + }}; + const std::array decisions{{ + &record.force_residual, + &record.moment_residual, + &record.translation_correction, + &record.rotation_correction, + }}; + for (std::size_t index = 0U; index < specs.size(); ++index) { + const Status channel_status = + AppendChannelFields(&fields, specs[index], *decisions[index], + channels_evaluated, not_evaluated, log_path); + if (!channel_status.IsOk()) { + return Result::Failure(channel_status); + } + } + AppendField(&fields, "combined_pass", + channels_evaluated ? (record.combined_passed ? "1" : "0") + : not_evaluated); + AppendField(&fields, "transition", EscapeText(record.transition)); + AppendField(&fields, "outcome", EscapeText(record.outcome)); + AppendField(&fields, "diagnostic_code", EscapeText(record.diagnostic_code)); + + std::string line; + for (std::size_t index = 0U; index < fields.size(); ++index) { + if (index != 0U) { + line += '\t'; + } + line += fields[index]; + } + line += '\n'; + return Result::Success(std::move(line)); +} + +} // namespace + +Status NewtonIterationLogWriter::Open(const std::filesystem::path& log_path) { + if (state_ != State::kReady) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log writer is not ready."); + } + + log_path_ = log_path; + stream_.open(log_path_, std::ios::binary | std::ios::out | std::ios::trunc); + if (!stream_.is_open() || !stream_) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log could not open."); + } + state_ = State::kOpen; + return Status::Ok(); +} + +Status NewtonIterationLogWriter::Write(const NewtonIterationLogRecord& record) { + if (state_ != State::kOpen) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log writer is not open."); + } + + const auto line = SerializeRecord(record, log_path_); + if (!line.HasValue()) { + state_ = State::kFailed; + return line.GetStatus(); + } + stream_.write(line.Value().data(), + static_cast(line.Value().size())); + if (!stream_) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log record could not write."); + } + return Status::Ok(); +} + +Status NewtonIterationLogWriter::Flush() { + if (state_ != State::kOpen) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log writer is not open."); + } + + stream_.flush(); + if (!stream_) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log could not flush."); + } + return Status::Ok(); +} + +Status NewtonIterationLogWriter::Close() { + if (state_ != State::kOpen) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log writer is not open."); + } + + stream_.close(); + if (stream_.fail()) { + state_ = State::kFailed; + return LogOutputFailure(log_path_, "The Newton log could not close."); + } + state_ = State::kClosed; + return Status::Ok(); +} + +} // namespace fesa diff --git a/src/fesa/analysis/nonlinear_analysis_state.cpp b/src/fesa/analysis/nonlinear_analysis_state.cpp new file mode 100644 index 0000000..79c6a91 --- /dev/null +++ b/src/fesa/analysis/nonlinear_analysis_state.cpp @@ -0,0 +1,320 @@ +#include "fesa/analysis/nonlinear_analysis_state.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/element_definition.h" + +namespace fesa { +namespace { + +constexpr std::size_t kDofsPerNode = 6U; +constexpr std::size_t kShellLocationsPerElement = 4U; +constexpr std::uint32_t kMaximumNewtonIterations = 100U; + +/// @brief Creates one failure without exposing a partially built state. +Status StateFailure(const FailureCategory category, const std::string& code, + const std::string& identity, const std::string& message) { + return Status::Failure( + category, + {{Severity::kError, code, {}, "NONLINEAR_ANALYSIS_STATE", identity, + message}}); +} + +/// @brief Compares every preserved source-identity component. +bool SourceIdsMatch(const SourceEntityId& left, const SourceEntityId& right) { + return left.instance_name == right.instance_name && + left.source_label == right.source_label && + left.source_label_text == right.source_label_text; +} + +template +/// @brief Tests one fixed-size numerical array for finite values. +bool IsFinite(const std::array& values) { + return std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); }); +} + +/// @brief Tests each component of a stored trial vector for finiteness. +bool IsFinite(const Vector& values) { + for (std::size_t index = 0U; index < values.Size(); ++index) { + if (!std::isfinite(values[index])) { + return false; + } + } + return true; +} + +/// @brief Tests all physical quantities attached to one shell recovery row. +bool IsFinite(const ShellResultRow& row) { + if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || + !IsFinite(row.section_resultant)) { + return false; + } + for (const auto& axis : row.local_frame) { + if (!IsFinite(axis)) { + return false; + } + } + return std::all_of(row.stress.begin(), row.stress.end(), + [](const ShellSectionStressRow& stress) { + return std::isfinite(stress.zeta) && + IsFinite(stress.components); + }); +} + +/// @brief Returns shell Domain indices in deterministic unified element order. +std::vector ShellElementOrder(const Domain& domain) { + std::vector order; + for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { + if (domain.Elements()[index].Kind() == ElementDefinitionKind::kMitc4Shell) { + order.push_back(static_cast(index)); + } + } + return order; +} + +/// @brief Validates one accepted frame before any committed-state mutation. +Status ValidateAcceptedFrame(const AcceptedFrameState& frame, + const NonlinearTrialState& committed, + const std::size_t full_dof_count, + const std::vector& shell_order, + const std::size_t accepted_frame_count) { + if (accepted_frame_count > + static_cast((std::numeric_limits::max)())) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted-frame inventory exceeds uint32 identity."); + } + if (frame.frame_index != + static_cast(accepted_frame_count)) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Frame index must equal accepted-frame order."); + } + if (frame.increment_index <= committed.increment_index || + !std::isfinite(frame.load_factor) || frame.load_factor <= 0.0 || + frame.load_factor > 1.0 || frame.load_factor <= committed.load_factor || + frame.iteration_count == 0U || + frame.iteration_count > kMaximumNewtonIterations || + frame.is_factor_one != (frame.load_factor == 1.0)) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted frame has an invalid increment identity."); + } + + const std::size_t node_count = committed.nodal_internal_order.size(); + if (frame.nodal_internal_order.size() != node_count || + frame.nodal_source_ids.size() != node_count || + frame.nodal_triad.size() != node_count || + frame.nodal_director.size() != node_count) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted frame node inventory does not match baseline."); + } + for (std::size_t node = 0U; node < node_count; ++node) { + if (frame.nodal_internal_order[node] != + committed.nodal_internal_order[node] || + !SourceIdsMatch(frame.nodal_source_ids[node], + committed.nodal_source_ids[node]) || + !IsFinite(frame.nodal_triad[node][0U]) || + !IsFinite(frame.nodal_triad[node][1U]) || + !IsFinite(frame.nodal_triad[node][2U]) || + !IsFinite(frame.nodal_director[node])) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted frame has invalid nodal identity or state."); + } + } + + const std::array vectors{ + &frame.generalized_coordinates, &frame.displacement, + &frame.rotation_vector, &frame.internal_force, + &frame.external_force, &frame.residual, + &frame.reaction}; + for (const Vector* vector : vectors) { + if (vector->Size() != full_dof_count || !IsFinite(*vector)) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted frame vector inventory is invalid."); + } + } + for (std::size_t dof = 0U; dof < full_dof_count; ++dof) { + const double residual = frame.internal_force[dof] - frame.external_force[dof]; + if (frame.residual[dof] != residual || frame.reaction[dof] != residual) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Residual and reaction must retain full equilibrium."); + } + } + + if (shell_order.size() > + (std::numeric_limits::max)() / kShellLocationsPerElement || + frame.shell_results.size() != + shell_order.size() * kShellLocationsPerElement || + !std::isfinite(frame.physical_strain_energy) || + !IsFinite(frame.global_equilibrium)) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Accepted frame physical result inventory is invalid."); + } + + const double gauss = 1.0 / std::sqrt(3.0); + const std::array + expected_locations{ShellMidsurfaceLocation::kGp1, + ShellMidsurfaceLocation::kGp2, + ShellMidsurfaceLocation::kGp3, + ShellMidsurfaceLocation::kGp4}; + const std::array, kShellLocationsPerElement> + expected_coordinates{std::array{-gauss, -gauss}, + std::array{gauss, -gauss}, + std::array{gauss, gauss}, + std::array{-gauss, gauss}}; + const std::array expected_positions{ + ShellSectionPosition::kBottom, ShellSectionPosition::kMiddle, + ShellSectionPosition::kTop}; + constexpr std::array expected_zeta{-1.0, 0.0, 1.0}; + for (std::size_t element = 0U; element < shell_order.size(); ++element) { + for (std::size_t point = 0U; point < kShellLocationsPerElement; ++point) { + const auto& row = + frame.shell_results[element * kShellLocationsPerElement + point]; + if (row.element != shell_order[element] || + row.location != expected_locations[point] || + row.natural_coordinates != expected_coordinates[point] || + !IsFinite(row)) { + return StateFailure(FailureCategory::kSolver, "invalid-accepted-state", {}, + "Shell result rows do not preserve stable identity."); + } + for (std::size_t position = 0U; position < expected_positions.size(); + ++position) { + if (row.stress[position].position != expected_positions[position] || + row.stress[position].zeta != expected_zeta[position]) { + return StateFailure( + FailureCategory::kSolver, "invalid-accepted-state", {}, + "Shell stress rows do not preserve stable section identity."); + } + } + } + } + return Status::Ok(); +} + +} // namespace + +Result NonlinearAnalysisState::Create( + const Domain& domain, const DofManager& dofs, + const NonlinearStateBaselineInput& baseline) { + const std::size_t node_count = domain.Nodes().size(); + if (node_count > (std::numeric_limits::max)() / kDofsPerNode || + dofs.FullDofCount() != node_count * kDofsPerNode || + !dofs.ValidateInvariants().IsOk()) { + return Result::Failure(StateFailure( + FailureCategory::kModel, "invalid-nonlinear-state", {}, + "Domain node and full-DOF inventories must agree.")); + } + if (baseline.node_baselines.size() != node_count) { + return Result::Failure(StateFailure( + FailureCategory::kModel, "invalid-nonlinear-state", {}, + "Nonlinear baseline requires exactly one entry per Domain node.")); + } + + NonlinearTrialState committed{ + 0U, + 0.0, + true, + {}, + {}, + Vector{dofs.FullDofCount()}, + Vector{dofs.FullDofCount()}, + Vector{dofs.FullDofCount()}, + {}, + {}, + Vector{dofs.FullDofCount()}, + Vector{dofs.FullDofCount()}, + Vector{dofs.FullDofCount()}, + Vector{dofs.FullDofCount()}, + {}, + 0.0, + {}}; + committed.nodal_internal_order.reserve(node_count); + committed.nodal_source_ids.reserve(node_count); + committed.nodal_triad.reserve(node_count); + committed.nodal_director.reserve(node_count); + for (std::size_t node = 0U; node < node_count; ++node) { + const auto& entry = baseline.node_baselines[node]; + if (entry.node_index != static_cast(node) || + !SourceIdsMatch(entry.source_id, domain.Nodes()[node].source_id) || + !IsFinite(entry.triad[0U]) || !IsFinite(entry.triad[1U]) || + !IsFinite(entry.triad[2U]) || !IsFinite(entry.director)) { + return Result::Failure(StateFailure( + FailureCategory::kModel, "invalid-nonlinear-state", + std::to_string(node), + "Baseline identity and finite node frame must match Domain order.")); + } + committed.nodal_internal_order.push_back(entry.node_index); + committed.nodal_source_ids.push_back(entry.source_id); + committed.nodal_triad.push_back(entry.triad); + committed.nodal_director.push_back(entry.director); + } + + return Result::Success(NonlinearAnalysisState{ + std::move(committed), dofs.FullDofCount(), ShellElementOrder(domain)}); +} + +Result NonlinearAnalysisState::BeginTrialFromCommitted() + const { + return Result::Success(committed_state_); +} + +Status NonlinearAnalysisState::CommitAcceptedFrame( + const AcceptedFrameState& frame) { + const Status validation = + ValidateAcceptedFrame(frame, committed_state_, full_dof_count_, + shell_element_order_, accepted_frames_.size()); + if (!validation.IsOk()) { + return validation; + } + + NonlinearTrialState candidate{ + frame.increment_index, + frame.load_factor, + false, + frame.nodal_internal_order, + frame.nodal_source_ids, + frame.generalized_coordinates, + frame.displacement, + frame.rotation_vector, + frame.nodal_triad, + frame.nodal_director, + frame.internal_force, + frame.external_force, + frame.residual, + frame.reaction, + frame.shell_results, + frame.physical_strain_energy, + frame.global_equilibrium}; + std::vector accepted_candidate = accepted_frames_; + accepted_candidate.push_back(frame); + + committed_state_ = std::move(candidate); + accepted_frames_ = std::move(accepted_candidate); + return Status::Ok(); +} + +void NonlinearAnalysisState::DiscardTrial() noexcept {} + +const std::vector& NonlinearAnalysisState::AcceptedFrames() + const noexcept { + return accepted_frames_; +} + +const NonlinearTrialState& NonlinearAnalysisState::CommittedState() const noexcept { + return committed_state_; +} + +NonlinearAnalysisState::NonlinearAnalysisState( + NonlinearTrialState committed_state, const std::size_t full_dof_count, + std::vector shell_element_order) + : committed_state_{std::move(committed_state)}, + full_dof_count_{full_dof_count}, + shell_element_order_{std::move(shell_element_order)} {} + +} // namespace fesa diff --git a/src/fesa/analysis/nonlinear_static_control.cpp b/src/fesa/analysis/nonlinear_static_control.cpp new file mode 100644 index 0000000..86235ae --- /dev/null +++ b/src/fesa/analysis/nonlinear_static_control.cpp @@ -0,0 +1,548 @@ +#include "fesa/analysis/nonlinear_static_control.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/assembly/load_assembler.h" +#include "fesa/elements/finite_rotation.h" + +namespace fesa { +namespace { + +constexpr std::size_t kDofsPerNode = 6U; +constexpr std::size_t kTranslationDofCount = 3U; +constexpr double kMomentAdmissibilityThreshold = 1.0e-12; + +/// @brief Creates a deterministic control-layer diagnostic status. +Status ControlFailure(const FailureCategory category, const std::string& code, + const SourceLocation& location, + const std::string& keyword, const std::string& identity, + const std::string& message) { + return Status::Failure(category, {{Severity::kError, code, location, keyword, + identity, message}}); +} + +/// @brief Verifies raw nonlinear static controls without deriving state. +Status ValidateNonlinearStaticControls(const StepDefinition& step) { + if (!step.IsNonlinearStatic() || !std::isfinite(step.InitialIncrement()) || + !(step.InitialIncrement() > 0.0) || !std::isfinite(step.TimePeriod()) || + step.TimePeriod() != 1.0 || !std::isfinite(step.MinimumIncrement()) || + !(step.MinimumIncrement() > 0.0) || + !std::isfinite(step.MaximumIncrement()) || + !(step.MaximumIncrement() > 0.0)) { + return ControlFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + step.Location(), "STATIC", step.Name(), + "A nonlinear static step requires four positive finite controls and " + "an exactly factor-one time period."); + } + return Status::Ok(); +} + +/// @brief Returns a finite three-component vector from full trial storage. +Result RotationVectorForNode(const Vector& trial, + const std::size_t node) { + const std::size_t first = node * kDofsPerNode + kTranslationDofCount; + if (first + kTranslationDofCount > trial.Size()) { + return Result::Failure(ControlFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {{}, 0U}, + "NONLINEAR_STATIC_CONTROL", std::to_string(node), + "The full trial coordinate vector does not contain every nodal " + "rotation component.")); + } + const Vector3 rotation{trial[first], trial[first + 1U], trial[first + 2U]}; + if (!rotation.IsFinite()) { + return Result::Failure(ControlFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {{}, 0U}, + "NONLINEAR_STATIC_CONTROL", std::to_string(node), + "The current trial rotation coordinate must be finite.")); + } + return Result::Success(rotation); +} + +/// @brief Builds a proper initial frame from its semantic nodal record. +Matrix InitialFrame(const ShellNodeInitialFrame& frame) { + Matrix result{3U, 3U}; + for (std::size_t row = 0U; row < kTranslationDofCount; ++row) { + result(row, 0U) = frame.tangent_a[row]; + result(row, 1U) = frame.tangent_b[row]; + result(row, 2U) = frame.director[row]; + } + return result; +} + +/// @brief Multiplies a 3-by-3 matrix by a Vector3. +Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { + return {matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + + matrix(0U, 2U) * vector.Z(), + matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + + matrix(1U, 2U) * vector.Z(), + matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + + matrix(2U, 2U) * vector.Z()}; +} + +/// @brief Multiplies a 3-by-3 matrix transpose by a Vector3. +Vector3 MultiplyTranspose(const Matrix& matrix, const Vector3& vector) { + return {matrix(0U, 0U) * vector.X() + matrix(1U, 0U) * vector.Y() + + matrix(2U, 0U) * vector.Z(), + matrix(0U, 1U) * vector.X() + matrix(1U, 1U) * vector.Y() + + matrix(2U, 1U) * vector.Z(), + matrix(0U, 2U) * vector.X() + matrix(1U, 2U) * vector.Y() + + matrix(2U, 2U) * vector.Z()}; +} + +/// @brief Forms the three-dimensional skew matrix of a global vector. +Matrix Skew(const Vector3& vector) { + Matrix result{3U, 3U}; + result(0U, 1U) = -vector.Z(); + result(0U, 2U) = vector.Y(); + result(1U, 0U) = vector.Z(); + result(1U, 2U) = -vector.X(); + result(2U, 0U) = -vector.Y(); + result(2U, 1U) = vector.X(); + return result; +} + +/// @brief Scales a small dense matrix without changing its shape. +Matrix Scale(const Matrix& matrix, const double scale) { + Matrix result{matrix.Rows(), matrix.Columns()}; + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t column = 0U; column < matrix.Columns(); ++column) { + result(row, column) = scale * matrix(row, column); + } + } + return result; +} + +/// @brief Adds matching small dense matrices. +Matrix Add(const Matrix& left, const Matrix& right) { + Matrix result{left.Rows(), left.Columns()}; + for (std::size_t row = 0U; row < left.Rows(); ++row) { + for (std::size_t column = 0U; column < left.Columns(); ++column) { + result(row, column) = left(row, column) + right(row, column); + } + } + return result; +} + +/// @brief Evaluates left-Jacobian coefficients and derivatives by theta +/// squared. +void LeftJacobianCoefficients(const double theta_squared, double& a, double& b, + double& da_dtheta_squared, + double& db_dtheta_squared) { + if (theta_squared < 1.0e-8) { + const double theta_fourth = theta_squared * theta_squared; + const double theta_sixth = theta_fourth * theta_squared; + a = 0.5 - theta_squared / 24.0 + theta_fourth / 720.0 - + theta_sixth / 40320.0; + b = 1.0 / 6.0 - theta_squared / 120.0 + theta_fourth / 5040.0 - + theta_sixth / 362880.0; + da_dtheta_squared = + -1.0 / 24.0 + theta_squared / 360.0 - theta_fourth / 13440.0; + db_dtheta_squared = + -1.0 / 120.0 + theta_squared / 2520.0 - theta_fourth / 120960.0; + return; + } + + const double theta = std::sqrt(theta_squared); + const double sine = std::sin(theta); + const double cosine = std::cos(theta); + a = (1.0 - cosine) / theta_squared; + b = (theta - sine) / (theta_squared * theta); + da_dtheta_squared = (theta * sine - 2.0 * (1.0 - cosine)) / + (2.0 * theta_squared * theta_squared); + db_dtheta_squared = + (1.0 - cosine) / (2.0 * theta_squared * theta_squared) - + 3.0 * (theta - sine) / (2.0 * theta_squared * theta_squared * theta); +} + +/// @brief Differentiates the SO(3) left Jacobian along one coordinate vector. +Matrix LeftJacobianDerivative(const Vector3& phi, const Vector3& direction) { + const Matrix skew = Skew(phi); + const Matrix direction_skew = Skew(direction); + const Matrix skew_squared = skew.Multiply(skew); + double a = 0.0; + double b = 0.0; + double da_dtheta_squared = 0.0; + double db_dtheta_squared = 0.0; + LeftJacobianCoefficients(phi.Dot(phi), a, b, da_dtheta_squared, + db_dtheta_squared); + const double derivative_scale = 2.0 * phi.Dot(direction); + return Add(Add(Scale(skew, derivative_scale * da_dtheta_squared), + Scale(direction_skew, a)), + Add(Scale(skew_squared, derivative_scale * db_dtheta_squared), + Scale(Add(direction_skew.Multiply(skew), + skew.Multiply(direction_skew)), + b))); +} + +/// @brief Projects the immutable source moment into current director tangent +/// space. +Vector3 ProjectMoment(const Vector3& director, const Vector3& source_moment) { + return source_moment - director.Dot(source_moment) * director; +} + +/// @brief Differentiates the projected moment along a coordinate direction. +Vector3 ProjectMomentDerivative(const Vector3& director, + const Vector3& director_derivative, + const Vector3& source_moment) { + return -director.Dot(source_moment) * director_derivative - + director_derivative.Dot(source_moment) * director; +} + +/// @brief Computes the infinity norm and reports finite input validity. +double InfinityNorm(const Vector& values, bool& is_finite) { + double result = 0.0; + for (std::size_t index = 0U; index < values.Size(); ++index) { + if (!std::isfinite(values[index])) { + is_finite = false; + return std::numeric_limits::quiet_NaN(); + } + result = (std::max)(result, std::abs(values[index])); + } + return result; +} + +/// @brief Evaluates one residual channel with its fixed physical zero-scale +/// unit. +NewtonChannelDecision EvaluateResidualChannel( + const NewtonResidualChannelInput& input, const NewtonChannelUnit unit) { + bool is_finite = input.free_residual.Size() == input.free_internal.Size() && + input.free_residual.Size() == input.free_external.Size(); + const double numerator = InfinityNorm(input.free_residual, is_finite); + const double internal = InfinityNorm(input.free_internal, is_finite); + const double external = InfinityNorm(input.free_external, is_finite); + if (!is_finite) { + return {input.identity, + numerator, + external, + NewtonConvergenceBranch::kZeroScale, + kNewtonZeroScaleThreshold, + unit, + false}; + } + if (external == 0.0) { + return {input.identity, + numerator, + external, + NewtonConvergenceBranch::kZeroScale, + kNewtonZeroScaleThreshold, + unit, + numerator <= kNewtonZeroScaleThreshold}; + } + const double denominator = (std::max)(internal, external); + return {input.identity, + numerator, + denominator, + NewtonConvergenceBranch::kRelative, + kNewtonRelativeThreshold, + NewtonChannelUnit::kDimensionless, + numerator / denominator <= kNewtonRelativeThreshold}; +} + +/// @brief Evaluates one correction channel with its fixed physical zero-scale +/// unit. +NewtonChannelDecision EvaluateCorrectionChannel( + const NewtonCorrectionChannelInput& input, const NewtonChannelUnit unit) { + bool is_finite = + input.fresh_correction.Size() == input.current_increment.Size(); + const double numerator = InfinityNorm(input.fresh_correction, is_finite); + const double denominator = InfinityNorm(input.current_increment, is_finite); + if (!is_finite) { + return {input.identity, + numerator, + denominator, + NewtonConvergenceBranch::kZeroScale, + kNewtonZeroScaleThreshold, + unit, + false}; + } + if (denominator == 0.0) { + return {input.identity, + numerator, + denominator, + NewtonConvergenceBranch::kZeroScale, + kNewtonZeroScaleThreshold, + unit, + numerator <= kNewtonZeroScaleThreshold}; + } + return {input.identity, + numerator, + denominator, + NewtonConvergenceBranch::kRelative, + kNewtonRelativeThreshold, + NewtonChannelUnit::kDimensionless, + numerator / denominator <= kNewtonRelativeThreshold}; +} + +} // namespace + +Result> BuildFixedLoadFactorSequence( + const StepDefinition& step) { + const Status control_status = ValidateNonlinearStaticControls(step); + if (!control_status.IsOk()) { + return Result>::Failure(control_status); + } + + std::vector increments; + std::uint32_t increment_index = 1U; + while (true) { + const double ordinal_factor = + static_cast(increment_index) * step.InitialIncrement(); + if (!std::isfinite(ordinal_factor)) { + return Result>::Failure(ControlFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + step.Location(), "STATIC", step.Name(), + "The fixed load-factor sequence must remain finite.")); + } + if (!(ordinal_factor < 1.0)) { + increments.push_back({increment_index, 1.0, true}); + break; + } + increments.push_back({increment_index, ordinal_factor, false}); + if (increment_index == (std::numeric_limits::max)()) { + return Result>::Failure(ControlFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + step.Location(), "STATIC", step.Name(), + "The fixed load-factor sequence exceeds the supported increment " + "identity range.")); + } + ++increment_index; + } + return Result>::Success( + std::move(increments)); +} + +Result ApplyAbsolutePrescribedDisplacementTarget( + const StepDefinition& step, const double load_factor) { + const Status control_status = ValidateNonlinearStaticControls(step); + if (!control_status.IsOk()) { + return Result::Failure(control_status); + } + if (!std::isfinite(load_factor) || load_factor < 0.0 || load_factor > 1.0) { + return Result::Failure(ControlFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + step.Location(), "BOUNDARY", step.Name(), + "The prescribed-displacement path requires a finite load factor in " + "the closed interval from zero to one.")); + } + + const auto& boundaries = step.PrescribedDisplacements(); + Vector targets{boundaries.Size()}; + for (std::size_t index = 0U; index < boundaries.Size(); ++index) { + const double target = boundaries[index].PrescribedValue(); + const double value = load_factor * target; + if (!std::isfinite(target) || !std::isfinite(value)) { + return Result::Failure(ControlFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + boundaries[index].Location(), "BOUNDARY", + boundaries[index].Target().target_name_or_label, + "The factor-one prescribed displacement target must remain finite.")); + } + targets[index] = value; + } + return Result::Success(std::move(targets)); +} + +Status CheckMomentAdmissibility(const Vector3& director, + const Vector3& source_moment) { + if (!source_moment.IsFinite()) { + return ControlFailure(FailureCategory::kModel, "nonfinite-newton-data", + {{}, 0U}, "CLOAD", "", + "The fixed-global source moment must be finite."); + } + if (source_moment == Vector3{}) { + return Status::Ok(); + } + if (!director.IsFinite() || !(director.Norm() > 0.0)) { + return ControlFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {{}, 0U}, "CLOAD", + "", "The current shell director must be finite and nonzero."); + } + const double source_norm = source_moment.Norm(); + const double rho = std::abs(director.Dot(source_moment)) / source_norm; + if (!std::isfinite(source_norm) || !(source_norm > 0.0) || + !std::isfinite(rho)) { + return ControlFailure( + FailureCategory::kModel, "nonfinite-newton-data", {{}, 0U}, "CLOAD", "", + "The fixed-global source moment norm must be finite."); + } + if (!(rho <= kMomentAdmissibilityThreshold)) { + return ControlFailure( + FailureCategory::kModel, "unsupported-drilling-load", {{}, 0U}, "CLOAD", + "", + "The aggregate nodal moment has an unsupported director-parallel " + "component."); + } + return Status::Ok(); +} + +Result AssembleGlobalFixedLoadContribution( + const Domain& domain, const DofManager& dofs, + const Vector& trial_generalized_coordinates, const double load_factor) { + if (!std::isfinite(load_factor) || load_factor < 0.0 || load_factor > 1.0 || + domain.Steps().Size() != 1U || !domain.Steps()[0U].IsNonlinearStatic()) { + return Result::Failure(ControlFailure( + FailureCategory::kModel, "invalid-nonlinear-static-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_CONTROL", + domain.SourceContentIdentity(), + "Fixed-load assembly requires one nonlinear step and a finite load " + "factor in the closed interval from zero to one.")); + } + const Status dof_status = dofs.ValidateInvariants(); + if (!dof_status.IsOk()) { + return Result::Failure(dof_status); + } + if (dofs.FullDofCount() != trial_generalized_coordinates.Size() || + domain.Nodes().size() > + (std::numeric_limits::max)() / kDofsPerNode || + dofs.FullDofCount() != domain.Nodes().size() * kDofsPerNode) { + return Result::Failure(ControlFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_CONTROL", + domain.SourceContentIdentity(), + "The full trial coordinates must match the stable Domain DOF " + "dimension.")); + } + for (std::size_t index = 0U; index < trial_generalized_coordinates.Size(); + ++index) { + if (!std::isfinite(trial_generalized_coordinates[index])) { + return Result::Failure(ControlFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_CONTROL", + std::to_string(index), + "The full trial coordinate vector must contain finite values.")); + } + } + + auto model = AnalysisModel::Create(domain); + if (!model.HasValue()) { + return Result::Failure(model.GetStatus()); + } + auto source_load = LoadAssembler::AssembleFullNodalLoad(model.Value(), dofs); + if (!source_load.HasValue()) { + return Result::Failure( + source_load.GetStatus()); + } + + Vector external_force{dofs.FullDofCount()}; + for (std::size_t index = 0U; index < external_force.Size(); ++index) { + external_force[index] = load_factor * source_load.Value()[index]; + } + + std::vector frames(domain.Nodes().size(), + nullptr); + for (const auto& frame : domain.ShellNodeInitialFrames()) { + if (frame.node_index >= frames.size() || + frames[frame.node_index] != nullptr) { + return Result::Failure(ControlFailure( + FailureCategory::kModel, "invalid-shell-director", + {domain.SourcePath(), 0U}, "NODE", std::to_string(frame.node_index), + "Shell nodal frames must provide one unique record per node.")); + } + frames[frame.node_index] = &frame; + } + + std::vector tangent_contributions; + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + const std::size_t first_rotation = + node * kDofsPerNode + kTranslationDofCount; + const Vector3 source_moment{source_load.Value()[first_rotation], + source_load.Value()[first_rotation + 1U], + source_load.Value()[first_rotation + 2U]}; + if (source_moment == Vector3{}) { + continue; + } + if (frames[node] == nullptr) { + return Result::Failure(ControlFailure( + FailureCategory::kModel, "invalid-shell-director", + domain.Nodes()[node].location, "NODE", + domain.Nodes()[node].source_id.source_label_text, + "A node carrying a moment requires an initial shell frame.")); + } + auto phi = RotationVectorForNode(trial_generalized_coordinates, node); + if (!phi.HasValue()) { + return Result::Failure(phi.GetStatus()); + } + auto rotation = + MakeFiniteRotationState(phi.Value(), InitialFrame(*frames[node])); + if (!rotation.HasValue()) { + return Result::Failure(rotation.GetStatus()); + } + const Status admissibility = + CheckMomentAdmissibility(rotation.Value().director, source_moment); + if (!admissibility.IsOk()) { + return Result::Failure(admissibility); + } + + const Matrix left_jacobian = LeftJacobianSO3(phi.Value()); + const Vector3 projected = + ProjectMoment(rotation.Value().director, source_moment); + const Vector3 rotational_force = + load_factor * MultiplyTranspose(left_jacobian, projected); + for (std::size_t row = 0U; row < kTranslationDofCount; ++row) { + external_force[first_rotation + row] = rotational_force[row]; + } + + for (std::size_t column = 0U; column < kTranslationDofCount; ++column) { + Vector3 direction{}; + if (column == 0U) { + direction = {1.0, 0.0, 0.0}; + } else if (column == 1U) { + direction = {0.0, 1.0, 0.0}; + } else { + direction = {0.0, 0.0, 1.0}; + } + const Matrix left_jacobian_derivative = + LeftJacobianDerivative(phi.Value(), direction); + const Vector3 director_derivative = + Multiply(left_jacobian, direction).Cross(rotation.Value().director); + const Vector3 projected_derivative = ProjectMomentDerivative( + rotation.Value().director, director_derivative, source_moment); + const Vector3 tangent_column = + load_factor * + (MultiplyTranspose(left_jacobian_derivative, projected) + + MultiplyTranspose(left_jacobian, projected_derivative)); + for (std::size_t row = 0U; row < kTranslationDofCount; ++row) { + tangent_contributions.push_back( + {first_rotation + row, first_rotation + column, tangent_column[row], + node, row * kTranslationDofCount + column}); + } + } + } + + auto tangent = SparseMatrix::FromCoo(dofs.FullDofCount(), dofs.FullDofCount(), + std::move(tangent_contributions), + dofs.GetSparsePattern()); + if (!tangent.HasValue()) { + return Result::Failure(tangent.GetStatus()); + } + return Result::Success( + {std::move(external_force), std::move(tangent.Value()), {}}); +} + +NewtonConvergenceResult EvaluateNewtonConvergence( + const NewtonConvergenceInput& input) { + NewtonConvergenceResult result{ + EvaluateResidualChannel(input.force_residual, NewtonChannelUnit::kForce), + EvaluateResidualChannel(input.moment_residual, + NewtonChannelUnit::kForceLength), + EvaluateCorrectionChannel(input.translation_correction, + NewtonChannelUnit::kLength), + EvaluateCorrectionChannel(input.rotation_correction, + NewtonChannelUnit::kDimensionless), + false}; + result.combined_passed = + result.force_residual.passed && result.moment_residual.passed && + result.translation_correction.passed && result.rotation_correction.passed; + return result; +} + +} // namespace fesa diff --git a/src/fesa/analysis/nonlinear_static_procedure.cpp b/src/fesa/analysis/nonlinear_static_procedure.cpp new file mode 100644 index 0000000..7663655 --- /dev/null +++ b/src/fesa/analysis/nonlinear_static_procedure.cpp @@ -0,0 +1,892 @@ +#include "fesa/analysis/nonlinear_static_procedure.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/analysis/newton_iteration_log.h" +#include "fesa/analysis/nonlinear_static_control.h" +#include "fesa/assembly/parallel_for.h" +#include "fesa/constraints/essential_constraint_policy.h" +#include "fesa/elements/finite_rotation.h" +#include "fesa/elements/mitc4_shell.h" +#include "fesa/elements/nonlinear_mitc4_shell.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/math/sparse_matrix.h" +#include "fesa/properties/shell_section.h" +#include "fesa/solvers/linear/tangent_solver.h" + +namespace fesa { +namespace { + +constexpr std::size_t kDofsPerNode = 6U; +constexpr std::size_t kTranslationsPerNode = 3U; +constexpr std::size_t kShellDofCount = 24U; +constexpr std::uint32_t kMaximumNewtonIterations = 100U; + +struct RuntimeShell { + EntityIndex element_index; + std::array scatter; + NonlinearMitc4Shell element; +}; + +struct InternalAssembly { + Vector force; + SparseMatrix tangent; + std::vector shell_rows; + double physical_strain_energy; +}; + +Status ProcedureFailure(const FailureCategory category, const std::string& code, + const SourceLocation& location, + const std::string& keyword, + const std::string& identity, + const std::string& message) { + return Status::Failure(category, {{Severity::kError, code, location, keyword, + identity, message}}); +} + +std::string DiagnosticCode(const Status& status) { + if (status.Diagnostics().empty()) { + return "nonlinear-procedure-failure"; + } + return status.Diagnostics().front().code; +} + +std::string DiagnosticReason(const Status& status) { + if (status.Diagnostics().empty()) { + return "The nonlinear procedure returned no diagnostic."; + } + return status.Diagnostics().front().message; +} + +NewtonChannelDecision UnevaluatedDecision(const std::string& identity, + const NewtonChannelUnit unit) { + return {identity, + 0.0, + 0.0, + NewtonConvergenceBranch::kZeroScale, + kNewtonZeroScaleThreshold, + unit, + false}; +} + +NewtonIterationLogRecord NewLogRecord(const StepDefinition& step, + const LoadFactorIncrement& increment, + const std::uint32_t iteration) { + return {step.Name(), + increment.increment_index, + increment.load_factor, + iteration, + NewtonIterationStage::kEntered, + {false, NewtonIterationStage::kEntered, {}, {}}, + "entered", + "pending", + {}, + UnevaluatedDecision("residual_force", NewtonChannelUnit::kForce), + UnevaluatedDecision("residual_moment", + NewtonChannelUnit::kForceLength), + UnevaluatedDecision("correction_translation", + NewtonChannelUnit::kLength), + UnevaluatedDecision("correction_rotation", + NewtonChannelUnit::kDimensionless), + false}; +} + +Status WriteAndFlush(NewtonIterationLogWriter& log, + const NewtonIterationLogRecord& record) { + const Status write_status = log.Write(record); + if (!write_status.IsOk()) { + return write_status; + } + return log.Flush(); +} + +Status RecordFailure(NewtonIterationLogWriter& log, + NewtonIterationLogRecord* record, const Status& failure, + const NewtonIterationStage stage) { + record->last_completed_stage = stage; + record->failure = {true, stage, DiagnosticCode(failure), + DiagnosticReason(failure)}; + record->transition = "failed"; + record->outcome = "failed"; + record->diagnostic_code = DiagnosticCode(failure); + const Status log_status = WriteAndFlush(log, *record); + return log_status.IsOk() ? failure : log_status; +} + +Matrix InitialFrame(const ShellNodeInitialFrame& frame) { + Matrix result{3U, 3U}; + for (std::size_t row = 0U; row < kTranslationsPerNode; ++row) { + result(row, 0U) = frame.tangent_a[row]; + result(row, 1U) = frame.tangent_b[row]; + result(row, 2U) = frame.director[row]; + } + return result; +} + +Result BuildDofManager(const Domain& domain) { + Result model = AnalysisModel::Create(domain); + if (!model.HasValue()) { + return Result::Failure(model.GetStatus()); + } + return DofManager::Create(model.Value()); +} + +Result BuildBaseline(const Domain& domain) { + if (domain.ShellNodeInitialFrames().size() != domain.Nodes().size()) { + return Result::Failure(ProcedureFailure( + FailureCategory::kModel, "invalid-nonlinear-state", + {domain.SourcePath(), 0U}, + "NODE", domain.SourceContentIdentity(), + "Nonlinear analysis requires one initial shell frame per node.")); + } + + NonlinearStateBaselineInput baseline; + baseline.node_baselines.reserve(domain.Nodes().size()); + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + const ShellNodeInitialFrame& frame = domain.ShellNodeInitialFrames()[node]; + if (frame.node_index != static_cast(node)) { + return Result::Failure(ProcedureFailure( + FailureCategory::kModel, "invalid-nonlinear-state", + domain.Nodes()[node].location, "NODE", + domain.Nodes()[node].source_id.source_label_text, + "Initial shell frames must follow stable Domain node order.")); + } + baseline.node_baselines.push_back( + {static_cast(node), domain.Nodes()[node].source_id, + {frame.tangent_a, frame.tangent_b, frame.director}, frame.director}); + } + return Result::Success(std::move(baseline)); +} + +Result> BuildRuntimeShells(const Domain& domain, + const DofManager& dofs) { + std::vector shells; + shells.reserve(domain.Elements().Size()); + for (std::size_t index = 0U; index < domain.Elements().Size(); ++index) { + const auto* definition = + dynamic_cast(&domain.Elements()[index]); + if (definition == nullptr) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kModel, "unsupported-nonlinear-element", + {}, "ELEMENT", + domain.Elements()[index].SourceId().source_label_text, + "The nonlinear static procedure supports MITC4 shell elements " + "only.")); + } + if (definition->section_index >= domain.Properties().Size() || + definition->material_index >= domain.Materials().Size()) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kModel, "invalid-nonlinear-static-data", + definition->location, "ELEMENT", + definition->source_id.source_label_text, + "The nonlinear shell element property or material index is " + "invalid.")); + } + + const auto* section = + dynamic_cast( + &domain.Properties()[definition->section_index]); + const auto* material = dynamic_cast( + &domain.Materials()[definition->material_index]); + if (section == nullptr || material == nullptr) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kModel, "incompatible-nonlinear-shell-property", + definition->location, "ELEMENT", + definition->source_id.source_label_text, + "A nonlinear MITC4 shell requires a shell section and linear " + "elastic material.")); + } + + std::array nodes{}; + std::array frames{}; + for (std::size_t node = 0U; node < definition->node_indices.size(); + ++node) { + const EntityIndex node_index = definition->node_indices[node]; + if (node_index >= domain.Nodes().size() || + node_index >= domain.ShellNodeInitialFrames().size()) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kModel, "invalid-shell-director", + definition->location, "ELEMENT", + definition->source_id.source_label_text, + "A nonlinear shell node does not have a stable initial frame.")); + } + nodes[node] = &domain.Nodes()[node_index]; + frames[node] = domain.ShellNodeInitialFrames()[node_index]; + if (frames[node].node_index != node_index) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kModel, "invalid-shell-director", + definition->location, "ELEMENT", + definition->source_id.source_label_text, + "A nonlinear shell initial frame does not match its node " + "identity.")); + } + } + + Result shell = + NonlinearMitc4Shell::Create(nodes, frames, *section, *material); + if (!shell.HasValue()) { + return Result>::Failure(shell.GetStatus()); + } + const EntityIndex element_index = static_cast(index); + shells.push_back( + {element_index, dofs.ShellElementScatter(element_index), + std::move(shell.Value())}); + } + return Result>::Success(std::move(shells)); +} + +Status PopulateNodalKinematics(const Domain& domain, + NonlinearTrialState* trial) { + if (trial->generalized_coordinates.Size() != + domain.Nodes().size() * kDofsPerNode) { + return ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, + "NONLINEAR_STATIC_PROCEDURE", domain.SourceContentIdentity(), + "Nonlinear trial coordinates do not match the Domain node inventory."); + } + + trial->displacement = trial->generalized_coordinates; + trial->rotation_vector = Vector{trial->generalized_coordinates.Size()}; + trial->nodal_triad.clear(); + trial->nodal_director.clear(); + trial->nodal_triad.reserve(domain.Nodes().size()); + trial->nodal_director.reserve(domain.Nodes().size()); + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + const std::size_t first = node * kDofsPerNode; + const Vector3 phi{trial->generalized_coordinates[first + 3U], + trial->generalized_coordinates[first + 4U], + trial->generalized_coordinates[first + 5U]}; + Result rotation = MakeFiniteRotationState( + phi, InitialFrame(domain.ShellNodeInitialFrames()[node])); + if (!rotation.HasValue()) { + return rotation.GetStatus(); + } + for (std::size_t component = 0U; component < kTranslationsPerNode; + ++component) { + trial->rotation_vector[first + 3U + component] = phi[component]; + } + const Matrix& q = rotation.Value().q; + trial->nodal_triad.push_back( + {{{q(0U, 0U), q(1U, 0U), q(2U, 0U)}, + {q(0U, 1U), q(1U, 1U), q(2U, 1U)}, + {q(0U, 2U), q(1U, 2U), q(2U, 2U)}}}); + trial->nodal_director.push_back(rotation.Value().director.Components()); + } + return Status::Ok(); +} + +NonlinearMitc4TrialDofs ExtractElementTrial( + const RuntimeShell& shell, const Vector& coordinates) { + NonlinearMitc4TrialDofs trial{}; + for (std::size_t node = 0U; node < 4U; ++node) { + const std::size_t first = node * kDofsPerNode; + trial.displacement[node] = + {coordinates[shell.scatter[first]], + coordinates[shell.scatter[first + 1U]], + coordinates[shell.scatter[first + 2U]]}; + trial.rotation_vector[node] = + {coordinates[shell.scatter[first + 3U]], + coordinates[shell.scatter[first + 4U]], + coordinates[shell.scatter[first + 5U]]}; + } + return trial; +} + +bool IsFinite(const Vector& values) { + for (std::size_t index = 0U; index < values.Size(); ++index) { + if (!std::isfinite(values[index])) { + return false; + } + } + return true; +} + +bool IsFinite(const Matrix& values) { + for (std::size_t row = 0U; row < values.Rows(); ++row) { + for (std::size_t column = 0U; column < values.Columns(); ++column) { + if (!std::isfinite(values(row, column))) { + return false; + } + } + } + return true; +} + +Result AssembleInternal( + const std::vector& shells, const DofManager& dofs, + const Vector& coordinates, const ParallelFor& parallel_for) { + std::vector> local( + shells.size()); + std::vector> failures(shells.size()); + parallel_for.Execute(shells.size(), [&](const std::size_t index) { + Result result = + EvaluateInternalResidualAndTangent(shells[index].element, + ExtractElementTrial(shells[index], + coordinates)); + if (!result.HasValue()) { + failures[index] = result.GetStatus(); + return; + } + local[index] = std::move(result.Value()); + }); + + Vector force{dofs.FullDofCount()}; + std::vector contributions; + contributions.reserve(shells.size() * kShellDofCount * kShellDofCount); + std::vector rows; + rows.reserve(shells.size() * 4U); + double energy = 0.0; + for (std::size_t index = 0U; index < shells.size(); ++index) { + if (failures[index].has_value()) { + return Result::Failure(*failures[index]); + } + if (!local[index].has_value() || + !IsFinite(local[index]->internal_residual) || + !IsFinite(local[index]->internal_tangent) || + !std::isfinite(local[index]->physical_strain_energy)) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", std::to_string(index), + "A nonlinear shell internal residual or tangent is nonfinite.")); + } + for (std::size_t row = 0U; row < kShellDofCount; ++row) { + force[shells[index].scatter[row]] += local[index]->internal_residual[row]; + for (std::size_t column = 0U; column < kShellDofCount; ++column) { + contributions.push_back( + {shells[index].scatter[row], shells[index].scatter[column], + local[index]->internal_tangent(row, column), index, + row * kShellDofCount + column}); + } + } + for (const NonlinearMitc4RecoveryPoint& point : + local[index]->recovery.gauss_points) { + rows.push_back({shells[index].element_index, + point.location, + point.natural_coordinates, + {point.local_frame.e1, point.local_frame.e2, + point.local_frame.e3}, + point.generalized_strain, + point.section_resultant, + point.stress}); + } + energy += local[index]->physical_strain_energy; + } + if (!IsFinite(force) || !std::isfinite(energy)) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", {}, + "Global nonlinear internal force or energy is nonfinite.")); + } + + Result tangent = SparseMatrix::FromCoo( + dofs.FullDofCount(), dofs.FullDofCount(), std::move(contributions), + dofs.GetSparsePattern()); + if (!tangent.HasValue()) { + return Result::Failure(tangent.GetStatus()); + } + return Result::Success( + {std::move(force), std::move(tangent.Value()), std::move(rows), energy}); +} + +Result Difference(const Vector& left, const Vector& right) { + if (left.Size() != right.Size()) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", {}, + "Nonlinear internal and external vectors must have equal dimensions.")); + } + Vector result{left.Size()}; + for (std::size_t index = 0U; index < result.Size(); ++index) { + result[index] = left[index] - right[index]; + } + if (!IsFinite(result)) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", {}, + "Nonlinear residual must remain finite.")); + } + return Result::Success(std::move(result)); +} + +Result Difference(const SparseMatrix& internal, + const SparseMatrix& external, + const DofManager& dofs) { + if (internal.Rows() != external.Rows() || + internal.Columns() != external.Columns() || + internal.RowOffsets() != external.RowOffsets() || + internal.ColumnIndices() != external.ColumnIndices()) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", {}, + "Nonlinear internal and external tangent patterns must match.")); + } + std::vector contributions; + contributions.reserve(internal.Values().size()); + for (std::size_t row = 0U; row < internal.Rows(); ++row) { + for (std::size_t offset = internal.RowOffsets()[row]; + offset < internal.RowOffsets()[row + 1U]; ++offset) { + const double value = + internal.Values()[offset] - external.Values()[offset]; + if (!std::isfinite(value)) { + return Result::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", {}, + "Nonlinear tangent must remain finite.")); + } + contributions.push_back( + {row, internal.ColumnIndices()[offset], value, row, offset}); + } + } + return SparseMatrix::FromCoo(internal.Rows(), internal.Columns(), + std::move(contributions), + dofs.GetSparsePattern()); +} + +Vector SelectFreeComponents(const Vector& full, const DofManager& dofs, + const bool rotations) { + std::size_t count = 0U; + for (const std::size_t full_dof : dofs.FreeDofs()) { + if ((full_dof % kDofsPerNode >= kTranslationsPerNode) == rotations) { + ++count; + } + } + Vector selected{count}; + std::size_t output = 0U; + for (const std::size_t full_dof : dofs.FreeDofs()) { + if ((full_dof % kDofsPerNode >= kTranslationsPerNode) == rotations) { + selected[output++] = full[full_dof]; + } + } + return selected; +} + +Vector SelectCorrectionComponents(const Vector& correction, + const DofManager& dofs, + const bool rotations) { + std::size_t count = 0U; + for (const std::size_t full_dof : dofs.FreeDofs()) { + if ((full_dof % kDofsPerNode >= kTranslationsPerNode) == rotations) { + ++count; + } + } + Vector selected{count}; + std::size_t output = 0U; + for (std::size_t equation = 0U; equation < dofs.FreeDofs().size(); + ++equation) { + if ((dofs.FreeDofs()[equation] % kDofsPerNode >= + kTranslationsPerNode) == rotations) { + selected[output++] = correction[equation]; + } + } + return selected; +} + +Vector CurrentIncrementComponents(const Vector& current, const Vector& start, + const DofManager& dofs, + const bool rotations) { + Vector difference{current.Size()}; + for (std::size_t index = 0U; index < difference.Size(); ++index) { + difference[index] = current[index] - start[index]; + } + return SelectFreeComponents(difference, dofs, rotations); +} + +Vector3 SpatialMoment(const Matrix& transform, + const std::array& generalized) { + return {transform(0U, 0U) * generalized[0U] + + transform(0U, 1U) * generalized[1U] + + transform(0U, 2U) * generalized[2U], + transform(1U, 0U) * generalized[0U] + + transform(1U, 1U) * generalized[1U] + + transform(1U, 2U) * generalized[2U], + transform(2U, 0U) * generalized[0U] + + transform(2U, 1U) * generalized[1U] + + transform(2U, 2U) * generalized[2U]}; +} + +/// @brief Computes accepted-state applied-plus-reaction balance evidence. +Result> GlobalEquilibrium( + const Domain& domain, const DofManager& dofs, + const NonlinearTrialState& trial) { + const std::size_t full_dof_count = domain.Nodes().size() * kDofsPerNode; + if (trial.displacement.Size() != full_dof_count || + trial.rotation_vector.Size() != full_dof_count || + trial.external_force.Size() != full_dof_count || + trial.residual.Size() != full_dof_count) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_PROCEDURE", + domain.SourceContentIdentity(), + "Nonlinear equilibrium vectors do not match the Domain node inventory.")); + } + + std::vector constrained(full_dof_count, false); + for (const std::size_t full_dof : dofs.ConstrainedDofs()) { + if (full_dof >= constrained.size()) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_PROCEDURE", + domain.SourceContentIdentity(), + "Nonlinear constraint identity is outside the full DOF range.")); + } + constrained[full_dof] = true; + } + + Vector3 applied_force_resultant; + Vector3 applied_moment_resultant; + Vector3 reaction_force_resultant; + Vector3 reaction_moment_resultant; + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + const std::size_t first = node * kDofsPerNode; + const Vector3 position = Vector3{domain.Nodes()[node].coordinates} + + Vector3{trial.displacement[first], + trial.displacement[first + 1U], + trial.displacement[first + 2U]}; + const Vector3 phi{trial.rotation_vector[first + 3U], + trial.rotation_vector[first + 4U], + trial.rotation_vector[first + 5U]}; + const Vector3 applied_force{trial.external_force[first], + trial.external_force[first + 1U], + trial.external_force[first + 2U]}; + const Vector3 reaction_force{ + constrained[first] ? trial.residual[first] : 0.0, + constrained[first + 1U] ? trial.residual[first + 1U] : 0.0, + constrained[first + 2U] ? trial.residual[first + 2U] : 0.0}; + const Matrix transform = InverseTransposeLeftJacobianSO3(phi); + const std::array applied_generalized{ + trial.external_force[first + 3U], trial.external_force[first + 4U], + trial.external_force[first + 5U]}; + const std::array reaction_generalized{ + constrained[first + 3U] ? trial.residual[first + 3U] : 0.0, + constrained[first + 4U] ? trial.residual[first + 4U] : 0.0, + constrained[first + 5U] ? trial.residual[first + 5U] : 0.0}; + const Vector3 applied_moment = SpatialMoment(transform, applied_generalized); + const Vector3 reaction_moment = + SpatialMoment(transform, reaction_generalized); + applied_force_resultant = applied_force_resultant + applied_force; + applied_moment_resultant = + applied_moment_resultant + position.Cross(applied_force) + applied_moment; + reaction_force_resultant = reaction_force_resultant + reaction_force; + reaction_moment_resultant = reaction_moment_resultant + + position.Cross(reaction_force) + reaction_moment; + } + const Vector3 force_balance = + applied_force_resultant + reaction_force_resultant; + const Vector3 moment_balance = + applied_moment_resultant + reaction_moment_resultant; + const std::array equilibrium{ + force_balance.X(), force_balance.Y(), force_balance.Z(), + moment_balance.X(), moment_balance.Y(), moment_balance.Z()}; + if (!std::all_of(equilibrium.begin(), equilibrium.end(), + [](const double value) { return std::isfinite(value); })) { + return Result>::Failure(ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", + {domain.SourcePath(), 0U}, "NONLINEAR_STATIC_PROCEDURE", + domain.SourceContentIdentity(), + "Nonlinear global equilibrium balance is nonfinite.")); + } + return Result>::Success(equilibrium); +} + +Status ApplyIncrementConstraints(const StepDefinition& step, + const LoadFactorIncrement& increment, + const DofManager& dofs, + NonlinearTrialState* trial) { + Result source_targets = + ApplyAbsolutePrescribedDisplacementTarget(step, increment.load_factor); + if (!source_targets.HasValue()) { + return source_targets.GetStatus(); + } + for (std::size_t index = 0U; index < dofs.ConstrainedDofs().size(); + ++index) { + const double target = + increment.load_factor * dofs.PrescribedValues()[index]; + if (!std::isfinite(target)) { + return ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", step.Location(), + "BOUNDARY", step.Name(), + "A nonlinear prescribed displacement target is nonfinite."); + } + trial->generalized_coordinates[dofs.ConstrainedDofs()[index]] = target; + } + return Status::Ok(); +} + +AcceptedFrameState AcceptedFrame(const NonlinearAnalysisState& state, + const NonlinearTrialState& trial, + const LoadFactorIncrement& increment, + const std::uint32_t iteration) { + return {static_cast(state.AcceptedFrames().size()), + increment.increment_index, + increment.load_factor, + iteration, + increment.is_factor_one, + trial.nodal_internal_order, + trial.nodal_source_ids, + trial.generalized_coordinates, + trial.displacement, + trial.rotation_vector, + trial.nodal_triad, + trial.nodal_director, + trial.internal_force, + trial.external_force, + trial.residual, + trial.reaction, + trial.shell_results, + trial.physical_strain_energy, + trial.global_equilibrium}; +} + +} // namespace + +NonlinearStaticProcedureExecutor::NonlinearStaticProcedureExecutor( + const ParallelFor& parallel_for, TangentSolver& tangent_solver) + : parallel_for_(parallel_for), tangent_solver_(tangent_solver) {} + +Result +NonlinearStaticProcedureExecutor::Execute( + const Domain& domain, NewtonIterationLogWriter& log) const { + if (domain.Steps().Size() != 1U || !domain.Steps()[0U].IsNonlinearStatic()) { + return Result::Failure(ProcedureFailure( + FailureCategory::kInput, "invalid-nonlinear-static-data", + {domain.SourcePath(), 0U}, "STATIC", domain.SourceContentIdentity(), + "Nonlinear procedure execution requires exactly one NLGEOM static " + "step.")); + } + const StepDefinition& step = domain.Steps()[0U]; + + Result dofs = BuildDofManager(domain); + if (!dofs.HasValue()) { + return Result::Failure(dofs.GetStatus()); + } + Result baseline = BuildBaseline(domain); + if (!baseline.HasValue()) { + return Result::Failure( + baseline.GetStatus()); + } + Result state = + NonlinearAnalysisState::Create(domain, dofs.Value(), baseline.Value()); + if (!state.HasValue()) { + return Result::Failure(state.GetStatus()); + } + Result> shells = + BuildRuntimeShells(domain, dofs.Value()); + if (!shells.HasValue()) { + return Result::Failure(shells.GetStatus()); + } + Result> increments = + BuildFixedLoadFactorSequence(step); + if (!increments.HasValue()) { + return Result::Failure( + increments.GetStatus()); + } + + const EssentialConstraintPolicy constraints; + for (const LoadFactorIncrement& increment : increments.Value()) { + Result trial = state.Value().BeginTrialFromCommitted(); + if (!trial.HasValue()) { + return Result::Failure(trial.GetStatus()); + } + const Vector increment_start = trial.Value().generalized_coordinates; + Status constraint_status = + ApplyIncrementConstraints(step, increment, dofs.Value(), + &trial.Value()); + if (!constraint_status.IsOk()) { + return Result::Failure(constraint_status); + } + + for (std::uint32_t iteration = 1U; iteration <= kMaximumNewtonIterations; + ++iteration) { + NewtonIterationLogRecord record = + NewLogRecord(step, increment, iteration); + trial.Value().increment_index = increment.increment_index; + trial.Value().load_factor = increment.load_factor; + trial.Value().is_factor_zero_baseline = false; + + Status kinematics = PopulateNodalKinematics(domain, &trial.Value()); + if (!kinematics.IsOk()) { + return Result::Failure( + RecordFailure(log, &record, kinematics, + NewtonIterationStage::kKinematicsEvaluated)); + } + record.last_completed_stage = NewtonIterationStage::kKinematicsEvaluated; + + Result internal = AssembleInternal( + shells.Value(), dofs.Value(), trial.Value().generalized_coordinates, + parallel_for_); + if (!internal.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, internal.GetStatus(), + NewtonIterationStage::kInternalAssembled)); + } + record.last_completed_stage = NewtonIterationStage::kInternalAssembled; + + Result external = + AssembleGlobalFixedLoadContribution( + domain, dofs.Value(), trial.Value().generalized_coordinates, + increment.load_factor); + if (!external.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, external.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + record.last_completed_stage = NewtonIterationStage::kExternalAssembled; + + Result residual = + Difference(internal.Value().force, + external.Value().generalized_external_force); + if (!residual.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, residual.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + Result tangent = + Difference(internal.Value().tangent, + external.Value().generalized_external_tangent, + dofs.Value()); + if (!tangent.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, tangent.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + trial.Value().internal_force = std::move(internal.Value().force); + trial.Value().external_force = + std::move(external.Value().generalized_external_force); + trial.Value().residual = std::move(residual.Value()); + trial.Value().reaction = trial.Value().residual; + trial.Value().shell_results = std::move(internal.Value().shell_rows); + trial.Value().physical_strain_energy = + internal.Value().physical_strain_energy; + Result> global_equilibrium = + GlobalEquilibrium(domain, dofs.Value(), trial.Value()); + if (!global_equilibrium.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, global_equilibrium.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + trial.Value().global_equilibrium = global_equilibrium.Value(); + + Result partition = + constraints.Partition(tangent.Value(), dofs.Value()); + if (!partition.HasValue()) { + return Result::Failure(RecordFailure( + log, &record, partition.GetStatus(), + NewtonIterationStage::kExternalAssembled)); + } + const Status factorization = tangent_solver_.FactorizeFresh( + partition.Value().k_ff); + if (!factorization.IsOk()) { + return Result::Failure(RecordFailure( + log, &record, factorization, + NewtonIterationStage::kSolvedCorrection)); + } + + Vector correction_rhs = constraints.GatherFree(trial.Value().residual, + dofs.Value()); + for (std::size_t index = 0U; index < correction_rhs.Size(); ++index) { + correction_rhs[index] = -correction_rhs[index]; + } + Vector correction{dofs.Value().FreeDofCount()}; + const Status solve = + tangent_solver_.SolveCorrection(correction_rhs, correction); + if (!solve.IsOk()) { + return Result::Failure(RecordFailure( + log, &record, solve, NewtonIterationStage::kSolvedCorrection)); + } + record.last_completed_stage = NewtonIterationStage::kSolvedCorrection; + + const NewtonConvergenceResult convergence = EvaluateNewtonConvergence({ + {"residual_force", SelectFreeComponents(trial.Value().residual, + dofs.Value(), false), + SelectFreeComponents(trial.Value().internal_force, dofs.Value(), + false), + SelectFreeComponents(trial.Value().external_force, dofs.Value(), + false)}, + {"residual_moment", SelectFreeComponents(trial.Value().residual, + dofs.Value(), true), + SelectFreeComponents(trial.Value().internal_force, dofs.Value(), + true), + SelectFreeComponents(trial.Value().external_force, dofs.Value(), + true)}, + {"correction_translation", + SelectCorrectionComponents(correction, dofs.Value(), false), + CurrentIncrementComponents(trial.Value().generalized_coordinates, + increment_start, dofs.Value(), false)}, + {"correction_rotation", + SelectCorrectionComponents(correction, dofs.Value(), true), + CurrentIncrementComponents(trial.Value().generalized_coordinates, + increment_start, dofs.Value(), true)}}); + record.force_residual = convergence.force_residual; + record.moment_residual = convergence.moment_residual; + record.translation_correction = convergence.translation_correction; + record.rotation_correction = convergence.rotation_correction; + record.combined_passed = convergence.combined_passed; + record.last_completed_stage = NewtonIterationStage::kConvergenceEvaluated; + + if (convergence.combined_passed) { + const Status committed = state.Value().CommitAcceptedFrame( + AcceptedFrame(state.Value(), trial.Value(), increment, iteration)); + if (!committed.IsOk()) { + return Result::Failure(RecordFailure( + log, &record, committed, NewtonIterationStage::kAccepted)); + } + record.last_completed_stage = NewtonIterationStage::kAccepted; + record.transition = "accepted"; + record.outcome = "accepted"; + const Status log_status = WriteAndFlush(log, record); + if (!log_status.IsOk()) { + return Result::Failure(log_status); + } + break; + } + + if (iteration == kMaximumNewtonIterations) { + const Status failure = ProcedureFailure( + FailureCategory::kSolver, "nonlinear-nonconvergence", + step.Location(), "STATIC", step.Name(), + "The nonlinear procedure did not converge within 100 iterations."); + return Result::Failure(RecordFailure( + log, &record, failure, + NewtonIterationStage::kConvergenceEvaluated)); + } + + for (std::size_t equation = 0U; equation < dofs.Value().FreeDofs().size(); + ++equation) { + const std::size_t full_dof = dofs.Value().FreeDofs()[equation]; + trial.Value().generalized_coordinates[full_dof] += correction[equation]; + if (!std::isfinite(trial.Value().generalized_coordinates[full_dof])) { + const Status failure = ProcedureFailure( + FailureCategory::kSolver, "nonfinite-newton-data", {}, + "NONLINEAR_STATIC_PROCEDURE", std::to_string(full_dof), + "A nonlinear free-coordinate correction is nonfinite."); + return Result::Failure(RecordFailure( + log, &record, failure, NewtonIterationStage::kSolvedCorrection)); + } + } + record.transition = "continue"; + record.outcome = "not-converged"; + const Status log_status = WriteAndFlush(log, record); + if (!log_status.IsOk()) { + return Result::Failure(log_status); + } + } + } + + std::vector diagnostics = domain.Warnings(); + SortDiagnostics(diagnostics); + return Result::Success( + {std::move(state.Value()), std::move(diagnostics)}); +} + +} // namespace fesa diff --git a/src/fesa/analysis/prepared_analysis.cpp b/src/fesa/analysis/prepared_analysis.cpp new file mode 100644 index 0000000..ce2042d --- /dev/null +++ b/src/fesa/analysis/prepared_analysis.cpp @@ -0,0 +1,79 @@ +#include "fesa/analysis/prepared_analysis.h" + +#include + +#include "fesa/analysis/linear_static_procedure.h" +#include "fesa/analysis/newton_iteration_log.h" +#include "fesa/analysis/nonlinear_static_procedure.h" +#include "fesa/app/output_paths.h" +#include "fesa/io/abaqus/domain_mapper.h" +#include "fesa/io/abaqus/input_reader.h" +#include "fesa/results/nonlinear_results_writer.h" +#include "fesa/results/results_writer.h" + +namespace fesa { + +Result PrepareAnalysisInput( + const std::filesystem::path& input_path) { + const Result syntax = AbaqusInputReader{}.Read(input_path); + if (!syntax.HasValue()) { + return Result::Failure(syntax.GetStatus()); + } + + Result mapped = AbaqusDomainMapper{}.Map(syntax.Value()); + if (!mapped.HasValue()) { + return Result::Failure(mapped.GetStatus()); + } + + PreparedAnalysisInput prepared{std::move(mapped.Value()), {}}; + prepared.diagnostics = prepared.domain.Warnings(); + SortDiagnostics(prepared.diagnostics); + return Result::Success(std::move(prepared)); +} + +Result ExecutePreparedAnalysis( + const Domain& domain, LinearStaticProcedureExecutor& linear_executor, + NonlinearStaticProcedureExecutor& nonlinear_executor, + NewtonIterationLogWriter& log) { + if (domain.Steps().Size() != 1U) { + return Result::Failure(Status::Failure( + FailureCategory::kInput, + {{Severity::kError, "invalid-analysis-step-count", {}, "*STEP", {}, + "Prepared analysis requires exactly one static step."}})); + } + + if (domain.Steps()[0U].IsNonlinearStatic()) { + Result nonlinear = + nonlinear_executor.Execute(domain, log); + if (!nonlinear.HasValue()) { + return Result::Failure(nonlinear.GetStatus()); + } + return Result::Success( + PreparedAnalysisOutcome{std::move(nonlinear.Value())}); + } + + Result linear = linear_executor.Execute(domain); + if (!linear.HasValue()) { + return Result::Failure(linear.GetStatus()); + } + return Result::Success( + PreparedAnalysisOutcome{std::move(linear.Value())}); +} + +Status FinalizePreparedAnalysisResult( + const DerivedOutputPaths& paths, const Domain& domain, + const PreparedAnalysisOutcome& outcome, + const std::vector& diagnostics, ResultsWriter& linear_writer, + NonlinearResultsWriter& nonlinear_writer) { + if (std::holds_alternative(outcome)) { + return linear_writer.Write( + paths.results_path, domain, + std::get(outcome).state, diagnostics); + } + + return nonlinear_writer.Write( + paths.results_path, domain, + std::get(outcome).state, diagnostics); +} + +} // namespace fesa diff --git a/src/fesa/app/fesa_application.cpp b/src/fesa/app/fesa_application.cpp index 72a3950..5ac723b 100644 --- a/src/fesa/app/fesa_application.cpp +++ b/src/fesa/app/fesa_application.cpp @@ -2,16 +2,20 @@ #include #include -#include #include #include -#include "fesa/analysis/analysis.h" -#include "fesa/analysis/linear_static_analysis.h" +#include "fesa/analysis/linear_static_procedure.h" +#include "fesa/analysis/newton_iteration_log.h" +#include "fesa/analysis/nonlinear_static_procedure.h" +#include "fesa/analysis/prepared_analysis.h" +#include "fesa/app/output_paths.h" #include "fesa/assembly/parallel_for.h" #include "fesa/core/diagnostic.h" #include "fesa/io/hdf5/hdf5_results_writer.h" +#include "fesa/io/hdf5/nonlinear_hdf5_results_writer.h" #include "fesa/solvers/linear/mkl_pardiso_solver.h" +#include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" namespace fesa { namespace { @@ -23,19 +27,6 @@ constexpr int kModelExitCode = 4; constexpr int kSolverExitCode = 5; constexpr int kOutputExitCode = 6; -bool StartsWithOption(const std::string& argument) { - return !argument.empty() && argument.front() == '-'; -} - -Diagnostic UsageDiagnostic() { - return {Severity::kError, - "cli-usage", - {{}, 0U}, - "", - "", - "Usage: fesa.exe [--output ]."}; -} - const char* SeverityName(const Severity severity) { return severity == Severity::kWarning ? "warning" : "error"; } @@ -72,30 +63,66 @@ int ExitCodeFor(const Status& status) { } // namespace int FesaApplication::Run(const std::vector& arguments) { - const bool default_output_form = arguments.size() == 1U && - !arguments[0U].empty() && - !StartsWithOption(arguments[0U]); - const bool explicit_output_form = - arguments.size() == 3U && !arguments[0U].empty() && - !StartsWithOption(arguments[0U]) && arguments[1U] == "--output" && - !arguments[2U].empty() && !StartsWithOption(arguments[2U]); - if (!default_output_form && !explicit_output_form) { - WriteDiagnostics({UsageDiagnostic()}); + const auto paths = DeriveSingleInputOutputPaths( + arguments, std::filesystem::current_path()); + if (!paths.HasValue()) { + WriteDiagnostics(paths.GetStatus().Diagnostics()); return kUsageExitCode; } - AnalysisRequest request; - request.input_path = arguments[0U]; - request.output_path = explicit_output_form - ? std::filesystem::path{arguments[2U]} - : std::filesystem::current_path() / "results.h5"; + auto lease = AcquireOutputWriteLease(paths.Value()); + if (!lease.HasValue()) { + WriteDiagnostics(lease.GetStatus().Diagnostics()); + return kOutputExitCode; + } TbbParallelFor parallel_for; MklPardisoSolver linear_solver; - Hdf5ResultsWriter results_writer; - std::unique_ptr analysis = std::make_unique( - parallel_for, linear_solver, results_writer); - const Status status = analysis->Run(request); + MklPardisoTangentSolver tangent_solver; + Hdf5ResultsWriter linear_writer; + NonlinearHdf5ResultsWriter nonlinear_writer; + NewtonIterationLogWriter log; + + Status status = log.Open(paths.Value().log_path); + if (!status.IsOk()) { + WriteDiagnostics(status.Diagnostics()); + return ExitCodeFor(status); + } + + Result prepared = + PrepareAnalysisInput(paths.Value().input_path); + if (!prepared.HasValue()) { + status = prepared.GetStatus(); + } else { + LinearStaticProcedureExecutor linear_executor(parallel_for, linear_solver); + NonlinearStaticProcedureExecutor nonlinear_executor(parallel_for, + tangent_solver); + Result outcome = ExecutePreparedAnalysis( + prepared.Value().domain, linear_executor, nonlinear_executor, log); + if (!outcome.HasValue()) { + status = outcome.GetStatus(); + } else { + const Status close_status = log.Close(); + if (!close_status.IsOk()) { + WriteDiagnostics(close_status.Diagnostics()); + return ExitCodeFor(close_status); + } + status = FinalizePreparedAnalysisResult( + paths.Value(), prepared.Value().domain, outcome.Value(), + prepared.Value().diagnostics, linear_writer, nonlinear_writer); + if (status.IsOk()) { + return kSuccessExitCode; + } + WriteDiagnostics(status.Diagnostics()); + return ExitCodeFor(status); + } + } + + const Status close_status = log.Close(); + if (!close_status.IsOk()) { + WriteDiagnostics(close_status.Diagnostics()); + return ExitCodeFor(close_status); + } if (status.IsOk()) { return kSuccessExitCode; } diff --git a/src/fesa/app/output_paths.cpp b/src/fesa/app/output_paths.cpp new file mode 100644 index 0000000..2a2388c --- /dev/null +++ b/src/fesa/app/output_paths.cpp @@ -0,0 +1,127 @@ +#include "fesa/app/output_paths.h" + +#include +#include +#include +#include + +#include + +#include "fesa/core/ascii.h" + +namespace fesa { +namespace { + +Status UsageFailure(const std::string& identity, const std::string& message) { + return Status::Failure( + FailureCategory::kInput, + {{Severity::kError, "cli-usage", {{}, 0U}, "", identity, message}}); +} + +Status OutputBusyFailure(const std::filesystem::path& results_path) { + return Status::Failure( + FailureCategory::kOutput, + {{Severity::kError, + "output-busy", + {{}, 0U}, + "", + results_path.generic_u8string(), + "The derived output pair is already owned by another invocation."}}); +} + +bool StartsWithOption(const std::string& argument) { + return !argument.empty() && argument.front() == '-'; +} + +std::string ArgumentIdentity(const std::size_t argument_index, + const std::string& argument) { + return "argument_index=" + std::to_string(argument_index) + + ";argument=" + argument; +} + +std::filesystem::path LockPathFor(const DerivedOutputPaths& paths) { + std::filesystem::path lock_path = paths.results_path; + lock_path += ".fesa.lock"; + return lock_path; +} + +} // namespace + +class OutputWriteLease::Impl { + public: + explicit Impl(const HANDLE handle) noexcept : handle_{handle} {} + + Impl(const Impl&) = delete; + Impl& operator=(const Impl&) = delete; + + ~Impl() { + if (handle_ != INVALID_HANDLE_VALUE) { + (void)CloseHandle(handle_); + } + } + + private: + HANDLE handle_{INVALID_HANDLE_VALUE}; +}; + +OutputWriteLease::OutputWriteLease(std::unique_ptr impl) noexcept + : impl_{std::move(impl)} {} + +OutputWriteLease::OutputWriteLease(OutputWriteLease&&) noexcept = default; + +OutputWriteLease& OutputWriteLease::operator=(OutputWriteLease&&) noexcept = + default; + +OutputWriteLease::~OutputWriteLease() = default; + +Result DeriveSingleInputOutputPaths( + const std::vector& arguments, + const std::filesystem::path& invocation_cwd) { + for (std::size_t index = 0U; index < arguments.size(); ++index) { + if (arguments[index].find("--output") != std::string::npos) { + return Result::Failure(UsageFailure( + ArgumentIdentity(index, arguments[index]), + "The --output option is not supported.")); + } + } + + if (arguments.size() != 1U || arguments.front().empty() || + StartsWithOption(arguments.front())) { + return Result::Failure( + UsageFailure("", "Usage: fesa.exe .")); + } + + std::filesystem::path input_path{arguments.front()}; + if (input_path.is_relative()) { + input_path = invocation_cwd / input_path; + } + input_path = input_path.lexically_normal(); + if (!AsciiCaseInsensitiveEquals(input_path.extension().string(), ".inp")) { + return Result::Failure( + UsageFailure(input_path.generic_u8string(), + "The input path must end in .inp.")); + } + + const std::filesystem::path stem = input_path.stem(); + const std::filesystem::path output_directory = input_path.parent_path(); + return Result::Success( + {input_path, output_directory / (stem.string() + "_results.h5"), + output_directory / (stem.string() + "_log.txt")}); +} + +Result AcquireOutputWriteLease( + const DerivedOutputPaths& paths) { + const std::filesystem::path lock_path = LockPathFor(paths); + const HANDLE lock_handle = CreateFileW( + lock_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0U, nullptr, CREATE_NEW, + FILE_ATTRIBUTE_HIDDEN | FILE_FLAG_DELETE_ON_CLOSE, nullptr); + if (lock_handle == INVALID_HANDLE_VALUE) { + return Result::Failure( + OutputBusyFailure(paths.results_path)); + } + + return Result::Success( + OutputWriteLease{std::make_unique(lock_handle)}); +} + +} // namespace fesa diff --git a/src/fesa/elements/finite_rotation.cpp b/src/fesa/elements/finite_rotation.cpp new file mode 100644 index 0000000..4e82390 --- /dev/null +++ b/src/fesa/elements/finite_rotation.cpp @@ -0,0 +1,286 @@ +#include "fesa/elements/finite_rotation.h" + +#include +#include +#include +#include +#include + +namespace fesa { +namespace { + +constexpr std::size_t kRotationDimension = 3U; +constexpr double kRotationStateTolerance = 1.0e-12; +constexpr double kSmallAngleThreshold = 1.0e-4; + +/// @brief Returns the SO(3) skew-symmetric matrix for a global vector. +Matrix Skew(const Vector3& vector) { + Matrix result{kRotationDimension, kRotationDimension}; + result(0U, 1U) = -vector.Z(); + result(0U, 2U) = vector.Y(); + result(1U, 0U) = vector.Z(); + result(1U, 2U) = -vector.X(); + result(2U, 0U) = -vector.Y(); + result(2U, 1U) = vector.X(); + return result; +} + +/// @brief Returns the 3-by-3 identity matrix. +Matrix Identity() { + Matrix result{kRotationDimension, kRotationDimension}; + for (std::size_t index = 0U; index < kRotationDimension; ++index) { + result(index, index) = 1.0; + } + return result; +} + +/// @brief Builds I plus linear and quadratic skew terms in stable row-major +/// order. +Matrix Polynomial(const Matrix& skew, const Matrix& skew_squared, + const double linear_coefficient, + const double quadratic_coefficient) { + Matrix result = Identity(); + for (std::size_t row = 0U; row < kRotationDimension; ++row) { + for (std::size_t column = 0U; column < kRotationDimension; ++column) { + result(row, column) += linear_coefficient * skew(row, column) + + quadratic_coefficient * + skew_squared(row, column); + } + } + return result; +} + +/// @brief Computes the determinant of one 3-by-3 matrix. +double Determinant(const Matrix& matrix) { + return matrix(0U, 0U) * + (matrix(1U, 1U) * matrix(2U, 2U) - + matrix(1U, 2U) * matrix(2U, 1U)) - + matrix(0U, 1U) * + (matrix(1U, 0U) * matrix(2U, 2U) - + matrix(1U, 2U) * matrix(2U, 0U)) + + matrix(0U, 2U) * + (matrix(1U, 0U) * matrix(2U, 1U) - + matrix(1U, 1U) * matrix(2U, 0U)); +} + +/// @brief Checks that all matrix entries are finite. +bool IsFinite(const Matrix& matrix) { + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t column = 0U; column < matrix.Columns(); ++column) { + if (!std::isfinite(matrix(row, column))) { + return false; + } + } + } + return true; +} + +/// @brief Checks the exact 3-by-3 proper-orthogonal frame contract. +bool IsProperOrthogonal(const Matrix& matrix) { + if (matrix.Rows() != kRotationDimension || + matrix.Columns() != kRotationDimension || !IsFinite(matrix)) { + return false; + } + + for (std::size_t row = 0U; row < kRotationDimension; ++row) { + for (std::size_t column = 0U; column < kRotationDimension; ++column) { + double value = 0.0; + for (std::size_t index = 0U; index < kRotationDimension; ++index) { + value += matrix(index, row) * matrix(index, column); + } + if (!std::isfinite(value) || + std::abs(value - (row == column ? 1.0 : 0.0)) > + kRotationStateTolerance) { + return false; + } + } + } + + const double determinant = Determinant(matrix); + return std::isfinite(determinant) && + std::abs(determinant - 1.0) <= kRotationStateTolerance; +} + +/// @brief Checks that the coordinate is finite and away from the pi branch. +bool IsPrincipalCoordinate(const Vector3& phi) { + if (!phi.IsFinite()) { + return false; + } + + const double angle = phi.Norm(); + const double pi = std::acos(-1.0); + const double margin = std::sqrt(std::numeric_limits::epsilon()); + return std::isfinite(angle) && pi - angle > margin; +} + +/// @brief Multiplies a 3-by-3 frame by a global vector. +Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { + return Vector3{ + matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + + matrix(0U, 2U) * vector.Z(), + matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + + matrix(1U, 2U) * vector.Z(), + matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + + matrix(2U, 2U) * vector.Z()}; +} + +/// @brief Checks componentwise agreement without scale-dependent repair. +bool IsNear(const Matrix& actual, const Matrix& expected) { + if (actual.Rows() != expected.Rows() || + actual.Columns() != expected.Columns()) { + return false; + } + for (std::size_t row = 0U; row < actual.Rows(); ++row) { + for (std::size_t column = 0U; column < actual.Columns(); ++column) { + if (!std::isfinite(actual(row, column)) || + !std::isfinite(expected(row, column)) || + std::abs(actual(row, column) - expected(row, column)) > + kRotationStateTolerance) { + return false; + } + } + } + return true; +} + +/// @brief Checks componentwise agreement for a derived director. +bool IsNear(const Vector3& actual, const Vector3& expected) { + return actual.IsFinite() && expected.IsFinite() && + std::abs(actual.X() - expected.X()) <= kRotationStateTolerance && + std::abs(actual.Y() - expected.Y()) <= kRotationStateTolerance && + std::abs(actual.Z() - expected.Z()) <= kRotationStateTolerance; +} + +/// @brief Returns the stable failure used when a nonlinear state is invalid. +Result InvalidAcceptedState(const std::string& message) { + return Result::Failure(Status::Failure( + FailureCategory::kSolver, + {{Severity::kError, "invalid-accepted-state", {{}, 0U}, + "FINITE_ROTATION", "", message}})); +} + +/// @brief Validates that an existing state remains derived from its coordinate. +bool IsConsistentState(const FiniteRotationState& state, + const Matrix& initial_frame) { + if (!IsPrincipalCoordinate(state.phi) || !IsProperOrthogonal(state.q) || + !state.director.IsFinite()) { + return false; + } + + const Matrix expected_q = ExpSkew(state.phi).Multiply(initial_frame); + return IsNear(state.q, expected_q) && + IsNear(state.director, Multiply(state.q, Vector3{0.0, 0.0, 1.0})); +} + +} // namespace + +Matrix ExpSkew(const Vector3& phi) { + const Matrix skew = Skew(phi); + const Matrix skew_squared = skew.Multiply(skew); + const double theta = phi.Norm(); + const double theta_squared = theta * theta; + + double linear_coefficient = 1.0; + double quadratic_coefficient = 0.5; + if (theta >= kSmallAngleThreshold) { + linear_coefficient = std::sin(theta) / theta; + quadratic_coefficient = (1.0 - std::cos(theta)) / theta_squared; + } else { + const double theta_fourth = theta_squared * theta_squared; + const double theta_sixth = theta_fourth * theta_squared; + linear_coefficient = + 1.0 - theta_squared / 6.0 + theta_fourth / 120.0 - + theta_sixth / 5040.0; + quadratic_coefficient = + 0.5 - theta_squared / 24.0 + theta_fourth / 720.0 - + theta_sixth / 40320.0; + } + return Polynomial(skew, skew_squared, linear_coefficient, + quadratic_coefficient); +} + +Matrix LeftJacobianSO3(const Vector3& phi) { + const Matrix skew = Skew(phi); + const Matrix skew_squared = skew.Multiply(skew); + const double theta = phi.Norm(); + const double theta_squared = theta * theta; + + double linear_coefficient = 0.5; + double quadratic_coefficient = 1.0 / 6.0; + if (theta >= kSmallAngleThreshold) { + linear_coefficient = (1.0 - std::cos(theta)) / theta_squared; + quadratic_coefficient = (theta - std::sin(theta)) / + (theta_squared * theta); + } else { + const double theta_fourth = theta_squared * theta_squared; + const double theta_sixth = theta_fourth * theta_squared; + linear_coefficient = + 0.5 - theta_squared / 24.0 + theta_fourth / 720.0 - + theta_sixth / 40320.0; + quadratic_coefficient = + 1.0 / 6.0 - theta_squared / 120.0 + theta_fourth / 5040.0 - + theta_sixth / 362880.0; + } + return Polynomial(skew, skew_squared, linear_coefficient, + quadratic_coefficient); +} + +Matrix InverseTransposeLeftJacobianSO3(const Vector3& phi) { + const Matrix skew = Skew(phi); + const Matrix skew_squared = skew.Multiply(skew); + const double theta = phi.Norm(); + const double theta_squared = theta * theta; + + double quadratic_coefficient = 1.0 / 12.0; + if (theta >= kSmallAngleThreshold) { + const double half_theta = 0.5 * theta; + quadratic_coefficient = + (1.0 - half_theta / std::tan(half_theta)) / theta_squared; + } else { + const double theta_fourth = theta_squared * theta_squared; + const double theta_sixth = theta_fourth * theta_squared; + quadratic_coefficient = + 1.0 / 12.0 + theta_squared / 720.0 + theta_fourth / 30240.0 + + theta_sixth / 1209600.0; + } + return Polynomial(skew, skew_squared, 0.5, quadratic_coefficient); +} + +Result MakeFiniteRotationState( + const Vector3& phi, const Matrix& initial_frame) { + if (!IsPrincipalCoordinate(phi)) { + return InvalidAcceptedState( + "Finite rotation coordinates must be finite and remain inside the " + "principal branch margin."); + } + if (!IsProperOrthogonal(initial_frame)) { + return InvalidAcceptedState( + "The initial finite-rotation frame must be a finite proper " + "orthogonal triad."); + } + + Matrix q = ExpSkew(phi).Multiply(initial_frame); + const Vector3 director = Multiply(q, Vector3{0.0, 0.0, 1.0}); + if (!IsProperOrthogonal(q) || !director.IsFinite()) { + return InvalidAcceptedState( + "Finite rotation state construction produced an invalid triad."); + } + return Result::Success( + FiniteRotationState{phi, std::move(q), director}); +} + +Result ApplyGlobalRotationIncrement( + const FiniteRotationState& committed, const Vector3& delta_phi, + const Matrix& initial_frame) { + if (!IsProperOrthogonal(initial_frame) || + !IsConsistentState(committed, initial_frame) || + !delta_phi.IsFinite()) { + return InvalidAcceptedState( + "The accepted finite rotation state and its correction must remain " + "finite and consistent with the initial frame."); + } + + return MakeFiniteRotationState(committed.phi + delta_phi, initial_frame); +} + +} // namespace fesa diff --git a/src/fesa/elements/nonlinear_mitc4_shell.cpp b/src/fesa/elements/nonlinear_mitc4_shell.cpp new file mode 100644 index 0000000..48d117a --- /dev/null +++ b/src/fesa/elements/nonlinear_mitc4_shell.cpp @@ -0,0 +1,1354 @@ +#include "fesa/elements/nonlinear_mitc4_shell.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/finite_rotation.h" + +namespace fesa { +namespace { + +constexpr std::size_t kNodeCount = 4U; +constexpr double kFrameTolerance = 1.0e-12; +constexpr double kDirectorOppositionTolerance = 1.0e-8; +constexpr double kShearCorrection = 5.0 / 6.0; + +using Tensor = std::array, 3>; +using EngineeringStrain = std::array; +using EngineeringStress = std::array; + +struct Geometry { + std::array reference_covariant; + std::array current_covariant; + std::array reciprocal; + Mitc4LocalFrame local_frame; + double reference_jacobian; +}; + +struct PointEvaluation { + Geometry geometry; + EngineeringStrain strain; + EngineeringStress stress; +}; + +/// @brief Builds one deterministic structured nonlinear-shell failure. +template +Result Failure(const std::string& code, const SourceLocation& location, + const std::string& identity, std::string message) { + return Result::Failure(Status::Failure( + FailureCategory::kModel, + {{Severity::kError, code, location, "*ELEMENT", identity, + std::move(message)}})); +} + +/// @brief Builds the stable source label concatenation used by diagnostics. +std::string ElementIdentity(const std::array& nodes) { + std::string identity; + for (const Node* node : nodes) { + if (node == nullptr) { + continue; + } + if (!identity.empty()) { + identity += "-"; + } + identity += node->source_id.source_label_text; + } + return identity; +} + +/// @brief Forms a weighted vector sum in source-node order. +Vector3 WeightedSum(const std::array& weights, + const std::array& values) { + Vector3 result{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + result = result + weights[node] * values[node]; + } + return result; +} + +/// @brief Forms a stable derivative sum after cancelling the constant term. +Vector3 DerivativeSum(const std::array& derivatives, + const std::array& values) { + std::array relative{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + relative[node] = values[node] - values[0U]; + } + return WeightedSum(derivatives, relative); +} + +/// @brief Returns a frame matrix whose columns are a, b and the director. +Matrix FrameMatrix(const ShellNodeInitialFrame& frame) { + Matrix result{3U, 3U}; + for (std::size_t row = 0U; row < 3U; ++row) { + result(row, 0U) = frame.tangent_a[row]; + result(row, 1U) = frame.tangent_b[row]; + result(row, 2U) = frame.director[row]; + } + return result; +} + +/// @brief Checks every scalar in a tensor before recovery commits it. +bool IsFinite(const Tensor& tensor) { + for (const auto& row : tensor) { + for (const double value : row) { + if (!std::isfinite(value)) { + return false; + } + } + } + return true; +} + +/// @brief Checks every scalar in one fixed-size engineering quantity. +template +bool IsFinite(const std::array& values) { + return std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); }); +} + +/// @brief Evaluates a determinant from covariant basis columns. +double Determinant(const std::array& covariant) { + return covariant[0U].Dot(covariant[1U].Cross(covariant[2U])); +} + +/// @brief Builds one proper fixed reference local frame at a midsurface point. +bool MakeLocalFrame(const Vector3& midsurface_xi, const Vector3& midsurface_eta, + const Vector3& director, Mitc4LocalFrame& frame) { + const Vector3 area = midsurface_xi.Cross(midsurface_eta); + const double director_norm = director.Norm(); + if (!area.IsFinite() || !director.IsFinite() || + !(director_norm > kDirectorOppositionTolerance) || + !std::isfinite(director_norm)) { + return false; + } + + const Vector3 e3 = director / director_norm; + if (!(area.Dot(e3) > 0.0)) { + return false; + } + const Vector3 e1_candidate = midsurface_xi - midsurface_xi.Dot(e3) * e3; + const double e1_norm = e1_candidate.Norm(); + if (!e1_candidate.IsFinite() || !std::isfinite(e1_norm) || + !(e1_norm > 0.0)) { + return false; + } + const Vector3 e1 = e1_candidate / e1_norm; + const Vector3 e2 = e3.Cross(e1); + if (!e2.IsFinite()) { + return false; + } + frame = {e1.Components(), e2.Components(), e3.Components()}; + return true; +} + +/// @brief Evaluates fixed-reference and trial covariant geometry together. +bool EvaluateGeometry(const std::array& coordinates, + const std::array& initial_directors, + const std::array& directors, + const NonlinearMitc4TrialDofs& trial, + const double thickness, const double xi, const double eta, + const double zeta, Geometry& geometry) { + const Mitc4ShapeFunctions shape = Mitc4Shell::ShapeFunctions(xi, eta); + const Vector3 reference_xi = + DerivativeSum(shape.xi_derivatives, coordinates); + const Vector3 reference_eta = + DerivativeSum(shape.eta_derivatives, coordinates); + const Vector3 initial_director_xi = + DerivativeSum(shape.xi_derivatives, initial_directors); + const Vector3 initial_director_eta = + DerivativeSum(shape.eta_derivatives, initial_directors); + const Vector3 initial_director = WeightedSum(shape.values, initial_directors); + const Vector3 displacement_xi = + DerivativeSum(shape.xi_derivatives, trial.displacement); + const Vector3 displacement_eta = + DerivativeSum(shape.eta_derivatives, trial.displacement); + const Vector3 director_xi = DerivativeSum(shape.xi_derivatives, directors); + const Vector3 director_eta = DerivativeSum(shape.eta_derivatives, directors); + const Vector3 director = WeightedSum(shape.values, directors); + const double half_thickness = 0.5 * thickness; + + geometry.reference_covariant[0U] = + reference_xi + half_thickness * zeta * initial_director_xi; + geometry.reference_covariant[1U] = + reference_eta + half_thickness * zeta * initial_director_eta; + geometry.reference_covariant[2U] = half_thickness * initial_director; + geometry.current_covariant[0U] = + reference_xi + displacement_xi + half_thickness * zeta * director_xi; + geometry.current_covariant[1U] = + reference_eta + displacement_eta + half_thickness * zeta * director_eta; + geometry.current_covariant[2U] = half_thickness * director; + geometry.reference_jacobian = Determinant(geometry.reference_covariant); + const double current_jacobian = Determinant(geometry.current_covariant); + + if (!reference_xi.IsFinite() || !reference_eta.IsFinite() || + !initial_director.IsFinite() || !director.IsFinite() || + !(director.Norm() > kDirectorOppositionTolerance) || + !std::isfinite(geometry.reference_jacobian) || + !(geometry.reference_jacobian > 0.0) || + !std::isfinite(current_jacobian) || !(current_jacobian > 0.0)) { + return false; + } + + geometry.reciprocal[0U] = + geometry.reference_covariant[1U].Cross(geometry.reference_covariant[2U]) / + geometry.reference_jacobian; + geometry.reciprocal[1U] = + geometry.reference_covariant[2U].Cross(geometry.reference_covariant[0U]) / + geometry.reference_jacobian; + geometry.reciprocal[2U] = + geometry.reference_covariant[0U].Cross(geometry.reference_covariant[1U]) / + geometry.reference_jacobian; + if (!geometry.reciprocal[0U].IsFinite() || + !geometry.reciprocal[1U].IsFinite() || + !geometry.reciprocal[2U].IsFinite()) { + return false; + } + return MakeLocalFrame(reference_xi, reference_eta, initial_director, + geometry.local_frame); +} + +/// @brief Forms the direct Green-Lagrange covariant strain with E33 excluded. +Tensor DirectStrain(const Geometry& geometry) { + Tensor strain{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + strain[row][column] = + 0.5 * (geometry.current_covariant[row].Dot( + geometry.current_covariant[column]) - + geometry.reference_covariant[row].Dot( + geometry.reference_covariant[column])); + } + } + strain[2U][2U] = 0.0; + return strain; +} + +/// @brief Reconstructs a fixed-reference Cartesian strain from covariant data. +Tensor CartesianStrain(const Tensor& covariant, + const std::array& reciprocal) { + Tensor cartesian{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + for (std::size_t first = 0U; first < 3U; ++first) { + for (std::size_t second = 0U; second < 3U; ++second) { + cartesian[row][column] += covariant[first][second] * + reciprocal[first][row] * + reciprocal[second][column]; + } + } + } + } + return cartesian; +} + +/// @brief Evaluates a tensor component in a fixed local reference frame. +double FrameComponent(const Vector3& left, const Tensor& tensor, + const Vector3& right) { + double value = 0.0; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + value += left[row] * tensor[row][column] * right[column]; + } + } + return value; +} + +/// @brief Converts fixed-reference Cartesian strain to engineering components. +EngineeringStrain LocalEngineering(const Tensor& tensor, + const Mitc4LocalFrame& frame) { + const Vector3 e1{frame.e1}; + const Vector3 e2{frame.e2}; + const Vector3 e3{frame.e3}; + return {FrameComponent(e1, tensor, e1), FrameComponent(e2, tensor, e2), + 2.0 * FrameComponent(e1, tensor, e2), + 2.0 * FrameComponent(e1, tensor, e3), + 2.0 * FrameComponent(e2, tensor, e3)}; +} + +/// @brief Applies the approved homogeneous plane-stress plus shear law. +EngineeringStress Stress(const EngineeringStrain& strain, const double youngs, + const double poisson) { + const double factor = youngs / (1.0 - poisson * poisson); + const double shear = kShearCorrection * youngs / (2.0 * (1.0 + poisson)); + return {factor * (strain[0U] + poisson * strain[1U]), + factor * (poisson * strain[0U] + strain[1U]), + factor * (1.0 - poisson) * 0.5 * strain[2U], + shear * strain[3U], shear * strain[4U]}; +} + +/// @brief Evaluates direct strain at one mandatory edge-midpoint tying point. +bool EvaluateTyingSample(const std::array& coordinates, + const std::array& initial_directors, + const std::array& directors, + const NonlinearMitc4TrialDofs& trial, + const double thickness, const double xi, + const double eta, Tensor& strain) { + Geometry geometry{}; + if (!EvaluateGeometry(coordinates, initial_directors, directors, trial, + thickness, xi, eta, 0.0, geometry)) { + return false; + } + strain = DirectStrain(geometry); + return IsFinite(strain); +} + +/// @brief Computes one MITC-projected local strain and material stress point. +bool EvaluatePoint(const std::array& coordinates, + const std::array& initial_directors, + const std::array& directors, + const NonlinearMitc4TrialDofs& trial, + const std::array& tying_samples, + const double thickness, const double youngs, + const double poisson, const double xi, const double eta, + const double zeta, PointEvaluation& point) { + if (!EvaluateGeometry(coordinates, initial_directors, directors, trial, + thickness, xi, eta, zeta, point.geometry)) { + return false; + } + Tensor covariant = DirectStrain(point.geometry); + const Mitc4TyingWeights weights = Mitc4Shell::TyingWeights(xi, eta); + covariant[0U][2U] = weights.xi_zeta[0U] * tying_samples[0U][0U][2U] + + weights.xi_zeta[1U] * tying_samples[1U][0U][2U]; + covariant[2U][0U] = covariant[0U][2U]; + covariant[1U][2U] = weights.eta_zeta[0U] * tying_samples[2U][1U][2U] + + weights.eta_zeta[1U] * tying_samples[3U][1U][2U]; + covariant[2U][1U] = covariant[1U][2U]; + const Tensor cartesian = CartesianStrain(covariant, point.geometry.reciprocal); + point.strain = LocalEngineering(cartesian, point.geometry.local_frame); + point.stress = Stress(point.strain, youngs, poisson); + return IsFinite(covariant) && IsFinite(cartesian) && IsFinite(point.strain) && + IsFinite(point.stress); +} + +/// @brief Tests the fixed-order physical recovery inventory for finite values. +bool IsFinite(const NonlinearMitc4Recovery& recovery) { + if (!std::isfinite(recovery.physical_strain_energy)) { + return false; + } + for (const auto& point : recovery.gauss_points) { + if (!IsFinite(point.generalized_strain) || + !IsFinite(point.section_resultant)) { + return false; + } + for (const auto& stress : point.stress) { + if (!IsFinite(stress.components)) { + return false; + } + } + } + return true; +} + +constexpr std::size_t kGlobalDofCount = 24U; +constexpr std::size_t kHessianSize = kGlobalDofCount * kGlobalDofCount; + +/// @brief Carries exact first and second trial-coordinate variations. +class Hessian { + public: + Hessian() : values_{std::make_shared>()} {} + + double& operator[](const std::size_t index) { return (*values_)[index]; } + + const double& operator[](const std::size_t index) const { + return (*values_)[index]; + } + + auto begin() const { return values_->begin(); } + + auto end() const { return values_->end(); } + + private: + std::shared_ptr> values_; +}; + +/// @brief Carries exact first and second trial-coordinate variations. +struct Jet { + double value{}; + std::array first{}; + Hessian second; +}; + +using JetVector3 = std::array; +using JetMatrix3 = std::array, 3>; +using JetTensor = std::array, 3>; + +/// @brief Returns a constant second-order trial-coordinate quantity. +Jet Constant(const double value) { + Jet result{}; + result.value = value; + return result; +} + +/// @brief Returns one independent global trial coordinate. +Jet Variable(const double value, const std::size_t index) { + Jet result = Constant(value); + result.first[index] = 1.0; + return result; +} + +/// @brief Adds two second-order trial-coordinate quantities. +Jet operator+(const Jet& left, const Jet& right) { + Jet result{}; + result.value = left.value + right.value; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = left.first[index] + right.first[index]; + } + for (std::size_t index = 0U; index < kHessianSize; ++index) { + result.second[index] = left.second[index] + right.second[index]; + } + return result; +} + +/// @brief Subtracts two second-order trial-coordinate quantities. +Jet operator-(const Jet& left, const Jet& right) { + Jet result{}; + result.value = left.value - right.value; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = left.first[index] - right.first[index]; + } + for (std::size_t index = 0U; index < kHessianSize; ++index) { + result.second[index] = left.second[index] - right.second[index]; + } + return result; +} + +/// @brief Multiplies two second-order trial-coordinate quantities. +Jet operator*(const Jet& left, const Jet& right) { + Jet result{}; + result.value = left.value * right.value; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = + left.first[index] * right.value + left.value * right.first[index]; + } + for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { + for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { + const std::size_t index = row * kGlobalDofCount + column; + result.second[index] = left.second[index] * right.value + + left.first[row] * right.first[column] + + left.first[column] * right.first[row] + + left.value * right.second[index]; + } + } + return result; +} + +/// @brief Scales a second-order trial-coordinate quantity. +Jet operator*(const double scalar, const Jet& value) { + Jet result{}; + result.value = scalar * value.value; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = scalar * value.first[index]; + } + for (std::size_t index = 0U; index < kHessianSize; ++index) { + result.second[index] = scalar * value.second[index]; + } + return result; +} + +/// @brief Scales a second-order trial-coordinate quantity. +Jet operator*(const Jet& value, const double scalar) { return scalar * value; } + +/// @brief Applies a scalar unary function through its first two derivatives. +Jet Compose(const Jet& input, const double value, const double first, + const double second) { + Jet result{}; + result.value = value; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = first * input.first[index]; + } + for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { + for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { + const std::size_t index = row * kGlobalDofCount + column; + result.second[index] = first * input.second[index] + + second * input.first[row] * input.first[column]; + } + } + return result; +} + +/// @brief Forms an analytic reciprocal without a secant approximation. +Jet Reciprocal(const Jet& value) { + const double inverse = 1.0 / value.value; + return Compose(value, inverse, -inverse * inverse, + 2.0 * inverse * inverse * inverse); +} + +/// @brief Divides two second-order trial-coordinate quantities. +Jet operator/(const Jet& left, const Jet& right) { + return left * Reciprocal(right); +} + +/// @brief Computes the analytic square root variation. +Jet Sqrt(const Jet& value) { + const double root = std::sqrt(value.value); + return Compose(value, root, 0.5 / root, -0.25 / (root * root * root)); +} + +/// @brief Computes the analytic sine variation. +Jet Sin(const Jet& value) { + return Compose(value, std::sin(value.value), std::cos(value.value), + -std::sin(value.value)); +} + +/// @brief Computes the analytic cosine variation. +Jet Cos(const Jet& value) { + return Compose(value, std::cos(value.value), -std::sin(value.value), + -std::cos(value.value)); +} + +/// @brief Computes the two-argument angle and its analytic first/second map. +Jet Atan2(const Jet& y, const Jet& x) { + const double radius_squared = x.value * x.value + y.value * y.value; + Jet result{}; + result.value = std::atan2(y.value, x.value); + const double derivative_y = x.value / radius_squared; + const double derivative_x = -y.value / radius_squared; + const double radius_fourth = radius_squared * radius_squared; + const double derivative_yy = -2.0 * x.value * y.value / radius_fourth; + const double derivative_yx = + (y.value * y.value - x.value * x.value) / radius_fourth; + const double derivative_xx = 2.0 * x.value * y.value / radius_fourth; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + result.first[index] = + derivative_y * y.first[index] + derivative_x * x.first[index]; + } + for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { + for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { + const std::size_t index = row * kGlobalDofCount + column; + result.second[index] = derivative_y * y.second[index] + + derivative_x * x.second[index] + + derivative_yy * y.first[row] * y.first[column] + + derivative_yx * (y.first[row] * x.first[column] + + x.first[row] * y.first[column]) + + derivative_xx * x.first[row] * x.first[column]; + } + } + return result; +} + +/// @brief Checks every coefficient in an automatic-differentiation quantity. +bool IsFinite(const Jet& value) { + if (!std::isfinite(value.value)) { + return false; + } + return std::all_of(value.first.begin(), value.first.end(), + [](const double coefficient) { + return std::isfinite(coefficient); + }) && + std::all_of(value.second.begin(), value.second.end(), + [](const double coefficient) { + return std::isfinite(coefficient); + }); +} + +/// @brief Forms a Jet vector from a fixed reference vector. +JetVector3 ConstantVector(const Vector3& value) { + return {Constant(value.X()), Constant(value.Y()), Constant(value.Z())}; +} + +/// @brief Adds two Jet vectors. +JetVector3 Add(const JetVector3& left, const JetVector3& right) { + return {left[0U] + right[0U], left[1U] + right[1U], left[2U] + right[2U]}; +} + +/// @brief Subtracts two Jet vectors. +JetVector3 Subtract(const JetVector3& left, const JetVector3& right) { + return {left[0U] - right[0U], left[1U] - right[1U], left[2U] - right[2U]}; +} + +/// @brief Scales a Jet vector. +JetVector3 Scale(const Jet& scalar, const JetVector3& vector) { + return {scalar * vector[0U], scalar * vector[1U], scalar * vector[2U]}; +} + +/// @brief Scales a Jet vector by a fixed value. +JetVector3 Scale(const double scalar, const JetVector3& vector) { + return {scalar * vector[0U], scalar * vector[1U], scalar * vector[2U]}; +} + +/// @brief Computes the Jet dot product. +Jet Dot(const JetVector3& left, const JetVector3& right) { + return left[0U] * right[0U] + left[1U] * right[1U] + left[2U] * right[2U]; +} + +/// @brief Computes the Jet right-handed cross product. +JetVector3 Cross(const JetVector3& left, const JetVector3& right) { + return {left[1U] * right[2U] - left[2U] * right[1U], + left[2U] * right[0U] - left[0U] * right[2U], + left[0U] * right[1U] - left[1U] * right[0U]}; +} + +/// @brief Builds a Jet identity matrix. +JetMatrix3 Identity() { + JetMatrix3 result{}; + for (std::size_t index = 0U; index < 3U; ++index) { + result[index][index] = Constant(1.0); + } + return result; +} + +/// @brief Forms a skew matrix from a Jet vector. +JetMatrix3 Skew(const JetVector3& value) { + JetMatrix3 result{}; + result[0U][1U] = -1.0 * value[2U]; + result[0U][2U] = value[1U]; + result[1U][0U] = value[2U]; + result[1U][2U] = -1.0 * value[0U]; + result[2U][0U] = -1.0 * value[1U]; + result[2U][1U] = value[0U]; + return result; +} + +/// @brief Multiplies two three-by-three Jet matrices. +JetMatrix3 Multiply(const JetMatrix3& left, const JetMatrix3& right) { + JetMatrix3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + for (std::size_t index = 0U; index < 3U; ++index) { + result[row][column] = + result[row][column] + left[row][index] * right[index][column]; + } + } + } + return result; +} + +/// @brief Multiplies a Jet matrix by a Jet vector. +JetVector3 Multiply(const JetMatrix3& matrix, const JetVector3& vector) { + JetVector3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row] = result[row] + matrix[row][column] * vector[column]; + } + } + return result; +} + +/// @brief Transposes a three-by-three Jet matrix. +JetMatrix3 Transpose(const JetMatrix3& matrix) { + JetMatrix3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = matrix[column][row]; + } + } + return result; +} + +/// @brief Returns a scalar multiple of a Jet matrix. +JetMatrix3 Scale(const double scalar, const JetMatrix3& matrix) { + JetMatrix3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = scalar * matrix[row][column]; + } + } + return result; +} + +/// @brief Returns a trial-coordinate scalar multiple of a Jet matrix. +JetMatrix3 Scale(const Jet& scalar, const JetMatrix3& matrix) { + JetMatrix3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = scalar * matrix[row][column]; + } + } + return result; +} + +/// @brief Adds two three-by-three Jet matrices. +JetMatrix3 Add(const JetMatrix3& left, const JetMatrix3& right) { + JetMatrix3 result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = left[row][column] + right[row][column]; + } + } + return result; +} + +/// @brief Computes the analytic three-by-three inverse through its adjugate. +JetMatrix3 Inverse(const JetMatrix3& matrix) { + JetMatrix3 cofactor{}; + cofactor[0U][0U] = + matrix[1U][1U] * matrix[2U][2U] - matrix[1U][2U] * matrix[2U][1U]; + cofactor[0U][1U] = + matrix[1U][2U] * matrix[2U][0U] - matrix[1U][0U] * matrix[2U][2U]; + cofactor[0U][2U] = + matrix[1U][0U] * matrix[2U][1U] - matrix[1U][1U] * matrix[2U][0U]; + cofactor[1U][0U] = + matrix[0U][2U] * matrix[2U][1U] - matrix[0U][1U] * matrix[2U][2U]; + cofactor[1U][1U] = + matrix[0U][0U] * matrix[2U][2U] - matrix[0U][2U] * matrix[2U][0U]; + cofactor[1U][2U] = + matrix[0U][1U] * matrix[2U][0U] - matrix[0U][0U] * matrix[2U][1U]; + cofactor[2U][0U] = + matrix[0U][1U] * matrix[1U][2U] - matrix[0U][2U] * matrix[1U][1U]; + cofactor[2U][1U] = + matrix[0U][2U] * matrix[1U][0U] - matrix[0U][0U] * matrix[1U][2U]; + cofactor[2U][2U] = + matrix[0U][0U] * matrix[1U][1U] - matrix[0U][1U] * matrix[1U][0U]; + const Jet determinant = matrix[0U][0U] * cofactor[0U][0U] + + matrix[0U][1U] * cofactor[0U][1U] + + matrix[0U][2U] * cofactor[0U][2U]; + JetMatrix3 result{}; + const Jet inverse_determinant = Reciprocal(determinant); + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = cofactor[column][row] * inverse_determinant; + } + } + return result; +} + +/// @brief Evaluates Rodrigues' map with an analytic near-zero series branch. +JetMatrix3 ExpSkew(const JetVector3& rotation) { + const Jet squared_norm = Dot(rotation, rotation); + Jet sine_over_norm{}; + Jet one_minus_cosine_over_norm_squared{}; + if (squared_norm.value < 1.0e-8) { + const Jet squared = squared_norm * squared_norm; + const Jet cubed = squared * squared_norm; + sine_over_norm = Constant(1.0) - squared_norm / Constant(6.0) + + squared / Constant(120.0) - cubed / Constant(5040.0); + one_minus_cosine_over_norm_squared = + Constant(0.5) - squared_norm / Constant(24.0) + + squared / Constant(720.0) - cubed / Constant(40320.0); + } else { + const Jet norm = Sqrt(squared_norm); + sine_over_norm = Sin(norm) / norm; + one_minus_cosine_over_norm_squared = + (Constant(1.0) - Cos(norm)) / squared_norm; + } + const JetMatrix3 skew = Skew(rotation); + return Add(Add(Identity(), Scale(sine_over_norm, skew)), + Scale(one_minus_cosine_over_norm_squared, Multiply(skew, skew))); +} + +/// @brief Stores the complete Jet-valued global element trial coordinates. +struct JetTrial { + std::array displacement; + std::array rotation; + std::array director; +}; + +/// @brief Lifts one validated nonlinear trial into independent Jet variables. +JetTrial MakeJetTrial(const NonlinearMitc4TrialDofs& trial, + const std::array& initial_frames) { + JetTrial result{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + for (std::size_t component = 0U; component < 3U; ++component) { + result.displacement[node][component] = + Variable(trial.displacement[node][component], 6U * node + component); + result.rotation[node][component] = Variable( + trial.rotation_vector[node][component], 6U * node + 3U + component); + } + JetMatrix3 frame{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + frame[row][column] = Constant(initial_frames[node](row, column)); + } + } + const JetVector3 initial_director{frame[0U][2U], frame[1U][2U], + frame[2U][2U]}; + result.director[node] = + Multiply(ExpSkew(result.rotation[node]), initial_director); + } + return result; +} + +/// @brief Forms one current covariant basis from the exact trial variables. +std::array CurrentCovariant( + const std::array& coordinates, const JetTrial& trial, + const double thickness, const double xi, const double eta, + const double zeta) { + const Mitc4ShapeFunctions shape = Mitc4Shell::ShapeFunctions(xi, eta); + JetVector3 displacement_xi{}; + JetVector3 displacement_eta{}; + JetVector3 director{}; + JetVector3 director_xi{}; + JetVector3 director_eta{}; + Vector3 reference_xi{}; + Vector3 reference_eta{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + reference_xi = + reference_xi + shape.xi_derivatives[node] * coordinates[node]; + reference_eta = + reference_eta + shape.eta_derivatives[node] * coordinates[node]; + displacement_xi = Add(displacement_xi, Scale(shape.xi_derivatives[node], + trial.displacement[node])); + displacement_eta = Add(displacement_eta, Scale(shape.eta_derivatives[node], + trial.displacement[node])); + director = Add(director, Scale(shape.values[node], trial.director[node])); + director_xi = Add(director_xi, + Scale(shape.xi_derivatives[node], trial.director[node])); + director_eta = Add( + director_eta, Scale(shape.eta_derivatives[node], trial.director[node])); + } + const double half_thickness = 0.5 * thickness; + return {Add(Add(ConstantVector(reference_xi), displacement_xi), + Scale(half_thickness * zeta, director_xi)), + Add(Add(ConstantVector(reference_eta), displacement_eta), + Scale(half_thickness * zeta, director_eta)), + Scale(half_thickness, director)}; +} + +/// @brief Forms the direct covariant Green--Lagrange strain tensor. +JetTensor DirectStrain(const std::array& current, + const Geometry& reference) { + JetTensor result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result[row][column] = + 0.5 * (Dot(current[row], current[column]) - + Constant(reference.reference_covariant[row].Dot( + reference.reference_covariant[column]))); + } + } + result[2U][2U] = Constant(0.0); + return result; +} + +/// @brief Reconstructs a fixed-reference Cartesian Jet strain tensor. +JetTensor CartesianStrain(const JetTensor& covariant, + const Geometry& reference) { + JetTensor result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + for (std::size_t first = 0U; first < 3U; ++first) { + for (std::size_t second = 0U; second < 3U; ++second) { + result[row][column] = + result[row][column] + reference.reciprocal[first][row] * + reference.reciprocal[second][column] * + covariant[first][second]; + } + } + } + } + return result; +} + +/// @brief Forms one fixed-frame engineering strain component. +Jet FrameComponent(const JetVector3& left, const JetTensor& tensor, + const JetVector3& right) { + Jet result{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + result = result + left[row] * tensor[row][column] * right[column]; + } + } + return result; +} + +/// @brief Evaluates the physical strain energy through exact Jet variations. +Jet PhysicalEnergy(const std::array& coordinates, + const std::array& initial_directors, + const JetTrial& trial, const double thickness, + const double youngs, const double poisson, bool& valid) { + const NonlinearMitc4TrialDofs reference_trial{}; + constexpr std::array, 4> tying_locations{ + std::array{0.0, -1.0}, std::array{0.0, 1.0}, + std::array{-1.0, 0.0}, std::array{1.0, 0.0}}; + std::array tying{}; + for (std::size_t point = 0U; point < tying_locations.size(); ++point) { + Geometry reference{}; + if (!EvaluateGeometry(coordinates, initial_directors, initial_directors, + reference_trial, thickness, + tying_locations[point][0U], + tying_locations[point][1U], 0.0, reference)) { + valid = false; + return {}; + } + tying[point] = + DirectStrain(CurrentCovariant(coordinates, trial, thickness, + tying_locations[point][0U], + tying_locations[point][1U], 0.0), + reference); + } + + const double gauss = 1.0 / std::sqrt(3.0); + const std::array, 4> surface_points{ + std::array{-gauss, -gauss}, + std::array{gauss, -gauss}, std::array{gauss, gauss}, + std::array{-gauss, gauss}}; + const std::array thickness_points{-gauss, gauss}; + const double plane_stress = youngs / (1.0 - poisson * poisson); + const double shear = kShearCorrection * youngs / (2.0 * (1.0 + poisson)); + Jet energy{}; + for (const auto& surface : surface_points) { + for (const double zeta : thickness_points) { + Geometry reference{}; + if (!EvaluateGeometry(coordinates, initial_directors, initial_directors, + reference_trial, thickness, surface[0U], + surface[1U], zeta, reference)) { + valid = false; + return {}; + } + JetTensor covariant = + DirectStrain(CurrentCovariant(coordinates, trial, thickness, + surface[0U], surface[1U], zeta), + reference); + const Mitc4TyingWeights weights = + Mitc4Shell::TyingWeights(surface[0U], surface[1U]); + covariant[0U][2U] = weights.xi_zeta[0U] * tying[0U][0U][2U] + + weights.xi_zeta[1U] * tying[1U][0U][2U]; + covariant[2U][0U] = covariant[0U][2U]; + covariant[1U][2U] = weights.eta_zeta[0U] * tying[2U][1U][2U] + + weights.eta_zeta[1U] * tying[3U][1U][2U]; + covariant[2U][1U] = covariant[1U][2U]; + const JetTensor cartesian = CartesianStrain(covariant, reference); + const JetVector3 e1 = ConstantVector(Vector3{reference.local_frame.e1}); + const JetVector3 e2 = ConstantVector(Vector3{reference.local_frame.e2}); + const JetVector3 e3 = ConstantVector(Vector3{reference.local_frame.e3}); + const std::array strain{FrameComponent(e1, cartesian, e1), + FrameComponent(e2, cartesian, e2), + 2.0 * FrameComponent(e1, cartesian, e2), + 2.0 * FrameComponent(e1, cartesian, e3), + 2.0 * FrameComponent(e2, cartesian, e3)}; + const std::array stress{ + plane_stress * (strain[0U] + poisson * strain[1U]), + plane_stress * (poisson * strain[0U] + strain[1U]), + plane_stress * (1.0 - poisson) * 0.5 * strain[2U], shear * strain[3U], + shear * strain[4U]}; + Jet density{}; + for (std::size_t component = 0U; component < strain.size(); ++component) { + density = density + strain[component] * stress[component]; + } + energy = energy + 0.5 * reference.reference_jacobian * density; + } + } + if (!IsFinite(energy)) { + valid = false; + } + return energy; +} + +/// @brief Computes a fixed-iteration analytic polar factor for drill +/// corotation. +JetMatrix3 PolarRotation(const JetMatrix3& deformation) { + JetMatrix3 result = deformation; + for (std::size_t iteration = 0U; iteration < 12U; ++iteration) { + result = Scale(0.5, Add(result, Transpose(Inverse(result)))); + } + return result; +} + +/// @brief Evaluates the objective numerical drilling potential and variations. +Jet DrillingEnergy(const std::array& coordinates, + const std::array& initial_directors, + const JetTrial& trial, const double thickness, + const double drilling_stiffness, bool& valid) { + const NonlinearMitc4TrialDofs reference_trial{}; + Geometry reference{}; + if (!EvaluateGeometry(coordinates, initial_directors, initial_directors, + reference_trial, thickness, 0.0, 0.0, 0.0, reference)) { + valid = false; + return {}; + } + const auto current = + CurrentCovariant(coordinates, trial, thickness, 0.0, 0.0, 0.0); + JetMatrix3 deformation{}; + for (std::size_t row = 0U; row < 3U; ++row) { + for (std::size_t column = 0U; column < 3U; ++column) { + for (std::size_t alpha = 0U; alpha < 3U; ++alpha) { + deformation[row][column] = + deformation[row][column] + + current[alpha][row] * reference.reciprocal[alpha][column]; + } + } + } + const JetMatrix3 element_rotation = PolarRotation(deformation); + Jet energy{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + const JetMatrix3 nodal_rotation = ExpSkew(trial.rotation[node]); + const JetMatrix3 corotated = + Multiply(Transpose(element_rotation), nodal_rotation); + const JetVector3 initial_director = ConstantVector(initial_directors[node]); + const JetVector3 swung_director = Multiply(corotated, initial_director); + const Jet alignment = Dot(initial_director, swung_director); + if (!std::isfinite(alignment.value) || + !(alignment.value > -1.0 + kDirectorOppositionTolerance)) { + valid = false; + return {}; + } + const JetVector3 swing_axis = Cross(initial_director, swung_director); + const JetMatrix3 swing_skew = Skew(swing_axis); + const JetMatrix3 swing = Add(Add(Identity(), swing_skew), + Scale(Reciprocal(Constant(1.0) + alignment), + Multiply(swing_skew, swing_skew))); + const JetMatrix3 twist = Multiply(Transpose(swing), corotated); + const JetVector3 twist_vex{twist[2U][1U] - twist[1U][2U], + twist[0U][2U] - twist[2U][0U], + twist[1U][0U] - twist[0U][1U]}; + const Jet sine = 0.5 * Dot(initial_director, twist_vex); + const Jet cosine = + 0.5 * (twist[0U][0U] + twist[1U][1U] + twist[2U][2U] - Constant(1.0)); + const Jet gamma = Atan2(sine, cosine); + energy = energy + 0.5 * drilling_stiffness * gamma * gamma; + } + if (!IsFinite(energy)) { + valid = false; + } + return energy; +} + +} // namespace + +NonlinearMitc4Shell::NonlinearMitc4Shell( + std::array coordinates, std::array initial_frames, + std::array initial_directors, const double thickness, + const double youngs_modulus, const double poisson_ratio, + const double drilling_stiffness, SourceLocation source_location, + std::string identity) + : coordinates_{std::move(coordinates)}, + initial_frames_{std::move(initial_frames)}, + initial_directors_{std::move(initial_directors)}, + thickness_{thickness}, + youngs_modulus_{youngs_modulus}, + poisson_ratio_{poisson_ratio}, + drilling_stiffness_{drilling_stiffness}, + source_location_{std::move(source_location)}, + identity_{std::move(identity)} {} + +Result NonlinearMitc4Shell::Create( + std::array nodes, + std::array initial_frames, + const ShellSection& section, const LinearElasticMaterial& material) { + const std::string identity = ElementIdentity(nodes); + if (std::any_of(nodes.begin(), nodes.end(), + [](const Node* node) { return node == nullptr; })) { + return Failure( + "invalid-nonlinear-shell-geometry", section.location, identity, + "Nonlinear MITC4 creation requires four valid node references."); + } + + std::array coordinates{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + coordinates[node] = Vector3{nodes[node]->coordinates}; + if (!coordinates[node].IsFinite()) { + return Failure( + "invalid-nonlinear-shell-geometry", nodes[node]->location, identity, + "Nonlinear MITC4 node coordinates must be finite."); + } + for (std::size_t previous = 0U; previous < node; ++previous) { + if (coordinates[node] == coordinates[previous]) { + return Failure( + "invalid-nonlinear-shell-geometry", nodes[node]->location, + identity, "Nonlinear MITC4 nodes must have distinct coordinates."); + } + if (initial_frames[node].node_index == initial_frames[previous].node_index) { + return Failure( + "invalid-nonlinear-shell-frame", nodes[node]->location, identity, + "Nonlinear MITC4 initial frames must identify four distinct nodes."); + } + } + } + + std::array frames{Matrix{3U, 3U}, Matrix{3U, 3U}, + Matrix{3U, 3U}, Matrix{3U, 3U}}; + std::array directors{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + frames[node] = FrameMatrix(initial_frames[node]); + const auto state = MakeFiniteRotationState(Vector3{}, frames[node]); + if (!state.HasValue()) { + return Failure( + "invalid-nonlinear-shell-frame", nodes[node]->location, identity, + "Nonlinear MITC4 initial frames must be finite proper triads."); + } + directors[node] = state.Value().director; + if ((directors[node] - Vector3{initial_frames[node].director}).Norm() > + kFrameTolerance) { + return Failure( + "invalid-nonlinear-shell-frame", nodes[node]->location, identity, + "Nonlinear MITC4 initial frame director must be its third axis."); + } + } + + const Mitc4ShapeFunctions center = Mitc4Shell::ShapeFunctions(0.0, 0.0); + const Vector3 center_xi = DerivativeSum(center.xi_derivatives, coordinates); + const Vector3 center_eta = DerivativeSum(center.eta_derivatives, coordinates); + const Vector3 center_area = center_xi.Cross(center_eta); + const double center_measure = center_area.Norm(); + if (!center_area.IsFinite() || !std::isfinite(center_measure) || + !(center_measure > 0.0)) { + return Failure( + "invalid-nonlinear-shell-geometry", nodes[0U]->location, identity, + "Nonlinear MITC4 center surface basis must be finite and nonzero."); + } + const Vector3 positive_face = center_area / center_measure; + if (std::any_of(directors.begin(), directors.end(), + [&positive_face](const Vector3& director) { + return !(positive_face.Dot(director) > 0.0); + })) { + return Failure( + "invalid-nonlinear-shell-frame", nodes[0U]->location, identity, + "Nonlinear MITC4 initial directors must follow the source positive face."); + } + + if (!std::isfinite(section.thickness) || !(section.thickness > 0.0)) { + return Failure( + "invalid-nonlinear-shell-section", section.location, identity, + "Nonlinear MITC4 shell thickness must be finite and positive."); + } + if (!std::isfinite(material.youngs_modulus) || + !(material.youngs_modulus > 0.0) || + !std::isfinite(material.poisson_ratio) || + !(material.poisson_ratio > -1.0) || !(material.poisson_ratio < 0.5)) { + return Failure( + "invalid-nonlinear-shell-material", material.location, identity, + "Nonlinear MITC4 requires finite E>0 and -1, kNodeCount> director_components{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + director_components[node] = directors[node].Components(); + } + const auto linear_shell = + Mitc4Shell::Create(nodes, director_components, section, material); + if (!linear_shell.HasValue()) { + return Result::Failure(linear_shell.GetStatus()); + } + const auto linear_stiffness = linear_shell.Value().Stiffness(); + if (!linear_stiffness.HasValue() || + !std::isfinite(linear_stiffness.Value().drilling_stiffness) || + !(linear_stiffness.Value().drilling_stiffness > 0.0)) { + return Failure( + "invalid-nonlinear-shell-drilling", section.location, identity, + "Nonlinear MITC4 requires a finite positive fixed drilling stiffness."); + } + + NonlinearMitc4Shell shell{coordinates, + std::move(frames), + directors, + section.thickness, + material.youngs_modulus, + material.poisson_ratio, + linear_stiffness.Value().drilling_stiffness, + nodes[0U]->location, + identity}; + const auto reference = shell.EvaluateKinematics(NonlinearMitc4TrialDofs{}); + if (!reference.HasValue()) { + return Result::Failure(reference.GetStatus()); + } + return Result::Success(std::move(shell)); +} + +Result NonlinearMitc4Shell::EvaluateKinematics( + const NonlinearMitc4TrialDofs& trial) const { + std::array directors{}; + for (std::size_t node = 0U; node < kNodeCount; ++node) { + if (!trial.displacement[node].IsFinite() || + !trial.rotation_vector[node].IsFinite()) { + return Failure( + "invalid-nonlinear-shell-trial", source_location_, identity_, + "Nonlinear MITC4 trial displacements and rotations must be finite."); + } + const auto state = + MakeFiniteRotationState(trial.rotation_vector[node], initial_frames_[node]); + if (!state.HasValue()) { + return Failure( + "invalid-nonlinear-shell-rotation", source_location_, identity_, + "Nonlinear MITC4 trial rotations must remain in the principal chart."); + } + directors[node] = state.Value().director; + } + for (std::size_t node = 0U; node < kNodeCount; ++node) { + for (std::size_t other = 0U; other < node; ++other) { + if (!(directors[node].Dot(directors[other]) > + -1.0 + kDirectorOppositionTolerance)) { + return Failure( + "invalid-nonlinear-shell-director", source_location_, identity_, + "Nonlinear MITC4 trial directors must not be opposed."); + } + } + } + + Geometry center{}; + if (!EvaluateGeometry(coordinates_, initial_directors_, directors, trial, + thickness_, 0.0, 0.0, 0.0, center)) { + return Failure( + "invalid-nonlinear-shell-geometry", source_location_, identity_, + "Nonlinear MITC4 center reference or trial geometry is invalid."); + } + + constexpr std::array, 4> tying_locations{ + std::array{0.0, -1.0}, std::array{0.0, 1.0}, + std::array{-1.0, 0.0}, std::array{1.0, 0.0}}; + std::array tying_samples{}; + for (std::size_t point = 0U; point < tying_locations.size(); ++point) { + if (!EvaluateTyingSample(coordinates_, initial_directors_, directors, trial, + thickness_, tying_locations[point][0U], + tying_locations[point][1U], tying_samples[point])) { + return Failure( + "invalid-nonlinear-shell-geometry", source_location_, identity_, + "Nonlinear MITC4 tying-point reference or trial geometry is invalid."); + } + } + + const double gauss = 1.0 / std::sqrt(3.0); + constexpr std::array locations{ + ShellMidsurfaceLocation::kGp1, ShellMidsurfaceLocation::kGp2, + ShellMidsurfaceLocation::kGp3, ShellMidsurfaceLocation::kGp4}; + const std::array, 4> surface_points{ + std::array{-gauss, -gauss}, + std::array{gauss, -gauss}, + std::array{gauss, gauss}, + std::array{-gauss, gauss}}; + constexpr std::array thickness_gauss{-1.0, 1.0}; + constexpr std::array stress_zeta{-1.0, 0.0, 1.0}; + constexpr std::array stress_position{ + ShellSectionPosition::kBottom, ShellSectionPosition::kMiddle, + ShellSectionPosition::kTop}; + + NonlinearMitc4Recovery recovery{}; + for (std::size_t surface = 0U; surface < surface_points.size(); ++surface) { + auto& row = recovery.gauss_points[surface]; + row.location = locations[surface]; + row.natural_coordinates = surface_points[surface]; + Geometry midpoint{}; + if (!EvaluateGeometry(coordinates_, initial_directors_, directors, trial, + thickness_, row.natural_coordinates[0U], + row.natural_coordinates[1U], 0.0, midpoint)) { + return Failure( + "invalid-nonlinear-shell-geometry", source_location_, identity_, + "Nonlinear MITC4 midsurface recovery geometry is invalid."); + } + row.local_frame = midpoint.local_frame; + + for (const double thickness_sign : thickness_gauss) { + PointEvaluation point{}; + if (!EvaluatePoint(coordinates_, initial_directors_, directors, trial, + tying_samples, thickness_, youngs_modulus_, + poisson_ratio_, row.natural_coordinates[0U], + row.natural_coordinates[1U], thickness_sign * gauss, + point)) { + return Failure( + "invalid-nonlinear-shell-geometry", source_location_, identity_, + "Nonlinear MITC4 volume recovery geometry is invalid."); + } + for (std::size_t component = 0U; component < 3U; ++component) { + row.generalized_strain[component] += 0.5 * point.strain[component]; + row.generalized_strain[3U + component] += + 3.0 * thickness_sign * gauss * point.strain[component] / + thickness_; + row.section_resultant[component] += + 0.5 * thickness_ * point.stress[component]; + row.section_resultant[3U + component] += + 0.25 * thickness_ * thickness_sign * gauss * point.stress[component]; + } + for (std::size_t component = 0U; component < 2U; ++component) { + row.generalized_strain[6U + component] += + 0.5 * point.strain[3U + component]; + row.section_resultant[6U + component] += + 0.5 * thickness_ * point.stress[3U + component]; + } + double density = 0.0; + for (std::size_t component = 0U; component < point.strain.size(); + ++component) { + density += point.strain[component] * point.stress[component]; + } + recovery.physical_strain_energy += + 0.5 * density * point.geometry.reference_jacobian; + } + + for (std::size_t position = 0U; position < stress_zeta.size(); ++position) { + PointEvaluation point{}; + if (!EvaluatePoint(coordinates_, initial_directors_, directors, trial, + tying_samples, thickness_, youngs_modulus_, + poisson_ratio_, row.natural_coordinates[0U], + row.natural_coordinates[1U], stress_zeta[position], + point)) { + return Failure( + "invalid-nonlinear-shell-geometry", source_location_, identity_, + "Nonlinear MITC4 section-position recovery geometry is invalid."); + } + row.stress[position] = {stress_position[position], stress_zeta[position], + {point.stress[0U], point.stress[1U], + point.stress[2U]}}; + } + } + + if (!IsFinite(recovery)) { + return Failure( + "invalid-nonlinear-shell-recovery", source_location_, identity_, + "Nonlinear MITC4 physical recovery must remain finite."); + } + return Result::Success(std::move(recovery)); +} + +Result NonlinearMitc4Shell::RecoverState( + const NonlinearMitc4TrialDofs& trial) const { + return EvaluateKinematics(trial); +} + +Result EvaluateInternalResidualAndTangent( + const NonlinearMitc4Shell& element, const NonlinearMitc4TrialDofs& trial) { + const auto recovery = element.EvaluateKinematics(trial); + if (!recovery.HasValue()) { + return Result::Failure( + recovery.GetStatus()); + } + + bool valid = true; + const JetTrial jet_trial = MakeJetTrial(trial, element.initial_frames_); + const Jet physical = + PhysicalEnergy(element.coordinates_, element.initial_directors_, + jet_trial, element.thickness_, element.youngs_modulus_, + element.poisson_ratio_, valid); + const Jet drilling = DrillingEnergy( + element.coordinates_, element.initial_directors_, jet_trial, + element.thickness_, element.drilling_stiffness_, valid); + const Jet internal_energy = physical + drilling; + if (!valid || !IsFinite(internal_energy)) { + return Failure( + "invalid-nonlinear-shell-equilibrium", element.source_location_, + element.identity_, + "Nonlinear MITC4 internal residual and tangent must remain finite."); + } + + Vector internal_residual{kGlobalDofCount}; + Matrix internal_tangent{kGlobalDofCount, kGlobalDofCount}; + for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { + internal_residual[row] = internal_energy.first[row]; + for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { + internal_tangent(row, column) = + internal_energy.second[row * kGlobalDofCount + column]; + } + } + for (std::size_t row = 0U; row < kGlobalDofCount; ++row) { + if (!std::isfinite(internal_residual[row])) { + return Failure( + "invalid-nonlinear-shell-equilibrium", element.source_location_, + element.identity_, + "Nonlinear MITC4 internal residual and tangent must remain finite."); + } + for (std::size_t column = 0U; column < kGlobalDofCount; ++column) { + if (!std::isfinite(internal_tangent(row, column))) { + return Failure( + "invalid-nonlinear-shell-equilibrium", element.source_location_, + element.identity_, + "Nonlinear MITC4 internal residual and tangent must remain " + "finite."); + } + } + } + + NonlinearMitc4InternalEquilibrium equilibrium{ + std::move(internal_residual), std::move(internal_tangent), + Vector{kGlobalDofCount}, recovery.Value(), + recovery.Value().physical_strain_energy}; + for (std::size_t index = 0U; index < kGlobalDofCount; ++index) { + equilibrium.internal_force[index] = equilibrium.internal_residual[index]; + } + return Result::Success( + std::move(equilibrium)); +} + +} // namespace fesa diff --git a/src/fesa/io/abaqus/domain_mapping_context.cpp b/src/fesa/io/abaqus/domain_mapping_context.cpp index c60519e..87984a3 100644 --- a/src/fesa/io/abaqus/domain_mapping_context.cpp +++ b/src/fesa/io/abaqus/domain_mapping_context.cpp @@ -107,6 +107,9 @@ struct RawMaterial { struct RawStep { SourceLocation location; bool has_static{false}; + StaticProcedureKind procedure_kind{ + StaticProcedureKind::kLinearSmallDisplacement}; + bool nlgeom{false}; std::array static_values{}; std::vector boundaries; std::vector loads; @@ -343,6 +346,27 @@ class DomainMappingContext::Impl { return true; } + bool ParseNonlinearStaticDouble(const std::string& text, double& value, + const SourceLocation& location, + const std::string& keyword) { + if (text.empty()) { + return InputFailure("invalid-nonlinear-static-data", location, keyword, + text, + "A nonlinear STATIC field cannot be empty."); + } + char* end = nullptr; + errno = 0; + const double parsed = std::strtod(text.c_str(), &end); + if (errno == ERANGE || end != text.c_str() + text.size() || + !std::isfinite(parsed)) { + return InputFailure("invalid-nonlinear-static-data", location, keyword, + text, + "All four nonlinear STATIC fields must be finite."); + } + value = parsed; + return true; + } + bool ParseModelDouble(const std::string& text, double& value, const SourceLocation& location, const std::string& keyword, @@ -1367,9 +1391,20 @@ class DomainMappingContext::Impl { void ParseStepStart(const KeywordBlock& block) { if (step_seen_) { - InputFailure("unsupported-multiple-step", block.location, - block.canonical_name, "", - "V0 accepts exactly one analysis step."); + const auto* nlgeom = Parameter(block, "NLGEOM"); + const bool nonlinear_second_step = + nlgeom != nullptr && nlgeom->value && + AsciiCaseInsensitiveEquals(*nlgeom->value, "YES"); + if (step_.nlgeom || nonlinear_second_step) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear static subset accepts exactly one " + "procedure step."); + } else { + InputFailure("unsupported-multiple-step", block.location, + block.canonical_name, "", + "V0 accepts exactly one analysis step."); + } return; } if (!assembly_seen_ || materials_.empty()) { @@ -1382,30 +1417,37 @@ class DomainMappingContext::Impl { !RequireNoData(block)) { return; } - const auto* nlgeom = Parameter(block, "NLGEOM"); - if (nlgeom != nullptr) { - if (!nlgeom->value || nlgeom->value->empty()) { + StaticProcedureKind procedure_kind = + StaticProcedureKind::kLinearSmallDisplacement; + bool nlgeom = false; + const auto* nlgeom_parameter = Parameter(block, "NLGEOM"); + if (nlgeom_parameter != nullptr) { + if (!nlgeom_parameter->value || nlgeom_parameter->value->empty()) { InputFailure("invalid-keyword-parameter", block.location, block.canonical_name, "NLGEOM", - "NLGEOM requires NO in the approved subset."); + "NLGEOM requires YES or NO in the approved subset."); return; } - if (!AsciiCaseInsensitiveEquals(*nlgeom->value, "NO")) { - if (model_element_family_ == ElementFamily::kShell) { - InputFailure("unsupported-nonlinear-geometry", block.location, - block.canonical_name, *nlgeom->value, - "Only absent NLGEOM or NLGEOM=NO is supported."); - } else { - ModelFailure("unsupported-nonlinear-geometry", block.location, - block.canonical_name, *nlgeom->value, - "Only absent NLGEOM or NLGEOM=NO is supported."); + if (AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "YES")) { + if (model_element_family_ != ElementFamily::kShell) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, *nlgeom_parameter->value, + "NLGEOM=YES requires an S4 or S4R shell model."); + return; } + procedure_kind = StaticProcedureKind::kNonlinearFullNewton; + nlgeom = true; + } else if (!AsciiCaseInsensitiveEquals(*nlgeom_parameter->value, "NO")) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, *nlgeom_parameter->value, + "NLGEOM must select YES or NO."); return; } } step_seen_ = true; in_step_ = true; - step_ = RawStep{block.location, false, {}, {}, {}}; + step_ = RawStep{block.location, false, procedure_kind, nlgeom, {}, {}, + {}}; step_load_seen_ = false; step_no_op_seen_ = false; } @@ -1485,6 +1527,14 @@ class DomainMappingContext::Impl { ParseOutputChild(block); } else { active_output_ = false; + if (step_.procedure_kind == + StaticProcedureKind::kNonlinearFullNewton && + !step_.has_static) { + InputFailure("unsupported-analysis-procedure", block.location, + block.canonical_name, "", + "The nonlinear step supports only the STATIC procedure."); + return; + } RejectUnknown(block); } } @@ -1493,41 +1543,75 @@ class DomainMappingContext::Impl { if (step_.has_static || !ValidateParameters(block, {}) || block.data.size() != 1U || block.data[0].fields.size() != 4U) { if (!failure_) { - InputFailure("invalid-static-data", block.location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.location, block.canonical_name, "", "STATIC requires exactly one row of four values."); } return; } for (std::size_t field = 0U; field < 4U; ++field) { - if (!ParseDouble(block.data[0].fields[field], step_.static_values[field], - block.data[0].location, block.canonical_name)) { + const std::string& text = block.data[0].fields[field]; + const bool parsed = step_.nlgeom + ? ParseNonlinearStaticDouble( + text, step_.static_values[field], + block.data[0].location, + block.canonical_name) + : ParseDouble(text, step_.static_values[field], + block.data[0].location, + block.canonical_name); + if (!parsed) { return; } if (step_.static_values[field] <= 0.0) { - InputFailure("invalid-static-data", block.data[0].location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.data[0].location, block.canonical_name, "", "All four STATIC fields must be positive."); return; } } if (step_.static_values[2] > step_.static_values[3]) { - InputFailure("invalid-static-data", block.data[0].location, + InputFailure(step_.nlgeom ? "invalid-nonlinear-static-data" + : "invalid-static-data", + block.data[0].location, block.canonical_name, "", "STATIC minimum increment cannot exceed maximum increment."); return; } + if (step_.nlgeom && step_.static_values[1] != 1.0) { + InputFailure("invalid-nonlinear-static-data", block.data[0].location, + block.canonical_name, "", + "The nonlinear STATIC time period must be exactly 1.0."); + return; + } step_.has_static = true; } void ParseOutputRoot(const KeywordBlock& block) { + if (!ValidateParameters(block, {"FIELD", "HISTORY", "VARIABLE"})) { + return; + } const auto* field = Parameter(block, "FIELD"); const auto* history = Parameter(block, "HISTORY"); + const auto* variable = Parameter(block, "VARIABLE"); if ((field == nullptr) == (history == nullptr) || (field != nullptr && field->value) || (history != nullptr && history->value)) { - InputFailure("unsupported-keyword", block.location, block.canonical_name, - "", "OUTPUT must select exactly FIELD or HISTORY."); + InputFailure(step_.nlgeom ? "invalid-keyword-parameter" + : "unsupported-keyword", + block.location, block.canonical_name, "", + "OUTPUT must select exactly FIELD or HISTORY."); + return; + } + if (step_.nlgeom && + (variable == nullptr || !variable->value || + !AsciiCaseInsensitiveEquals(*variable->value, "PRESELECT"))) { + InputFailure("invalid-keyword-parameter", block.location, + block.canonical_name, "VARIABLE", + "Nonlinear OUTPUT requires VARIABLE=PRESELECT."); return; } active_output_ = true; @@ -2176,10 +2260,10 @@ class DomainMappingContext::Impl { // Static time-control values are provenance only: V0 creates exactly // the canonical final frame 0 and performs no increment loop here. - definition_.steps.push_back({"Step-1", std::move(boundaries), step_.loads, - step_.static_values[0], step_.static_values[1], - step_.static_values[2], step_.static_values[3], - step_.location}); + definition_.steps.push_back( + {"Step-1", std::move(boundaries), step_.loads, step_.procedure_kind, + step_.nlgeom, step_.static_values[0], step_.static_values[1], + step_.static_values[2], step_.static_values[3], step_.location}); } const ParsedInput& input_; diff --git a/src/fesa/io/hdf5/hdf5_primitives.cpp b/src/fesa/io/hdf5/hdf5_primitives.cpp index c58076e..1256580 100644 --- a/src/fesa/io/hdf5/hdf5_primitives.cpp +++ b/src/fesa/io/hdf5/hdf5_primitives.cpp @@ -138,6 +138,34 @@ void WriteUint64Attribute(const hid_t object, const char* name, "Unable to write an HDF5 integer attribute."); } +void WriteUint8Attribute(const hid_t object, const char* name, + const std::uint8_t value) { + Hdf5Handle space{RequireHdf5Id(H5Screate(H5S_SCALAR), + "Unable to create an attribute space."), + H5Sclose}; + Hdf5Handle attribute{ + RequireHdf5Id(H5Acreate2(object, name, H5T_STD_U8LE, space.Get(), + H5P_DEFAULT, H5P_DEFAULT), + "Unable to create an HDF5 uint8 attribute."), + H5Aclose}; + RequireHdf5(H5Awrite(attribute.Get(), H5T_NATIVE_UINT8, &value), + "Unable to write an HDF5 uint8 attribute."); +} + +void WriteDoubleAttribute(const hid_t object, const char* name, + const double value) { + Hdf5Handle space{RequireHdf5Id(H5Screate(H5S_SCALAR), + "Unable to create an attribute space."), + H5Sclose}; + Hdf5Handle attribute{ + RequireHdf5Id(H5Acreate2(object, name, H5T_IEEE_F64LE, space.Get(), + H5P_DEFAULT, H5P_DEFAULT), + "Unable to create an HDF5 float64 attribute."), + H5Aclose}; + RequireHdf5(H5Awrite(attribute.Get(), H5T_NATIVE_DOUBLE, &value), + "Unable to write an HDF5 float64 attribute."); +} + Hdf5Handle CreateGroup(const hid_t file, const char* path) { Hdf5Handle link_properties{RequireHdf5Id(H5Pcreate(H5P_LINK_CREATE), "Unable to create link properties."), diff --git a/src/fesa/io/hdf5/hdf5_primitives.h b/src/fesa/io/hdf5/hdf5_primitives.h index 429448b..da215e4 100644 --- a/src/fesa/io/hdf5/hdf5_primitives.h +++ b/src/fesa/io/hdf5/hdf5_primitives.h @@ -97,6 +97,8 @@ Hdf5Handle MakeUtf8StringType(); void WriteStringAttribute(hid_t object, const char* name, const std::string& value); void WriteUint64Attribute(hid_t object, const char* name, std::uint64_t value); +void WriteUint8Attribute(hid_t object, const char* name, std::uint8_t value); +void WriteDoubleAttribute(hid_t object, const char* name, double value); Hdf5Handle CreateGroup(hid_t file, const char* path); Hdf5Handle CreateDatasetSpace(const std::vector& dimensions); void WriteResultAttributes(hid_t dataset, const std::string& component_names, diff --git a/src/fesa/io/hdf5/hdf5_self_check.cpp b/src/fesa/io/hdf5/hdf5_self_check.cpp index 833c7aa..6a77619 100644 --- a/src/fesa/io/hdf5/hdf5_self_check.cpp +++ b/src/fesa/io/hdf5/hdf5_self_check.cpp @@ -59,7 +59,9 @@ void RequireStringAttribute(const hid_t object, const char* name, RequireHdf5(H5free_memory(raw), "Unable to release an HDF5 string value."); } if (actual != expected) { - throw Hdf5Failure{"An HDF5 string attribute has the wrong value."}; + throw Hdf5Failure{"HDF5 string attribute '" + std::string{name} + + "' mismatch: expected '" + expected + "', got '" + + actual + "'."}; } } @@ -99,9 +101,13 @@ void RequirePortableCompoundMember(const hid_t compound_type, name == "internal_material_id" || name == "internal_section_id" || name == "shell_section_internal_id" || name == "material_internal_id" || name == "source_line" || name == "gauss_point_index" || - name == "section_point_index" || name == "line"; + name == "section_point_index" || name == "line" || + name == "frame_index" || name == "increment_index" || + name == "iteration_count"; const bool is_float64 = name == "x1" || name == "x2" || name == "S11" || - name == "E" || name == "nu" || name == "thickness"; + name == "E" || name == "nu" || name == "thickness" || + name == "load_factor"; + const bool is_uint8 = name == "is_factor_one"; const bool is_string = name == "instance_name" || name == "source_label" || name == "source_element_type" || name == "internal_formulation" || @@ -126,6 +132,15 @@ void RequirePortableCompoundMember(const hid_t compound_type, } return; } + if (is_uint8) { + if (H5Tget_class(member_type.Get()) != H5T_INTEGER || + H5Tget_size(member_type.Get()) != sizeof(std::uint8_t) || + H5Tget_sign(member_type.Get()) != H5T_SGN_NONE || + H5Tequal(member_type.Get(), H5T_STD_U8LE) <= 0) { + throw Hdf5Failure{"A compound HDF5 field is not portable uint8."}; + } + return; + } if (is_string) { if (H5Tget_class(member_type.Get()) != H5T_STRING || H5Tis_variable_str(member_type.Get()) <= 0 || @@ -342,13 +357,159 @@ void RequireCompoundDataset(const hid_t file, const char* path, RequireHdf5(H5free_memory(raw_name), "Unable to release a compound field name."); if (actual_name != expected_members[index]) { - throw Hdf5Failure{"A compound HDF5 field has the wrong identity."}; + throw Hdf5Failure{"Compound HDF5 field identity mismatch: expected '" + + std::string{expected_members[index]} + "', got '" + + actual_name + "'."}; } RequirePortableCompoundMember(type.Get(), static_cast(index), expected_members[index]); } } +void RequireUint8Attribute(const hid_t object, const char* name, + const std::uint8_t expected) { + Hdf5Handle attribute{ + RequireHdf5Id(H5Aopen(object, name, H5P_DEFAULT), + "A mandatory HDF5 uint8 attribute is missing."), + H5Aclose}; + Hdf5Handle type{ + RequireHdf5Id(H5Aget_type(attribute.Get()), + "Unable to inspect an HDF5 uint8 attribute type."), + H5Tclose}; + if (H5Tget_class(type.Get()) != H5T_INTEGER || + H5Tget_size(type.Get()) != sizeof(std::uint8_t) || + H5Tget_sign(type.Get()) != H5T_SGN_NONE || + H5Tequal(type.Get(), H5T_STD_U8LE) <= 0) { + throw Hdf5Failure{"An HDF5 attribute is not portable uint8."}; + } + std::uint8_t actual = 0U; + RequireHdf5(H5Aread(attribute.Get(), H5T_NATIVE_UINT8, &actual), + "Unable to read an HDF5 uint8 attribute."); + if (actual != expected) { + throw Hdf5Failure{"An HDF5 uint8 attribute has the wrong value."}; + } +} + +void RequireDoubleAttribute(const hid_t object, const char* name, + const double expected) { + Hdf5Handle attribute{ + RequireHdf5Id(H5Aopen(object, name, H5P_DEFAULT), + "A mandatory HDF5 float64 attribute is missing."), + H5Aclose}; + Hdf5Handle type{ + RequireHdf5Id(H5Aget_type(attribute.Get()), + "Unable to inspect an HDF5 float64 attribute type."), + H5Tclose}; + if (H5Tget_class(type.Get()) != H5T_FLOAT || + H5Tget_size(type.Get()) != sizeof(double) || + H5Tequal(type.Get(), H5T_IEEE_F64LE) <= 0) { + throw Hdf5Failure{"An HDF5 attribute is not portable float64."}; + } + double actual = 0.0; + RequireHdf5(H5Aread(attribute.Get(), H5T_NATIVE_DOUBLE, &actual), + "Unable to read an HDF5 float64 attribute."); + if (actual != expected) { + throw Hdf5Failure{"An HDF5 float64 attribute has the wrong value."}; + } +} + +void RequireSchemaV1NumericDataset( + const hid_t file, const char* path, + const std::vector& expected_dimensions, + const char* component_names, const char* component_units, + const char* coordinate_system, const char* location, + const AcceptedFrameState* frame) { + auto dataset = OpenDatasetForCheck(file, path); + if (CheckedDimensions(dataset.Get()) != expected_dimensions) { + throw Hdf5Failure{"A schema-v1 numeric dataset has the wrong shape."}; + } + Hdf5Handle type{RequireHdf5Id(H5Dget_type(dataset.Get()), + "Unable to inspect a schema-v1 dataset type."), + H5Tclose}; + if (H5Tget_class(type.Get()) != H5T_FLOAT || + H5Tget_size(type.Get()) != sizeof(double) || + H5Tequal(type.Get(), H5T_IEEE_F64LE) <= 0) { + throw Hdf5Failure{"A schema-v1 numeric dataset is not float64."}; + } + RequireUint64Attribute(dataset.Get(), "schema_version", 1U); + RequireStringAttribute(dataset.Get(), "component_names", component_names); + RequireStringAttribute(dataset.Get(), "component_unit_dimensions", + component_units); + RequireStringAttribute(dataset.Get(), "coordinate_system", + coordinate_system); + RequireStringAttribute(dataset.Get(), "location", location); + if (frame != nullptr) { + RequireStringAttribute(dataset.Get(), "step_name", "Step-1"); + RequireUint64Attribute(dataset.Get(), "frame_index", frame->frame_index); + RequireUint64Attribute(dataset.Get(), "increment_index", + frame->increment_index); + RequireDoubleAttribute(dataset.Get(), "load_factor", frame->load_factor); + RequireUint8Attribute(dataset.Get(), "is_factor_one", + frame->is_factor_one ? 1U : 0U); + } + std::size_t value_count = 1U; + for (const hsize_t dimension : expected_dimensions) { + std::size_t next = 0U; + if (!SizeProductFits(value_count, static_cast(dimension), + next)) { + throw Hdf5Failure{"A schema-v1 numeric shape overflows size_t."}; + } + value_count = next; + } + std::vector values(value_count); + if (!values.empty()) { + RequireHdf5(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()), + "Unable to read a schema-v1 numeric dataset."); + } + if (!std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); })) { + throw Hdf5Failure{"A schema-v1 numeric dataset contains a nonfinite value."}; + } +} + +void RequireSchemaV1MaskDataset(const hid_t file, + const std::vector& dimensions) { + auto dataset = OpenDatasetForCheck(file, "/model/nodal_constraint_mask"); + if (CheckedDimensions(dataset.Get()) != dimensions) { + throw Hdf5Failure{"The schema-v1 constraint mask has the wrong shape."}; + } + Hdf5Handle type{RequireHdf5Id(H5Dget_type(dataset.Get()), + "Unable to inspect the constraint mask type."), + H5Tclose}; + if (H5Tget_class(type.Get()) != H5T_INTEGER || + H5Tget_size(type.Get()) != sizeof(std::uint8_t) || + H5Tget_sign(type.Get()) != H5T_SGN_NONE || + H5Tequal(type.Get(), H5T_STD_U8LE) <= 0) { + throw Hdf5Failure{"The schema-v1 constraint mask is not uint8."}; + } + RequireUint64Attribute(dataset.Get(), "schema_version", 1U); + RequireStringAttribute(dataset.Get(), "component_names", "UX,UY,UZ,URX,URY,URZ"); + RequireStringAttribute(dataset.Get(), "component_unit_dimensions", + "1,1,1,1,1,1"); + RequireStringAttribute(dataset.Get(), "coordinate_system", "global-cartesian"); + RequireStringAttribute(dataset.Get(), "location", "nodal-constraint"); + RequireStringAttribute(dataset.Get(), "value_meaning", "0=free,1=constrained"); +} + +void RequireSchemaV1ShellIdentity(const hid_t file, const char* path, + const bool has_section_positions, + const std::string& frame_root) { + auto dataset = OpenDatasetForCheck(file, path); + RequireStringAttribute(dataset.Get(), "source_element_type_dataset", + "/model/elements.source_element_type"); + RequireStringAttribute(dataset.Get(), "internal_formulation", + "FESA-MITC4-total-lagrangian"); + RequireStringAttribute(dataset.Get(), "midsurface_location_dataset", + "/model/shell/midsurface_locations"); + RequireStringAttribute(dataset.Get(), "local_frame_dataset", + frame_root + "/element/shell/local_frame"); + if (has_section_positions) { + RequireStringAttribute(dataset.Get(), "section_position_dataset", + "/model/shell/section_positions"); + } +} + /// @brief Reopens the closed candidate and verifies its required external /// schema. void SelfCheckFile(const std::filesystem::path& path, const Domain& domain, @@ -594,6 +755,175 @@ void SelfCheckFile(const std::filesystem::path& path, const Domain& domain, "Unable to close the read-only HDF5 schema self-check handle."); } +void NonlinearSelfCheckFile(const std::filesystem::path& path, + const Domain& domain, + const NonlinearAnalysisState& state, + const std::size_t diagnostic_count) { + if (H5Fis_hdf5(path.string().c_str()) <= 0) { + throw Hdf5Failure{"The nonlinear candidate is not an HDF5 file."}; + } + Hdf5Handle file{ + RequireHdf5Id(H5Fopen(path.string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT), + "Unable to reopen nonlinear candidate read-only."), + H5Fclose}; + Hdf5Handle metadata{ + RequireHdf5Id(H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT), + "The nonlinear metadata group is missing."), + H5Gclose}; + RequireUint64Attribute(metadata.Get(), "schema_version", 1U); + RequireStringAttribute(metadata.Get(), "feature_id", + "nonlinear-static-newton-raphson"); + RequireStringAttribute(metadata.Get(), "solver_version", + std::string{SolverVersion()}); + RequireStringAttribute(metadata.Get(), "source_input_identity", + SourceInputIdentity(domain)); + RequireStringAttribute(metadata.Get(), "unit_system_label", + "user-consistent-unspecified"); + RequireStringAttribute( + metadata.Get(), "coordinate_convention", + "global-cartesian; shell-local=fixed-initial-reference; " + "positive-thickness=+zeta"); + RequireStringAttribute(metadata.Get(), "analysis_procedure", + "nonlinear-static-full-newton"); + RequireStringAttribute(metadata.Get(), "internal_formulation", + "FESA-MITC4-total-lagrangian"); + RequireStringAttribute(metadata.Get(), "integration_rule", + "2x2x2-gauss; mitc4-edge-midpoint-shear"); + RequireStringAttribute(metadata.Get(), "step_name", "Step-1"); + RequireStringAttribute(metadata.Get(), "frame_indexing", + "accepted-increment-order-zero-based"); + RequireUint8Attribute(metadata.Get(), "factor_zero_is_frame", 0U); + RequireDoubleAttribute(metadata.Get(), "factor_zero_load_factor", 0.0); + + const hsize_t node_count = static_cast(domain.Nodes().size()); + const hsize_t element_count = + static_cast(domain.ShellElements().Size()); + const std::vector nodal_dimensions{node_count, kDofsPerNode}; + RequireCompoundDataset(file.Get(), "/model/nodes", node_count, + {"internal_node_id", "instance_name", "source_label", + "coordinates"}); + RequireCompoundDataset( + file.Get(), "/model/elements", element_count, + {"internal_element_id", "instance_name", "source_label", + "source_element_type", "internal_formulation", "node_internal_ids", + "shell_section_internal_id", "material_internal_id"}); + RequireCompoundDataset(file.Get(), "/model/shell/materials", + static_cast(domain.LinearElasticMaterials().Size()), + {"internal_material_id", "name", "E", "nu"}); + RequireCompoundDataset( + file.Get(), "/model/shell/sections", + static_cast(domain.ShellSections().Size()), + {"internal_section_id", "source_file", "source_line", "source_elset", + "material_internal_id", "thickness"}); + RequireSchemaV1NumericDataset( + file.Get(), "/model/shell/nodal_director", {node_count, 3U}, "D1,D2,D3", + "1,1,1", "global-cartesian", "nodal-initial-director", nullptr); + RequireSchemaV1NumericDataset( + file.Get(), "/model/shell/nodal_frame", {node_count, 3U, 3U}, "X,Y,Z", + "1,1,1", "global-cartesian", "nodal-initial-frame", nullptr); + RequireSchemaV1MaskDataset(file.Get(), nodal_dimensions); + RequireSchemaV1NumericDataset( + file.Get(), "/model/prescribed_displacement_start", nodal_dimensions, + "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal-prescribed-start", nullptr); + RequireSchemaV1NumericDataset( + file.Get(), "/model/prescribed_displacement_target", nodal_dimensions, + "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal-prescribed-target", nullptr); + RequireSchemaV1NumericDataset(file.Get(), "/model/shell/midsurface_locations", + {4U, 2U}, "XI,ETA", "1,1", "shell-natural", + "midsurface-location", nullptr); + RequireSchemaV1NumericDataset(file.Get(), "/model/shell/section_positions", + {3U}, "ZETA", "1", "shell-natural", + "section-position", nullptr); + + const auto& frames = state.AcceptedFrames(); + RequireCompoundDataset(file.Get(), "/steps/Step-1/accepted_frames", + static_cast(frames.size()), + {"frame_index", "increment_index", "load_factor", + "iteration_count", "is_factor_one"}); + if (H5Lexists(file.Get(), "/steps/Step-1/trial_history", H5P_DEFAULT) != 0) { + throw Hdf5Failure{"Schema v1 must not contain nonlinear trial history."}; + } + for (const auto& frame : frames) { + const std::string root = "/steps/Step-1/frames/" + + std::to_string(frame.frame_index); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/displacement").c_str(), nodal_dimensions, + "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/triad").c_str(), {node_count, 3U, 3U}, + "X,Y,Z", "1,1,1", "global-cartesian", "nodal-triad", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/director").c_str(), {node_count, 3U}, + "D1,D2,D3", "1,1,1", "global-cartesian", "nodal-director", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/generalized_internal_force").c_str(), + nodal_dimensions, "FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/generalized_external_force").c_str(), + nodal_dimensions, "FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/generalized_residual").c_str(), + nodal_dimensions, "RU1,RU2,RU3,RPHI1,RPHI2,RPHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/nodal/reaction").c_str(), nodal_dimensions, + "RF1,RF2,RF3,RM1,RM2,RM3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", &frame); + const std::string shell_root = root + "/element/shell"; + RequireSchemaV1NumericDataset( + file.Get(), (shell_root + "/local_frame").c_str(), + {element_count, 4U, 3U, 3U}, "X,Y,Z", "1,1,1", "global-cartesian", + "shell-local-frame", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (shell_root + "/generalized_strain").c_str(), + {element_count, 4U, 8U}, "E11,E22,G12,K11,K22,K12,G13,G23", + "1,1,1,1/length,1/length,1/length,1,1", "shell-local", "midsurface", + &frame); + RequireSchemaV1ShellIdentity(file.Get(), + (shell_root + "/generalized_strain").c_str(), + false, root); + RequireSchemaV1NumericDataset( + file.Get(), (shell_root + "/section_resultant").c_str(), + {element_count, 4U, 8U}, "N11,N22,N12,M11,M22,M12,Q13,Q23", + "force/length,force/length,force/length,force,force,force,force/length," + "force/length", + "shell-local", "midsurface", &frame); + RequireSchemaV1ShellIdentity(file.Get(), + (shell_root + "/section_resultant").c_str(), + false, root); + RequireSchemaV1NumericDataset( + file.Get(), (shell_root + "/stress").c_str(), + {element_count, 4U, 3U, 3U}, "S11,S22,S12", + "force/length^2,force/length^2,force/length^2", "shell-local", + "section-position", &frame); + RequireSchemaV1ShellIdentity(file.Get(), (shell_root + "/stress").c_str(), + true, root); + RequireSchemaV1NumericDataset(file.Get(), (root + "/global/energy").c_str(), + {1U}, "PHYSICAL_STRAIN_ENERGY", "force*length", + "global", "global", &frame); + RequireSchemaV1NumericDataset( + file.Get(), (root + "/global/equilibrium").c_str(), {6U}, + "FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "global-balance-error", &frame); + } + RequireCompoundDataset(file.Get(), "/diagnostics", + static_cast(diagnostic_count), + {"severity", "code", "file", "line", "keyword", + "entity_identity", "message"}); + RequireHdf5(file.CloseChecked(), + "Unable to close nonlinear read-only self-check file."); +} + Status SelfCheck(const std::filesystem::path& path, const Domain& domain, const AnalysisState& state, const std::size_t diagnostic_count, const WriterModelData& model_data) { @@ -607,4 +937,18 @@ Status SelfCheck(const std::filesystem::path& path, const Domain& domain, } } +Status NonlinearSelfCheck(const std::filesystem::path& path, + const Domain& domain, + const NonlinearAnalysisState& state, + const std::size_t diagnostic_count) { + try { + NonlinearSelfCheckFile(path, domain, state, diagnostic_count); + return Status::Ok(); + } catch (const Hdf5Failure& failure) { + return OutputFailure("hdf5-write-failure", failure.what()); + } catch (const std::exception& failure) { + return OutputFailure("hdf5-write-failure", failure.what()); + } +} + } // namespace fesa::hdf5_internal diff --git a/src/fesa/io/hdf5/hdf5_self_check.h b/src/fesa/io/hdf5/hdf5_self_check.h index b076b1e..be6fb94 100644 --- a/src/fesa/io/hdf5/hdf5_self_check.h +++ b/src/fesa/io/hdf5/hdf5_self_check.h @@ -5,6 +5,7 @@ #include #include "fesa/analysis/analysis_state.h" +#include "fesa/analysis/nonlinear_analysis_state.h" #include "fesa/core/status.h" #include "fesa/model/domain.h" #include "io/hdf5/hdf5_primitives.h" @@ -16,6 +17,12 @@ Status SelfCheck(const std::filesystem::path& path, const Domain& domain, const AnalysisState& state, std::size_t diagnostic_count, const WriterModelData& model_data); +/// @brief Reopens and validates the complete closed schema-v1 candidate. +Status NonlinearSelfCheck(const std::filesystem::path& path, + const Domain& domain, + const NonlinearAnalysisState& state, + std::size_t diagnostic_count); + } // namespace fesa::hdf5_internal #endif // FESA_IO_HDF5_HDF5_SELF_CHECK_H_ diff --git a/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp b/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp new file mode 100644 index 0000000..dd75d69 --- /dev/null +++ b/src/fesa/io/hdf5/nonlinear_hdf5_results_writer.cpp @@ -0,0 +1,1113 @@ +#include "fesa/io/hdf5/nonlinear_hdf5_results_writer.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/build_info.h" +#include "fesa/elements/finite_rotation.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/math/vector3.h" +#include "io/hdf5/hdf5_atomic_file.h" +#include "io/hdf5/hdf5_primitives.h" +#include "io/hdf5/hdf5_raii.h" +#include "io/hdf5/hdf5_self_check.h" + +namespace fesa { +namespace { + +using hdf5_internal::Hdf5Failure; +using hdf5_internal::Hdf5Handle; + +constexpr std::size_t kDofsPerNode = 6U; +constexpr std::size_t kShellLocationsPerElement = 4U; +constexpr std::size_t kSectionPositions = 3U; + +struct NonlinearModelData { + std::vector constraint_mask; + std::vector prescribed_start; + std::vector prescribed_target; +}; + +struct NodeWriteRow { + std::uint64_t internal_node_id; + const char* instance_name; + const char* source_label; + double coordinates[3]; +}; + +struct ElementWriteRow { + std::uint64_t internal_element_id; + const char* instance_name; + const char* source_label; + const char* source_element_type; + const char* internal_formulation; + std::uint64_t node_internal_ids[4]; + std::uint64_t shell_section_internal_id; + std::uint64_t material_internal_id; +}; + +struct MaterialWriteRow { + std::uint64_t internal_material_id; + const char* name; + double youngs_modulus; + double poisson_ratio; +}; + +struct SectionWriteRow { + std::uint64_t internal_section_id; + const char* source_file; + std::uint64_t source_line; + const char* source_elset; + std::uint64_t material_internal_id; + double thickness; +}; + +struct AcceptedFrameWriteRow { + std::uint64_t frame_index; + std::uint64_t increment_index; + double load_factor; + std::uint64_t iteration_count; + std::uint8_t is_factor_one; +}; + +struct DiagnosticWriteRow { + const char* severity; + const char* code; + const char* file; + std::uint64_t line; + const char* keyword; + const char* entity_identity; + const char* message; +}; + +template +bool IsFinite(const std::array& values) { + return std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); }); +} + +bool IsFinite(const Vector& values) { + for (std::size_t index = 0U; index < values.Size(); ++index) { + if (!std::isfinite(values[index])) { + return false; + } + } + return true; +} + +bool SameIdentity(const SourceEntityId& left, const SourceEntityId& right) { + return left.instance_name == right.instance_name && + left.source_label == right.source_label && + left.source_label_text == right.source_label_text; +} + +bool IsFinite(const ShellResultRow& row) { + if (!IsFinite(row.natural_coordinates) || !IsFinite(row.generalized_strain) || + !IsFinite(row.section_resultant)) { + return false; + } + for (const auto& axis : row.local_frame) { + if (!IsFinite(axis)) { + return false; + } + } + for (const auto& stress : row.stress) { + if (!std::isfinite(stress.zeta) || !IsFinite(stress.components)) { + return false; + } + } + return true; +} + +Status Failure(const char* code, const std::string& message) { + return hdf5_internal::OutputFailure(code, message); +} + +Status ValidateDomain(const Domain& domain) { + if (!domain.BeamElements().Empty() || domain.ShellElements().Empty() || + domain.Steps().Size() != 1U || !domain.Steps()[0U].IsNonlinearStatic() || + domain.Nodes().empty() || domain.SourcePath().empty() || + domain.SourceContentIdentity().empty() || + !hdf5_internal::IsValidUtf8(domain.SourceContentIdentity())) { + return Failure("invalid-result-identity", + "Schema v1 requires one nonlinear shell Domain identity."); + } + if (domain.ShellNodeInitialFrames().size() != domain.Nodes().size()) { + return Failure("invalid-result-identity", + "Every nonlinear output node requires an initial frame."); + } + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + const Node& source = domain.Nodes()[node]; + const auto& frame = domain.ShellNodeInitialFrames()[node]; + if (source.source_id.source_label <= 0 || + source.source_id.source_label_text.empty() || + !hdf5_internal::IsValidUtf8(source.source_id.instance_name) || + !hdf5_internal::IsValidUtf8(source.source_id.source_label_text) || + !Vector3{source.coordinates}.IsFinite() || + frame.node_index != static_cast(node) || + !IsFinite(frame.tangent_a) || !IsFinite(frame.tangent_b) || + !IsFinite(frame.director)) { + return Failure("invalid-result-identity", + "Nonlinear node identity or initial frame is invalid."); + } + } + for (std::size_t element = 0U; element < domain.ShellElements().Size(); + ++element) { + const auto& source = domain.ShellElements()[element]; + if (source.source_id.source_label <= 0 || + source.source_id.source_label_text.empty() || + !hdf5_internal::IsValidUtf8(source.source_id.instance_name) || + !hdf5_internal::IsValidUtf8(source.source_id.source_label_text) || + source.node_indices.size() != 4U || + source.section_index >= domain.ShellSections().Size() || + source.material_index >= domain.LinearElasticMaterials().Size() || + domain.ShellSections()[source.section_index].material_index != + source.material_index) { + return Failure("invalid-result-identity", + "Nonlinear shell element identity is invalid."); + } + for (const EntityIndex node : source.node_indices) { + if (node >= domain.Nodes().size()) { + return Failure("invalid-result-identity", + "Nonlinear shell connectivity is out of range."); + } + } + } + return Status::Ok(); +} + +Status BuildModelData(const Domain& domain, NonlinearModelData& model_data) { + auto model_result = AnalysisModel::Create(domain); + if (!model_result.HasValue()) { + return Failure("invalid-result-state", + "The nonlinear writer could not create an AnalysisModel."); + } + auto dofs_result = DofManager::Create(model_result.Value()); + if (!dofs_result.HasValue()) { + return Failure("invalid-result-state", + "The nonlinear writer could not create a DofManager."); + } + const DofManager dofs = std::move(dofs_result.Value()); + std::size_t full_dof_count = 0U; + if (!hdf5_internal::SizeProductFits(domain.Nodes().size(), kDofsPerNode, + full_dof_count) || + dofs.FullDofCount() != full_dof_count || + dofs.ConstrainedDofs().size() != dofs.PrescribedValues().Size()) { + return Failure("invalid-result-state", + "Nonlinear constraint identities have an invalid size."); + } + model_data.constraint_mask.assign(full_dof_count, 0U); + model_data.prescribed_start.assign(full_dof_count, 0.0); + model_data.prescribed_target.assign(full_dof_count, 0.0); + for (std::size_t index = 0U; index < dofs.ConstrainedDofs().size(); ++index) { + const std::size_t full_dof = dofs.ConstrainedDofs()[index]; + const double target = dofs.PrescribedValues()[index]; + if (full_dof >= full_dof_count || !std::isfinite(target)) { + return Failure("invalid-result-state", + "Nonlinear prescribed values must be finite and in range."); + } + model_data.constraint_mask[full_dof] = 1U; + model_data.prescribed_target[full_dof] = target; + } + return Status::Ok(); +} + +Status ValidateState(const Domain& domain, const NonlinearAnalysisState& state) { + const auto& frames = state.AcceptedFrames(); + if (frames.empty()) { + return Failure("invalid-result-state", + "Schema v1 requires at least one accepted frame."); + } + std::size_t full_dof_count = 0U; + std::size_t shell_row_count = 0U; + if (!hdf5_internal::SizeProductFits(domain.Nodes().size(), kDofsPerNode, + full_dof_count) || + !hdf5_internal::SizeProductFits(domain.ShellElements().Size(), + kShellLocationsPerElement, + shell_row_count)) { + return Failure("invalid-result-state", + "Nonlinear result dimensions overflow size_t."); + } + const double gauss = 1.0 / std::sqrt(3.0); + const std::array + locations{ShellMidsurfaceLocation::kGp1, ShellMidsurfaceLocation::kGp2, + ShellMidsurfaceLocation::kGp3, ShellMidsurfaceLocation::kGp4}; + const std::array, kShellLocationsPerElement> + coordinates{{{-gauss, -gauss}, {gauss, -gauss}, + {gauss, gauss}, {-gauss, gauss}}}; + for (std::size_t frame_index = 0U; frame_index < frames.size(); + ++frame_index) { + const AcceptedFrameState& frame = frames[frame_index]; + const bool final_frame = frame_index + 1U == frames.size(); + if (frame.frame_index != frame_index || frame.increment_index == 0U || + !std::isfinite(frame.load_factor) || frame.load_factor <= 0.0 || + frame.load_factor > 1.0 || frame.iteration_count == 0U || + frame.is_factor_one != final_frame || + (final_frame && frame.load_factor != 1.0) || + (!final_frame && frame.load_factor >= 1.0) || + (frame_index > 0U && + (frame.increment_index <= frames[frame_index - 1U].increment_index || + frame.load_factor <= frames[frame_index - 1U].load_factor))) { + return Failure("invalid-result-state", + "Accepted-frame ordering or factor-one identity is invalid."); + } + if (frame.nodal_internal_order.size() != domain.Nodes().size() || + frame.nodal_source_ids.size() != domain.Nodes().size() || + frame.nodal_triad.size() != domain.Nodes().size() || + frame.nodal_director.size() != domain.Nodes().size() || + frame.shell_results.size() != shell_row_count || + !std::isfinite(frame.physical_strain_energy) || + !IsFinite(frame.global_equilibrium)) { + return Failure("invalid-result-state", + "Accepted-frame identity or physical inventory is invalid."); + } + const std::array vectors{ + &frame.generalized_coordinates, &frame.displacement, + &frame.rotation_vector, &frame.internal_force, + &frame.external_force, &frame.residual, + &frame.reaction}; + for (const Vector* values : vectors) { + if (values->Size() != full_dof_count || !IsFinite(*values)) { + return Failure("invalid-result-state", + "Accepted-frame vectors must be finite node-by-six data."); + } + } + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + if (frame.nodal_internal_order[node] != node || + !SameIdentity(frame.nodal_source_ids[node], + domain.Nodes()[node].source_id) || + !IsFinite(frame.nodal_triad[node][0U]) || + !IsFinite(frame.nodal_triad[node][1U]) || + !IsFinite(frame.nodal_triad[node][2U]) || + !IsFinite(frame.nodal_director[node])) { + return Failure("invalid-result-state", + "Accepted-frame nodal identity is invalid."); + } + } + for (std::size_t row_index = 0U; row_index < shell_row_count; + ++row_index) { + const ShellResultRow& row = frame.shell_results[row_index]; + const std::size_t element = row_index / kShellLocationsPerElement; + const std::size_t location = row_index % kShellLocationsPerElement; + if (row.element != element || row.location != locations[location] || + row.natural_coordinates != coordinates[location] || !IsFinite(row)) { + return Failure("invalid-result-state", + "Accepted shell rows must preserve element and GP order."); + } + } + } + return Status::Ok(); +} + +void WriteCommonNumericAttributes(const hid_t dataset, + const std::string& component_names, + const std::string& component_units, + const std::string& coordinate_system, + const std::string& location) { + hdf5_internal::WriteUint64Attribute(dataset, "schema_version", 1U); + hdf5_internal::WriteStringAttribute(dataset, "component_names", + component_names); + hdf5_internal::WriteStringAttribute(dataset, "component_unit_dimensions", + component_units); + hdf5_internal::WriteStringAttribute(dataset, "coordinate_system", + coordinate_system); + hdf5_internal::WriteStringAttribute(dataset, "location", location); +} + +void WriteFrameAttributes(const hid_t dataset, const AcceptedFrameState& frame) { + hdf5_internal::WriteStringAttribute(dataset, "step_name", "Step-1"); + hdf5_internal::WriteUint64Attribute(dataset, "frame_index", frame.frame_index); + hdf5_internal::WriteUint64Attribute(dataset, "increment_index", + frame.increment_index); + hdf5_internal::WriteDoubleAttribute(dataset, "load_factor", + frame.load_factor); + hdf5_internal::WriteUint8Attribute(dataset, "is_factor_one", + frame.is_factor_one ? 1U : 0U); +} + +Hdf5Handle WriteModelDoubleDataset( + const hid_t file, const std::string& path, + const std::vector& dimensions, const double* values, + const std::size_t value_count, const std::string& component_names, + const std::string& component_units, const std::string& coordinate_system, + const std::string& location) { + auto dataset = hdf5_internal::WriteDoubleValues(file, path, dimensions, values, + value_count); + WriteCommonNumericAttributes(dataset.Get(), component_names, component_units, + coordinate_system, location); + return dataset; +} + +Hdf5Handle WriteFrameDoubleDataset( + const hid_t file, const std::string& path, + const std::vector& dimensions, const double* values, + const std::size_t value_count, const std::string& component_names, + const std::string& component_units, const std::string& coordinate_system, + const std::string& location, const AcceptedFrameState& frame) { + auto dataset = WriteModelDoubleDataset(file, path, dimensions, values, + value_count, component_names, + component_units, coordinate_system, + location); + WriteFrameAttributes(dataset.Get(), frame); + return dataset; +} + +void WriteMetadata(const hid_t file, const Domain& domain) { + auto metadata = hdf5_internal::CreateGroup(file, "/metadata"); + hdf5_internal::WriteUint64Attribute(metadata.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(metadata.Get(), "feature_id", + "nonlinear-static-newton-raphson"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "solver_version", + std::string{SolverVersion()}); + hdf5_internal::WriteStringAttribute(metadata.Get(), "source_input_identity", + hdf5_internal::SourceInputIdentity(domain)); + hdf5_internal::WriteStringAttribute(metadata.Get(), "unit_system_label", + "user-consistent-unspecified"); + hdf5_internal::WriteStringAttribute( + metadata.Get(), "coordinate_convention", + "global-cartesian; shell-local=fixed-initial-reference; " + "positive-thickness=+zeta"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "analysis_procedure", + "nonlinear-static-full-newton"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "internal_formulation", + "FESA-MITC4-total-lagrangian"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "integration_rule", + "2x2x2-gauss; mitc4-edge-midpoint-shear"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "step_name", "Step-1"); + hdf5_internal::WriteStringAttribute(metadata.Get(), "frame_indexing", + "accepted-increment-order-zero-based"); + hdf5_internal::WriteUint8Attribute(metadata.Get(), "factor_zero_is_frame", + 0U); + hdf5_internal::WriteDoubleAttribute(metadata.Get(), "factor_zero_load_factor", + 0.0); +} + +void WriteNodes(const hid_t file, const Domain& domain) { + std::vector rows; + rows.reserve(domain.Nodes().size()); + for (std::size_t index = 0U; index < domain.Nodes().size(); ++index) { + const Node& node = domain.Nodes()[index]; + rows.push_back({static_cast(index), + node.source_id.instance_name.c_str(), + node.source_id.source_label_text.c_str(), + {node.coordinates[0U], node.coordinates[1U], + node.coordinates[2U]}}); + } + auto string_type = hdf5_internal::MakeUtf8StringType(); + const hsize_t coordinate_dimensions[] = {3U}; + Hdf5Handle file_coordinates{hdf5_internal::RequireHdf5Id( + H5Tarray_create2(H5T_IEEE_F64LE, 1, + coordinate_dimensions), + "Unable to create node coordinate type."), + H5Tclose}; + Hdf5Handle memory_coordinates{hdf5_internal::RequireHdf5Id( + H5Tarray_create2(H5T_NATIVE_DOUBLE, 1, + coordinate_dimensions), + "Unable to create node memory type."), + H5Tclose}; + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(NodeWriteRow)), + "Unable to create nonlinear node file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(NodeWriteRow)), + "Unable to create nonlinear node memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type, + const hid_t coordinate_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "internal_node_id", HOFFSET(NodeWriteRow, internal_node_id), + integer_type), + "Unable to define nonlinear node ID."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "instance_name", HOFFSET(NodeWriteRow, instance_name), + string_type.Get()), + "Unable to define nonlinear node instance."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_label", HOFFSET(NodeWriteRow, source_label), + string_type.Get()), + "Unable to define nonlinear node source label."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "coordinates", HOFFSET(NodeWriteRow, coordinates), + coordinate_type), + "Unable to define nonlinear node coordinates."); + }; + insert(file_type.Get(), H5T_STD_U64LE, file_coordinates.Get()); + insert(memory_type.Get(), H5T_NATIVE_UINT64, memory_coordinates.Get()); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/model/nodes", rows.size(), file_type.Get(), memory_type.Get(), + rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(dataset.Get(), "coordinate_system", + "global-cartesian"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "component_names", "X,Y,Z"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "component_unit_dimensions", + "length,length,length"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "location", + "nodal-reference"); +} + +void WriteElements(const hid_t file, const Domain& domain) { + std::vector rows; + rows.reserve(domain.ShellElements().Size()); + for (std::size_t index = 0U; index < domain.ShellElements().Size(); ++index) { + const auto& element = domain.ShellElements()[index]; + rows.push_back({static_cast(index), + element.source_id.instance_name.c_str(), + element.source_id.source_label_text.c_str(), + hdf5_internal::ShellSourceTypeName(element.source_type), + "FESA-MITC4-total-lagrangian", + {static_cast(element.node_indices[0U]), + static_cast(element.node_indices[1U]), + static_cast(element.node_indices[2U]), + static_cast(element.node_indices[3U])}, + static_cast(element.section_index), + static_cast(element.material_index)}); + } + auto string_type = hdf5_internal::MakeUtf8StringType(); + const hsize_t nodes[] = {4U}; + Hdf5Handle file_nodes{hdf5_internal::RequireHdf5Id( + H5Tarray_create2(H5T_STD_U64LE, 1, nodes), + "Unable to create shell connectivity type."), + H5Tclose}; + Hdf5Handle memory_nodes{hdf5_internal::RequireHdf5Id( + H5Tarray_create2(H5T_NATIVE_UINT64, 1, nodes), + "Unable to create shell connectivity memory type."), + H5Tclose}; + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(ElementWriteRow)), + "Unable to create shell element file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(ElementWriteRow)), + "Unable to create shell element memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type, + const hid_t node_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "internal_element_id", + HOFFSET(ElementWriteRow, internal_element_id), integer_type), + "Unable to define shell element ID."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "instance_name", HOFFSET(ElementWriteRow, instance_name), + string_type.Get()), + "Unable to define shell instance identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_label", HOFFSET(ElementWriteRow, source_label), + string_type.Get()), + "Unable to define shell source label identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_element_type", + HOFFSET(ElementWriteRow, source_element_type), + string_type.Get()), + "Unable to define shell source type identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "internal_formulation", + HOFFSET(ElementWriteRow, internal_formulation), + string_type.Get()), + "Unable to define shell formulation identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "node_internal_ids", HOFFSET(ElementWriteRow, node_internal_ids), + node_type), + "Unable to define shell connectivity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "shell_section_internal_id", + HOFFSET(ElementWriteRow, shell_section_internal_id), integer_type), + "Unable to define shell section identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "material_internal_id", + HOFFSET(ElementWriteRow, material_internal_id), integer_type), + "Unable to define shell material identity."); + }; + insert(file_type.Get(), H5T_STD_U64LE, file_nodes.Get()); + insert(memory_type.Get(), H5T_NATIVE_UINT64, memory_nodes.Get()); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/model/elements", rows.size(), file_type.Get(), memory_type.Get(), + rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(dataset.Get(), "formulation", + "FESA-MITC4-total-lagrangian"); +} + +void WriteMaterials(const hid_t file, const Domain& domain) { + std::vector rows; + rows.reserve(domain.LinearElasticMaterials().Size()); + for (std::size_t index = 0U; index < domain.LinearElasticMaterials().Size(); + ++index) { + const auto& material = domain.LinearElasticMaterials()[index]; + rows.push_back({static_cast(index), material.name.c_str(), + material.youngs_modulus, material.poisson_ratio}); + } + auto string_type = hdf5_internal::MakeUtf8StringType(); + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(MaterialWriteRow)), + "Unable to create shell material file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(MaterialWriteRow)), + "Unable to create shell material memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type, + const hid_t double_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "internal_material_id", + HOFFSET(MaterialWriteRow, internal_material_id), integer_type), + "Unable to define shell material ID."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "name", HOFFSET(MaterialWriteRow, name), string_type.Get()), + "Unable to define shell material name."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "E", HOFFSET(MaterialWriteRow, youngs_modulus), + double_type), + "Unable to define shell material E."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "nu", HOFFSET(MaterialWriteRow, poisson_ratio), + double_type), + "Unable to define shell material nu."); + }; + insert(file_type.Get(), H5T_STD_U64LE, H5T_IEEE_F64LE); + insert(memory_type.Get(), H5T_NATIVE_UINT64, H5T_NATIVE_DOUBLE); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/model/shell/materials", rows.size(), file_type.Get(), + memory_type.Get(), rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(dataset.Get(), "component_unit_dimensions", + "force/length^2,1"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "location", + "model-material"); +} + +void WriteSections(const hid_t file, const Domain& domain) { + std::vector source_files; + source_files.reserve(domain.ShellSections().Size()); + for (std::size_t index = 0U; index < domain.ShellSections().Size(); ++index) { + source_files.push_back(hdf5_internal::NormalizedPathString( + domain.ShellSections()[index].location.file)); + } + std::vector rows; + rows.reserve(domain.ShellSections().Size()); + for (std::size_t index = 0U; index < domain.ShellSections().Size(); ++index) { + const auto& section = domain.ShellSections()[index]; + rows.push_back({static_cast(index), source_files[index].c_str(), + static_cast(section.location.line), + section.name.c_str(), + static_cast(section.material_index), + section.thickness}); + } + auto string_type = hdf5_internal::MakeUtf8StringType(); + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(SectionWriteRow)), + "Unable to create shell section file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(SectionWriteRow)), + "Unable to create shell section memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type, + const hid_t double_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "internal_section_id", + HOFFSET(SectionWriteRow, internal_section_id), integer_type), + "Unable to define shell section ID."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_file", HOFFSET(SectionWriteRow, source_file), + string_type.Get()), + "Unable to define shell section source file."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_line", HOFFSET(SectionWriteRow, source_line), + integer_type), + "Unable to define shell section source line."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "source_elset", HOFFSET(SectionWriteRow, source_elset), + string_type.Get()), + "Unable to define shell section source elset."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "material_internal_id", + HOFFSET(SectionWriteRow, material_internal_id), integer_type), + "Unable to define shell section material identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "thickness", HOFFSET(SectionWriteRow, thickness), + double_type), + "Unable to define shell section thickness."); + }; + insert(file_type.Get(), H5T_STD_U64LE, H5T_IEEE_F64LE); + insert(memory_type.Get(), H5T_NATIVE_UINT64, H5T_NATIVE_DOUBLE); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/model/shell/sections", rows.size(), file_type.Get(), + memory_type.Get(), rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(dataset.Get(), "component_unit_dimensions", + "length"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "location", + "model-shell-section"); + hdf5_internal::WriteStringAttribute(dataset.Get(), "layering", + "centered-single-layer"); +} + +void WriteModelData(const hid_t file, const Domain& domain, + const NonlinearModelData& model_data) { + std::vector directors; + std::vector frames; + directors.reserve(domain.Nodes().size() * 3U); + frames.reserve(domain.Nodes().size() * 9U); + for (const auto& frame : domain.ShellNodeInitialFrames()) { + directors.insert(directors.end(), frame.director.begin(), frame.director.end()); + frames.insert(frames.end(), frame.tangent_a.begin(), frame.tangent_a.end()); + frames.insert(frames.end(), frame.tangent_b.begin(), frame.tangent_b.end()); + frames.insert(frames.end(), frame.director.begin(), frame.director.end()); + } + const hsize_t node_count = static_cast(domain.Nodes().size()); + (void)WriteModelDoubleDataset(file, "/model/shell/nodal_director", + {node_count, 3U}, directors.data(), + directors.size(), "D1,D2,D3", "1,1,1", + "global-cartesian", "nodal-initial-director"); + auto initial_frame = WriteModelDoubleDataset( + file, "/model/shell/nodal_frame", {node_count, 3U, 3U}, frames.data(), + frames.size(), "X,Y,Z", "1,1,1", "global-cartesian", + "nodal-initial-frame"); + hdf5_internal::WriteStringAttribute(initial_frame.Get(), "axis_names", "A,B,D"); + + WriteMaterials(file, domain); + WriteSections(file, domain); + const std::vector nodal_dimensions{node_count, kDofsPerNode}; + hdf5_internal::WriteUint8Dataset(file, "/model/nodal_constraint_mask", + nodal_dimensions, model_data.constraint_mask.data(), + model_data.constraint_mask.size()); + Hdf5Handle mask{hdf5_internal::RequireHdf5Id( + H5Dopen2(file, "/model/nodal_constraint_mask", H5P_DEFAULT), + "Unable to reopen nonlinear constraint mask."), + H5Dclose}; + hdf5_internal::WriteUint64Attribute(mask.Get(), "schema_version", 1U); + hdf5_internal::WriteStringAttribute(mask.Get(), "component_unit_dimensions", + "1,1,1,1,1,1"); + hdf5_internal::WriteStringAttribute(mask.Get(), "coordinate_system", + "global-cartesian"); + hdf5_internal::WriteStringAttribute(mask.Get(), "location", + "nodal-constraint"); + auto start = WriteModelDoubleDataset( + file, "/model/prescribed_displacement_start", nodal_dimensions, + model_data.prescribed_start.data(), model_data.prescribed_start.size(), + "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal-prescribed-start"); + hdf5_internal::WriteDoubleAttribute(start.Get(), "load_factor", 0.0); + auto target = WriteModelDoubleDataset( + file, "/model/prescribed_displacement_target", nodal_dimensions, + model_data.prescribed_target.data(), model_data.prescribed_target.size(), + "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal-prescribed-target"); + hdf5_internal::WriteDoubleAttribute(target.Get(), "load_factor", 1.0); + + const double gauss = 1.0 / std::sqrt(3.0); + const std::array locations{-gauss, -gauss, gauss, -gauss, + gauss, gauss, -gauss, gauss}; + (void)WriteModelDoubleDataset(file, "/model/shell/midsurface_locations", + {4U, 2U}, locations.data(), locations.size(), + "XI,ETA", "1,1", "shell-natural", + "midsurface-location"); + const std::array positions{-1.0, 0.0, 1.0}; + auto section_positions = WriteModelDoubleDataset( + file, "/model/shell/section_positions", {3U}, positions.data(), + positions.size(), "ZETA", "1", "shell-natural", "section-position"); + hdf5_internal::WriteStringAttribute(section_positions.Get(), "position_names", + "BOTTOM,MIDDLE,TOP"); +} + +void WriteAcceptedFrameTable(const hid_t file, + const std::vector& frames) { + std::vector rows; + rows.reserve(frames.size()); + for (const auto& frame : frames) { + rows.push_back({frame.frame_index, frame.increment_index, frame.load_factor, + frame.iteration_count, + frame.is_factor_one ? static_cast(1U) + : static_cast(0U)}); + } + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(AcceptedFrameWriteRow)), + "Unable to create accepted-frame file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(AcceptedFrameWriteRow)), + "Unable to create accepted-frame memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type, + const hid_t double_type, const hid_t flag_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "frame_index", HOFFSET(AcceptedFrameWriteRow, frame_index), + integer_type), + "Unable to define accepted-frame index."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "increment_index", + HOFFSET(AcceptedFrameWriteRow, increment_index), integer_type), + "Unable to define accepted increment index."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "load_factor", HOFFSET(AcceptedFrameWriteRow, load_factor), + double_type), + "Unable to define accepted-frame load factor."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "iteration_count", + HOFFSET(AcceptedFrameWriteRow, iteration_count), integer_type), + "Unable to define accepted-frame iteration count."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "is_factor_one", + HOFFSET(AcceptedFrameWriteRow, is_factor_one), flag_type), + "Unable to define accepted-frame factor-one flag."); + }; + insert(file_type.Get(), H5T_STD_U64LE, H5T_IEEE_F64LE, H5T_STD_U8LE); + insert(memory_type.Get(), H5T_NATIVE_UINT64, H5T_NATIVE_DOUBLE, + H5T_NATIVE_UINT8); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/steps/Step-1/accepted_frames", rows.size(), file_type.Get(), + memory_type.Get(), rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); +} + +std::vector CopyVector(const Vector& source) { + std::vector values(source.Size()); + for (std::size_t index = 0U; index < source.Size(); ++index) { + values[index] = source[index]; + } + return values; +} + +std::vector NodalDisplacement(const AcceptedFrameState& frame) { + std::vector values(frame.displacement.Size()); + for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); ++node) { + const std::size_t offset = kDofsPerNode * node; + for (std::size_t component = 0U; component < 3U; ++component) { + values[offset + component] = frame.displacement[offset + component]; + values[offset + 3U + component] = + frame.rotation_vector[offset + 3U + component]; + } + } + return values; +} + +std::vector FlattenTriads(const AcceptedFrameState& frame) { + std::vector values; + values.reserve(frame.nodal_triad.size() * 9U); + for (const auto& triad : frame.nodal_triad) { + for (const auto& axis : triad) { + values.insert(values.end(), axis.begin(), axis.end()); + } + } + return values; +} + +std::vector FlattenDirectors(const AcceptedFrameState& frame) { + std::vector values; + values.reserve(frame.nodal_director.size() * 3U); + for (const auto& director : frame.nodal_director) { + values.insert(values.end(), director.begin(), director.end()); + } + return values; +} + +std::vector SpatialReaction(const AcceptedFrameState& frame) { + std::vector values = CopyVector(frame.reaction); + for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); ++node) { + const std::size_t offset = kDofsPerNode * node; + const Vector3 phi{frame.rotation_vector[offset + 3U], + frame.rotation_vector[offset + 4U], + frame.rotation_vector[offset + 5U]}; + const Matrix transform = InverseTransposeLeftJacobianSO3(phi); + const std::array generalized{ + frame.reaction[offset + 3U], frame.reaction[offset + 4U], + frame.reaction[offset + 5U]}; + for (std::size_t row = 0U; row < 3U; ++row) { + values[offset + 3U + row] = 0.0; + for (std::size_t column = 0U; column < 3U; ++column) { + values[offset + 3U + row] += transform(row, column) * generalized[column]; + } + } + } + return values; +} + +void WriteShellIdentity(const hid_t dataset, const bool has_section_positions, + const std::string& local_frame_path) { + hdf5_internal::WriteStringAttribute(dataset, "source_element_type_dataset", + "/model/elements.source_element_type"); + hdf5_internal::WriteStringAttribute(dataset, "internal_formulation", + "FESA-MITC4-total-lagrangian"); + hdf5_internal::WriteStringAttribute(dataset, "midsurface_location_dataset", + "/model/shell/midsurface_locations"); + hdf5_internal::WriteStringAttribute(dataset, "local_frame_dataset", + local_frame_path); + if (has_section_positions) { + hdf5_internal::WriteStringAttribute(dataset, "section_position_dataset", + "/model/shell/section_positions"); + } +} + +void WriteFrame(const hid_t file, const Domain& domain, + const AcceptedFrameState& frame) { + const std::string root = "/steps/Step-1/frames/" + + std::to_string(frame.frame_index); + (void)hdf5_internal::CreateGroup(file, (root + "/nodal").c_str()); + (void)hdf5_internal::CreateGroup(file, (root + "/element/shell").c_str()); + (void)hdf5_internal::CreateGroup(file, (root + "/global").c_str()); + const hsize_t node_count = static_cast(domain.Nodes().size()); + const std::vector nodal_dimensions{node_count, kDofsPerNode}; + const auto displacement = NodalDisplacement(frame); + (void)WriteFrameDoubleDataset( + file, root + "/nodal/displacement", nodal_dimensions, displacement.data(), + displacement.size(), "UX,UY,UZ,URX,URY,URZ", "length,length,length,1,1,1", + "global-cartesian", "nodal", frame); + const auto triads = FlattenTriads(frame); + (void)WriteFrameDoubleDataset(file, root + "/nodal/triad", + {node_count, 3U, 3U}, triads.data(), triads.size(), + "X,Y,Z", "1,1,1", "global-cartesian", + "nodal-triad", frame); + const auto directors = FlattenDirectors(frame); + (void)WriteFrameDoubleDataset(file, root + "/nodal/director", {node_count, 3U}, + directors.data(), directors.size(), "D1,D2,D3", + "1,1,1", "global-cartesian", "nodal-director", + frame); + const auto internal = CopyVector(frame.internal_force); + (void)WriteFrameDoubleDataset( + file, root + "/nodal/generalized_internal_force", nodal_dimensions, + internal.data(), internal.size(), "FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", frame); + const auto external = CopyVector(frame.external_force); + (void)WriteFrameDoubleDataset( + file, root + "/nodal/generalized_external_force", nodal_dimensions, + external.data(), external.size(), "FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", frame); + const auto residual = CopyVector(frame.residual); + (void)WriteFrameDoubleDataset( + file, root + "/nodal/generalized_residual", nodal_dimensions, + residual.data(), residual.size(), "RU1,RU2,RU3,RPHI1,RPHI2,RPHI3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", frame); + const auto reaction = SpatialReaction(frame); + (void)WriteFrameDoubleDataset( + file, root + "/nodal/reaction", nodal_dimensions, reaction.data(), + reaction.size(), "RF1,RF2,RF3,RM1,RM2,RM3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "nodal", frame); + + std::vector local_frames; + std::vector strains; + std::vector resultants; + std::vector stresses; + local_frames.reserve(frame.shell_results.size() * 9U); + strains.reserve(frame.shell_results.size() * 8U); + resultants.reserve(frame.shell_results.size() * 8U); + stresses.reserve(frame.shell_results.size() * kSectionPositions * 3U); + for (const auto& row : frame.shell_results) { + for (const auto& axis : row.local_frame) { + local_frames.insert(local_frames.end(), axis.begin(), axis.end()); + } + strains.insert(strains.end(), row.generalized_strain.begin(), + row.generalized_strain.end()); + resultants.insert(resultants.end(), row.section_resultant.begin(), + row.section_resultant.end()); + for (const auto& stress : row.stress) { + stresses.insert(stresses.end(), stress.components.begin(), + stress.components.end()); + } + } + const hsize_t element_count = static_cast(domain.ShellElements().Size()); + const std::string shell_root = root + "/element/shell"; + auto local_frame = WriteFrameDoubleDataset( + file, shell_root + "/local_frame", {element_count, 4U, 3U, 3U}, + local_frames.data(), local_frames.size(), "X,Y,Z", "1,1,1", + "global-cartesian", "shell-local-frame", frame); + hdf5_internal::WriteStringAttribute(local_frame.Get(), "axis_names", "E1,E2,E3"); + hdf5_internal::WriteStringAttribute(local_frame.Get(), "source_element_type_dataset", + "/model/elements.source_element_type"); + hdf5_internal::WriteStringAttribute(local_frame.Get(), "internal_formulation", + "FESA-MITC4-total-lagrangian"); + hdf5_internal::WriteStringAttribute(local_frame.Get(), "midsurface_location_dataset", + "/model/shell/midsurface_locations"); + auto strain = WriteFrameDoubleDataset( + file, shell_root + "/generalized_strain", {element_count, 4U, 8U}, + strains.data(), strains.size(), "E11,E22,G12,K11,K22,K12,G13,G23", + "1,1,1,1/length,1/length,1/length,1,1", "shell-local", "midsurface", + frame); + WriteShellIdentity(strain.Get(), false, shell_root + "/local_frame"); + auto resultant = WriteFrameDoubleDataset( + file, shell_root + "/section_resultant", {element_count, 4U, 8U}, + resultants.data(), resultants.size(), "N11,N22,N12,M11,M22,M12,Q13,Q23", + "force/length,force/length,force/length,force,force,force,force/length," + "force/length", + "shell-local", "midsurface", frame); + WriteShellIdentity(resultant.Get(), false, shell_root + "/local_frame"); + auto stress = WriteFrameDoubleDataset( + file, shell_root + "/stress", {element_count, 4U, 3U, 3U}, stresses.data(), + stresses.size(), "S11,S22,S12", + "force/length^2,force/length^2,force/length^2", "shell-local", + "section-position", frame); + WriteShellIdentity(stress.Get(), true, shell_root + "/local_frame"); + (void)WriteFrameDoubleDataset(file, root + "/global/energy", {1U}, + &frame.physical_strain_energy, 1U, + "PHYSICAL_STRAIN_ENERGY", "force*length", + "global", "global", frame); + (void)WriteFrameDoubleDataset( + file, root + "/global/equilibrium", {6U}, frame.global_equilibrium.data(), + frame.global_equilibrium.size(), + "FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3", + "force,force,force,force*length,force*length,force*length", + "global-cartesian", "global-balance-error", frame); +} + +void WriteDiagnostics(const hid_t file, + const std::vector& input_diagnostics) { + std::vector diagnostics = input_diagnostics; + SortDiagnostics(diagnostics); + std::vector files; + files.reserve(diagnostics.size()); + for (const auto& diagnostic : diagnostics) { + files.push_back(hdf5_internal::NormalizedPathString(diagnostic.location.file)); + } + std::vector rows; + rows.reserve(diagnostics.size()); + for (std::size_t index = 0U; index < diagnostics.size(); ++index) { + const auto& diagnostic = diagnostics[index]; + rows.push_back({diagnostic.severity == Severity::kWarning ? "warning" : "error", + diagnostic.code.c_str(), files[index].c_str(), + static_cast(diagnostic.location.line), + diagnostic.keyword.c_str(), diagnostic.entity_identity.c_str(), + diagnostic.message.c_str()}); + } + auto string_type = hdf5_internal::MakeUtf8StringType(); + Hdf5Handle file_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(DiagnosticWriteRow)), + "Unable to create nonlinear diagnostic file type."), + H5Tclose}; + Hdf5Handle memory_type{hdf5_internal::RequireHdf5Id( + H5Tcreate(H5T_COMPOUND, sizeof(DiagnosticWriteRow)), + "Unable to create nonlinear diagnostic memory type."), + H5Tclose}; + const auto insert = [&](const hid_t type, const hid_t integer_type) { + hdf5_internal::RequireHdf5( + H5Tinsert(type, "severity", HOFFSET(DiagnosticWriteRow, severity), + string_type.Get()), + "Unable to define nonlinear diagnostic severity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "code", HOFFSET(DiagnosticWriteRow, code), + string_type.Get()), + "Unable to define nonlinear diagnostic code."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "file", HOFFSET(DiagnosticWriteRow, file), + string_type.Get()), + "Unable to define nonlinear diagnostic file."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "line", HOFFSET(DiagnosticWriteRow, line), integer_type), + "Unable to define nonlinear diagnostic line."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "keyword", HOFFSET(DiagnosticWriteRow, keyword), + string_type.Get()), + "Unable to define nonlinear diagnostic keyword."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "entity_identity", + HOFFSET(DiagnosticWriteRow, entity_identity), string_type.Get()), + "Unable to define nonlinear diagnostic entity identity."); + hdf5_internal::RequireHdf5( + H5Tinsert(type, "message", HOFFSET(DiagnosticWriteRow, message), + string_type.Get()), + "Unable to define nonlinear diagnostic message."); + }; + insert(file_type.Get(), H5T_STD_U64LE); + insert(memory_type.Get(), H5T_NATIVE_UINT64); + auto dataset = hdf5_internal::WriteCompoundDataset( + file, "/diagnostics", rows.size(), file_type.Get(), memory_type.Get(), + rows.data()); + hdf5_internal::WriteUint64Attribute(dataset.Get(), "schema_version", 1U); +} + +Status ValidateDiagnostics(const std::vector& diagnostics) { + for (const auto& diagnostic : diagnostics) { + if (!hdf5_internal::IsValidUtf8(diagnostic.code) || + !hdf5_internal::IsValidUtf8(diagnostic.keyword) || + !hdf5_internal::IsValidUtf8(diagnostic.entity_identity) || + !hdf5_internal::IsValidUtf8(diagnostic.message)) { + return Failure("invalid-result-diagnostic", + "Nonlinear diagnostic text must be valid UTF-8."); + } + } + return Status::Ok(); +} + +} // namespace + +Status NonlinearHdf5ResultsWriter::Write( + const std::filesystem::path& output_path, const Domain& domain, + const NonlinearAnalysisState& state, + const std::vector& diagnostics) { + if (output_path.empty() || output_path.filename().empty()) { + return Failure("invalid-output-path", "The HDF5 output path must name a file."); + } + const Status domain_status = ValidateDomain(domain); + if (!domain_status.IsOk()) { + return domain_status; + } + const Status state_status = ValidateState(domain, state); + if (!state_status.IsOk()) { + return state_status; + } + const Status diagnostic_status = ValidateDiagnostics(diagnostics); + if (!diagnostic_status.IsOk()) { + return diagnostic_status; + } + NonlinearModelData model_data; + const Status model_status = BuildModelData(domain, model_data); + if (!model_status.IsOk()) { + return model_status; + } + + try { + hdf5_internal::Hdf5ErrorSilencer silence_backend_errors; + const std::filesystem::path candidate_path = + hdf5_internal::MakeCandidatePath(output_path); + hdf5_internal::CandidateFileGuard cleanup{candidate_path}; + Hdf5Handle file{hdf5_internal::RequireHdf5Id( + H5Fcreate(candidate_path.string().c_str(), H5F_ACC_EXCL, + H5P_DEFAULT, H5P_DEFAULT), + "Unable to create nonlinear temporary HDF5 file."), + H5Fclose}; + (void)hdf5_internal::CreateGroup(file.Get(), "/model"); + (void)hdf5_internal::CreateGroup(file.Get(), "/model/shell"); + (void)hdf5_internal::CreateGroup(file.Get(), "/steps/Step-1"); + WriteMetadata(file.Get(), domain); + WriteNodes(file.Get(), domain); + WriteElements(file.Get(), domain); + WriteModelData(file.Get(), domain, model_data); + WriteAcceptedFrameTable(file.Get(), state.AcceptedFrames()); + for (const auto& frame : state.AcceptedFrames()) { + WriteFrame(file.Get(), domain, frame); + } + WriteDiagnostics(file.Get(), diagnostics); + hdf5_internal::RequireHdf5(H5Fflush(file.Get(), H5F_SCOPE_GLOBAL), + "Unable to flush nonlinear temporary HDF5 file."); + hdf5_internal::RequireHdf5( + file.CloseChecked(), "Unable to close nonlinear temporary HDF5 file."); + const Status self_check = hdf5_internal::NonlinearSelfCheck( + candidate_path, domain, state, diagnostics.size()); + const Status atomic = hdf5_internal::AtomicFinalizeValidatedCandidate( + candidate_path, output_path, self_check); + if (atomic.IsOk()) { + cleanup.Release(); + } + return atomic; + } catch (const Hdf5Failure& failure) { + return Failure("hdf5-write-failure", failure.what()); + } catch (const std::exception& failure) { + return Failure("hdf5-write-failure", failure.what()); + } +} + +} // namespace fesa diff --git a/src/fesa/model/domain.cpp b/src/fesa/model/domain.cpp index 60f2c5a..b9d97f1 100644 --- a/src/fesa/model/domain.cpp +++ b/src/fesa/model/domain.cpp @@ -9,6 +9,8 @@ namespace fesa { StepDefinition::StepDefinition(StaticStepDefinition definition) : name_{std::move(definition.name)}, + procedure_kind_{definition.procedure_kind}, + nlgeom_{definition.nlgeom}, initial_increment_{definition.initial_increment}, time_period_{definition.time_period}, minimum_increment_{definition.minimum_increment}, @@ -60,6 +62,14 @@ StepDefinition::ConcentratedLoads() const noexcept { return concentrated_loads_view_; } +StaticProcedureKind StepDefinition::ProcedureKind() const noexcept { + return procedure_kind_; +} + +bool StepDefinition::IsNonlinearStatic() const noexcept { + return procedure_kind_ == StaticProcedureKind::kNonlinearFullNewton; +} + double StepDefinition::InitialIncrement() const noexcept { return initial_increment_; } diff --git a/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp b/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp new file mode 100644 index 0000000..1554b67 --- /dev/null +++ b/src/fesa/solvers/linear/mkl_pardiso_tangent_solver.cpp @@ -0,0 +1,294 @@ +#include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/math/sparse_matrix.h" +#include "fesa/math/vector.h" + +namespace fesa { +namespace { + +/// @brief Builds a structured nonlinear tangent-solver failure. +Status SolverFailure(const std::string& code, const std::string& identity, + const std::string& message) { + return Status::Failure( + FailureCategory::kSolver, + {{Severity::kError, code, {{}, 0U}, "PARDISO", identity, message}}); +} + +/// @brief Translates a PARDISO phase error into the stable solver taxonomy. +Status PardisoFailure(const MKL_INT phase, const MKL_INT error) { + std::string code; + std::string reason; + switch (error) { + case -4: + code = "pardiso-zero-or-negative-pivot"; + reason = "zero or negative pivot"; + break; + case -7: + code = "pardiso-singular-diagonal"; + reason = "singular diagonal"; + break; + case -8: + code = "pardiso-integer-overflow"; + reason = "32-bit backend integer overflow"; + break; + case 21: + case 22: + case 23: + case 24: + code = "pardiso-invalid-csr"; + reason = "matrix checker rejected the CSR indices"; + break; + default: + code = phase == 11 ? "pardiso-analysis-failed" + : phase == 22 ? "pardiso-factorization-failed" + : phase == 33 ? "pardiso-solve-failed" + : "pardiso-release-failed"; + reason = "backend error"; + break; + } + + const std::string phase_text = std::to_string(phase); + const std::string error_text = std::to_string(error); + return SolverFailure(code, "phase=" + phase_text + ",error=" + error_text, + "oneMKL PARDISO phase " + phase_text + + " failed with error " + error_text + " (" + reason + + ")."); +} + +/// @brief Reports whether a public size fits the private MKL integer type. +bool ConvertsToMklInt(const std::size_t value) { + return value <= + static_cast((std::numeric_limits::max)()); +} + +} // namespace + +class MklPardisoTangentSolver::Impl { + public: + Impl() = default; + + ~Impl() { static_cast(Release()); } + + /// @brief Replaces any retained state with one validated full-CSR tangent. + Status FactorizeFresh(const SparseMatrix& matrix) { + const MKL_INT release_error = Release(); + if (release_error != 0) { + return PardisoFailure(-1, release_error); + } + + const Status csr_status = matrix.Validate(); + if (!csr_status.IsOk()) { + return SolverFailure("solver-invalid-csr", "public-csr", + "The public sparse matrix failed CSR validation."); + } + if (matrix.Rows() != matrix.Columns()) { + return SolverFailure("solver-matrix-not-square", "matrix-shape", + "PARDISO factorization requires a square matrix."); + } + if (matrix.Rows() == 0U) { + // PARDISO does not accept n=0, but a fully constrained nonlinear + // correction remains a valid factorize/solve lifecycle. + factorized_ = true; + return Status::Ok(); + } + if (!ConvertsToMklInt(matrix.Rows()) || + !ConvertsToMklInt(matrix.Values().size())) { + return SolverFailure( + "solver-dimension-overflow", "matrix-shape", + "Sparse matrix dimensions exceed the oneMKL integer range."); + } + + const Status copy_status = CopyValidatedFullCsr(matrix); + if (!copy_status.IsOk()) { + ClearOwnedArrays(); + return copy_status; + } + + // The nonlinear tangent is generally nonsymmetric, so PARDISO consumes + // the complete public CSR with mtype=11 instead of an SPD triangle. + pt_.fill(nullptr); + iparm_.fill(0); + pardisoinit(pt_.data(), &mtype_, iparm_.data()); + iparm_[26] = 1; // Validate sorted CSR integer arrays. + iparm_[34] = 1; // Consume the project's native zero-based CSR. + permutation_.assign(static_cast(equation_count_), 0); + owns_pardiso_state_ = true; + + MKL_INT phase = 11; + MKL_INT error = 0; + CallPardiso(phase, nullptr, nullptr, error); + if (error != 0) { + const Status failure = PardisoFailure(phase, error); + static_cast(Release()); + return failure; + } + + phase = 22; + error = 0; + CallPardiso(phase, nullptr, nullptr, error); + if (error != 0) { + const Status failure = PardisoFailure(phase, error); + static_cast(Release()); + return failure; + } + if (iparm_[13] != 0) { + const Status failure = SolverFailure( + "pardiso-perturbed-pivot", "phase=22", + "oneMKL PARDISO perturbed one or more tangent pivots."); + static_cast(Release()); + return failure; + } + + factorized_ = true; + return Status::Ok(); + } + + /// @brief Solves one correction while preserving caller output on failure. + Status SolveCorrection(const Vector& rhs, Vector& correction) { + if (!factorized_) { + return SolverFailure( + "solver-not-factorized", "factorization-state", + "Substitution requires a successful retained factorization."); + } + const std::size_t size = static_cast(equation_count_); + if (rhs.Size() != size || correction.Size() != size) { + return SolverFailure( + "solver-vector-dimension-mismatch", "rhs-or-correction", + "RHS and correction dimensions must match the factorized matrix."); + } + for (std::size_t index = 0U; index < rhs.Size(); ++index) { + if (!std::isfinite(rhs[index])) { + return SolverFailure("nonfinite-solver-rhs", std::to_string(index), + "PARDISO RHS values must be finite."); + } + } + if (size == 0U) { + return Status::Ok(); + } + + std::vector rhs_copy(rhs.Data(), rhs.Data() + rhs.Size()); + Vector candidate{size}; + MKL_INT phase = 33; + MKL_INT error = 0; + CallPardiso(phase, rhs_copy.data(), candidate.Data(), error); + if (error != 0) { + return PardisoFailure(phase, error); + } + for (std::size_t index = 0U; index < candidate.Size(); ++index) { + if (!std::isfinite(candidate[index])) { + return SolverFailure( + "nonfinite-solver-solution", std::to_string(index), + "PARDISO substitution produced a nonfinite solution."); + } + } + + correction = std::move(candidate); + return Status::Ok(); + } + + private: + /// @brief Copies validated public CSR without symmetry or diagonal filtering. + Status CopyValidatedFullCsr(const SparseMatrix& matrix) { + equation_count_ = static_cast(matrix.Rows()); + row_offsets_.clear(); + column_indices_.clear(); + values_.clear(); + row_offsets_.reserve(matrix.RowOffsets().size()); + column_indices_.reserve(matrix.ColumnIndices().size()); + values_.reserve(matrix.Values().size()); + + for (const std::size_t offset : matrix.RowOffsets()) { + if (!ConvertsToMklInt(offset)) { + return SolverFailure("solver-dimension-overflow", "row-offsets", + "CSR row offsets exceed the oneMKL integer " + "range."); + } + row_offsets_.push_back(static_cast(offset)); + } + for (const std::size_t column : matrix.ColumnIndices()) { + if (!ConvertsToMklInt(column)) { + return SolverFailure("solver-dimension-overflow", "column-indices", + "CSR indices exceed the oneMKL integer range."); + } + column_indices_.push_back(static_cast(column)); + } + values_ = matrix.Values(); + return Status::Ok(); + } + + /// @brief Calls PARDISO with retained private arrays and phase state. + void CallPardiso(const MKL_INT phase, double* rhs, double* correction, + MKL_INT& error) { + pardiso(pt_.data(), &max_factorizations_, &matrix_number_, &mtype_, &phase, + &equation_count_, values_.data(), row_offsets_.data(), + column_indices_.data(), permutation_.data(), &rhs_count_, + iparm_.data(), &message_level_, rhs, correction, &error); + } + + /// @brief Releases backend state and resets every retained array. + MKL_INT Release() noexcept { + MKL_INT error = 0; + if (owns_pardiso_state_) { + const MKL_INT phase = -1; + double placeholder = 0.0; + CallPardiso(phase, &placeholder, &placeholder, error); + } + owns_pardiso_state_ = false; + factorized_ = false; + pt_.fill(nullptr); + iparm_.fill(0); + permutation_.clear(); + ClearOwnedArrays(); + return error; + } + + /// @brief Clears FESA-owned CSR arrays without touching backend state. + void ClearOwnedArrays() noexcept { + equation_count_ = 0; + row_offsets_.clear(); + column_indices_.clear(); + values_.clear(); + } + + std::array pt_{}; + std::array iparm_{}; + std::vector row_offsets_; + std::vector column_indices_; + std::vector permutation_; + std::vector values_; + MKL_INT equation_count_{0}; + MKL_INT max_factorizations_{1}; + MKL_INT matrix_number_{1}; + MKL_INT mtype_{11}; + MKL_INT rhs_count_{1}; + MKL_INT message_level_{0}; + bool owns_pardiso_state_{false}; + bool factorized_{false}; +}; + +MklPardisoTangentSolver::MklPardisoTangentSolver() + : impl_{std::make_unique()} {} + +MklPardisoTangentSolver::~MklPardisoTangentSolver() = default; + +Status MklPardisoTangentSolver::FactorizeFresh(const SparseMatrix& matrix) { + return impl_->FactorizeFresh(matrix); +} + +Status MklPardisoTangentSolver::SolveCorrection(const Vector& rhs, + Vector& correction) const { + return impl_->SolveCorrection(rhs, correction); +} + +} // namespace fesa diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ef28eb2..8803f82 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,9 +6,13 @@ add_executable( unit/analysis/analysis_test.cpp unit/analysis/analysis_model_test.cpp unit/analysis/analysis_state_test.cpp + unit/analysis/nonlinear_analysis_state_test.cpp + unit/analysis/nonlinear_static_control_test.cpp + unit/analysis/newton_iteration_log_test.cpp unit/assembly/parallel_for_test.cpp unit/assembly/load_assembler_test.cpp unit/assembly/sparse_assembler_test.cpp + unit/app/output_paths_test.cpp unit/constraints/boundary_condition_test.cpp unit/constraints/essential_constraints_test.cpp unit/core/ascii_test.cpp @@ -17,7 +21,10 @@ add_executable( unit/core/status_test.cpp unit/elements/element_factory_test.cpp unit/elements/euler_beam_3d_test.cpp + unit/elements/finite_rotation_test.cpp unit/elements/mitc4_shell_test.cpp + unit/elements/nonlinear_mitc4_shell_test.cpp + unit/elements/nonlinear_mitc4_shell_tangent_test.cpp unit/fem/dof_manager_test.cpp unit/math/dense_blas_internal_test.cpp unit/math/matrix_test.cpp @@ -29,6 +36,7 @@ add_executable( unit/io/abaqus/input_reader_test.cpp unit/io/abaqus/input_syntax_test.cpp unit/io/hdf5/hdf5_results_writer_test.cpp + unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp unit/io/hdf5/hdf5_writer_components_test.cpp unit/loads/load_test.cpp unit/model/domain_test.cpp @@ -43,6 +51,7 @@ add_executable( unit/results/results_writer_test.cpp unit/solvers/linear/linear_solver_test.cpp unit/solvers/linear/mkl_pardiso_solver_test.cpp + unit/solvers/linear/tangent_solver_test.cpp ) target_include_directories( @@ -63,6 +72,7 @@ target_link_libraries( add_executable( fesa_integration_tests integration/analysis/linear_static_analysis_test.cpp + integration/analysis/nonlinear_static_procedure_test.cpp integration/app/fesa_application_test.cpp ) @@ -84,6 +94,8 @@ add_executable( reference/mitc4_reference_comparison.cpp reference/mitc4_reference_comparison_test.cpp reference/mitc4_reference_cases_test.cpp + reference/nonlinear_static_reference_comparison.cpp + reference/nonlinear_static_reference_cases_test.cpp ) target_link_libraries( diff --git a/tests/integration/analysis/linear_static_analysis_test.cpp b/tests/integration/analysis/linear_static_analysis_test.cpp index a738210..2205230 100644 --- a/tests/integration/analysis/linear_static_analysis_test.cpp +++ b/tests/integration/analysis/linear_static_analysis_test.cpp @@ -16,6 +16,7 @@ #include "fesa/analysis/analysis.h" #include "fesa/assembly/parallel_for.h" +#include "fesa/math/sparse_matrix.h" #include "fesa/results/results_writer.h" #include "fesa/solvers/linear/mkl_pardiso_solver.h" diff --git a/tests/integration/analysis/nonlinear_static_procedure_test.cpp b/tests/integration/analysis/nonlinear_static_procedure_test.cpp new file mode 100644 index 0000000..b5adfa5 --- /dev/null +++ b/tests/integration/analysis/nonlinear_static_procedure_test.cpp @@ -0,0 +1,346 @@ +#include "fesa/app/fesa_application.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/finite_rotation.h" +#include "fesa/math/vector3.h" + +namespace { + +class TempDirectory { + public: + explicit TempDirectory(const std::string& label) { + static std::atomic sequence{0U}; + const auto tick = + std::chrono::steady_clock::now().time_since_epoch().count(); + path_ = std::filesystem::temp_directory_path() / + ("fesa-step10-nonlinear-" + label + "-" + + std::to_string(tick) + "-" + + std::to_string(sequence.fetch_add(1U))); + std::error_code error; + if (!std::filesystem::create_directory(path_, error) || error) { + throw std::runtime_error{"Unable to create nonlinear procedure fixture."}; + } + } + + TempDirectory(const TempDirectory&) = delete; + TempDirectory& operator=(const TempDirectory&) = delete; + + ~TempDirectory() { + std::error_code ignored; + std::filesystem::remove_all(path_, ignored); + } + + const std::filesystem::path& Path() const noexcept { return path_; } + + private: + std::filesystem::path path_; +}; + +void WriteText(const std::filesystem::path& path, const std::string& text) { + std::ofstream stream{path, std::ios::binary | std::ios::trunc}; + stream.write(text.data(), static_cast(text.size())); + if (!stream) { + throw std::runtime_error{"Unable to write nonlinear procedure input."}; + } +} + +std::string AllConstrainedNonlinearShellDeck() { + return R"inp(*Part, name=ShellPart +*Node +1, 0., 0., 0. +2, 1., 0., 0. +3, 1., 1., 0. +4, 0., 1., 0. +*Element, type=S4 +1, 1, 2, 3, 4 +*Elset, elset=ShellSet +1 +*Shell Section, elset=ShellSet, material=Steel +0.1 +*End Part +*Assembly, name=Assembly +*Instance, name=Shell-1, part=ShellPart +*End Instance +*Nset, nset=All, instance=Shell-1 +1, 2, 3, 4 +*End Assembly +*Material, name=Steel +*Elastic +1000., 0.25 +*Boundary +All, 1, 6 +*Step, name=Step-1, nlgeom=YES +*Static +0.1, 1., 0.001, 0.1 +*End Step +)inp"; +} + +std::string NonzeroPrescribedNonlinearShellDeck() { + return R"inp(*Part, name=ShellPart +*Node +1, 0., 0., 0. +2, 1., 0., 0. +3, 1., 1., 0. +4, 0., 1., 0. +*Element, type=S4 +1, 1, 2, 3, 4 +*Elset, elset=ShellSet +1 +*Shell Section, elset=ShellSet, material=Steel +0.1 +*End Part +*Assembly, name=Assembly +*Instance, name=Shell-1, part=ShellPart +*End Instance +*Nset, nset=N1, instance=Shell-1 +1 +*Nset, nset=N2, instance=Shell-1 +2 +*Nset, nset=N3, instance=Shell-1 +3 +*Nset, nset=N4, instance=Shell-1 +4 +*End Assembly +*Material, name=Steel +*Elastic +1000., 0.25 +*Boundary +N1, 1, 6 +N2, 1, 1, 0.2 +N2, 2, 3 +N2, 4, 4, 0.3 +N2, 5, 6 +N3, 1, 6 +N4, 1, 6 +*Step, name=Step-1, nlgeom=YES +*Static +0.1, 1., 0.001, 0.1 +*Cload +N2, 3, -3. +N2, 4, 2. +*End Step +)inp"; +} + +class Hdf5File { + public: + explicit Hdf5File(const std::filesystem::path& path) + : handle_{H5Fopen(path.string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT)} { + if (handle_ < 0) { + throw std::runtime_error{"Unable to open nonlinear results HDF5."}; + } + } + + Hdf5File(const Hdf5File&) = delete; + Hdf5File& operator=(const Hdf5File&) = delete; + + ~Hdf5File() { (void)H5Fclose(handle_); } + + hid_t Get() const noexcept { return handle_; } + + private: + hid_t handle_; +}; + +std::string ReadStringAttribute(const hid_t object, const char* name) { + const hid_t attribute = H5Aopen(object, name, H5P_DEFAULT); + const hid_t type = attribute < 0 ? -1 : H5Aget_type(attribute); + if (attribute < 0 || type < 0) { + if (type >= 0) { + (void)H5Tclose(type); + } + if (attribute >= 0) { + (void)H5Aclose(attribute); + } + throw std::runtime_error{"Unable to read nonlinear metadata attribute."}; + } + char* value = nullptr; + const herr_t read = H5Aread(attribute, type, &value); + const std::string result = read >= 0 && value != nullptr ? value : ""; + if (value != nullptr) { + (void)H5free_memory(value); + } + (void)H5Tclose(type); + (void)H5Aclose(attribute); + if (read < 0) { + throw std::runtime_error{"Unable to read nonlinear metadata text."}; + } + return result; +} + +std::vector ReadNodalDataset(const Hdf5File& file, + const std::string& path) { + const hid_t dataset = H5Dopen2(file.Get(), path.c_str(), H5P_DEFAULT); + if (dataset < 0) { + throw std::runtime_error{"Unable to open nonlinear nodal dataset."}; + } + std::vector values(24U); + const herr_t read = H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()); + (void)H5Dclose(dataset); + if (read < 0 || !std::all_of(values.begin(), values.end(), + [](const double value) { + return std::isfinite(value); + })) { + throw std::runtime_error{"Unable to read nonlinear nodal dataset."}; + } + return values; +} + +std::vector ReadConstraintMask(const Hdf5File& file) { + const hid_t dataset = + H5Dopen2(file.Get(), "/model/nodal_constraint_mask", H5P_DEFAULT); + if (dataset < 0) { + throw std::runtime_error{"Unable to open nonlinear constraint mask."}; + } + std::vector values(24U); + const herr_t read = H5Dread(dataset, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()); + (void)H5Dclose(dataset); + if (read < 0 || !std::all_of(values.begin(), values.end(), + [](const std::uint8_t value) { + return value <= 1U; + })) { + throw std::runtime_error{"Unable to read nonlinear constraint mask."}; + } + return values; +} + +fesa::Vector3 SpatialMoment(const fesa::Vector3& phi, + const fesa::Vector3& generalized) { + const fesa::Matrix transform = fesa::InverseTransposeLeftJacobianSO3(phi); + return {transform(0U, 0U) * generalized.X() + + transform(0U, 1U) * generalized.Y() + + transform(0U, 2U) * generalized.Z(), + transform(1U, 0U) * generalized.X() + + transform(1U, 1U) * generalized.Y() + + transform(1U, 2U) * generalized.Z(), + transform(2U, 0U) * generalized.X() + + transform(2U, 1U) * generalized.Y() + + transform(2U, 2U) * generalized.Z()}; +} + +std::array ReconstructGlobalBalance(const Hdf5File& file) { + const std::string root = "/steps/Step-1/frames/9/nodal/"; + const auto displacement = ReadNodalDataset(file, root + "displacement"); + const auto external = + ReadNodalDataset(file, root + "generalized_external_force"); + const auto residual = + ReadNodalDataset(file, root + "generalized_residual"); + const auto mask = ReadConstraintMask(file); + const std::array initial_positions{ + fesa::Vector3{0.0, 0.0, 0.0}, fesa::Vector3{1.0, 0.0, 0.0}, + fesa::Vector3{1.0, 1.0, 0.0}, fesa::Vector3{0.0, 1.0, 0.0}}; + fesa::Vector3 applied_force_resultant; + fesa::Vector3 applied_moment_resultant; + fesa::Vector3 reaction_force_resultant; + fesa::Vector3 reaction_moment_resultant; + for (std::size_t node = 0U; node < initial_positions.size(); ++node) { + const std::size_t offset = node * 6U; + const fesa::Vector3 current_position = + initial_positions[node] + + fesa::Vector3{displacement[offset], displacement[offset + 1U], + displacement[offset + 2U]}; + const fesa::Vector3 applied_force{external[offset], external[offset + 1U], + external[offset + 2U]}; + const fesa::Vector3 reaction_force{ + mask[offset] == 1U ? residual[offset] : 0.0, + mask[offset + 1U] == 1U ? residual[offset + 1U] : 0.0, + mask[offset + 2U] == 1U ? residual[offset + 2U] : 0.0}; + const fesa::Vector3 phi{displacement[offset + 3U], + displacement[offset + 4U], + displacement[offset + 5U]}; + const fesa::Vector3 applied_moment = SpatialMoment( + phi, {external[offset + 3U], external[offset + 4U], + external[offset + 5U]}); + const fesa::Vector3 reaction_moment = SpatialMoment( + phi, {mask[offset + 3U] == 1U ? residual[offset + 3U] : 0.0, + mask[offset + 4U] == 1U ? residual[offset + 4U] : 0.0, + mask[offset + 5U] == 1U ? residual[offset + 5U] : 0.0}); + applied_force_resultant = applied_force_resultant + applied_force; + applied_moment_resultant = + applied_moment_resultant + current_position.Cross(applied_force) + + applied_moment; + reaction_force_resultant = reaction_force_resultant + reaction_force; + reaction_moment_resultant = + reaction_moment_resultant + current_position.Cross(reaction_force) + + reaction_moment; + } + const fesa::Vector3 force_balance = + applied_force_resultant + reaction_force_resultant; + const fesa::Vector3 moment_balance = + applied_moment_resultant + reaction_moment_resultant; + return {force_balance.X(), force_balance.Y(), force_balance.Z(), + moment_balance.X(), moment_balance.Y(), moment_balance.Z()}; +} + +// NSNR-PROC-004, NSNR-PROC-007, and NSNR-PROC-010. +TEST(NonlinearStaticProcedure, + AllConstrainedNlgeomRunWritesSchemaV1AfterAcceptedFrames) { + TempDirectory directory{"schema-v1"}; + const auto input = directory.Path() / "shellnl.inp"; + const auto output = directory.Path() / "shellnl_results.h5"; + WriteText(input, AllConstrainedNonlinearShellDeck()); + + testing::internal::CaptureStderr(); + const int exit_code = fesa::FesaApplication{}.Run({input.string()}); + const std::string standard_error = testing::internal::GetCapturedStderr(); + + ASSERT_EQ(exit_code, 0) << standard_error; + ASSERT_TRUE(std::filesystem::exists(output)); + ASSERT_GT(H5Fis_hdf5(output.string().c_str()), 0); + const Hdf5File file{output}; + const hid_t metadata = H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT); + ASSERT_GE(metadata, 0); + EXPECT_EQ(ReadStringAttribute(metadata, "feature_id"), + "nonlinear-static-newton-raphson"); + (void)H5Gclose(metadata); + EXPECT_GT(H5Lexists(file.Get(), "/steps/Step-1/accepted_frames", H5P_DEFAULT), + 0); +} + +// NSNR-PROC-019. +TEST(NonlinearStaticProcedure, + NonzeroPrescribedMotionWritesCurrentArmSpatialAppliedPlusReactionBalance) { + TempDirectory directory{"current-arm-balance"}; + const auto input = directory.Path() / "shellnl-current-arm.inp"; + const auto output = directory.Path() / "shellnl-current-arm_results.h5"; + WriteText(input, NonzeroPrescribedNonlinearShellDeck()); + + testing::internal::CaptureStderr(); + const int exit_code = fesa::FesaApplication{}.Run({input.string()}); + const std::string standard_error = testing::internal::GetCapturedStderr(); + + ASSERT_EQ(exit_code, 0) << standard_error; + const Hdf5File file{output}; + const hid_t dataset = H5Dopen2( + file.Get(), "/steps/Step-1/frames/9/global/equilibrium", H5P_DEFAULT); + ASSERT_GE(dataset, 0); + std::array actual{}; + ASSERT_GE(H5Dread(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, actual.data()), + 0); + (void)H5Dclose(dataset); + const auto expected = ReconstructGlobalBalance(file); + for (std::size_t component = 0U; component < actual.size(); ++component) { + EXPECT_NEAR(actual[component], expected[component], 1.0e-10) + << "component=" << component; + } +} + +} // namespace diff --git a/tests/integration/app/fesa_application_test.cpp b/tests/integration/app/fesa_application_test.cpp index 8d3f73b..efdbb4f 100644 --- a/tests/integration/app/fesa_application_test.cpp +++ b/tests/integration/app/fesa_application_test.cpp @@ -1,5 +1,7 @@ #include "fesa/app/fesa_application.h" +#include "fesa/app/output_paths.h" +#include #include #include @@ -9,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -332,32 +335,51 @@ void ExpectDiagnosticFieldOrder(const std::string& text) { } } -std::vector ExplicitOutputArguments( - const std::filesystem::path& input, const std::filesystem::path& output) { - // FesaApplication receives argv[0]-excluded operands and options. - return {input.string(), "--output", output.string()}; +struct FileSnapshot { + std::string contents; + std::filesystem::file_time_type write_time; +}; + +FileSnapshot SnapshotFile(const std::filesystem::path& path) { + std::ifstream stream{path, std::ios::binary}; + if (!stream) { + throw std::runtime_error{"Unable to open an app output fixture."}; + } + return {{std::istreambuf_iterator{stream}, + std::istreambuf_iterator{}}, + std::filesystem::last_write_time(path)}; } } // namespace -TEST(LinearStaticCli, DefaultAndExplicitOutputProduceFesaHdf5) { +// NSNR-CLI-008: the application no longer uses a CWD-global results.h5. +TEST(LinearStaticCli, DefaultOutputUsesInputSiblingDerivedName) { TempDirectory directory{"paths"}; - const auto input = directory.Path() / "model.inp"; + const auto input = directory.Path() / "Beam.Model.INP"; WriteText(input, AxialDeck(true, false, false)); - const auto default_output = directory.Path() / "results.h5"; + const auto default_output = directory.Path() / "Beam.Model_results.h5"; { CurrentDirectoryGuard current_directory{directory.Path()}; const auto result = RunApplication({input.string()}); ASSERT_EQ(result.exit_code, 0) << result.standard_error; } ExpectFesaHdf5Identity(default_output, input); + EXPECT_FALSE(std::filesystem::exists(directory.Path() / "results.h5")); +} - const auto explicit_output = directory.Path() / "named-output.h5"; - const auto result = - RunApplication(ExplicitOutputArguments(input, explicit_output)); - ASSERT_EQ(result.exit_code, 0) << result.standard_error; - ExpectFesaHdf5Identity(explicit_output, input); +// NSNR-PROC-001: log lifecycle begins after leasing and before parse/map. +TEST(FesaApplication, OpensDerivedLogBeforeInputMapping) { + TempDirectory directory{"log-before-input"}; + const auto input = directory.Path() / "missing.inp"; + const auto log = directory.Path() / "missing_log.txt"; + + const auto result = RunApplication({input.string()}); + + EXPECT_EQ(result.exit_code, 3); + ExpectDiagnosticFieldOrder(result.standard_error); + ASSERT_TRUE(std::filesystem::exists(log)); + EXPECT_EQ(std::filesystem::file_size(log), 0U); } TEST(LinearStaticCli, ReturnsEveryExactExitCodeAndOrderedDiagnostic) { @@ -369,8 +391,7 @@ TEST(LinearStaticCli, ReturnsEveryExactExitCodeAndOrderedDiagnostic) { WriteText(model_input, AxialDeck(true, true, false)); WriteText(solver_input, AxialDeck(false, false, false)); - const auto success = RunApplication( - ExplicitOutputArguments(valid_input, directory.Path() / "success.h5")); + const auto success = RunApplication({valid_input.string()}); const auto usage = RunApplication({}); const auto missing_input = directory.Path() / "missing.inp"; const auto input = RunApplication({missing_input.string()}); @@ -378,25 +399,19 @@ TEST(LinearStaticCli, ReturnsEveryExactExitCodeAndOrderedDiagnostic) { RunApplication({missing_input.string(), "--output", "--output"}); const auto unknown_output_option = RunApplication({missing_input.string(), "--output", "--bogus"}); - const auto model = RunApplication(ExplicitOutputArguments( - model_input, directory.Path() / "model-failure.h5")); - const auto solver = RunApplication(ExplicitOutputArguments( - solver_input, directory.Path() / "solver-failure.h5")); - const auto output = RunApplication(ExplicitOutputArguments( - valid_input, directory.Path() / "nonexistent-parent" / "results.h5")); + const auto model = RunApplication({model_input.string()}); + const auto solver = RunApplication({solver_input.string()}); EXPECT_EQ(success.exit_code, 0) << success.standard_error; EXPECT_EQ(usage.exit_code, 2); EXPECT_EQ(input.exit_code, 3); EXPECT_EQ(model.exit_code, 4); EXPECT_EQ(solver.exit_code, 5); - EXPECT_EQ(output.exit_code, 6); ExpectDiagnosticFieldOrder(usage.standard_error); ExpectDiagnosticFieldOrder(input.standard_error); ExpectDiagnosticFieldOrder(model.standard_error); ExpectDiagnosticFieldOrder(solver.standard_error); - ExpectDiagnosticFieldOrder(output.standard_error); EXPECT_EQ(repeated_output.exit_code, 2); ExpectDiagnosticFieldOrder(repeated_output.standard_error); EXPECT_NE(repeated_output.standard_error.find("code=cli-usage"), @@ -407,24 +422,79 @@ TEST(LinearStaticCli, ReturnsEveryExactExitCodeAndOrderedDiagnostic) { std::string::npos); } +// NSNR-CLI-003 and NSNR-CLI-007: usage failure precedes every output side +// effect, including replacement of existing derived files. +TEST(LinearStaticCli, OutputSubstringRejectionLeavesDerivedFilesUnchanged) { + TempDirectory directory{"usage-no-output"}; + const auto input = directory.Path() / "model.inp"; + const auto results = directory.Path() / "model_results.h5"; + const auto log = directory.Path() / "model_log.txt"; + WriteText(input, AxialDeck(true, false, false)); + WriteText(results, "previous-results"); + WriteText(log, "previous-log"); + const FileSnapshot previous_results = SnapshotFile(results); + const FileSnapshot previous_log = SnapshotFile(log); + + for (const char* argument : + {"abc--outputdef", "--output-path", "--output=foo", "--output"}) { + const auto result = RunApplication({input.string(), argument}); + EXPECT_EQ(result.exit_code, 2) << argument; + EXPECT_EQ( + std::count(result.standard_error.begin(), result.standard_error.end(), '\n'), + 1U) + << result.standard_error; + EXPECT_NE(result.standard_error.find("code=cli-usage"), + std::string::npos); + EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents); + EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time); + EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents); + EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time); + } +} + +// NSNR-CLI-006: a held lease blocks the application before any public output +// is opened, truncated, or replaced. +TEST(LinearStaticCli, BusyOutputLeaseLeavesDerivedFilesUnchanged) { + TempDirectory directory{"busy-output"}; + const auto input = directory.Path() / "model.inp"; + const auto results = directory.Path() / "model_results.h5"; + const auto log = directory.Path() / "model_log.txt"; + WriteText(input, AxialDeck(true, false, false)); + WriteText(results, "previous-results"); + WriteText(log, "previous-log"); + const FileSnapshot previous_results = SnapshotFile(results); + const FileSnapshot previous_log = SnapshotFile(log); + + const fesa::DerivedOutputPaths paths{input, results, log}; + auto lease = fesa::AcquireOutputWriteLease(paths); + ASSERT_TRUE(lease.HasValue()) << lease.GetStatus().Diagnostics().size(); + + const auto result = RunApplication({input.string()}); + EXPECT_EQ(result.exit_code, 6) << result.standard_error; + EXPECT_NE(result.standard_error.find("code=output-busy"), + std::string::npos); + EXPECT_EQ(SnapshotFile(results).contents, previous_results.contents); + EXPECT_EQ(SnapshotFile(results).write_time, previous_results.write_time); + EXPECT_EQ(SnapshotFile(log).contents, previous_log.contents); + EXPECT_EQ(SnapshotFile(log).write_time, previous_log.write_time); +} + TEST(LinearStaticCli, OutputRequestsDoNotFilterMandatoryResults) { TempDirectory directory{"output-requests"}; const auto plain_input = directory.Path() / "plain.inp"; const auto requested_input = directory.Path() / "requested.inp"; - const auto plain_output = directory.Path() / "plain.h5"; - const auto requested_output = directory.Path() / "requested.h5"; WriteText(plain_input, AxialDeck(true, false, false)); WriteText(requested_input, AxialDeck(true, false, true)); - const auto plain = - RunApplication(ExplicitOutputArguments(plain_input, plain_output)); - const auto requested = RunApplication( - ExplicitOutputArguments(requested_input, requested_output)); + const auto plain = RunApplication({plain_input.string()}); + const auto requested = RunApplication({requested_input.string()}); ASSERT_EQ(plain.exit_code, 0) << plain.standard_error; ASSERT_EQ(requested.exit_code, 0) << requested.standard_error; - const auto plain_file = OpenFile(plain_output); - const auto requested_file = OpenFile(requested_output); + const auto plain_file = + OpenFile(plain_input.parent_path() / "plain_results.h5"); + const auto requested_file = + OpenFile(requested_input.parent_path() / "requested_results.h5"); ExpectMandatoryInventory(plain_file.Get()); ExpectMandatoryInventory(requested_file.Get()); @@ -449,10 +519,10 @@ TEST(LinearStaticCli, OutputRequestsDoNotFilterMandatoryResults) { TEST(Mitc4ShellCli, WritesShellHdf5ThroughTheExistingApplicationRoute) { TempDirectory directory{"shell-route"}; const auto input = directory.Path() / "shell.inp"; - const auto output = directory.Path() / "shell-results.h5"; + const auto output = directory.Path() / "shell_results.h5"; WriteText(input, AllConstrainedShellDeck()); - const auto result = RunApplication(ExplicitOutputArguments(input, output)); + const auto result = RunApplication({input.string()}); ASSERT_EQ(result.exit_code, 0) << result.standard_error; ExpectShellHdf5Identity(output, input); } diff --git a/tests/reference/b33_reference_comparison_test.cpp b/tests/reference/b33_reference_comparison_test.cpp index 8e2908a..2987869 100644 --- a/tests/reference/b33_reference_comparison_test.cpp +++ b/tests/reference/b33_reference_comparison_test.cpp @@ -153,7 +153,8 @@ TEST(B33ReferenceComparison, GeneratesAuthoritativeHdf5AndComparisonEvidence) { const auto input = reference_directory / "cantilever beam.inp"; const auto output_directory = binary_root / "reference" / "cantilever-beam-b33"; - const auto results = output_directory / "results.h5"; + const auto execution_input = output_directory / input.filename(); + const auto results = output_directory / "cantilever beam_results.h5"; const auto comparison = output_directory / "comparison.json"; // Only the exact build-local evidence directory is reset; the approved @@ -173,16 +174,18 @@ TEST(B33ReferenceComparison, GeneratesAuthoritativeHdf5AndComparisonEvidence) { std::filesystem::path{"cantilever beam reactions.csv"}); EXPECT_EQ(reference_before[3U].relative_path, std::filesystem::path{"cantilever beam.inp"}); + ASSERT_TRUE(std::filesystem::copy_file(input, execution_input, error)); + ASSERT_FALSE(error); fesa::FesaApplication application; - // FesaApplication receives application operands/options; main strips argv[0]. - ASSERT_EQ(application.Run({input.string(), "--output", results.string()}), 0); + ASSERT_EQ(application.Run({execution_input.string()}), 0); ASSERT_TRUE(std::filesystem::is_regular_file(results)); ASSERT_GT(H5Fis_hdf5(results.string().c_str()), 0); EXPECT_GT(StressRowCount(results), 0U); auto comparison_result = - fesa::test::ReferenceComparison::Compare(results, reference_directory); + fesa::test::ReferenceComparison::Compare(results, reference_directory, + execution_input); ASSERT_TRUE(comparison_result.HasValue()); const auto& report = comparison_result.Value(); ASSERT_TRUE(report.passed); @@ -248,7 +251,10 @@ TEST(B33ReferenceComparison, GeneratesAuthoritativeHdf5AndComparisonEvidence) { } std::sort(generated_names.begin(), generated_names.end()); EXPECT_EQ(generated_names, - (std::vector{"comparison.json", "results.h5"})); + (std::vector{"cantilever beam.inp", + "cantilever beam_log.txt", + "cantilever beam_results.h5", + "comparison.json"})); ExpectTreeUnchanged(reference_before, SnapshotTree(reference_directory)); } diff --git a/tests/reference/mitc4_reference_cases_test.cpp b/tests/reference/mitc4_reference_cases_test.cpp index 118a420..75b3fe6 100644 --- a/tests/reference/mitc4_reference_cases_test.cpp +++ b/tests/reference/mitc4_reference_cases_test.cpp @@ -75,14 +75,19 @@ CaseEvidence RunCase(const std::string& case_id, if (!std::filesystem::create_directories(output_directory, error) || error) { throw std::runtime_error{"Unable to create MITC4 evidence directory."}; } - const auto results = output_directory / "results.h5"; + const auto execution_input = output_directory / input.filename(); + if (!std::filesystem::copy_file(input, execution_input, error) || error) { + throw std::runtime_error{"Unable to copy MITC4 input for execution."}; + } + const auto results = output_directory / + (execution_input.stem().string() + "_results.h5"); const auto comparison = output_directory / "comparison.json"; fesa::FesaApplication application; - EXPECT_EQ(application.Run({input.string(), "--output", results.string()}), 0); + EXPECT_EQ(application.Run({execution_input.string()}), 0); EXPECT_TRUE(std::filesystem::is_regular_file(results)); auto comparison_result = fesa::test::Mitc4ReferenceComparison::Compare( - {case_id, source_element_type, input, csv, results}); + {case_id, source_element_type, execution_input, csv, results}); if (!comparison_result.HasValue()) { std::string diagnostics; for (const auto& diagnostic : comparison_result.GetStatus().Diagnostics()) { @@ -104,7 +109,10 @@ CaseEvidence RunCase(const std::string& case_id, } std::sort(generated.begin(), generated.end()); EXPECT_EQ(generated, - (std::vector{"comparison.json", "results.h5"})); + (std::vector{"comparison.json", + input.filename().string(), + input.stem().string() + "_log.txt", + results.filename().string()})); EXPECT_TRUE(std::filesystem::is_directory(reference_directory)); ExpectUnchanged(input, input_before); ExpectUnchanged(csv, csv_before); diff --git a/tests/reference/nonlinear_static_reference_cases_test.cpp b/tests/reference/nonlinear_static_reference_cases_test.cpp new file mode 100644 index 0000000..6140549 --- /dev/null +++ b/tests/reference/nonlinear_static_reference_cases_test.cpp @@ -0,0 +1,401 @@ +#include "nonlinear_static_reference_comparison.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef FESA_TEST_SOURCE_DIR +#error FESA_TEST_SOURCE_DIR must identify the repository root. +#endif + +#ifndef FESA_TEST_BINARY_DIR +#error FESA_TEST_BINARY_DIR must identify the CMake binary root. +#endif + +namespace { + +std::string ReadBytes(const std::filesystem::path& path) { + std::ifstream stream{path, std::ios::binary}; + if (!stream) { + throw std::runtime_error{"Unable to read reference artifact."}; + } + return {std::istreambuf_iterator{stream}, + std::istreambuf_iterator{}}; +} + +fesa::test::NonlinearReferenceCase MakeCase(const std::string& case_id) { + const std::filesystem::path root{FESA_TEST_SOURCE_DIR}; + const bool fine = case_id == "shellnl-meshfine-s4-final"; + const bool nonlinear = case_id == "shellnl-s4-final" || fine; + const std::filesystem::path directory = + root / "reference" / (fine ? "shellNL-meshfine" + : (nonlinear ? "shellNL" : "shell")); + const std::string stem = fine ? "shellNL-meshfine" + : (nonlinear ? "shellNL" : "shell"); + return {case_id, + directory / (stem + ".inp"), + directory / (stem + " displacements.csv"), + directory / (stem + " reactions.csv"), + directory / (stem + " stresses.csv"), + std::filesystem::path{FESA_TEST_BINARY_DIR} / "reference" / + "nonlinear-static-reference" / stem}; +} + +void ExpectSnapshotsEqual( + const std::vector& expected, + const std::vector& actual) { + ASSERT_EQ(actual.size(), expected.size()); + for (std::size_t index = 0U; index < expected.size(); ++index) { + EXPECT_EQ(actual[index].path, expected[index].path); + EXPECT_EQ(actual[index].sha256, expected[index].sha256); + EXPECT_EQ(actual[index].byte_size, expected[index].byte_size); + EXPECT_EQ(actual[index].last_write_time, expected[index].last_write_time); + } +} + +const fesa::test::NonlinearReferenceFamilyReport* FindFamily( + const fesa::test::NonlinearReferenceComparisonReport& report, + const std::string& identity) { + const auto found = std::find_if( + report.families.begin(), report.families.end(), + [&identity](const fesa::test::NonlinearReferenceFamilyReport& family) { + return family.family_identity == identity; + }); + return found == report.families.end() ? nullptr : &*found; +} + +void ExpectFamily(const fesa::test::NonlinearReferenceComparisonReport& report, + const std::string& identity, const std::size_t row_count, + const fesa::test::NonlinearReferenceDisposition disposition) { + const auto* family = FindFamily(report, identity); + ASSERT_NE(family, nullptr) << identity; + EXPECT_EQ(family->row_count, row_count); + EXPECT_EQ(family->disposition, disposition); +} + +void ExpectBlockingFamiliesPassed( + const fesa::test::NonlinearReferenceComparisonReport& report) { + for (const auto& family : report.families) { + if (family.disposition != + fesa::test::NonlinearReferenceDisposition::kBlocking) { + continue; + } + EXPECT_TRUE(family.tolerance.passed) + << family.family_identity << " rows=" << family.row_count + << " scale=" << family.tolerance.reference_scale + << " max_abs=" << family.tolerance.maximum_absolute_error + << " rms=" << family.tolerance.relative_rms + << " diagnostic=" << family.tolerance.diagnostic_code; + } +} + +void ExpectInternalFamiliesPassed( + const fesa::test::NonlinearReferenceComparisonReport& report) { + for (const auto& family : report.internal_equilibrium) { + EXPECT_TRUE(family.passed) + << family.family_identity << " rows=" << family.row_count + << " numerator=" << family.numerator << " scale=" << family.scale + << " metric=" + << (family.normalized_metric.has_value() + ? *family.normalized_metric + : -1.0) + << " diagnostic=" << family.diagnostic_code; + } +} + +} // namespace + +// NSNR-REF-001 and NSNR-REF-018. +TEST(NonlinearStaticReference, AuditsEveryDeclaredArtifactBeforeExecution) { + const auto nonlinear = MakeCase("shellnl-s4-final"); + const auto linear = MakeCase("shell-s4-linear-limit"); + + const auto nonlinear_artifacts = fesa::test::ArtifactCheck(nonlinear); + ASSERT_TRUE(nonlinear_artifacts.HasValue()); + ASSERT_EQ(nonlinear_artifacts.Value().size(), 4U); + EXPECT_EQ(nonlinear_artifacts.Value()[0U].sha256, + "4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"); + EXPECT_EQ(nonlinear_artifacts.Value()[3U].sha256, + "5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"); + + const auto linear_artifacts = fesa::test::ArtifactCheck(linear); + ASSERT_TRUE(linear_artifacts.HasValue()); + ASSERT_EQ(linear_artifacts.Value().size(), 4U); + EXPECT_EQ(linear_artifacts.Value()[0U].sha256, + "4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"); + EXPECT_EQ(linear_artifacts.Value()[3U].sha256, + "2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"); +} + +// NSNR-REF-002 through NSNR-REF-018. +TEST(NonlinearStaticReference, + CopiesRunsComparesAndPreservesTheReadOnlyReferenceInventory) { + for (const std::string case_id : + {"shellnl-s4-final", "shell-s4-linear-limit"}) { + const auto reference_case = MakeCase(case_id); + const auto before = fesa::test::ArtifactCheck(reference_case); + ASSERT_TRUE(before.HasValue()); + + const auto copied = + fesa::test::CopyInputToExecutionDirectory(reference_case); + ASSERT_TRUE(copied.HasValue()); + EXPECT_NE(copied.Value().parent_path(), + reference_case.original_input_path.parent_path()); + EXPECT_EQ(ReadBytes(copied.Value()), + ReadBytes(reference_case.original_input_path)); + + const auto generated = fesa::test::RunFesaApplicationOnCopiedInput( + reference_case, copied.Value()); + ASSERT_TRUE(generated.HasValue()); + EXPECT_EQ(generated.Value().copied_input_path, copied.Value()); + EXPECT_TRUE(std::filesystem::is_regular_file( + generated.Value().generated_results_hdf5)); + EXPECT_TRUE(std::filesystem::is_regular_file( + generated.Value().generated_log_path)); + EXPECT_EQ(generated.Value().generated_results_hdf5.filename(), + case_id == "shellnl-s4-final" ? "shellNL_results.h5" + : "shell_results.h5"); + EXPECT_EQ(generated.Value().generated_log_path.filename(), + case_id == "shellnl-s4-final" ? "shellNL_log.txt" + : "shell_log.txt"); + + const auto comparison = fesa::test::CompareHdf5ToReferenceCsv( + reference_case, generated.Value().generated_results_hdf5); + ASSERT_TRUE(comparison.HasValue()); + ExpectBlockingFamiliesPassed(comparison.Value()); + if (case_id == "shellnl-s4-final") { + ExpectInternalFamiliesPassed(comparison.Value()); + } + EXPECT_TRUE(comparison.Value().blocking_passed); + EXPECT_EQ(comparison.Value().copied_input_path, copied.Value()); + EXPECT_EQ(comparison.Value().generated_log_path, + generated.Value().generated_log_path); + + ExpectFamily(comparison.Value(), + case_id == "shellnl-s4-final" ? "coarse.translation" + : "linear.translation", + 147U, fesa::test::NonlinearReferenceDisposition::kBlocking); + ExpectFamily(comparison.Value(), + case_id == "shellnl-s4-final" ? "coarse.rotation" + : "linear.rotation", + 147U, + fesa::test::NonlinearReferenceDisposition::kWarningOnly); + if (case_id == "shellnl-s4-final") { + ExpectFamily(comparison.Value(), "coarse.local_reaction_inplane_force", + 48U, fesa::test::NonlinearReferenceDisposition::kReviewOnly); + ExpectFamily(comparison.Value(), "coarse.local_reaction_transverse_force", + 24U, fesa::test::NonlinearReferenceDisposition::kReviewOnly); + ExpectFamily(comparison.Value(), "coarse.local_reaction_physical_moment", + 48U, fesa::test::NonlinearReferenceDisposition::kReviewOnly); + EXPECT_EQ(FindFamily(comparison.Value(), "RM3"), nullptr); + } + + const auto after = fesa::test::ArtifactCheck(reference_case); + ASSERT_TRUE(after.HasValue()); + ExpectSnapshotsEqual(before.Value(), after.Value()); + } +} + +// NSNR-REF-009 and NSNR-REF-017. +TEST(NonlinearStaticReference, + RejectsInvalidHdf5BeforeToleranceAndKeepsWarningOnlyClassification) { + const auto reference_case = MakeCase("shellnl-s4-final"); + const auto copied = fesa::test::CopyInputToExecutionDirectory(reference_case); + ASSERT_TRUE(copied.HasValue()); + const auto generated = fesa::test::RunFesaApplicationOnCopiedInput( + reference_case, copied.Value()); + ASSERT_TRUE(generated.HasValue()); + + const auto invalid_hdf5 = copied.Value().parent_path() / "invalid.h5"; + std::ofstream stream{invalid_hdf5, std::ios::binary | std::ios::trunc}; + stream << "not an HDF5 file"; + stream.close(); + EXPECT_FALSE(fesa::test::CompareHdf5ToReferenceCsv(reference_case, + invalid_hdf5) + .HasValue()); + + fesa::test::NonlinearReferenceComparisonReport report{}; + report.blocking_passed = true; + report.families.push_back( + {"nonlinear.rotation", + {"UR1", "UR2", "UR3"}, + fesa::test::NonlinearReferenceDisposition::kWarningOnly, + 147U, + {"nonlinear.rotation", {"UR1", "UR2", "UR3"}, false, 1.0, 0.01, + 0U, 0.02, 0.02, 0U, false, false, "relative-rms-exceeded", {}, 147U}}); + EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), + fesa::test::NonlinearReferenceClassification::kWarningOnlyDifferences); +} + +// NSNR-REF-020. +TEST(NonlinearStaticReference, AuditsFinePrimaryAndCoarseCompanionArtifacts) { + const std::array case_ids{ + "shellnl-meshfine-s4-final", "shellnl-s4-final", + "shell-s4-linear-limit"}; + for (const auto& case_id : case_ids) { + const auto reference_case = MakeCase(case_id); + const auto before = fesa::test::ArtifactCheck(reference_case); + ASSERT_TRUE(before.HasValue()) << case_id; + ASSERT_EQ(before.Value().size(), 4U) << case_id; + + const auto copied = + fesa::test::CopyInputToExecutionDirectory(reference_case); + ASSERT_TRUE(copied.HasValue()) << case_id; + EXPECT_NE(copied.Value().parent_path(), + reference_case.original_input_path.parent_path()); + const auto generated = fesa::test::RunFesaApplicationOnCopiedInput( + reference_case, copied.Value()); + ASSERT_TRUE(generated.HasValue()) << case_id; + EXPECT_TRUE(std::filesystem::is_regular_file( + generated.Value().generated_results_hdf5)); + + const auto after = fesa::test::ArtifactCheck(reference_case); + ASSERT_TRUE(after.HasValue()) << case_id; + ExpectSnapshotsEqual(before.Value(), after.Value()); + } +} + +// NSNR-REF-021. +TEST(NonlinearStaticReference, + ReviewOnlyLocalReactionsCannotChangeBlockingVerdict) { + const auto reference_case = MakeCase("shellnl-s4-final"); + const auto copied = fesa::test::CopyInputToExecutionDirectory(reference_case); + ASSERT_TRUE(copied.HasValue()); + const auto generated = fesa::test::RunFesaApplicationOnCopiedInput( + reference_case, copied.Value()); + ASSERT_TRUE(generated.HasValue()); + const auto comparison = fesa::test::CompareHdf5ToReferenceCsv( + reference_case, generated.Value().generated_results_hdf5); + ASSERT_TRUE(comparison.HasValue()); + + ExpectFamily(comparison.Value(), "coarse.local_reaction_inplane_force", 48U, + fesa::test::NonlinearReferenceDisposition::kReviewOnly); + ExpectFamily(comparison.Value(), "coarse.local_reaction_transverse_force", + 24U, fesa::test::NonlinearReferenceDisposition::kReviewOnly); + ExpectFamily(comparison.Value(), "coarse.local_reaction_physical_moment", + 48U, fesa::test::NonlinearReferenceDisposition::kReviewOnly); + EXPECT_TRUE(comparison.Value().external_blocking_passed); +} + +// NSNR-REF-022. +TEST(NonlinearStaticReference, + BlocksOnGlobalBalanceAndAcceptedFreeResidual) { + for (const std::string case_id : + {"shellnl-meshfine-s4-final", "shellnl-s4-final"}) { + const auto reference_case = MakeCase(case_id); + const auto copied = + fesa::test::CopyInputToExecutionDirectory(reference_case); + ASSERT_TRUE(copied.HasValue()) << case_id; + const auto generated = fesa::test::RunFesaApplicationOnCopiedInput( + reference_case, copied.Value()); + ASSERT_TRUE(generated.HasValue()) << case_id; + const auto comparison = fesa::test::CompareHdf5ToReferenceCsv( + reference_case, generated.Value().generated_results_hdf5); + ASSERT_TRUE(comparison.HasValue()) << case_id; + + const std::string prefix = case_id == "shellnl-meshfine-s4-final" + ? "fine." + : "coarse."; + const std::array identities{ + prefix + "global_force_balance", prefix + "global_moment_balance", + prefix + "accepted_free_force_residual", + prefix + "accepted_free_moment_residual"}; + for (const auto& identity : identities) { + const auto found = std::find_if( + comparison.Value().internal_equilibrium.begin(), + comparison.Value().internal_equilibrium.end(), + [&identity](const fesa::test::NonlinearInternalEquilibriumReport& row) { + return row.family_identity == identity; + }); + ASSERT_NE(found, comparison.Value().internal_equilibrium.end()) + << identity; + EXPECT_TRUE(found->passed) + << identity << " numerator=" << found->numerator + << " scale=" << found->scale << " metric=" + << (found->normalized_metric.has_value() + ? *found->normalized_metric + : -1.0) + << " diagnostic=" << found->diagnostic_code; + } + EXPECT_TRUE(comparison.Value().internal_blocking_passed); + const std::array zero_resultant{}; + EXPECT_NE(comparison.Value().constrained_reaction_resultant.force, + zero_resultant); + } +} + +// NSNR-REF-023. +TEST(NonlinearStaticReference, + RejectsMissingExtraDuplicateAndNonfiniteRowsBeforeToleranceAndRecordsReviewOnlyFindings) { + fesa::test::NonlinearReferenceComparisonReport report{}; + report.blocking_passed = true; + report.external_blocking_passed = true; + report.internal_blocking_passed = true; + report.precheck_findings = { + {"blocking", fesa::test::NonlinearReferenceDisposition::kBlocking, + "missing-row", {}}, + {"warning", fesa::test::NonlinearReferenceDisposition::kWarningOnly, + "duplicate-row", {}}, + {"review", fesa::test::NonlinearReferenceDisposition::kReviewOnly, + "nonfinite-row", {}}}; + + EXPECT_EQ(fesa::test::ClassifyReferenceComparison(report), + fesa::test::NonlinearReferenceClassification::kFailed); + EXPECT_EQ(report.precheck_findings[1U].diagnostic_code, "duplicate-row"); + EXPECT_EQ(report.precheck_findings[2U].diagnostic_code, "nonfinite-row"); +} + +// NSNR-REF-024. +TEST(NonlinearStaticReference, + GlobalForceAndMomentBalanceUseApprovedInclusiveOneEighthGate) { + for (const std::string& identity : + {"fine.global_force_balance", "fine.global_moment_balance"}) { + const auto below = fesa::test::EvaluateGlobalBalance( + identity, 5.0e-9, 1.0, 0.0); + EXPECT_TRUE(below.passed) << identity; + ASSERT_TRUE(below.normalized_metric.has_value()) << identity; + EXPECT_EQ(*below.normalized_metric, 5.0e-9) << identity; + + const auto boundary = fesa::test::EvaluateGlobalBalance( + identity, 1.0e-8, 1.0, 0.0); + EXPECT_TRUE(boundary.passed) << identity; + ASSERT_TRUE(boundary.normalized_metric.has_value()) << identity; + EXPECT_EQ(*boundary.normalized_metric, 1.0e-8) << identity; + + const auto above = fesa::test::EvaluateGlobalBalance( + identity, std::nextafter(1.0e-8, + std::numeric_limits::infinity()), + 1.0, 0.0); + EXPECT_FALSE(above.passed) << identity; + ASSERT_TRUE(above.normalized_metric.has_value()) << identity; + EXPECT_GT(*above.normalized_metric, 1.0e-8) << identity; + } +} + +// NSNR-REF-025. +TEST(NonlinearStaticReference, + GlobalForceAndMomentExactZeroScaleRequiresExactZeroBalance) { + for (const std::string& identity : + {"coarse.global_force_balance", "coarse.global_moment_balance"}) { + const auto exact_zero = + fesa::test::EvaluateGlobalBalance(identity, 0.0, 0.0, 0.0); + EXPECT_TRUE(exact_zero.passed) << identity; + EXPECT_EQ(exact_zero.scale, 0.0) << identity; + EXPECT_FALSE(exact_zero.normalized_metric.has_value()) << identity; + + const auto nonzero = + fesa::test::EvaluateGlobalBalance(identity, 1.0e-300, 0.0, 0.0); + EXPECT_FALSE(nonzero.passed) << identity; + EXPECT_EQ(nonzero.scale, 0.0) << identity; + EXPECT_FALSE(nonzero.normalized_metric.has_value()) << identity; + } +} diff --git a/tests/reference/nonlinear_static_reference_comparison.cpp b/tests/reference/nonlinear_static_reference_comparison.cpp new file mode 100644 index 0000000..7055cf1 --- /dev/null +++ b/tests/reference/nonlinear_static_reference_comparison.cpp @@ -0,0 +1,1624 @@ +#include "nonlinear_static_reference_comparison.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/app/fesa_application.h" +#include "fesa/elements/finite_rotation.h" +#include "fesa/math/vector3.h" +#include "mitc4_reference_comparison.h" + +#ifndef FESA_TEST_SOURCE_DIR +#error FESA_TEST_SOURCE_DIR must identify the repository root. +#endif + +#ifndef FESA_TEST_BINARY_DIR +#error FESA_TEST_BINARY_DIR must identify the CMake binary root. +#endif + +namespace fesa::test { +namespace { + +constexpr std::array kDisplacementComponents{ + "U1", "U2", "U3", "UR1", "UR2", "UR3"}; +constexpr std::array kReactionComponents{ + "RF1", "RF2", "RF3", "RM1", "RM2", "RM3"}; +constexpr double kInternalGlobalBalanceRelativeTolerance = 1.0e-8; +constexpr const char* kNonlinearFrame = + "Increment 10: Step Time = 1.000"; +constexpr std::array kCoarseConstrainedNodeLabels{ + 1, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}; + +[[noreturn]] void Fail(const std::string& code, const std::string& message); + +struct CaseContract { + std::size_t node_count; + bool nonlinear; + std::string family_prefix; +}; + +const CaseContract& ContractFor(const NonlinearReferenceCase& reference_case) { + static const CaseContract kCoarse{49U, true, "coarse."}; + static const CaseContract kFine{729U, true, "fine."}; + static const CaseContract kLinear{49U, false, "linear."}; + if (reference_case.case_id == "shellnl-s4-final") { + return kCoarse; + } + if (reference_case.case_id == "shellnl-meshfine-s4-final") { + return kFine; + } + if (reference_case.case_id == "shell-s4-linear-limit") { + return kLinear; + } + Fail("needs-reference-artifacts", "The reference case identifier is unknown."); +} + +class ComparisonFailure final : public std::runtime_error { + public: + ComparisonFailure(std::string code, std::string message) + : std::runtime_error{std::move(message)}, code_{std::move(code)} {} + + const std::string& Code() const noexcept { return code_; } + + private: + std::string code_; +}; + +[[noreturn]] void Fail(const std::string& code, const std::string& message) { + throw ComparisonFailure{code, message}; +} + +Status FailureStatus(const NonlinearReferenceCase& reference_case, + const std::string& code, const std::string& message) { + return Status::Failure(FailureCategory::kModel, + {{Severity::kError, code, {}, "", + reference_case.case_id, message}}); +} + +std::filesystem::path Normalized(const std::filesystem::path& path) { + std::error_code error; + const std::filesystem::path absolute = std::filesystem::absolute(path, error); + return (error ? path : absolute).lexically_normal(); +} + +bool IsDescendantOf(const std::filesystem::path& path, + const std::filesystem::path& parent) { + const auto normalized_path = Normalized(path); + const auto normalized_parent = Normalized(parent); + auto path_part = normalized_path.begin(); + auto parent_part = normalized_parent.begin(); + for (; parent_part != normalized_parent.end(); ++parent_part, ++path_part) { + if (path_part == normalized_path.end() || *path_part != *parent_part) { + return false; + } + } + return true; +} + +std::string GenericPath(const std::filesystem::path& path) { + return Normalized(path).generic_u8string(); +} + +std::string Trim(const std::string& value) { + const auto is_space = [](const unsigned char character) { + return character == ' ' || character == '\t' || character == '\r' || + character == '\n' || character == '\f' || character == '\v'; + }; + const auto begin = std::find_if_not( + value.begin(), value.end(), + [&is_space](const char character) { + return is_space(static_cast(character)); + }); + const auto end = std::find_if_not( + value.rbegin(), value.rend(), + [&is_space](const char character) { + return is_space(static_cast(character)); + }) + .base(); + return begin < end ? std::string{begin, end} : std::string{}; +} + +std::string UppercaseAscii(std::string value) { + std::transform(value.begin(), value.end(), value.begin(), + [](const char character) { + return character >= 'a' && character <= 'z' + ? static_cast(character - 'a' + 'A') + : character; + }); + return value; +} + +std::string ReadBytes(const std::filesystem::path& path) { + std::ifstream stream{path, std::ios::binary}; + if (!stream) { + Fail("needs-reference-artifacts", + "A declared reference artifact is missing or unreadable."); + } + return {std::istreambuf_iterator{stream}, + std::istreambuf_iterator{}}; +} + +std::uint32_t RotateRight(const std::uint32_t value, + const std::uint32_t amount) { + return (value >> amount) | (value << (32U - amount)); +} + +std::string Sha256(const std::string& input) { + constexpr std::array kRoundConstants{ + 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, + 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, + 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, + 0xc19bf174U, 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, + 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 0x983e5152U, + 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U, + 0x06ca6351U, 0x14292967U, 0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, + 0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U, + 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U, + 0xd6990624U, 0xf40e3585U, 0x106aa070U, 0x19a4c116U, 0x1e376c08U, + 0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, + 0x682e6ff3U, 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U, + 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U}; + std::vector bytes; + bytes.reserve(input.size() + 72U); + for (const unsigned char byte : input) { + bytes.push_back(byte); + } + const std::uint64_t bit_length = + static_cast(bytes.size()) * 8U; + bytes.push_back(0x80U); + while ((bytes.size() % 64U) != 56U) { + bytes.push_back(0U); + } + for (int shift = 56; shift >= 0; shift -= 8) { + bytes.push_back(static_cast(bit_length >> shift)); + } + + std::array state{0x6a09e667U, 0xbb67ae85U, 0x3c6ef372U, + 0xa54ff53aU, 0x510e527fU, 0x9b05688cU, + 0x1f83d9abU, 0x5be0cd19U}; + for (std::size_t offset = 0U; offset < bytes.size(); offset += 64U) { + std::array words{}; + for (std::size_t index = 0U; index < 16U; ++index) { + const std::size_t byte = offset + index * 4U; + words[index] = (static_cast(bytes[byte]) << 24U) | + (static_cast(bytes[byte + 1U]) << 16U) | + (static_cast(bytes[byte + 2U]) << 8U) | + static_cast(bytes[byte + 3U]); + } + for (std::size_t index = 16U; index < words.size(); ++index) { + const std::uint32_t sigma0 = RotateRight(words[index - 15U], 7U) ^ + RotateRight(words[index - 15U], 18U) ^ + (words[index - 15U] >> 3U); + const std::uint32_t sigma1 = RotateRight(words[index - 2U], 17U) ^ + RotateRight(words[index - 2U], 19U) ^ + (words[index - 2U] >> 10U); + words[index] = words[index - 16U] + sigma0 + words[index - 7U] + + sigma1; + } + std::uint32_t a = state[0U]; + std::uint32_t b = state[1U]; + std::uint32_t c = state[2U]; + std::uint32_t d = state[3U]; + std::uint32_t e = state[4U]; + std::uint32_t f = state[5U]; + std::uint32_t g = state[6U]; + std::uint32_t h = state[7U]; + for (std::size_t index = 0U; index < words.size(); ++index) { + const std::uint32_t sigma1 = RotateRight(e, 6U) ^ RotateRight(e, 11U) ^ + RotateRight(e, 25U); + const std::uint32_t choose = (e & f) ^ (~e & g); + const std::uint32_t temporary1 = + h + sigma1 + choose + kRoundConstants[index] + words[index]; + const std::uint32_t sigma0 = RotateRight(a, 2U) ^ RotateRight(a, 13U) ^ + RotateRight(a, 22U); + const std::uint32_t majority = (a & b) ^ (a & c) ^ (b & c); + const std::uint32_t temporary2 = sigma0 + majority; + h = g; + g = f; + f = e; + e = d + temporary1; + d = c; + c = b; + b = a; + a = temporary1 + temporary2; + } + state[0U] += a; + state[1U] += b; + state[2U] += c; + state[3U] += d; + state[4U] += e; + state[5U] += f; + state[6U] += g; + state[7U] += h; + } + std::ostringstream result; + result << std::uppercase << std::hex << std::setfill('0'); + for (const std::uint32_t word : state) { + result << std::setw(8) << word; + } + return result.str(); +} + +std::string Fnv1a64(const std::string& input) { + std::uint64_t hash = 14695981039346656037ULL; + for (const unsigned char byte : input) { + hash ^= static_cast(byte); + hash *= 1099511628211ULL; + } + std::ostringstream result; + result << "fnv1a64:" << std::hex << std::setfill('0') << std::setw(16) + << hash; + return result.str(); +} + +struct DeclaredArtifact { + std::filesystem::path path; + const char* sha256; +}; + +std::vector DeclaredArtifacts( + const NonlinearReferenceCase& reference_case) { + const std::filesystem::path root{FESA_TEST_SOURCE_DIR}; + if (reference_case.case_id == "shellnl-meshfine-s4-final") { + const auto directory = root / "reference" / "shellNL-meshfine"; + const std::vector artifacts{ + {directory / "shellNL-meshfine.inp", + "40DF1CE77311C8D799564A21A60F3BDEBB8148D52CAE22B7292FDFAD32018220"}, + {directory / "shellNL-meshfine displacements.csv", + "740819FF8AED0E279961581F7CDBFA12784CFBA3A488C35A652E80103F64433F"}, + {directory / "shellNL-meshfine reactions.csv", + "AEB01C98C596792B0E5F2B86A81945CAB0BEB0C6969CFC6738C6F81DF1F94363"}, + {directory / "shellNL-meshfine stresses.csv", + "6D6213AB5DB9D6B1F5FBD641367D08BACC805967B6C5A95BCE0E1A5395377782"}}; + if (Normalized(reference_case.original_input_path) != + Normalized(artifacts[0U].path) || + Normalized(reference_case.displacement_csv_path) != + Normalized(artifacts[1U].path) || + Normalized(reference_case.reaction_csv_path) != + Normalized(artifacts[2U].path) || + Normalized(reference_case.stress_inventory_path) != + Normalized(artifacts[3U].path)) { + Fail("needs-reference-artifacts", + "The fine nonlinear reference case does not use declared paths."); + } + return artifacts; + } + if (reference_case.case_id == "shellnl-s4-final") { + const auto directory = root / "reference" / "shellNL"; + const std::vector artifacts{ + {directory / "shellNL.inp", + "4BF3ECB0F7F1E8462C573E993DBC97AC5D920C91CF6F23AD4C6891D77FFBADA2"}, + {directory / "shellNL displacements.csv", + "4E0F99CA9372B1ADF7FAF102F43BC0B887DC743FDEDA378E4342D2CF8E0C0786"}, + {directory / "shellNL reactions.csv", + "001CB1541A9E94424E5E650509D46BC8724970DF4DE47184D9DB09C7938AB069"}, + {directory / "shellNL stresses.csv", + "5500E5114B1C44887528E30CEC054A1EB0F68BE3F4B8CE81FA59FC74A881483F"}}; + if (Normalized(reference_case.original_input_path) != + Normalized(artifacts[0U].path) || + Normalized(reference_case.displacement_csv_path) != + Normalized(artifacts[1U].path) || + Normalized(reference_case.reaction_csv_path) != + Normalized(artifacts[2U].path) || + Normalized(reference_case.stress_inventory_path) != + Normalized(artifacts[3U].path)) { + Fail("needs-reference-artifacts", + "The nonlinear reference case does not use its declared paths."); + } + return artifacts; + } + if (reference_case.case_id == "shell-s4-linear-limit") { + const auto directory = root / "reference" / "shell"; + const std::vector artifacts{ + {directory / "shell.inp", + "4005851E1AB22FD3A16AC17A8D5DA3E051233F69F37419079F3553AD134ECFCF"}, + {directory / "shell displacements.csv", + "C81D94E0B4A849F87AA0F79C83A79B94D5661AC79E44ED826919AB432C87746B"}, + {directory / "shell reactions.csv", + "0E34EEC27E700C3C0C744C1DAFD8A3B95EFEF34B8616FE96665876586FE82D41"}, + {directory / "shell stresses.csv", + "2B75A5B0DEB045A283C9BB7E9B1153B79F7537FF487214BF4A23316B59B660A7"}}; + if (Normalized(reference_case.original_input_path) != + Normalized(artifacts[0U].path) || + Normalized(reference_case.displacement_csv_path) != + Normalized(artifacts[1U].path) || + Normalized(reference_case.reaction_csv_path) != + Normalized(artifacts[2U].path) || + Normalized(reference_case.stress_inventory_path) != + Normalized(artifacts[3U].path)) { + Fail("needs-reference-artifacts", + "The linear control case does not use its declared paths."); + } + return artifacts; + } + Fail("needs-reference-artifacts", "The reference case identifier is unknown."); +} + +ArtifactSnapshot Snapshot(const DeclaredArtifact& artifact) { + std::error_code error; + if (!std::filesystem::is_regular_file(artifact.path, error) || error) { + Fail("needs-reference-artifacts", + "A declared reference artifact is missing or unreadable."); + } + const std::string bytes = ReadBytes(artifact.path); + const std::string hash = Sha256(bytes); + if (hash != artifact.sha256) { + Fail("reference-artifact-hash-mismatch", + "A declared reference artifact does not match its approved hash."); + } + const std::uintmax_t size = std::filesystem::file_size(artifact.path, error); + if (error) { + Fail("needs-reference-artifacts", + "A declared reference artifact size cannot be read."); + } + const auto write_time = std::filesystem::last_write_time(artifact.path, error); + if (error) { + Fail("needs-reference-artifacts", + "A declared reference artifact timestamp cannot be read."); + } + return {Normalized(artifact.path), hash, size, write_time}; +} + +std::vector SplitCsv(const std::string& line) { + std::vector fields; + std::string field; + bool quoted = false; + for (std::size_t index = 0U; index < line.size(); ++index) { + const char character = line[index]; + if (character == '"') { + if (quoted && index + 1U < line.size() && line[index + 1U] == '"') { + field.push_back(character); + ++index; + } else { + quoted = !quoted; + } + } else if (character == ',' && !quoted) { + fields.push_back(Trim(field)); + field.clear(); + } else { + field.push_back(character); + } + } + if (quoted) { + Fail("schema-mismatch", "A reference CSV row has an unclosed quote."); + } + fields.push_back(Trim(field)); + return fields; +} + +std::int64_t ParsePositiveLabel(const std::string& field) { + std::int64_t value = 0; + const char* const begin = field.data(); + const char* const end = begin + field.size(); + const auto parsed = std::from_chars(begin, end, value); + if (parsed.ec != std::errc{} || parsed.ptr != end || value <= 0) { + Fail("schema-mismatch", "A reference CSV node label is invalid."); + } + return value; +} + +double ParseFiniteDouble(const std::string& field) { + char* end = nullptr; + const double value = std::strtod(field.c_str(), &end); + if (field.empty() || end == field.c_str() || end == nullptr || + *end != '\0' || !std::isfinite(value)) { + Fail("schema-mismatch", "A reference CSV value is nonfinite or invalid."); + } + return value; +} + +struct CsvWideRow { + std::string instance_name; + std::int64_t source_node_label; + std::array values; +}; + +std::vector ReadCsvWideRows( + const std::filesystem::path& path, const bool requires_frame, + const std::array& components, + const std::size_t expected_node_count) { + std::ifstream stream{path, std::ios::binary}; + if (!stream) { + Fail("needs-reference-artifacts", + "A declared comparison CSV is missing or unreadable."); + } + std::string line; + if (!std::getline(stream, line)) { + Fail("schema-mismatch", "A declared comparison CSV is empty."); + } + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + std::vector expected_header; + if (requires_frame) { + expected_header.push_back("Frame"); + } + expected_header.push_back("Part Instance Name"); + expected_header.push_back("Node Label"); + for (const char* component : components) { + expected_header.push_back(std::string{components == kDisplacementComponents + ? (std::string{"U-"} + component) + : (std::string{"RF-"} + component)}); + } + if (components == kDisplacementComponents) { + expected_header[requires_frame ? 3U : 2U] = "U-U1"; + expected_header[requires_frame ? 4U : 3U] = "U-U2"; + expected_header[requires_frame ? 5U : 4U] = "U-U3"; + expected_header[requires_frame ? 6U : 5U] = "UR-UR1"; + expected_header[requires_frame ? 7U : 6U] = "UR-UR2"; + expected_header[requires_frame ? 8U : 7U] = "UR-UR3"; + } else { + expected_header[requires_frame ? 3U : 2U] = "RF-RF1"; + expected_header[requires_frame ? 4U : 3U] = "RF-RF2"; + expected_header[requires_frame ? 5U : 4U] = "RF-RF3"; + expected_header[requires_frame ? 6U : 5U] = "RM-RM1"; + expected_header[requires_frame ? 7U : 6U] = "RM-RM2"; + expected_header[requires_frame ? 8U : 7U] = "RM-RM3"; + } + if (SplitCsv(line) != expected_header) { + Fail("schema-mismatch", "A comparison CSV header is out of contract."); + } + + std::vector rows; + std::map, std::size_t> identities; + while (std::getline(stream, line)) { + if (!line.empty() && line.back() == '\r') { + line.pop_back(); + } + if (line.empty()) { + Fail("schema-mismatch", "A comparison CSV has a blank row."); + } + const auto fields = SplitCsv(line); + if (fields.size() != expected_header.size()) { + Fail("schema-mismatch", "A comparison CSV row has the wrong width."); + } + const std::size_t shift = requires_frame ? 1U : 0U; + if (requires_frame && fields[0U] != kNonlinearFrame) { + Fail("schema-mismatch", "A nonlinear CSV row has the wrong Frame value."); + } + if (fields[shift].empty()) { + Fail("schema-mismatch", "A comparison CSV instance is empty."); + } + CsvWideRow row{fields[shift], ParsePositiveLabel(fields[shift + 1U]), {}}; + for (std::size_t component = 0U; component < row.values.size(); + ++component) { + row.values[component] = ParseFiniteDouble(fields[shift + 2U + component]); + } + const auto identity = + std::make_pair(UppercaseAscii(row.instance_name), row.source_node_label); + if (!identities.emplace(identity, rows.size()).second) { + Fail("schema-mismatch", "A comparison CSV wide-row identity is duplicated."); + } + rows.push_back(std::move(row)); + } + if (rows.size() != expected_node_count) { + Fail("schema-mismatch", "A comparison CSV node inventory is out of contract."); + } + return rows; +} + +class Hdf5Handle { + public: + using Closer = herr_t (*)(hid_t); + + Hdf5Handle() = default; + Hdf5Handle(const hid_t value, Closer closer) : value_{value}, closer_{closer} {} + Hdf5Handle(const Hdf5Handle&) = delete; + Hdf5Handle& operator=(const Hdf5Handle&) = delete; + Hdf5Handle(Hdf5Handle&& other) noexcept + : value_{other.value_}, closer_{other.closer_} { + other.value_ = -1; + other.closer_ = nullptr; + } + ~Hdf5Handle() { + if (value_ >= 0 && closer_ != nullptr) { + (void)closer_(value_); + } + } + + hid_t Get() const noexcept { return value_; } + + private: + hid_t value_{-1}; + Closer closer_{nullptr}; +}; + +class Hdf5ErrorSilencer { + public: + Hdf5ErrorSilencer() { + if (H5Eget_auto2(H5E_DEFAULT, &callback_, &client_data_) >= 0 && + H5Eset_auto2(H5E_DEFAULT, nullptr, nullptr) >= 0) { + active_ = true; + } + } + ~Hdf5ErrorSilencer() { + if (active_) { + (void)H5Eset_auto2(H5E_DEFAULT, callback_, client_data_); + } + } + + private: + H5E_auto2_t callback_{nullptr}; + void* client_data_{nullptr}; + bool active_{false}; +}; + +class Hdf5VlenReclaimer { + public: + Hdf5VlenReclaimer(const hid_t memory_type, const hid_t data_space, + void* const data) + : memory_type_{memory_type}, data_space_{data_space}, data_{data} {} + ~Hdf5VlenReclaimer() { + if (active_) { + (void)H5Dvlen_reclaim(memory_type_, data_space_, H5P_DEFAULT, data_); + } + } + + void Reclaim() { + active_ = false; + if (H5Dvlen_reclaim(memory_type_, data_space_, H5P_DEFAULT, data_) < 0) { + Fail("schema-mismatch", "HDF5 variable-length strings cannot be freed."); + } + } + + private: + hid_t memory_type_; + hid_t data_space_; + void* data_; + bool active_{true}; +}; + +hid_t RequireId(const hid_t value, const char* message) { + if (value < 0) { + Fail("schema-mismatch", message); + } + return value; +} + +void RequireHdf(const herr_t value, const char* message) { + if (value < 0) { + Fail("schema-mismatch", message); + } +} + +Hdf5Handle OpenDataset(const hid_t file, const std::string& path) { + return {RequireId(H5Dopen2(file, path.c_str(), H5P_DEFAULT), + "A required HDF5 dataset is missing."), + H5Dclose}; +} + +std::vector Dimensions(const hid_t dataset) { + Hdf5Handle space{RequireId(H5Dget_space(dataset), + "HDF5 dimensions cannot be inspected."), + H5Sclose}; + const int rank = H5Sget_simple_extent_ndims(space.Get()); + if (rank < 0) { + Fail("schema-mismatch", "HDF5 rank cannot be inspected."); + } + std::vector dimensions(static_cast(rank)); + if (rank > 0) { + RequireHdf(H5Sget_simple_extent_dims(space.Get(), dimensions.data(), nullptr), + "HDF5 extents cannot be inspected."); + } + return dimensions; +} + +Hdf5Handle MakeUtf8StringType() { + Hdf5Handle type{RequireId(H5Tcopy(H5T_C_S1), + "An HDF5 string type cannot be created."), + H5Tclose}; + RequireHdf(H5Tset_size(type.Get(), H5T_VARIABLE), + "An HDF5 variable string type cannot be configured."); + RequireHdf(H5Tset_cset(type.Get(), H5T_CSET_UTF8), + "An HDF5 UTF-8 string type cannot be configured."); + return type; +} + +std::string ReadStringAttribute(const hid_t object, const char* name) { + Hdf5Handle attribute{RequireId(H5Aopen(object, name, H5P_DEFAULT), + "A required HDF5 attribute is missing."), + H5Aclose}; + Hdf5Handle type{RequireId(H5Aget_type(attribute.Get()), + "An HDF5 attribute type cannot be read."), + H5Tclose}; + if (H5Tget_class(type.Get()) != H5T_STRING || + H5Tis_variable_str(type.Get()) <= 0 || + H5Tget_cset(type.Get()) != H5T_CSET_UTF8) { + Fail("schema-mismatch", "An HDF5 string attribute is out of contract."); + } + char* raw = nullptr; + RequireHdf(H5Aread(attribute.Get(), type.Get(), &raw), + "An HDF5 string attribute cannot be read."); + if (raw == nullptr) { + Fail("schema-mismatch", "An HDF5 string attribute is null."); + } + const std::string result{raw}; + RequireHdf(H5free_memory(raw), "HDF5 attribute memory cannot be freed."); + return result; +} + +std::uint64_t ReadUint64Attribute(const hid_t object, const char* name) { + Hdf5Handle attribute{RequireId(H5Aopen(object, name, H5P_DEFAULT), + "A required HDF5 attribute is missing."), + H5Aclose}; + std::uint64_t value = 0U; + RequireHdf(H5Aread(attribute.Get(), H5T_NATIVE_UINT64, &value), + "An HDF5 integer attribute cannot be read."); + return value; +} + +void RequireStringAttribute(const hid_t object, const char* name, + const std::string& expected) { + if (ReadStringAttribute(object, name) != expected) { + Fail("schema-mismatch", "An HDF5 string attribute has the wrong value."); + } +} + +struct NodeReadRow { + std::uint64_t internal_node_id; + char* instance_name; + char* source_label; + double coordinates[3]; +}; + +struct Hdf5Node { + std::string instance_name; + std::int64_t source_node_label; + std::array coordinates; +}; + +std::vector ReadNodes(const hid_t file, + const std::size_t expected_node_count) { + auto dataset = OpenDataset(file, "/model/nodes"); + const auto shape = Dimensions(dataset.Get()); + if (shape.size() != 1U || shape[0U] != expected_node_count) { + Fail("schema-mismatch", "The HDF5 node inventory is out of contract."); + } + auto string_type = MakeUtf8StringType(); + const hsize_t coordinate_dimensions[] = {3U}; + Hdf5Handle coordinates{RequireId(H5Tarray_create2( + H5T_NATIVE_DOUBLE, 1, coordinate_dimensions), + "An HDF5 coordinate type cannot be created."), + H5Tclose}; + Hdf5Handle memory_type{RequireId(H5Tcreate(H5T_COMPOUND, sizeof(NodeReadRow)), + "An HDF5 node type cannot be created."), + H5Tclose}; + RequireHdf(H5Tinsert(memory_type.Get(), "internal_node_id", + HOFFSET(NodeReadRow, internal_node_id), + H5T_NATIVE_UINT64), + "An HDF5 node identifier cannot be read."); + RequireHdf(H5Tinsert(memory_type.Get(), "instance_name", + HOFFSET(NodeReadRow, instance_name), string_type.Get()), + "An HDF5 node instance cannot be read."); + RequireHdf(H5Tinsert(memory_type.Get(), "source_label", + HOFFSET(NodeReadRow, source_label), string_type.Get()), + "An HDF5 node label cannot be read."); + RequireHdf(H5Tinsert(memory_type.Get(), "coordinates", + HOFFSET(NodeReadRow, coordinates), coordinates.Get()), + "An HDF5 node coordinates cannot be read."); + std::vector raw(static_cast(shape[0U])); + RequireHdf(H5Dread(dataset.Get(), memory_type.Get(), H5S_ALL, H5S_ALL, + H5P_DEFAULT, raw.data()), + "HDF5 node identities cannot be read."); + Hdf5Handle space{RequireId(H5Dget_space(dataset.Get()), + "HDF5 node space cannot be read."), + H5Sclose}; + Hdf5VlenReclaimer reclaimer{memory_type.Get(), space.Get(), raw.data()}; + std::map, std::size_t> identities; + std::vector nodes; + nodes.reserve(raw.size()); + for (std::size_t index = 0U; index < raw.size(); ++index) { + if (raw[index].internal_node_id != index || raw[index].instance_name == nullptr || + raw[index].source_label == nullptr || + !std::all_of(std::begin(raw[index].coordinates), + std::end(raw[index].coordinates), + [](const double value) { return std::isfinite(value); })) { + Fail("schema-mismatch", "An HDF5 node identity is invalid."); + } + Hdf5Node node{raw[index].instance_name, + ParsePositiveLabel(raw[index].source_label), + {raw[index].coordinates[0U], raw[index].coordinates[1U], + raw[index].coordinates[2U]}}; + const auto identity = + std::make_pair(UppercaseAscii(node.instance_name), node.source_node_label); + if (!identities.emplace(identity, nodes.size()).second) { + Fail("schema-mismatch", "An HDF5 node identity is duplicated."); + } + nodes.push_back(std::move(node)); + } + reclaimer.Reclaim(); + return nodes; +} + +struct AcceptedFrameReadRow { + std::uint64_t frame_index; + std::uint64_t increment_index; + double load_factor; + std::uint64_t iteration_count; + std::uint8_t is_factor_one; +}; + +std::uint64_t ReadFactorOneFrame(const hid_t file) { + auto dataset = OpenDataset(file, "/steps/Step-1/accepted_frames"); + const auto shape = Dimensions(dataset.Get()); + if (shape.size() != 1U || shape[0U] == 0U) { + Fail("schema-mismatch", "The accepted-frame table is invalid."); + } + Hdf5Handle type{RequireId(H5Tcreate(H5T_COMPOUND, sizeof(AcceptedFrameReadRow)), + "An accepted-frame type cannot be created."), + H5Tclose}; + RequireHdf(H5Tinsert(type.Get(), "frame_index", + HOFFSET(AcceptedFrameReadRow, frame_index), + H5T_NATIVE_UINT64), + "An accepted-frame index cannot be read."); + RequireHdf(H5Tinsert(type.Get(), "increment_index", + HOFFSET(AcceptedFrameReadRow, increment_index), + H5T_NATIVE_UINT64), + "An accepted-frame increment cannot be read."); + RequireHdf(H5Tinsert(type.Get(), "load_factor", + HOFFSET(AcceptedFrameReadRow, load_factor), + H5T_NATIVE_DOUBLE), + "An accepted-frame load factor cannot be read."); + RequireHdf(H5Tinsert(type.Get(), "iteration_count", + HOFFSET(AcceptedFrameReadRow, iteration_count), + H5T_NATIVE_UINT64), + "An accepted-frame iteration count cannot be read."); + RequireHdf(H5Tinsert(type.Get(), "is_factor_one", + HOFFSET(AcceptedFrameReadRow, is_factor_one), + H5T_NATIVE_UINT8), + "An accepted-frame factor-one flag cannot be read."); + std::vector rows(static_cast(shape[0U])); + RequireHdf(H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, + rows.data()), + "The accepted-frame table cannot be read."); + std::vector factor_one; + for (const auto& row : rows) { + if (!std::isfinite(row.load_factor) || row.increment_index == 0U || + row.iteration_count == 0U || row.is_factor_one > 1U) { + Fail("schema-mismatch", "An accepted-frame row is invalid."); + } + if (row.is_factor_one == 1U) { + if (row.load_factor != 1.0) { + Fail("schema-mismatch", "A factor-one frame must have load factor one."); + } + factor_one.push_back(row.frame_index); + } + } + if (factor_one.size() != 1U) { + Fail("schema-mismatch", "The HDF5 result needs one factor-one frame."); + } + return factor_one.front(); +} + +std::vector ReadNodalDataset(const hid_t file, const std::string& path, + const std::string& expected_components, + const std::size_t node_count) { + auto dataset = OpenDataset(file, path); + if (Dimensions(dataset.Get()) != std::vector{node_count, 6U}) { + Fail("schema-mismatch", "A nodal HDF5 dataset has the wrong shape."); + } + RequireStringAttribute(dataset.Get(), "component_names", expected_components); + std::vector values(node_count * 6U); + RequireHdf(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()), + "A nodal HDF5 dataset cannot be read."); + if (!std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); })) { + Fail("schema-mismatch", "A nodal HDF5 value is nonfinite."); + } + return values; +} + +std::vector ReadConstraintMask(const hid_t file, + const std::size_t node_count) { + auto dataset = OpenDataset(file, "/model/nodal_constraint_mask"); + if (Dimensions(dataset.Get()) != std::vector{node_count, 6U}) { + Fail("schema-mismatch", "The HDF5 constraint mask has the wrong shape."); + } + std::vector values(node_count * 6U); + RequireHdf(H5Dread(dataset.Get(), H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()), + "The HDF5 constraint mask cannot be read."); + if (!std::all_of(values.begin(), values.end(), + [](const std::uint8_t value) { return value <= 1U; })) { + Fail("schema-mismatch", "The HDF5 constraint mask contains an invalid flag."); + } + return values; +} + +struct Hdf5Projection { + std::filesystem::path copied_input_path; + std::vector nodes; + std::vector displacement; + std::vector internal_force; + std::vector external_force; + std::vector residual; + std::vector reaction; + std::vector constraint_mask; + std::array global_equilibrium; +}; + +std::filesystem::path CopiedInputPathFor( + const std::filesystem::path& hdf5_results_path) { + const std::string stem = hdf5_results_path.stem().string(); + constexpr const char* kSuffix = "_results"; + const std::size_t suffix_size = std::char_traits::length(kSuffix); + if (stem.size() <= suffix_size || + stem.compare(stem.size() - suffix_size, suffix_size, kSuffix) != 0) { + Fail("schema-mismatch", "The generated HDF5 file does not have a sibling stem."); + } + return hdf5_results_path.parent_path() / + (stem.substr(0U, stem.size() - suffix_size) + ".inp"); +} + +std::array ReadGlobalBalance(const hid_t file, + const std::string& path) { + auto dataset = OpenDataset(file, path); + if (Dimensions(dataset.Get()) != std::vector{6U}) { + Fail("schema-mismatch", "The global balance dataset has the wrong shape."); + } + RequireStringAttribute(dataset.Get(), "component_names", + "FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"); + RequireStringAttribute(dataset.Get(), "location", "global-balance-error"); + std::array values{}; + RequireHdf(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()), + "The global balance dataset cannot be read."); + if (!std::all_of(values.begin(), values.end(), + [](const double value) { return std::isfinite(value); })) { + Fail("schema-mismatch", "The global balance dataset contains nonfinite data."); + } + return values; +} + +Hdf5Projection ReadNonlinearHdf5( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path) { + Hdf5ErrorSilencer silence; + Hdf5Handle file{RequireId(H5Fopen(hdf5_results_path.string().c_str(), + H5F_ACC_RDONLY, H5P_DEFAULT), + "The generated HDF5 result cannot be opened."), + H5Fclose}; + Hdf5Handle metadata{RequireId(H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT), + "The HDF5 metadata group is missing."), + H5Gclose}; + if (ReadUint64Attribute(metadata.Get(), "schema_version") != 1U) { + Fail("schema-mismatch", "The nonlinear HDF5 schema version is invalid."); + } + RequireStringAttribute(metadata.Get(), "feature_id", + "nonlinear-static-newton-raphson"); + RequireStringAttribute(metadata.Get(), "analysis_procedure", + "nonlinear-static-full-newton"); + const CaseContract& contract = ContractFor(reference_case); + const std::filesystem::path copied_input = CopiedInputPathFor(hdf5_results_path); + const std::string expected_identity = + "path=" + GenericPath(copied_input) + ";content_identity=" + + Fnv1a64(ReadBytes(reference_case.original_input_path)); + if (ReadStringAttribute(metadata.Get(), "source_input_identity") != + expected_identity) { + Fail("schema-mismatch", + "The HDF5 source path or source content identity is out of contract."); + } + const auto nodes = ReadNodes(file.Get(), contract.node_count); + const std::uint64_t frame_index = ReadFactorOneFrame(file.Get()); + const std::string root = "/steps/Step-1/frames/" + + std::to_string(frame_index) + "/nodal/"; + return {copied_input, + nodes, + ReadNodalDataset(file.Get(), root + "displacement", + "UX,UY,UZ,URX,URY,URZ", contract.node_count), + ReadNodalDataset(file.Get(), root + "generalized_internal_force", + "FI1,FI2,FI3,MI_PHI1,MI_PHI2,MI_PHI3", + contract.node_count), + ReadNodalDataset(file.Get(), root + "generalized_external_force", + "FE1,FE2,FE3,ME_PHI1,ME_PHI2,ME_PHI3", + contract.node_count), + ReadNodalDataset(file.Get(), root + "generalized_residual", + "RU1,RU2,RU3,RPHI1,RPHI2,RPHI3", + contract.node_count), + ReadNodalDataset(file.Get(), root + "reaction", + "RF1,RF2,RF3,RM1,RM2,RM3", contract.node_count), + ReadConstraintMask(file.Get(), contract.node_count), + ReadGlobalBalance(file.Get(), + "/steps/Step-1/frames/" + + std::to_string(frame_index) + + "/global/equilibrium")}; +} + +void RequireExactNodeLabels(const std::vector& rows, + const std::size_t expected_node_count) { + std::vector labels; + labels.reserve(rows.size()); + for (const auto& row : rows) { + labels.push_back(row.source_node_label); + } + std::sort(labels.begin(), labels.end()); + if (labels.size() != expected_node_count) { + Fail("schema-mismatch", "The CSV node inventory is out of contract."); + } + for (std::size_t index = 0U; index < labels.size(); ++index) { + if (labels[index] != static_cast(index + 1U)) { + Fail("schema-mismatch", "The CSV node labels are out of contract."); + } + } +} + +void RequireExactNodeLabels(const std::vector& nodes, + const std::size_t expected_node_count) { + std::vector labels; + labels.reserve(nodes.size()); + for (const auto& node : nodes) { + labels.push_back(node.source_node_label); + } + std::sort(labels.begin(), labels.end()); + if (labels.size() != expected_node_count) { + Fail("schema-mismatch", "The HDF5 node inventory is out of contract."); + } + for (std::size_t index = 0U; index < labels.size(); ++index) { + if (labels[index] != static_cast(index + 1U)) { + Fail("schema-mismatch", "The HDF5 node labels are out of contract."); + } + } +} + +std::string Key(const std::string& instance_name, + const std::int64_t source_node_label, + const std::string& component) { + return UppercaseAscii(instance_name) + "\x1f" + + std::to_string(source_node_label) + "\x1f" + component; +} + +bool IsSelected(const std::int64_t label, + const std::vector& selected_labels) { + return selected_labels.empty() || + std::find(selected_labels.begin(), selected_labels.end(), label) != + selected_labels.end(); +} + +std::map ProjectCsv( + const std::vector& rows, + const std::array& components, + const std::vector& selected_components, + const std::vector& selected_labels) { + std::map projected; + for (const auto& row : rows) { + if (!IsSelected(row.source_node_label, selected_labels)) { + continue; + } + for (const std::size_t component : selected_components) { + const std::string key = + Key(row.instance_name, row.source_node_label, components[component]); + if (!projected.emplace(key, row.values[component]).second) { + Fail("schema-mismatch", "A CSV component-row identity is duplicated."); + } + } + } + return projected; +} + +std::map ProjectHdf5( + const Hdf5Projection& projection, const std::vector& values, + const std::array& components, + const std::vector& selected_components, + const std::vector& selected_labels) { + std::map projected; + if (values.size() != projection.nodes.size() * 6U) { + Fail("schema-mismatch", "An HDF5 nodal vector has the wrong row count."); + } + for (std::size_t node = 0U; node < projection.nodes.size(); ++node) { + if (!IsSelected(projection.nodes[node].source_node_label, selected_labels)) { + continue; + } + for (const std::size_t component : selected_components) { + const std::string key = Key(projection.nodes[node].instance_name, + projection.nodes[node].source_node_label, + components[component]); + const double value = values[node * 6U + component]; + if (!std::isfinite(value) || !projected.emplace(key, value).second) { + Fail("schema-mismatch", "An HDF5 component-row identity is invalid."); + } + } + } + return projected; +} + +ReferenceToleranceFamilyDecision EvaluateFamily( + const std::string& identity, const std::vector& components, + const bool blocking, const std::map& hdf5, + const std::map& reference) { + if (hdf5.empty() || hdf5.size() != reference.size()) { + Fail("schema-mismatch", "HDF5 and CSV required row inventories differ."); + } + ReferenceToleranceFamily family{identity, components, blocking, {}}; + family.rows.reserve(hdf5.size()); + auto hdf5_row = hdf5.begin(); + auto reference_row = reference.begin(); + for (; hdf5_row != hdf5.end(); ++hdf5_row, ++reference_row) { + if (hdf5_row->first != reference_row->first || + !std::isfinite(hdf5_row->second) || !std::isfinite(reference_row->second)) { + Fail("schema-mismatch", "HDF5 and CSV required row keys differ or are nonfinite."); + } + family.rows.push_back({hdf5_row->second, reference_row->second}); + } + const auto evaluation = ReferenceTolerancePolicy::Evaluate({family}); + if (!evaluation.valid || evaluation.families.size() != 1U) { + Fail("schema-mismatch", "The common tolerance policy rejected a finite family."); + } + return evaluation.families.front(); +} + +void AppendFamily(NonlinearReferenceComparisonReport& report, + const std::string& identity, + const std::vector& components, + const NonlinearReferenceDisposition disposition, + const std::map& hdf5, + const std::map& reference) { + const bool blocking = disposition == NonlinearReferenceDisposition::kBlocking; + const auto tolerance = + EvaluateFamily(identity, components, blocking, hdf5, reference); + if (tolerance.row_count != hdf5.size()) { + Fail("schema-mismatch", "The tolerance family row count is inconsistent."); + } + report.families.push_back( + {identity, components, disposition, hdf5.size(), tolerance}); + if (blocking && !tolerance.passed) { + report.external_blocking_passed = false; + } +} + +std::vector ExpectedConstrainedLabels( + const NonlinearReferenceCase& reference_case) { + if (reference_case.case_id == "shellnl-s4-final") { + return {kCoarseConstrainedNodeLabels.begin(), kCoarseConstrainedNodeLabels.end()}; + } + if (reference_case.case_id == "shellnl-meshfine-s4-final") { + std::vector labels{1}; + for (std::int64_t label = 3; label <= 9; ++label) { + labels.push_back(label); + } + for (std::int64_t label = 34; label <= 57; ++label) { + labels.push_back(label); + } + for (std::int64_t label = 82; label <= 153; ++label) { + labels.push_back(label); + } + return labels; + } + Fail("schema-mismatch", "A linear case does not define nonlinear constraints."); +} + +std::vector RequiredConstrainedLabels( + const NonlinearReferenceCase& reference_case, + const Hdf5Projection& projection) { + std::vector constrained; + for (std::size_t node = 0U; node < projection.nodes.size(); ++node) { + const auto begin = projection.constraint_mask.begin() + + static_cast(node * 6U); + if (std::all_of(begin, begin + 6U, + [](const std::uint8_t value) { return value == 1U; })) { + constrained.push_back(projection.nodes[node].source_node_label); + } + } + std::sort(constrained.begin(), constrained.end()); + if (constrained != ExpectedConstrainedLabels(reference_case)) { + Fail("schema-mismatch", "The HDF5 constrained-node selection is out of contract."); + } + return constrained; +} + +fesa::Vector3 VectorAt(const std::vector& values, + const std::size_t offset) { + return {values[offset], values[offset + 1U], values[offset + 2U]}; +} + +fesa::Vector3 SpatialMoment(const fesa::Vector3& phi, + const fesa::Vector3& generalized) { + const Matrix transform = InverseTransposeLeftJacobianSO3(phi); + return {transform(0U, 0U) * generalized.X() + + transform(0U, 1U) * generalized.Y() + + transform(0U, 2U) * generalized.Z(), + transform(1U, 0U) * generalized.X() + + transform(1U, 1U) * generalized.Y() + + transform(1U, 2U) * generalized.Z(), + transform(2U, 0U) * generalized.X() + + transform(2U, 1U) * generalized.Y() + + transform(2U, 2U) * generalized.Z()}; +} + +fesa::Vector3 MaskedResidual(const Hdf5Projection& projection, + const std::size_t offset) { + return {projection.constraint_mask[offset] == 1U + ? projection.residual[offset] + : 0.0, + projection.constraint_mask[offset + 1U] == 1U + ? projection.residual[offset + 1U] + : 0.0, + projection.constraint_mask[offset + 2U] == 1U + ? projection.residual[offset + 2U] + : 0.0}; +} + +double InfinityNorm(const Hdf5Projection& projection, + const std::vector& values, + const bool rotations) { + double norm = 0.0; + const std::size_t first_component = rotations ? 3U : 0U; + for (std::size_t node = 0U; node < projection.nodes.size(); ++node) { + const std::size_t offset = node * 6U; + for (std::size_t component = 0U; component < 3U; ++component) { + const std::size_t dof = offset + first_component + component; + if (projection.constraint_mask[dof] == 0U) { + norm = (std::max)(norm, std::abs(values[dof])); + } + } + } + return norm; +} + +std::size_t FreeRowCount(const Hdf5Projection& projection, + const bool rotations) { + std::size_t count = 0U; + const std::size_t first_component = rotations ? 3U : 0U; + for (std::size_t node = 0U; node < projection.nodes.size(); ++node) { + const std::size_t offset = node * 6U; + for (std::size_t component = 0U; component < 3U; ++component) { + if (projection.constraint_mask[offset + first_component + component] == 0U) { + ++count; + } + } + } + return count; +} + +void AppendInternal(NonlinearReferenceComparisonReport* report, + const NonlinearInternalEquilibriumReport& row) { + report->internal_equilibrium.push_back(row); + if (!row.passed) { + report->internal_blocking_passed = false; + } +} + +void AppendFreeResidual(NonlinearReferenceComparisonReport* report, + const std::string& identity, + const Hdf5Projection& projection, + const bool rotations) { + const double residual = InfinityNorm(projection, projection.residual, rotations); + const double internal = + InfinityNorm(projection, projection.internal_force, rotations); + const double external = + InfinityNorm(projection, projection.external_force, rotations); + if (external == 0.0) { + AppendInternal(report, {identity, FreeRowCount(projection, rotations), residual, + 0.0, std::nullopt, residual <= 1.0e-3, + "accepted-free-residual-exact-zero-scale"}); + return; + } + const double scale = (std::max)(internal, external); + const double metric = residual / scale; + AppendInternal(report, {identity, FreeRowCount(projection, rotations), residual, + scale, metric, metric <= 1.0e-2, + "accepted-free-residual-relative"}); +} + +void AppendGlobalBalance(NonlinearReferenceComparisonReport* report, + const std::string& identity, + const fesa::Vector3& balance, + const double applied_scale, + const double reaction_scale) { + AppendInternal(report, EvaluateGlobalBalance(identity, balance.Norm(), + applied_scale, reaction_scale)); +} + +void AppendInternalEquilibrium(NonlinearReferenceComparisonReport* report, + const NonlinearReferenceCase& reference_case, + const Hdf5Projection& projection) { + fesa::Vector3 reaction_force; + fesa::Vector3 reaction_moment; + double applied_force_scale = 0.0; + double reaction_force_scale = 0.0; + double applied_moment_scale = 0.0; + double reaction_moment_scale = 0.0; + for (std::size_t node = 0U; node < projection.nodes.size(); ++node) { + const std::size_t offset = node * 6U; + const fesa::Vector3 position = + fesa::Vector3{projection.nodes[node].coordinates} + + VectorAt(projection.displacement, offset); + const fesa::Vector3 phi = VectorAt(projection.displacement, offset + 3U); + const fesa::Vector3 applied_force = VectorAt(projection.external_force, offset); + const fesa::Vector3 constrained_force = MaskedResidual(projection, offset); + const fesa::Vector3 applied_moment = + SpatialMoment(phi, VectorAt(projection.external_force, offset + 3U)); + const fesa::Vector3 constrained_moment = + SpatialMoment(phi, MaskedResidual(projection, offset + 3U)); + const fesa::Vector3 applied_resultant = + position.Cross(applied_force) + applied_moment; + const fesa::Vector3 constrained_resultant = + position.Cross(constrained_force) + constrained_moment; + reaction_force = reaction_force + constrained_force; + reaction_moment = reaction_moment + constrained_resultant; + applied_force_scale += applied_force.Norm(); + reaction_force_scale += constrained_force.Norm(); + applied_moment_scale += applied_resultant.Norm(); + reaction_moment_scale += constrained_resultant.Norm(); + } + report->constrained_reaction_resultant = { + reaction_force.Components(), reaction_moment.Components()}; + const std::string prefix = ContractFor(reference_case).family_prefix; + AppendGlobalBalance(report, prefix + "global_force_balance", + {projection.global_equilibrium[0U], + projection.global_equilibrium[1U], + projection.global_equilibrium[2U]}, + applied_force_scale, reaction_force_scale); + AppendGlobalBalance(report, prefix + "global_moment_balance", + {projection.global_equilibrium[3U], + projection.global_equilibrium[4U], + projection.global_equilibrium[5U]}, + applied_moment_scale, reaction_moment_scale); + AppendFreeResidual(report, prefix + "accepted_free_force_residual", + projection, false); + AppendFreeResidual(report, prefix + "accepted_free_moment_residual", + projection, true); +} + +std::filesystem::path DerivedLogPath(const std::filesystem::path& copied_input) { + return copied_input.parent_path() / + (copied_input.stem().string() + "_log.txt"); +} + +std::filesystem::path DerivedResultsPath( + const std::filesystem::path& copied_input) { + return copied_input.parent_path() / + (copied_input.stem().string() + "_results.h5"); +} + +NonlinearReferenceComparisonReport MakeReport( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path, + const std::vector& before, + const std::vector& after) { + const auto copied_input = CopiedInputPathFor(hdf5_results_path); + return {reference_case.case_id, + reference_case.original_input_path, + copied_input, + hdf5_results_path, + DerivedLogPath(copied_input), + before, + after, + {}, + true, + {}, + {}, + {}, + true, + true}; +} + +void CompareLinearCase(NonlinearReferenceComparisonReport& report, + const NonlinearReferenceCase& reference_case) { + const Mitc4ReferenceCase legacy_case{ + reference_case.case_id, "S4", report.copied_input_path, + reference_case.displacement_csv_path, report.generated_results_hdf5}; + const auto legacy = Mitc4ReferenceComparison::Compare(legacy_case); + if (!legacy.HasValue()) { + const auto& diagnostics = legacy.GetStatus().Diagnostics(); + const std::string message = diagnostics.empty() + ? "The linear control comparison failed." + : diagnostics.front().message; + Fail("schema-mismatch", message); + } + for (const auto& metric : legacy.Value().metrics) { + ReferenceToleranceFamilyDecision tolerance{}; + tolerance.identity = metric.blocking ? "linear.translation" : "linear.rotation"; + tolerance.components = metric.components; + tolerance.blocking = metric.blocking; + tolerance.reference_scale = metric.reference_scale; + tolerance.near_zero_band = metric.near_zero_band; + tolerance.near_zero_count = metric.near_zero_count; + tolerance.relative_rms = metric.relative_rms; + tolerance.maximum_absolute_error = metric.maximum_absolute_error; + tolerance.worst_row = metric.worst_row; + tolerance.rms_passed = metric.rms_passed; + tolerance.passed = metric.passed; + tolerance.diagnostic_code = metric.diagnostic_code; + tolerance.row_count = metric.row_count; + const auto disposition = metric.blocking + ? NonlinearReferenceDisposition::kBlocking + : NonlinearReferenceDisposition::kWarningOnly; + report.families.push_back({tolerance.identity, tolerance.components, + disposition, tolerance.row_count, tolerance}); + if (metric.blocking && !metric.passed) { + report.external_blocking_passed = false; + } + } +} + +void CompareNonlinearCase(NonlinearReferenceComparisonReport& report, + const NonlinearReferenceCase& reference_case) { + const CaseContract& contract = ContractFor(reference_case); + const auto hdf5 = ReadNonlinearHdf5(reference_case, + report.generated_results_hdf5); + report.copied_input_path = hdf5.copied_input_path; + report.generated_log_path = DerivedLogPath(hdf5.copied_input_path); + RequireExactNodeLabels(hdf5.nodes, contract.node_count); + const auto displacement_rows = ReadCsvWideRows( + reference_case.displacement_csv_path, true, kDisplacementComponents, + contract.node_count); + const auto reaction_rows = ReadCsvWideRows(reference_case.reaction_csv_path, + true, kReactionComponents, + contract.node_count); + RequireExactNodeLabels(displacement_rows, contract.node_count); + RequireExactNodeLabels(reaction_rows, contract.node_count); + const std::vector translations{0U, 1U, 2U}; + const std::vector rotations{3U, 4U, 5U}; + const std::vector inplane_forces{0U, 1U}; + const std::vector transverse_force{2U}; + const std::vector physical_moments{3U, 4U}; + const std::vector all_nodes; + const auto constrained = RequiredConstrainedLabels(reference_case, hdf5); + + AppendFamily(report, contract.family_prefix + "translation", {"U1", "U2", "U3"}, + NonlinearReferenceDisposition::kBlocking, + ProjectHdf5(hdf5, hdf5.displacement, kDisplacementComponents, + translations, all_nodes), + ProjectCsv(displacement_rows, kDisplacementComponents, + translations, all_nodes)); + AppendFamily(report, contract.family_prefix + "rotation", {"UR1", "UR2", "UR3"}, + NonlinearReferenceDisposition::kWarningOnly, + ProjectHdf5(hdf5, hdf5.displacement, kDisplacementComponents, + rotations, all_nodes), + ProjectCsv(displacement_rows, kDisplacementComponents, rotations, + all_nodes)); + AppendFamily(report, contract.family_prefix + "local_reaction_inplane_force", + {"RF1", "RF2"}, NonlinearReferenceDisposition::kReviewOnly, + ProjectHdf5(hdf5, hdf5.reaction, kReactionComponents, + inplane_forces, constrained), + ProjectCsv(reaction_rows, kReactionComponents, inplane_forces, + constrained)); + AppendFamily(report, contract.family_prefix + "local_reaction_transverse_force", + {"RF3"}, NonlinearReferenceDisposition::kReviewOnly, + ProjectHdf5(hdf5, hdf5.reaction, kReactionComponents, + transverse_force, constrained), + ProjectCsv(reaction_rows, kReactionComponents, transverse_force, + constrained)); + AppendFamily(report, contract.family_prefix + "local_reaction_physical_moment", + {"RM1", "RM2"}, NonlinearReferenceDisposition::kReviewOnly, + ProjectHdf5(hdf5, hdf5.reaction, kReactionComponents, + physical_moments, constrained), + ProjectCsv(reaction_rows, kReactionComponents, physical_moments, + constrained)); + AppendInternalEquilibrium(&report, reference_case, hdf5); +} + +} // namespace + +NonlinearInternalEquilibriumReport EvaluateGlobalBalance( + const std::string& family_identity, const double numerator, + const double applied_scale, const double reaction_scale) { + const double scale = (std::max)(applied_scale, reaction_scale); + if (scale == 0.0) { + return {family_identity, 3U, numerator, scale, std::nullopt, + numerator == 0.0, "zero-reference-scale-nonzero-error"}; + } + const double metric = numerator / scale; + return {family_identity, 3U, numerator, scale, metric, + metric <= kInternalGlobalBalanceRelativeTolerance, + "global-balance-relative"}; +} + +Result> ArtifactCheck( + const NonlinearReferenceCase& reference_case) { + try { + const auto artifacts = DeclaredArtifacts(reference_case); + std::vector snapshots; + snapshots.reserve(artifacts.size()); + for (const auto& artifact : artifacts) { + snapshots.push_back(Snapshot(artifact)); + } + return Result>::Success(std::move(snapshots)); + } catch (const ComparisonFailure& exception) { + return Result>::Failure( + FailureStatus(reference_case, exception.Code(), exception.what())); + } catch (const std::exception& exception) { + return Result>::Failure( + FailureStatus(reference_case, "reference-artifact-check-failed", + exception.what())); + } +} + +Result CopyInputToExecutionDirectory( + const NonlinearReferenceCase& reference_case) { + try { + const auto check = ArtifactCheck(reference_case); + if (!check.HasValue()) { + return Result::Failure(check.GetStatus()); + } + const std::filesystem::path execution_root = + Normalized(reference_case.execution_directory); + if (!IsDescendantOf(execution_root, + std::filesystem::path{FESA_TEST_BINARY_DIR}) || + IsDescendantOf(execution_root, + reference_case.original_input_path.parent_path())) { + Fail("invalid-execution-directory", + "Reference execution must use a build-local directory outside reference."); + } + std::error_code error; + std::filesystem::create_directories(execution_root, error); + if (error) { + Fail("copy-input-failed", "The build-local execution directory cannot be created."); + } + static std::atomic sequence{0U}; + const auto tick = std::chrono::steady_clock::now().time_since_epoch().count(); + const std::filesystem::path run_directory = + execution_root / (reference_case.case_id + "-" + std::to_string(tick) + + "-" + std::to_string(sequence.fetch_add(1U))); + if (!std::filesystem::create_directory(run_directory, error) || error) { + Fail("copy-input-failed", "A unique execution directory cannot be created."); + } + const std::filesystem::path copied_input = + run_directory / reference_case.original_input_path.filename(); + if (!std::filesystem::copy_file(reference_case.original_input_path, + copied_input, + std::filesystem::copy_options::none, error) || + error || ReadBytes(copied_input) != ReadBytes(reference_case.original_input_path)) { + Fail("copy-input-failed", "The copied input does not preserve source bytes."); + } + return Result::Success(copied_input); + } catch (const ComparisonFailure& exception) { + return Result::Failure( + FailureStatus(reference_case, exception.Code(), exception.what())); + } catch (const std::exception& exception) { + return Result::Failure( + FailureStatus(reference_case, "copy-input-failed", exception.what())); + } +} + +Result RunFesaApplicationOnCopiedInput( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& copied_input_path) { + try { + if (Normalized(copied_input_path) == + Normalized(reference_case.original_input_path)) { + Fail("original-reference-input-forbidden", + "FesaApplication must never receive the original reference input."); + } + if (!IsDescendantOf(copied_input_path, + Normalized(reference_case.execution_directory)) || + !std::filesystem::is_regular_file(copied_input_path)) { + Fail("invalid-execution-input", "The execution input is not a copied artifact."); + } + const int exit_code = FesaApplication{}.Run({copied_input_path.string()}); + if (exit_code != 0) { + Fail("fesa-application-failed", + "FesaApplication did not produce an accepted reference run."); + } + const auto results = DerivedResultsPath(copied_input_path); + const auto log = DerivedLogPath(copied_input_path); + if (!std::filesystem::is_regular_file(results) || + !std::filesystem::is_regular_file(log)) { + Fail("generated-artifact-missing", + "The copied execution did not produce sibling result and log artifacts."); + } + return Result::Success({copied_input_path, results, log}); + } catch (const ComparisonFailure& exception) { + return Result::Failure( + FailureStatus(reference_case, exception.Code(), exception.what())); + } catch (const std::exception& exception) { + return Result::Failure( + FailureStatus(reference_case, "fesa-application-failed", exception.what())); + } +} + +Result CompareHdf5ToReferenceCsv( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path) { + try { + const auto before = ArtifactCheck(reference_case); + if (!before.HasValue()) { + return Result::Failure( + before.GetStatus()); + } + if (!std::filesystem::is_regular_file(hdf5_results_path)) { + Fail("schema-mismatch", "The generated HDF5 result is missing."); + } + auto report = MakeReport(reference_case, hdf5_results_path, before.Value(), {}); + if (ContractFor(reference_case).nonlinear) { + CompareNonlinearCase(report, reference_case); + } else if (reference_case.case_id == "shell-s4-linear-limit") { + CompareLinearCase(report, reference_case); + } else { + Fail("schema-mismatch", "The requested comparison case is unknown."); + } + const auto after = ArtifactCheck(reference_case); + if (!after.HasValue()) { + return Result::Failure(after.GetStatus()); + } + report.post_run_artifacts = after.Value(); + report.blocking_passed = report.external_blocking_passed && + report.internal_blocking_passed; + return Result::Success(std::move(report)); + } catch (const ComparisonFailure& exception) { + return Result::Failure( + FailureStatus(reference_case, exception.Code(), exception.what())); + } catch (const std::exception& exception) { + return Result::Failure( + FailureStatus(reference_case, "reference-comparison-failed", exception.what())); + } +} + +NonlinearReferenceClassification ClassifyReferenceComparison( + const NonlinearReferenceComparisonReport& report) { + const bool blocking_precheck = + std::any_of(report.precheck_findings.begin(), report.precheck_findings.end(), + [](const NonlinearReferencePrecheckFinding& finding) { + return finding.disposition == + NonlinearReferenceDisposition::kBlocking; + }); + if (!report.blocking_passed || blocking_precheck) { + return NonlinearReferenceClassification::kFailed; + } + const bool warning_only_difference = + std::any_of(report.families.begin(), report.families.end(), + [](const NonlinearReferenceFamilyReport& family) { + return family.disposition == + NonlinearReferenceDisposition::kWarningOnly && + !family.tolerance.passed; + }); + const bool warning_precheck = + std::any_of(report.precheck_findings.begin(), report.precheck_findings.end(), + [](const NonlinearReferencePrecheckFinding& finding) { + return finding.disposition == + NonlinearReferenceDisposition::kWarningOnly; + }); + return warning_only_difference || warning_precheck + ? NonlinearReferenceClassification::kWarningOnlyDifferences + : NonlinearReferenceClassification::kPassed; +} + +NonlinearReferenceComparisonReport BuildReferenceComparisonReport( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path) { + NonlinearReferenceComparisonReport report{}; + report.case_id = reference_case.case_id; + report.original_input_path = reference_case.original_input_path; + report.generated_results_hdf5 = hdf5_results_path; + report.blocking_passed = false; + const auto artifacts = ArtifactCheck(reference_case); + if (artifacts.HasValue()) { + report.pre_run_artifacts = artifacts.Value(); + report.post_run_artifacts = artifacts.Value(); + } + if (hdf5_results_path.has_filename()) { + try { + report.copied_input_path = CopiedInputPathFor(hdf5_results_path); + report.generated_log_path = DerivedLogPath(report.copied_input_path); + } catch (const ComparisonFailure&) { + // This builder is non-throwing by contract; comparison reports surface + // the malformed result path through CompareHdf5ToReferenceCsv instead. + } + } + return report; +} + +} // namespace fesa::test diff --git a/tests/reference/nonlinear_static_reference_comparison.h b/tests/reference/nonlinear_static_reference_comparison.h new file mode 100644 index 0000000..dc1b235 --- /dev/null +++ b/tests/reference/nonlinear_static_reference_comparison.h @@ -0,0 +1,129 @@ +#ifndef FESA_TESTS_REFERENCE_NONLINEAR_STATIC_REFERENCE_COMPARISON_H_ +#define FESA_TESTS_REFERENCE_NONLINEAR_STATIC_REFERENCE_COMPARISON_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/core/status.h" +#include "reference_tolerance_policy.h" + +namespace fesa::test { + +struct NonlinearReferenceCase { + std::string case_id; + std::filesystem::path original_input_path; + std::filesystem::path displacement_csv_path; + std::filesystem::path reaction_csv_path; + std::filesystem::path stress_inventory_path; + std::filesystem::path execution_directory; +}; + +struct ArtifactSnapshot { + std::filesystem::path path; + std::string sha256; + std::uintmax_t byte_size; + std::filesystem::file_time_type last_write_time; +}; + +enum class NonlinearReferenceDisposition { + kBlocking, + kWarningOnly, + kReviewOnly, + kExcluded, +}; + +struct NonlinearReferenceRowKey { + std::string case_id; + std::string accepted_state; + std::string instance_name; + std::int64_t source_node_label; + std::string component; +}; + +struct NonlinearReferenceFamilyReport { + std::string family_identity; + std::vector components; + NonlinearReferenceDisposition disposition; + std::size_t row_count; + ReferenceToleranceFamilyDecision tolerance; +}; + +struct NonlinearReferencePrecheckFinding { + std::string family_identity; + NonlinearReferenceDisposition disposition; + std::string diagnostic_code; + std::vector affected_keys; +}; + +struct NonlinearInternalEquilibriumReport { + std::string family_identity; + std::size_t row_count; + double numerator; + double scale; + std::optional normalized_metric; + bool passed; + std::string diagnostic_code; +}; + +struct ConstrainedReactionResultantReport { + std::array force; + std::array moment; +}; + +NonlinearInternalEquilibriumReport EvaluateGlobalBalance( + const std::string& family_identity, double numerator, + double applied_scale, double reaction_scale); + +struct GeneratedRunArtifacts { + std::filesystem::path copied_input_path; + std::filesystem::path generated_results_hdf5; + std::filesystem::path generated_log_path; +}; + +struct NonlinearReferenceComparisonReport { + std::string case_id; + std::filesystem::path original_input_path; + std::filesystem::path copied_input_path; + std::filesystem::path generated_results_hdf5; + std::filesystem::path generated_log_path; + std::vector pre_run_artifacts; + std::vector post_run_artifacts; + std::vector families; + bool blocking_passed; + std::vector precheck_findings; + std::vector internal_equilibrium; + ConstrainedReactionResultantReport constrained_reaction_resultant; + bool external_blocking_passed; + bool internal_blocking_passed; +}; + +enum class NonlinearReferenceClassification { + kPassed, + kFailed, + kWarningOnlyDifferences, +}; + +Result> ArtifactCheck( + const NonlinearReferenceCase& reference_case); +Result CopyInputToExecutionDirectory( + const NonlinearReferenceCase& reference_case); +Result RunFesaApplicationOnCopiedInput( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& copied_input_path); +Result CompareHdf5ToReferenceCsv( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path); +NonlinearReferenceClassification ClassifyReferenceComparison( + const NonlinearReferenceComparisonReport& report); +NonlinearReferenceComparisonReport BuildReferenceComparisonReport( + const NonlinearReferenceCase& reference_case, + const std::filesystem::path& hdf5_results_path); + +} // namespace fesa::test + +#endif // FESA_TESTS_REFERENCE_NONLINEAR_STATIC_REFERENCE_COMPARISON_H_ diff --git a/tests/reference/reference_comparison.cpp b/tests/reference/reference_comparison.cpp index 5823a38..af14ddf 100644 --- a/tests/reference/reference_comparison.cpp +++ b/tests/reference/reference_comparison.cpp @@ -1345,10 +1345,18 @@ bool FiniteReport(const ComparisonReport& report) { Result ReferenceComparison::Compare( const std::filesystem::path& results_hdf5, const std::filesystem::path& legacy_reference_directory) { + return Compare(results_hdf5, legacy_reference_directory, + legacy_reference_directory / kInputName); +} + +Result ReferenceComparison::Compare( + const std::filesystem::path& results_hdf5, + const std::filesystem::path& legacy_reference_directory, + const std::filesystem::path& execution_input_path) { try { RequireExactArtifactInventory(legacy_reference_directory); - const auto input = legacy_reference_directory / kInputName; - Domain domain = ReadApprovedDomain(input); + const auto reference_input = legacy_reference_directory / kInputName; + Domain domain = ReadApprovedDomain(reference_input); const ReferenceTable displacement = ReadReferenceCsv(legacy_reference_directory / kDisplacementName, {"Frame", "Part Instance Name", "Node Label", "U-U1", @@ -1359,7 +1367,8 @@ Result ReferenceComparison::Compare( "RF-RF2", "RF-RF3", "RM-RM1", "RM-RM2", "RM-RM3"}); const SectionReferenceTable section = ReadSectionReferenceCsv(legacy_reference_directory / kSectionName); - HdfProjection hdf = ReadHdfProjection(results_hdf5, input, domain); + HdfProjection hdf = + ReadHdfProjection(results_hdf5, execution_input_path, domain); const auto displacement_rows = OrderedRows(displacement, hdf.nodes); const auto reaction_rows = OrderedRows(reaction, hdf.nodes); const auto section_rows = OrderedSectionRows(section, hdf); diff --git a/tests/reference/reference_comparison.h b/tests/reference/reference_comparison.h index 1a9c339..c9ae21a 100644 --- a/tests/reference/reference_comparison.h +++ b/tests/reference/reference_comparison.h @@ -84,6 +84,15 @@ class ReferenceComparison { static Result Compare( const std::filesystem::path& results_hdf5, const std::filesystem::path& legacy_reference_directory); + + /// @brief Compares results using a separately copied execution input path. + /// @param execution_input_path Input path recorded by the solver in HDF5. + /// @note Reference inputs and CSV files remain in legacy_reference_directory. + static Result Compare( + const std::filesystem::path& results_hdf5, + const std::filesystem::path& legacy_reference_directory, + const std::filesystem::path& execution_input_path); + static Status WriteDeterministicJson( const ComparisonReport& report, const std::filesystem::path& output_json); }; diff --git a/tests/test_execute.py b/tests/test_execute.py index 6eaac37..157f9c3 100644 --- a/tests/test_execute.py +++ b/tests/test_execute.py @@ -6,6 +6,17 @@ import pytest from scripts import execute +def write_implementation_agent_profile( + root, *, model="gpt-5.6-terra", reasoning="xhigh" +): + profile = root / ".codex" / "agents" / "implementation-agent.toml" + profile.parent.mkdir(parents=True) + profile.write_text( + f'model = "{model}"\nmodel_reasoning_effort = "{reasoning}"\n', + encoding="utf-8", + ) + + def test_invoke_codex_uses_utf8_for_unicode_prompt(tmp_path, monkeypatch): phase_dir = tmp_path / "phases" / "unicode-phase" phase_dir.mkdir(parents=True) @@ -20,6 +31,7 @@ def test_invoke_codex_uses_utf8_for_unicode_prompt(tmp_path, monkeypatch): encoding="utf-8", ) (phase_dir / "step0.md").write_text("Euler–Bernoulli 보", encoding="utf-8") + write_implementation_agent_profile(tmp_path) invocation = {} @@ -40,6 +52,44 @@ def test_invoke_codex_uses_utf8_for_unicode_prompt(tmp_path, monkeypatch): assert invocation["command"][sandbox_index + 1] == "workspace-write" +def test_invoke_codex_uses_implementation_agent_command_contract( + tmp_path, monkeypatch +): + phase_dir = tmp_path / "phases" / "agent-phase" + phase_dir.mkdir(parents=True) + (phase_dir / "index.json").write_text( + json.dumps( + { + "project": "FESA Structural Solver", + "phase": "agent-phase", + "steps": [{"step": 0, "name": "agent", "status": "pending"}], + } + ), + encoding="utf-8", + ) + (phase_dir / "step0.md").write_text("agent routing", encoding="utf-8") + write_implementation_agent_profile(tmp_path) + + invocation = {} + + def capture_run(command, **kwargs): + invocation["command"] = command + return subprocess.CompletedProcess(command, 0, stdout="", stderr="") + + monkeypatch.setattr(execute, "ROOT", tmp_path) + monkeypatch.setattr(execute.subprocess, "run", capture_run) + + executor = execute.StepExecutor("agent-phase") + executor._invoke_codex({"step": 0, "name": "agent"}, "") + + model_index = invocation["command"].index("--model") + config_index = invocation["command"].index("--config") + assert invocation["command"][model_index + 1] == "gpt-5.6-terra" + assert invocation["command"][config_index + 1] == 'model_reasoning_effort="xhigh"' + adjacent_arguments = list(zip(invocation["command"], invocation["command"][1:])) + assert ("--disable", "unified_exec") in adjacent_arguments + + def test_invoke_codex_accepts_explicit_danger_full_access_override( tmp_path, monkeypatch ): @@ -56,6 +106,7 @@ def test_invoke_codex_accepts_explicit_danger_full_access_override( encoding="utf-8", ) (phase_dir / "step0.md").write_text("sandbox override", encoding="utf-8") + write_implementation_agent_profile(tmp_path) invocation = {} @@ -74,6 +125,80 @@ def test_invoke_codex_accepts_explicit_danger_full_access_override( assert invocation["command"][sandbox_index + 1] == "danger-full-access" +def test_invoke_codex_timeout_writes_structured_failure(tmp_path, monkeypatch): + phase_dir = tmp_path / "phases" / "timeout-phase" + phase_dir.mkdir(parents=True) + (phase_dir / "index.json").write_text( + json.dumps( + { + "project": "FESA Structural Solver", + "phase": "timeout-phase", + "steps": [{"step": 0, "name": "timeout", "status": "pending"}], + } + ), + encoding="utf-8", + ) + (phase_dir / "step0.md").write_text("timeout", encoding="utf-8") + write_implementation_agent_profile(tmp_path) + + def timeout_run(command, **kwargs): + raise subprocess.TimeoutExpired( + command, kwargs["timeout"], output="partial stdout", stderr="partial stderr" + ) + + monkeypatch.setattr(execute, "ROOT", tmp_path) + monkeypatch.setattr(execute.subprocess, "run", timeout_run) + + executor = execute.StepExecutor("timeout-phase") + output = executor._invoke_codex({"step": 0, "name": "timeout"}, "") + + assert output["exitCode"] == 124 + assert output["stdout"] == "partial stdout" + assert "Codex timed out after 1800 seconds." in output["stderr"] + stored = json.loads((phase_dir / "step0-output.json").read_text(encoding="utf-8")) + assert stored == output + + +def test_execute_single_step_retries_structured_codex_timeout(tmp_path, monkeypatch): + phase_dir = tmp_path / "phases" / "retry-phase" + phase_dir.mkdir(parents=True) + (phase_dir / "index.json").write_text( + json.dumps( + { + "project": "FESA Structural Solver", + "phase": "retry-phase", + "steps": [{"step": 0, "name": "retry", "status": "pending"}], + } + ), + encoding="utf-8", + ) + (phase_dir / "step0.md").write_text("retry", encoding="utf-8") + write_implementation_agent_profile(tmp_path) + attempts = [] + + def timeout_run(command, **kwargs): + attempts.append(command) + raise subprocess.TimeoutExpired(command, kwargs["timeout"]) + + monkeypatch.setattr(execute, "ROOT", tmp_path) + monkeypatch.setattr(execute.subprocess, "run", timeout_run) + + executor = execute.StepExecutor("retry-phase") + executor.MAX_RETRIES = 2 + monkeypatch.setattr(executor, "_commit_step", lambda *args: None) + monkeypatch.setattr(executor, "_update_top_index", lambda *args: None) + + with pytest.raises(SystemExit, match="1"): + executor._execute_single_step( + {"step": 0, "name": "retry", "status": "pending"}, "" + ) + + assert len(attempts) == 2 + index = json.loads((phase_dir / "index.json").read_text(encoding="utf-8")) + assert index["steps"][0]["status"] == "error" + assert "Codex timed out after 1800 seconds." in index["steps"][0]["error_message"] + + def test_invoke_codex_rejects_unknown_sandbox_override(tmp_path, monkeypatch): phase_dir = tmp_path / "phases" / "sandbox-phase" phase_dir.mkdir(parents=True) diff --git a/tests/test_harness_preset_contract.py b/tests/test_harness_preset_contract.py new file mode 100644 index 0000000..185fda8 --- /dev/null +++ b/tests/test_harness_preset_contract.py @@ -0,0 +1,80 @@ +import json +from pathlib import Path +import sys + + +ROOT = Path(__file__).resolve().parents[1] +SCRIPTS = ROOT / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +from msvc_harness.adapters.cmake import CMakeAdapter +from msvc_harness.config import load_config +from msvc_harness.models import ProjectKind, ProjectSelection, Toolchain + + +PRESET_NAME = "windows-msvc-ninja-debug" +BINARY_DIR = ".harness/build-ninja-msvc-debug" + + +def test_harness_uses_tracked_ninja_msvc_presets(tmp_path): + presets = json.loads((ROOT / "CMakePresets.json").read_text(encoding="utf-8")) + configure = presets["configurePresets"][0] + assert configure == { + "name": PRESET_NAME, + "displayName": "Windows MSVC x64 Debug (Ninja)", + "generator": "Ninja", + "binaryDir": f"${{sourceDir}}/{BINARY_DIR}", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "FESA_GTEST_SOURCE_DIR": "$env{FESA_GTEST_SOURCE_DIR}", + "MKL_DIR": "$env{MKL_DIR}", + "TBB_DIR": "$env{TBB_DIR}", + "HDF5_DIR": "$env{HDF5_DIR}", + }, + } + assert presets["buildPresets"] == [ + {"name": PRESET_NAME, "configurePreset": PRESET_NAME} + ] + assert presets["testPresets"] == [ + {"name": PRESET_NAME, "configurePreset": PRESET_NAME} + ] + + example = json.loads( + (ROOT / ".harness" / "config.example.json").read_text(encoding="utf-8") + ) + assert example == { + "version": 1, + "projectType": "cmake", + "cmake": { + "sourceDir": ".", + "binaryDir": BINARY_DIR, + "configurePreset": PRESET_NAME, + "buildPreset": PRESET_NAME, + "testPreset": PRESET_NAME, + }, + } + assert ".harness/build-ninja-msvc-debug/" in ( + ROOT / ".gitignore" + ).read_text(encoding="utf-8").splitlines() + + harness_dir = tmp_path / ".harness" + harness_dir.mkdir() + (harness_dir / "config.json").write_text( + json.dumps(example), encoding="utf-8" + ) + config = load_config(tmp_path) + tools = Toolchain( + installation=tmp_path / "vs", + msbuild=tmp_path / "msbuild.exe", + cmake=tmp_path / "cmake.exe", + ctest=tmp_path / "ctest.exe", + ) + selection = ProjectSelection(ProjectKind.CMAKE, ROOT / "CMakePresets.json") + plan = CMakeAdapter().create_plan(tmp_path, selection, config, tools) + + assert [step.command.argv[1:] for step in plan.steps] == [ + ("--preset", PRESET_NAME), + ("--build", "--preset", PRESET_NAME), + ("--preset", PRESET_NAME, "--show-only=json-v1"), + ("--preset", PRESET_NAME, "--output-on-failure"), + ] diff --git a/tests/unit/analysis/newton_iteration_log_test.cpp b/tests/unit/analysis/newton_iteration_log_test.cpp new file mode 100644 index 0000000..8b77ad0 --- /dev/null +++ b/tests/unit/analysis/newton_iteration_log_test.cpp @@ -0,0 +1,415 @@ +#include "fesa/analysis/newton_iteration_log.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace { + +class TempDirectory { + public: + explicit TempDirectory(const std::string& label) { + const auto tick = + std::chrono::steady_clock::now().time_since_epoch().count(); + path_ = std::filesystem::temp_directory_path() / + ("fesa-newton-log-" + label + "-" + std::to_string(tick)); + std::error_code error; + if (!std::filesystem::create_directory(path_, error) || error) { + throw std::runtime_error{"Unable to create Newton log test fixture."}; + } + } + + TempDirectory(const TempDirectory&) = delete; + TempDirectory& operator=(const TempDirectory&) = delete; + + ~TempDirectory() { + std::error_code ignored; + std::filesystem::remove_all(path_, ignored); + } + + const std::filesystem::path& Path() const noexcept { return path_; } + + private: + std::filesystem::path path_; +}; + +void ExpectLogOutputFailure(const fesa::Status& status) { + ASSERT_FALSE(status.IsOk()); + ASSERT_EQ(status.Category(), fesa::FailureCategory::kOutput); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics().front().code, "log-output-failure"); +} + +std::vector SplitTabs(const std::string& line) { + std::vector fields; + std::size_t start = 0U; + while (start <= line.size()) { + const std::size_t end = line.find('\t', start); + if (end == std::string::npos) { + fields.push_back(line.substr(start)); + return fields; + } + fields.push_back(line.substr(start, end - start)); + start = end + 1U; + } + return fields; +} + +const std::string& FieldValue(const std::vector& fields, + const std::string_view label) { + const std::string prefix = std::string{label} + "="; + for (const std::string& field : fields) { + if (field.compare(0U, prefix.size(), prefix) == 0) { + return field; + } + } + throw std::runtime_error{"Newton log field is missing."}; +} + +std::string ValueAfterEquals(const std::string& field) { + return field.substr(field.find('=') + 1U); +} + +fesa::Vector VectorFrom(const std::vector& values) { + fesa::Vector result{values.size()}; + for (std::size_t index = 0U; index < values.size(); ++index) { + result[index] = values[index]; + } + return result; +} + +fesa::NewtonChannelDecision MakeDecision(const std::string& identity) { + return {identity, + 0.0012345678901234567, + 1.2345678901234567, + fesa::NewtonConvergenceBranch::kRelative, + fesa::kNewtonRelativeThreshold, + fesa::NewtonChannelUnit::kDimensionless, + true}; +} + +fesa::NewtonIterationLogRecord CompleteRecord() { + return {"Step-1", + 3U, + 0.12345678901234567, + 2U, + fesa::NewtonIterationStage::kConvergenceEvaluated, + {false, fesa::NewtonIterationStage::kFailed, "", ""}, + "accept", + "accepted", + "none", + MakeDecision("residual_force"), + MakeDecision("residual_moment"), + MakeDecision("correction_translation"), + MakeDecision("correction_rotation"), + true}; +} + +std::vector WriteAndRead( + const std::filesystem::path& path, + const fesa::NewtonIterationLogRecord& record) { + fesa::NewtonIterationLogWriter writer; + if (!writer.Open(path).IsOk() || !writer.Write(record).IsOk() || + !writer.Flush().IsOk() || !writer.Close().IsOk()) { + throw std::runtime_error{"Unable to write Newton log test record."}; + } + + std::ifstream input{path, std::ios::binary}; + if (!input.is_open()) { + throw std::runtime_error{"Unable to read Newton log test record."}; + } + const std::string contents{std::istreambuf_iterator{input}, + std::istreambuf_iterator{}}; + if (contents.empty()) { + throw std::runtime_error{"Newton log test record is empty."}; + } + EXPECT_EQ(contents.back(), '\n'); + EXPECT_EQ(std::count(contents.begin(), contents.end(), '\n'), 1); + EXPECT_EQ(contents.find('\r'), std::string::npos); + EXPECT_FALSE(contents.size() >= 3U && + static_cast(contents[0U]) == 0xEFU && + static_cast(contents[1U]) == 0xBBU && + static_cast(contents[2U]) == 0xBFU); + return SplitTabs(contents.substr(0U, contents.size() - 1U)); +} + +// NSNR-LOG-001, NSNR-LOG-002, and NSNR-LOG-003 +TEST(NewtonIterationLog, WritesOneLfTerminated39FieldRecordInApprovedOrder) { + TempDirectory directory{"complete"}; + const auto fields = + WriteAndRead(directory.Path() / "model_log.txt", CompleteRecord()); + + const std::vector labels{ + "record", "schema", "increment", "target_factor", "iteration", + "last_completed_stage", "failing_stage", "residual_force_channel", + "residual_force_numerator_norm", "residual_force_denominator_scale", + "residual_force_branch", "residual_force_threshold", + "residual_force_threshold_unit", "residual_force_pass", + "residual_moment_channel", "residual_moment_numerator_norm", + "residual_moment_denominator_scale", "residual_moment_branch", + "residual_moment_threshold", "residual_moment_threshold_unit", + "residual_moment_pass", "correction_translation_channel", + "correction_translation_numerator_norm", + "correction_translation_denominator_scale", + "correction_translation_branch", "correction_translation_threshold", + "correction_translation_threshold_unit", "correction_translation_pass", + "correction_rotation_channel", "correction_rotation_numerator_norm", + "correction_rotation_denominator_scale", "correction_rotation_branch", + "correction_rotation_threshold", "correction_rotation_threshold_unit", + "correction_rotation_pass", "combined_pass", "transition", "outcome", + "diagnostic_code"}; + + ASSERT_EQ(fields.size(), labels.size()); + for (std::size_t index = 0U; index < labels.size(); ++index) { + EXPECT_EQ(fields[index].substr(0U, fields[index].find('=')), labels[index]); + } + EXPECT_EQ(FieldValue(fields, "record"), "record=newton-iteration"); + EXPECT_EQ(FieldValue(fields, "schema"), "schema=nsnr-log-v1"); +} + +// NSNR-LOG-004 +TEST(NewtonIterationLog, FormatsFiniteNumbersForLocaleIndependentRoundTrip) { + TempDirectory directory{"numbers"}; + const auto fields = + WriteAndRead(directory.Path() / "model_log.txt", CompleteRecord()); + const std::string value = ValueAfterEquals(FieldValue(fields, "target_factor")); + + double parsed = 0.0; + const auto result = std::from_chars(value.data(), value.data() + value.size(), + parsed, std::chars_format::general); + EXPECT_EQ(result.ec, std::errc{}); + EXPECT_EQ(result.ptr, value.data() + value.size()); + EXPECT_DOUBLE_EQ(parsed, 0.12345678901234567); + EXPECT_NE(value.find('.'), std::string::npos); + EXPECT_EQ(value.find(','), std::string::npos); +} + +// NSNR-LOG-005 and NSNR-LOG-007 +TEST(NewtonIterationLog, SerializesChannelDecisionsAndExplicitOutcomeFields) { + TempDirectory directory{"channels"}; + const auto fields = + WriteAndRead(directory.Path() / "model_log.txt", CompleteRecord()); + + for (const std::string_view prefix : + {"residual_force", "residual_moment", "correction_translation", + "correction_rotation"}) { + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_channel"), + std::string{prefix} + "_channel=" + std::string{prefix}); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_numerator_norm"), + std::string{prefix} + + "_numerator_norm=0.0012345678901234567"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_denominator_scale"), + std::string{prefix} + + "_denominator_scale=1.2345678901234567"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_branch"), + std::string{prefix} + "_branch=relative"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_threshold"), + std::string{prefix} + "_threshold=0.01"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_threshold_unit"), + std::string{prefix} + "_threshold_unit=1"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_pass"), + std::string{prefix} + "_pass=1"); + } + EXPECT_EQ(FieldValue(fields, "last_completed_stage"), + "last_completed_stage=convergence-gates"); + EXPECT_EQ(FieldValue(fields, "failing_stage"), "failing_stage=none"); + EXPECT_EQ(FieldValue(fields, "combined_pass"), "combined_pass=1"); + EXPECT_EQ(FieldValue(fields, "transition"), "transition=accept"); + EXPECT_EQ(FieldValue(fields, "outcome"), "outcome=accepted"); + EXPECT_EQ(FieldValue(fields, "diagnostic_code"), "diagnostic_code=none"); +} + +// NSNR-LOG-006 +TEST(NewtonIterationLog, SerializesEmptyChannelsAsTypedZeroScaleDecisions) { + TempDirectory directory{"zero-scale"}; + auto record = CompleteRecord(); + const std::vector units{ + fesa::NewtonChannelUnit::kForce, fesa::NewtonChannelUnit::kForceLength, + fesa::NewtonChannelUnit::kLength, fesa::NewtonChannelUnit::kDimensionless}; + fesa::NewtonChannelDecision* decisions[]{ + &record.force_residual, &record.moment_residual, + &record.translation_correction, &record.rotation_correction}; + for (std::size_t index = 0U; index < std::size(decisions); ++index) { + decisions[index]->numerator_norm = 0.0; + decisions[index]->denominator_scale = 0.0; + decisions[index]->branch = fesa::NewtonConvergenceBranch::kZeroScale; + decisions[index]->threshold = fesa::kNewtonZeroScaleThreshold; + decisions[index]->threshold_unit = units[index]; + decisions[index]->passed = true; + } + + const auto fields = WriteAndRead(directory.Path() / "model_log.txt", record); + for (const std::string_view prefix : + {"residual_force", "residual_moment", "correction_translation", + "correction_rotation"}) { + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_numerator_norm"), + std::string{prefix} + "_numerator_norm=0"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_denominator_scale"), + std::string{prefix} + "_denominator_scale=0"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_branch"), + std::string{prefix} + "_branch=zero-scale"); + EXPECT_EQ(FieldValue(fields, std::string{prefix} + "_threshold"), + std::string{prefix} + "_threshold=0.001"); + } + EXPECT_EQ(FieldValue(fields, "residual_force_threshold_unit"), + "residual_force_threshold_unit=force"); + EXPECT_EQ(FieldValue(fields, "residual_moment_threshold_unit"), + "residual_moment_threshold_unit=force*length"); + EXPECT_EQ(FieldValue(fields, "correction_translation_threshold_unit"), + "correction_translation_threshold_unit=length"); + EXPECT_EQ(FieldValue(fields, "correction_rotation_threshold_unit"), + "correction_rotation_threshold_unit=1"); +} + +// NSNR-LOG-008 and NSNR-LOG-009 +TEST(NewtonIterationLog, EscapesStringsAndOmitsUnevaluatedFailureFields) { + TempDirectory directory{"failure"}; + auto record = CompleteRecord(); + record.last_completed_stage = fesa::NewtonIterationStage::kInternalAssembled; + record.failure = {true, + fesa::NewtonIterationStage::kExternalAssembled, + "load\\failure", + std::string{"external\tload\nmissing\r"} + '\0'}; + record.transition = "fail\ttransition"; + record.outcome = "failed\nrecord"; + record.diagnostic_code = std::string{"external\\load\r"} + '\0'; + const auto fields = WriteAndRead(directory.Path() / "model_log.txt", record); + + const std::string not_evaluated = + "not-evaluated(external\\tload\\nmissing\\r\\0)"; + for (std::size_t index = 7U; index < 36U; ++index) { + EXPECT_EQ(ValueAfterEquals(fields[index]), not_evaluated); + } + EXPECT_EQ(FieldValue(fields, "failing_stage"), + "failing_stage=load-boundary"); + EXPECT_EQ(FieldValue(fields, "transition"), + "transition=fail\\ttransition"); + EXPECT_EQ(FieldValue(fields, "outcome"), "outcome=failed\\nrecord"); + EXPECT_EQ(FieldValue(fields, "diagnostic_code"), + "diagnostic_code=external\\\\load\\r\\0"); +} + +// NSNR-LOG-010 +TEST(NewtonIterationLog, ReportsWriteFlushAndCloseStateFailures) { + TempDirectory directory{"failures"}; + const auto path = directory.Path() / "model_log.txt"; + fesa::NewtonIterationLogWriter writer; + ExpectLogOutputFailure(writer.Write(CompleteRecord())); + ExpectLogOutputFailure(writer.Flush()); + ExpectLogOutputFailure(writer.Close()); + + fesa::NewtonIterationLogWriter invalid_open_writer; + ExpectLogOutputFailure( + invalid_open_writer.Open(directory.Path() / "missing" / "log.txt")); + + fesa::NewtonIterationLogWriter closed_writer; + ASSERT_TRUE(closed_writer.Open(path).IsOk()); + ASSERT_TRUE(closed_writer.Close().IsOk()); + ExpectLogOutputFailure(closed_writer.Write(CompleteRecord())); + ExpectLogOutputFailure(closed_writer.Flush()); + ExpectLogOutputFailure(closed_writer.Close()); +} + +// NSNR-LOG-011 +TEST(NewtonIterationLog, LeavesZeroByteLogForNonNewtonControlledFailurePath) { + TempDirectory directory{"zero-byte"}; + const auto path = directory.Path() / "model_log.txt"; + fesa::NewtonIterationLogWriter writer; + + ASSERT_TRUE(writer.Open(path).IsOk()); + ASSERT_TRUE(writer.Close().IsOk()); + EXPECT_TRUE(std::filesystem::exists(path)); + EXPECT_EQ(std::filesystem::file_size(path), 0U); +} + +// NSNR-LOG-012 +TEST(NewtonIterationLog, + SerializesEvaluatorProducedExternalScaleResidualDecisions) { + TempDirectory directory{"external-scale"}; + const fesa::NewtonConvergenceInput zero_external{ + {"residual_force", VectorFrom({1.0e-3}), VectorFrom({2.0}), + VectorFrom({0.0})}, + {"residual_moment", VectorFrom({1.0e-3}), VectorFrom({3.0}), + VectorFrom({0.0})}, + {"correction_translation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + {"correction_rotation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + }; + const auto zero_decisions = fesa::EvaluateNewtonConvergence(zero_external); + auto zero_record = CompleteRecord(); + zero_record.force_residual = zero_decisions.force_residual; + zero_record.moment_residual = zero_decisions.moment_residual; + zero_record.translation_correction = zero_decisions.translation_correction; + zero_record.rotation_correction = zero_decisions.rotation_correction; + zero_record.combined_passed = zero_decisions.combined_passed; + const auto zero_fields = + WriteAndRead(directory.Path() / "zero_log.txt", zero_record); + + ASSERT_EQ(zero_fields.size(), 39U); + EXPECT_EQ(FieldValue(zero_fields, "schema"), "schema=nsnr-log-v1"); + EXPECT_EQ(FieldValue(zero_fields, "residual_force_denominator_scale"), + "residual_force_denominator_scale=0"); + EXPECT_EQ(FieldValue(zero_fields, "residual_moment_denominator_scale"), + "residual_moment_denominator_scale=0"); + EXPECT_EQ(FieldValue(zero_fields, "residual_force_branch"), + "residual_force_branch=zero-scale"); + EXPECT_EQ(FieldValue(zero_fields, "residual_moment_branch"), + "residual_moment_branch=zero-scale"); + EXPECT_EQ(FieldValue(zero_fields, "residual_force_threshold"), + "residual_force_threshold=0.001"); + EXPECT_EQ(FieldValue(zero_fields, "residual_moment_threshold"), + "residual_moment_threshold=0.001"); + EXPECT_EQ(FieldValue(zero_fields, "residual_force_threshold_unit"), + "residual_force_threshold_unit=force"); + EXPECT_EQ(FieldValue(zero_fields, "residual_moment_threshold_unit"), + "residual_moment_threshold_unit=force*length"); + + const fesa::NewtonConvergenceInput nonzero_external{ + {"residual_force", VectorFrom({2.0e-2}), VectorFrom({2.0}), + VectorFrom({1.0})}, + {"residual_moment", VectorFrom({2.0e-2}), VectorFrom({1.0}), + VectorFrom({2.0})}, + {"correction_translation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + {"correction_rotation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + }; + const auto relative_decisions = + fesa::EvaluateNewtonConvergence(nonzero_external); + auto relative_record = CompleteRecord(); + relative_record.force_residual = relative_decisions.force_residual; + relative_record.moment_residual = relative_decisions.moment_residual; + relative_record.translation_correction = + relative_decisions.translation_correction; + relative_record.rotation_correction = relative_decisions.rotation_correction; + relative_record.combined_passed = relative_decisions.combined_passed; + const auto relative_fields = + WriteAndRead(directory.Path() / "relative_log.txt", relative_record); + + ASSERT_EQ(relative_fields.size(), 39U); + EXPECT_EQ(FieldValue(relative_fields, "residual_force_denominator_scale"), + "residual_force_denominator_scale=2"); + EXPECT_EQ(FieldValue(relative_fields, "residual_moment_denominator_scale"), + "residual_moment_denominator_scale=2"); + EXPECT_EQ(FieldValue(relative_fields, "residual_force_branch"), + "residual_force_branch=relative"); + EXPECT_EQ(FieldValue(relative_fields, "residual_moment_branch"), + "residual_moment_branch=relative"); + EXPECT_EQ(FieldValue(relative_fields, "residual_force_threshold"), + "residual_force_threshold=0.01"); + EXPECT_EQ(FieldValue(relative_fields, "residual_moment_threshold"), + "residual_moment_threshold=0.01"); + EXPECT_EQ(FieldValue(relative_fields, "residual_force_threshold_unit"), + "residual_force_threshold_unit=1"); + EXPECT_EQ(FieldValue(relative_fields, "residual_moment_threshold_unit"), + "residual_moment_threshold_unit=1"); +} + +} // namespace diff --git a/tests/unit/analysis/nonlinear_analysis_state_test.cpp b/tests/unit/analysis/nonlinear_analysis_state_test.cpp new file mode 100644 index 0000000..4fc9ad3 --- /dev/null +++ b/tests/unit/analysis/nonlinear_analysis_state_test.cpp @@ -0,0 +1,456 @@ +#include "fesa/analysis/nonlinear_analysis_state.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/model/domain.h" +#include "fesa/model/model_types.h" + +namespace { + +constexpr std::array, 3> kIdentityTriad{ + std::array{1.0, 0.0, 0.0}, + std::array{0.0, 1.0, 0.0}, + std::array{0.0, 0.0, 1.0}}; + +struct Fixture { + std::unique_ptr domain; + std::unique_ptr model; + std::unique_ptr dofs; +}; + +Fixture MakeFixture() { + const std::filesystem::path source{"nonlinear-analysis-state.inp"}; + fesa::ModelDefinition definition{}; + definition.source_path = source; + definition.source_content_identity = "nonlinear-analysis-state-fixture"; + definition.nodes = { + {{"Shell-A", 10, "10"}, {0.0, 0.0, 0.0}, {source, 1U}}, + {{"Shell-A", 20, "20"}, {1.0, 0.0, 0.0}, {source, 2U}}, + {{"Shell-A", 30, "30"}, {1.0, 1.0, 0.0}, {source, 3U}}, + {{"Shell-A", 40, "40"}, {0.0, 1.0, 0.0}, {source, 4U}}}; + definition.materials = {{"Material", 1000.0, 0.25, {source, 5U}}}; + definition.shell_sections = {{"Shell", 0.1, 0U, {source, 6U}}}; + definition.shell_elements = { + {{"Shell-A", 1, "1"}, + fesa::ShellSourceElementType::kS4, + {0U, 1U, 2U, 3U}, + 0U, + 0U, + {source, 7U}}}; + for (std::size_t node = 0U; node < definition.nodes.size(); ++node) { + definition.shell_node_initial_frames.push_back( + {static_cast(node), + {0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}}); + } + definition.steps = {{"Step-1", + {}, + {}, + fesa::StaticProcedureKind::kNonlinearFullNewton, + true, + 0.1, + 1.0, + 0.001, + 1.0, + {source, 8U}}}; + + auto domain_result = fesa::Domain::Create(std::move(definition)); + if (!domain_result.HasValue()) { + throw std::runtime_error{"State fixture Domain construction failed."}; + } + auto domain = + std::make_unique(std::move(domain_result.Value())); + auto model_result = fesa::AnalysisModel::Create(*domain); + if (!model_result.HasValue()) { + throw std::runtime_error{"State fixture AnalysisModel construction failed."}; + } + auto model = + std::make_unique(std::move(model_result.Value())); + auto dofs_result = fesa::DofManager::Create(*model); + if (!dofs_result.HasValue()) { + throw std::runtime_error{"State fixture DofManager construction failed."}; + } + auto dofs = + std::make_unique(std::move(dofs_result.Value())); + return {std::move(domain), std::move(model), std::move(dofs)}; +} + +fesa::NonlinearStateBaselineInput MakeBaseline(const fesa::Domain& domain) { + fesa::NonlinearStateBaselineInput baseline{}; + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + baseline.node_baselines.push_back( + {static_cast(node), domain.Nodes()[node].source_id, + kIdentityTriad, {0.0, 0.0, 1.0}}); + } + return baseline; +} + +fesa::NonlinearAnalysisState MakeState(const Fixture& fixture) { + auto state = fesa::NonlinearAnalysisState::Create( + *fixture.domain, *fixture.dofs, MakeBaseline(*fixture.domain)); + if (!state.HasValue()) { + throw std::runtime_error{"State fixture construction failed."}; + } + return std::move(state.Value()); +} + +fesa::ShellResultRow MakeShellRow( + const fesa::ShellMidsurfaceLocation location, + const std::array coordinates) { + return {0U, + location, + coordinates, + kIdentityTriad, + {}, + {}, + {{{fesa::ShellSectionPosition::kBottom, -1.0, {}}, + {fesa::ShellSectionPosition::kMiddle, 0.0, {}}, + {fesa::ShellSectionPosition::kTop, 1.0, {}}}}}; +} + +std::vector MakeShellRows() { + const double gauss = 1.0 / std::sqrt(3.0); + return {MakeShellRow(fesa::ShellMidsurfaceLocation::kGp1, {-gauss, -gauss}), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp2, {gauss, -gauss}), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp3, {gauss, gauss}), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp4, {-gauss, gauss})}; +} + +fesa::AcceptedFrameState MakeFrame( + const fesa::NonlinearTrialState& committed, const std::uint32_t frame_index, + const std::uint32_t increment_index, const double load_factor, + const std::uint32_t iteration_count) { + return {frame_index, + increment_index, + load_factor, + iteration_count, + load_factor == 1.0, + committed.nodal_internal_order, + committed.nodal_source_ids, + committed.generalized_coordinates, + committed.displacement, + committed.rotation_vector, + committed.nodal_triad, + committed.nodal_director, + committed.internal_force, + committed.external_force, + committed.residual, + committed.reaction, + MakeShellRows(), + 0.0, + {}}; +} + +template +struct HasVerificationMetrics : std::false_type {}; + +template +struct HasVerificationMetrics< + T, std::void_t().verification_metrics)>> + : std::true_type {}; + +void ExpectSourceIdEqual(const fesa::SourceEntityId& actual, + const fesa::SourceEntityId& expected) { + EXPECT_EQ(actual.instance_name, expected.instance_name); + EXPECT_EQ(actual.source_label, expected.source_label); + EXPECT_EQ(actual.source_label_text, expected.source_label_text); +} + +void ExpectVectorEqual(const fesa::Vector& actual, const fesa::Vector& expected) { + ASSERT_EQ(actual.Size(), expected.Size()); + for (std::size_t index = 0U; index < actual.Size(); ++index) { + EXPECT_DOUBLE_EQ(actual[index], expected[index]); + } +} + +} // namespace + +// NSNR-STATE-000, NSNR-STATE-002, NSNR-STATE-003, and NSNR-STATE-014 +TEST(NonlinearAnalysisState, CreatesFactorZeroBaselineInStableIdentityOrder) { + const auto fixture = MakeFixture(); + const auto baseline = MakeBaseline(*fixture.domain); + const auto result = fesa::NonlinearAnalysisState::Create( + *fixture.domain, *fixture.dofs, baseline); + + ASSERT_TRUE(result.HasValue()); + const auto& committed = result.Value().CommittedState(); + EXPECT_EQ(committed.increment_index, 0U); + EXPECT_DOUBLE_EQ(committed.load_factor, 0.0); + EXPECT_TRUE(committed.is_factor_zero_baseline); + EXPECT_TRUE(result.Value().AcceptedFrames().empty()); + ASSERT_EQ(committed.nodal_internal_order.size(), fixture.domain->Nodes().size()); + ASSERT_EQ(committed.nodal_source_ids.size(), fixture.domain->Nodes().size()); + for (std::size_t node = 0U; node < fixture.domain->Nodes().size(); ++node) { + EXPECT_EQ(committed.nodal_internal_order[node], node); + ExpectSourceIdEqual(committed.nodal_source_ids[node], + fixture.domain->Nodes()[node].source_id); + } + const fesa::Vector* const vectors[] = { + &committed.generalized_coordinates, &committed.displacement, + &committed.rotation_vector, &committed.internal_force, + &committed.external_force, &committed.residual, &committed.reaction}; + for (const auto* vector : vectors) { + ASSERT_EQ(vector->Size(), fixture.dofs->FullDofCount()); + for (std::size_t index = 0U; index < vector->Size(); ++index) { + EXPECT_DOUBLE_EQ((*vector)[index], 0.0); + } + } +} + +// NSNR-STATE-001 +TEST(NonlinearAnalysisState, RejectsInvalidBaselineInventoryBeforeStateCreation) { + const auto fixture = MakeFixture(); + const auto baseline = MakeBaseline(*fixture.domain); + const std::array invalid{ + fesa::NonlinearStateBaselineInput{{baseline.node_baselines[0U], + baseline.node_baselines[1U], + baseline.node_baselines[2U]}}, + fesa::NonlinearStateBaselineInput{{baseline.node_baselines[0U], + baseline.node_baselines[1U], + baseline.node_baselines[2U], + baseline.node_baselines[3U], + baseline.node_baselines[3U]}}, + fesa::NonlinearStateBaselineInput{{baseline.node_baselines[1U], + baseline.node_baselines[0U], + baseline.node_baselines[2U], + baseline.node_baselines[3U]}}, + fesa::NonlinearStateBaselineInput{{baseline.node_baselines[0U], + baseline.node_baselines[0U], + baseline.node_baselines[2U], + baseline.node_baselines[3U]}}, + fesa::NonlinearStateBaselineInput{{baseline.node_baselines[0U], + baseline.node_baselines[1U], + baseline.node_baselines[2U], + {3U, + {"Other-Instance", 40, "40"}, + kIdentityTriad, + {0.0, 0.0, 1.0}}}}}; + + for (const auto& invalid_baseline : invalid) { + const auto result = fesa::NonlinearAnalysisState::Create( + *fixture.domain, *fixture.dofs, invalid_baseline); + EXPECT_FALSE(result.HasValue()); + } +} + +// NSNR-STATE-001 and NSNR-STATE-002 +TEST(NonlinearAnalysisState, RejectsNonfiniteBaselineAndDofMismatch) { + const auto fixture = MakeFixture(); + auto nonfinite_triad = MakeBaseline(*fixture.domain); + nonfinite_triad.node_baselines[0U].triad[0U][0U] = + std::numeric_limits::quiet_NaN(); + EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( + *fixture.domain, *fixture.dofs, nonfinite_triad) + .HasValue()); + + auto nonfinite_director = MakeBaseline(*fixture.domain); + nonfinite_director.node_baselines[0U].director[2U] = + std::numeric_limits::infinity(); + EXPECT_FALSE(fesa::NonlinearAnalysisState::Create( + *fixture.domain, *fixture.dofs, nonfinite_director) + .HasValue()); + + auto empty_domain_result = fesa::Domain::Create(fesa::ModelDefinition{}); + ASSERT_TRUE(empty_domain_result.HasValue()); + const auto dof_mismatch = fesa::NonlinearAnalysisState::Create( + empty_domain_result.Value(), *fixture.dofs, + MakeBaseline(empty_domain_result.Value())); + EXPECT_FALSE(dof_mismatch.HasValue()); +} + +// NSNR-STATE-001 and NSNR-STATE-003 +TEST(NonlinearAnalysisState, PreservesDuplicateLabelsWhenInstancesDiffer) { + const auto fixture = MakeFixture(); + auto baseline = MakeBaseline(*fixture.domain); + baseline.node_baselines[1U].source_id = {"Shell-B", 10, "10"}; + auto changed_definition = fesa::ModelDefinition{}; + changed_definition.source_path = "duplicate-instance-labels.inp"; + changed_definition.source_content_identity = "duplicate-instance-labels"; + changed_definition.nodes = { + {{"Shell-A", 10, "10"}, {0.0, 0.0, 0.0}, {changed_definition.source_path, 1U}}, + {{"Shell-B", 10, "10"}, {1.0, 0.0, 0.0}, {changed_definition.source_path, 2U}}}; + changed_definition.steps = {{"Step-1", + {}, + {}, + fesa::StaticProcedureKind::kNonlinearFullNewton, + true, + 0.1, + 1.0, + 0.001, + 1.0, + {changed_definition.source_path, 3U}}}; + auto domain_result = fesa::Domain::Create(std::move(changed_definition)); + ASSERT_TRUE(domain_result.HasValue()); + auto domain = std::move(domain_result.Value()); + auto model_result = fesa::AnalysisModel::Create(domain); + ASSERT_TRUE(model_result.HasValue()); + auto dofs_result = fesa::DofManager::Create(model_result.Value()); + ASSERT_TRUE(dofs_result.HasValue()); + + baseline.node_baselines.resize(domain.Nodes().size()); + baseline = MakeBaseline(domain); + const auto result = fesa::NonlinearAnalysisState::Create( + domain, dofs_result.Value(), baseline); + + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().CommittedState().nodal_source_ids.size(), 2U); + EXPECT_EQ(result.Value().CommittedState().nodal_source_ids[0U].source_label, + result.Value().CommittedState().nodal_source_ids[1U].source_label); + EXPECT_NE(result.Value().CommittedState().nodal_source_ids[0U].instance_name, + result.Value().CommittedState().nodal_source_ids[1U].instance_name); +} + +// NSNR-STATE-004 and NSNR-STATE-012 +TEST(NonlinearAnalysisState, StartsIndependentTrialAndDiscardPreservesCommit) { + const auto fixture = MakeFixture(); + auto state = MakeState(fixture); + const auto before = state.CommittedState(); + auto trial = state.BeginTrialFromCommitted(); + + ASSERT_TRUE(trial.HasValue()); + EXPECT_NE(trial.Value().displacement.Data(), + state.CommittedState().displacement.Data()); + trial.Value().displacement[0U] = 2.0; + trial.Value().nodal_director[0U][2U] = 0.5; + state.DiscardTrial(); + + ExpectVectorEqual(state.CommittedState().displacement, before.displacement); + EXPECT_DOUBLE_EQ(state.CommittedState().nodal_director[0U][2U], 1.0); +} + +// NSNR-STATE-005, NSNR-STATE-006, NSNR-STATE-007, NSNR-STATE-008, +// NSNR-STATE-009, and NSNR-STATE-010 +TEST(NonlinearAnalysisState, CommitsOnlyStableCompleteAcceptedFrames) { + const auto fixture = MakeFixture(); + auto state = MakeState(fixture); + auto first = MakeFrame(state.CommittedState(), 0U, 1U, 0.5, 3U); + first.internal_force[0U] = 7.0; + first.external_force[0U] = 2.0; + first.residual[0U] = 5.0; + first.reaction[0U] = 5.0; + + ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()); + ASSERT_EQ(state.AcceptedFrames().size(), 1U); + EXPECT_EQ(state.AcceptedFrames()[0U].frame_index, 0U); + EXPECT_EQ(state.AcceptedFrames()[0U].increment_index, 1U); + EXPECT_FALSE(state.AcceptedFrames()[0U].is_factor_one); + EXPECT_EQ(state.CommittedState().increment_index, 1U); + EXPECT_FALSE(state.CommittedState().is_factor_zero_baseline); + EXPECT_DOUBLE_EQ(state.CommittedState().residual[0U], 5.0); + EXPECT_DOUBLE_EQ(state.CommittedState().reaction[0U], 5.0); + ASSERT_EQ(state.CommittedState().shell_results.size(), 4U); + EXPECT_EQ(state.CommittedState().shell_results[0U].location, + fesa::ShellMidsurfaceLocation::kGp1); + EXPECT_EQ(state.CommittedState().shell_results[3U].location, + fesa::ShellMidsurfaceLocation::kGp4); + + auto final_frame = MakeFrame(state.CommittedState(), 1U, 2U, 1.0, 2U); + ASSERT_TRUE(state.CommitAcceptedFrame(final_frame).IsOk()); + ASSERT_EQ(state.AcceptedFrames().size(), 2U); + EXPECT_EQ(state.AcceptedFrames()[1U].frame_index, 1U); + EXPECT_TRUE(state.AcceptedFrames()[1U].is_factor_one); +} + +// NSNR-STATE-005, NSNR-STATE-009, NSNR-STATE-010, and NSNR-STATE-012 +TEST(NonlinearAnalysisState, AtomicallyRejectsMalformedAcceptedFrames) { + const auto fixture = MakeFixture(); + auto state = MakeState(fixture); + const auto first = MakeFrame(state.CommittedState(), 0U, 1U, 0.5, 1U); + ASSERT_TRUE(state.CommitAcceptedFrame(first).IsOk()); + + const auto MakeNextFrame = [&state]() { + return MakeFrame(state.CommittedState(), 1U, 2U, 1.0, 1U); + }; + const auto ExpectRejected = [&state](const fesa::AcceptedFrameState& frame) { + const auto before = state.CommittedState(); + const std::size_t frame_count = state.AcceptedFrames().size(); + const auto status = state.CommitAcceptedFrame(frame); + + EXPECT_FALSE(status.IsOk()); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0U].code, "invalid-accepted-state"); + EXPECT_EQ(state.AcceptedFrames().size(), frame_count); + EXPECT_EQ(state.CommittedState().increment_index, before.increment_index); + EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor); + ExpectVectorEqual(state.CommittedState().displacement, before.displacement); + }; + + auto wrong_frame_index = MakeNextFrame(); + wrong_frame_index.frame_index = 2U; + ExpectRejected(wrong_frame_index); + + auto nonincreasing_factor = MakeFrame(state.CommittedState(), 1U, 2U, 0.5, 1U); + ExpectRejected(nonincreasing_factor); + + auto mismatched_identity = MakeNextFrame(); + mismatched_identity.nodal_source_ids[0U].instance_name = "Wrong-Instance"; + ExpectRejected(mismatched_identity); + + auto wrong_vector_size = MakeNextFrame(); + wrong_vector_size.generalized_coordinates = + fesa::Vector{fixture.dofs->FullDofCount() - 1U}; + ExpectRejected(wrong_vector_size); + + auto nonfinite_vector = MakeNextFrame(); + nonfinite_vector.rotation_vector[0U] = + std::numeric_limits::quiet_NaN(); + ExpectRejected(nonfinite_vector); + + auto residual_mismatch = MakeNextFrame(); + residual_mismatch.residual[0U] = 1.0; + ExpectRejected(residual_mismatch); + + auto reaction_mismatch = MakeNextFrame(); + reaction_mismatch.reaction[0U] = 1.0; + ExpectRejected(reaction_mismatch); + + auto invalid_shell_inventory = MakeNextFrame(); + invalid_shell_inventory.shell_results.pop_back(); + ExpectRejected(invalid_shell_inventory); + + auto invalid_factor_flag = MakeNextFrame(); + invalid_factor_flag.is_factor_one = false; + ExpectRejected(invalid_factor_flag); +} + +// NSNR-STATE-011 and NSNR-STATE-012 +TEST(NonlinearAnalysisState, AtomicallyRejectsNonfiniteAcceptedFrame) { + const auto fixture = MakeFixture(); + auto state = MakeState(fixture); + const auto valid = MakeFrame(state.CommittedState(), 0U, 1U, 0.5, 1U); + ASSERT_TRUE(state.CommitAcceptedFrame(valid).IsOk()); + const auto before = state.CommittedState(); + auto invalid = MakeFrame(state.CommittedState(), 1U, 2U, 1.0, 1U); + invalid.physical_strain_energy = std::numeric_limits::quiet_NaN(); + + const auto status = state.CommitAcceptedFrame(invalid); + + EXPECT_FALSE(status.IsOk()); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0U].code, "invalid-accepted-state"); + ASSERT_EQ(state.AcceptedFrames().size(), 1U); + ExpectVectorEqual(state.CommittedState().displacement, before.displacement); + EXPECT_DOUBLE_EQ(state.CommittedState().load_factor, before.load_factor); +} + +// NSNR-STATE-013 +TEST(NonlinearAnalysisState, StoresNoUnapprovedVerificationMetrics) { + EXPECT_FALSE((HasVerificationMetrics::value)); + EXPECT_FALSE((HasVerificationMetrics::value)); +} diff --git a/tests/unit/analysis/nonlinear_static_control_test.cpp b/tests/unit/analysis/nonlinear_static_control_test.cpp new file mode 100644 index 0000000..884d049 --- /dev/null +++ b/tests/unit/analysis/nonlinear_static_control_test.cpp @@ -0,0 +1,534 @@ +#include "fesa/analysis/nonlinear_static_control.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/model/domain.h" +#include "fesa/model/model_types.h" + +namespace { + +fesa::Vector VectorFrom(const std::vector& values) { + fesa::Vector result{values.size()}; + for (std::size_t index = 0U; index < values.size(); ++index) { + result[index] = values[index]; + } + return result; +} + +struct Fixture { + std::unique_ptr domain; + std::unique_ptr model; + std::unique_ptr dofs; +}; + +Fixture MakeFixture( + std::vector boundaries = {}, + std::vector loads = {}, + const double initial_increment = 0.1, const double time_period = 1.0, + const double minimum_increment = 1.0e-9, + const double maximum_increment = 5.0) { + const std::filesystem::path source{"nonlinear-static-control.inp"}; + fesa::ModelDefinition definition{}; + definition.source_path = source; + definition.source_content_identity = "control-fixture"; + definition.nodes = { + {{"Shell-1", 10, "10"}, {0.0, 0.0, 0.0}, {source, 1U}}, + {{"Shell-1", 20, "20"}, {1.0, 0.0, 0.0}, {source, 2U}}, + {{"Shell-1", 30, "30"}, {1.0, 1.0, 0.0}, {source, 3U}}, + {{"Shell-1", 40, "40"}, {0.0, 1.0, 0.0}, {source, 4U}}, + {{"Shell-1", 50, "50"}, {-1.0, 1.0, 0.0}, {source, 5U}}, + {{"Shell-1", 60, "60"}, {-1.0, 0.0, 0.0}, {source, 6U}}, + }; + definition.materials = {{"Material", 1000.0, 0.25, {source, 7U}}}; + definition.shell_sections = {{"Shell", 0.1, 0U, {source, 8U}}}; + definition.shell_elements = { + {{"Shell-1", 1, "1"}, + fesa::ShellSourceElementType::kS4, + {0U, 1U, 2U, 3U}, + 0U, + 0U, + {source, 9U}}, + {{"Shell-1", 2, "2"}, + fesa::ShellSourceElementType::kS4, + {0U, 3U, 4U, 5U}, + 0U, + 0U, + {source, 10U}}, + }; + for (std::size_t node = 0U; node < definition.nodes.size(); ++node) { + definition.shell_node_initial_frames.push_back( + {static_cast(node), + {0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}}); + } + definition.steps = {{"Step-1", + std::move(boundaries), + std::move(loads), + fesa::StaticProcedureKind::kNonlinearFullNewton, + true, + initial_increment, + time_period, + minimum_increment, + maximum_increment, + {source, 11U}}}; + + auto domain_result = fesa::Domain::Create(std::move(definition)); + if (!domain_result.HasValue()) { + throw std::runtime_error{"Control fixture Domain construction failed."}; + } + auto domain = + std::make_unique(std::move(domain_result.Value())); + auto model_result = fesa::AnalysisModel::Create(*domain); + if (!model_result.HasValue()) { + throw std::runtime_error{ + "Control fixture AnalysisModel construction failed."}; + } + auto model = + std::make_unique(std::move(model_result.Value())); + auto dofs_result = fesa::DofManager::Create(*model); + if (!dofs_result.HasValue()) { + throw std::runtime_error{"Control fixture DofManager construction failed."}; + } + auto dofs = + std::make_unique(std::move(dofs_result.Value())); + return {std::move(domain), std::move(model), std::move(dofs)}; +} + +fesa::Vector TrialCoordinates(const Fixture& fixture) { + return fesa::Vector{fixture.dofs->FullDofCount()}; +} + +fesa::Vector AddScaled(const fesa::Vector& values, + const fesa::Vector& direction, const double scale) { + fesa::Vector result = values; + result.Axpy(scale, direction); + return result; +} + +double MaximumAbsoluteDifference(const fesa::Vector& left, + const fesa::Vector& right) { + if (left.Size() != right.Size()) { + throw std::invalid_argument{"Vector dimensions must match."}; + } + double maximum = 0.0; + for (std::size_t index = 0U; index < left.Size(); ++index) { + maximum = (std::max)(maximum, std::abs(left[index] - right[index])); + } + return maximum; +} + +fesa::NewtonConvergenceInput RelativeConvergenceInput() { + return { + {"residual_force", VectorFrom({1.0e-2}), VectorFrom({1.0}), + VectorFrom({0.5})}, + {"residual_moment", VectorFrom({1.0e-2}), VectorFrom({1.0}), + VectorFrom({0.25})}, + {"correction_translation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + {"correction_rotation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + }; +} + +fesa::NewtonConvergenceInput ExactZeroExternalResidualInput( + const double force_numerator, const double moment_numerator) { + return { + {"residual_force", VectorFrom({force_numerator}), VectorFrom({2.0}), + VectorFrom({0.0})}, + {"residual_moment", VectorFrom({moment_numerator}), VectorFrom({3.0}), + VectorFrom({0.0})}, + {"correction_translation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + {"correction_rotation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + }; +} + +// NSNR-CTRL-001, NSNR-CTRL-002, and NSNR-CTRL-017 +TEST(NonlinearStaticControl, BuildsFixedFactorSequenceWithExactEndpoint) { + const auto fixture = MakeFixture(); + const auto result = + fesa::BuildFixedLoadFactorSequence(fixture.domain->Steps()[0U]); + + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().size(), 10U); + for (std::size_t index = 0U; index < result.Value().size(); ++index) { + const auto& increment = result.Value()[index]; + EXPECT_EQ(increment.increment_index, + static_cast(index + 1U)); + EXPECT_DOUBLE_EQ(increment.load_factor, + static_cast(index + 1U) * 0.1); + EXPECT_EQ(increment.is_factor_one, index + 1U == result.Value().size()); + } + EXPECT_DOUBLE_EQ(result.Value().back().load_factor, 1.0); + + const auto one_hundred = MakeFixture({}, {}, 0.01); + const auto one_hundred_result = + fesa::BuildFixedLoadFactorSequence(one_hundred.domain->Steps()[0U]); + ASSERT_TRUE(one_hundred_result.HasValue()); + ASSERT_EQ(one_hundred_result.Value().size(), 100U); + EXPECT_EQ(one_hundred_result.Value().back().increment_index, 100U); + EXPECT_TRUE(one_hundred_result.Value().back().is_factor_one); +} + +// NSNR-CTRL-003 +TEST(NonlinearStaticControl, IgnoresPositiveMinimumAndMaximumDuringStepping) { + const auto first = MakeFixture({}, {}, 0.3, 1.0, 1.0e-12, 100.0); + const auto second = MakeFixture({}, {}, 0.3, 1.0, 0.29, 0.31); + const auto first_result = + fesa::BuildFixedLoadFactorSequence(first.domain->Steps()[0U]); + const auto second_result = + fesa::BuildFixedLoadFactorSequence(second.domain->Steps()[0U]); + + ASSERT_TRUE(first_result.HasValue()); + ASSERT_TRUE(second_result.HasValue()); + ASSERT_EQ(first_result.Value().size(), second_result.Value().size()); + for (std::size_t index = 0U; index < first_result.Value().size(); ++index) { + EXPECT_DOUBLE_EQ(first_result.Value()[index].load_factor, + second_result.Value()[index].load_factor); + EXPECT_EQ(first_result.Value()[index].increment_index, + second_result.Value()[index].increment_index); + } +} + +// NSNR-CTRL-004 and NSNR-CTRL-005 +TEST(NonlinearLoadBoundary, AppliesAbsoluteBoundaryTargetsWithoutCorrection) { + const std::filesystem::path source{"nonlinear-static-control.inp"}; + const auto fixture = MakeFixture( + {{"10", 1, 1, 4.0, {source, 12U}}, {"20", 4, 4, -0.5, {source, 13U}}}); + const auto result = fesa::ApplyAbsolutePrescribedDisplacementTarget( + fixture.domain->Steps()[0U], 0.25); + + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().Size(), 2U); + EXPECT_DOUBLE_EQ(result.Value()[0U], 1.0); + EXPECT_DOUBLE_EQ(result.Value()[1U], -0.125); + for (const std::size_t constrained : fixture.dofs->ConstrainedDofs()) { + EXPECT_EQ(TrialCoordinates(fixture)[constrained], 0.0); + } +} + +// NSNR-CTRL-006 and NSNR-CTRL-008 +TEST(NonlinearLoadBoundary, AssemblesEverySharedNodeLoadOnceInFixedGlobalAxes) { + const std::filesystem::path source{"nonlinear-static-control.inp"}; + const std::vector loads{ + {"10", 1, 8.0, {source, 20U}}, + {"10", 2, -4.0, {source, 21U}}, + {"10", 4, 2.0, {source, 22U}}, + }; + const auto fixture = MakeFixture({}, loads); + const fesa::Vector trial = TrialCoordinates(fixture); + const auto result = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, trial, 0.25); + + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().generalized_external_force.Size(), + fixture.dofs->FullDofCount()); + EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[0U], 2.0); + EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[1U], -1.0); + EXPECT_DOUBLE_EQ(result.Value().generalized_external_force[3U], 0.5); + EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] + .ConcentratedLoads()[0U] + .GlobalComponents()[0U], + 8.0); + EXPECT_DOUBLE_EQ(fixture.domain->Steps()[0U] + .ConcentratedLoads()[2U] + .GlobalComponents()[3U], + 2.0); +} + +// NSNR-CTRL-007 +TEST(NonlinearLoadBoundary, RejectsDirectorAlignedMomentAboveTheExactBand) { + const fesa::Vector3 director{0.0, 0.0, 1.0}; + EXPECT_TRUE( + fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 1.0e-12}).IsOk()); + const auto rejected = + fesa::CheckMomentAdmissibility(director, {1.0, 0.0, 2.0e-12}); + EXPECT_FALSE(rejected.IsOk()); + ASSERT_EQ(rejected.Diagnostics().size(), 1U); + EXPECT_EQ(rejected.Diagnostics()[0U].code, "unsupported-drilling-load"); +} + +// NSNR-CTRL-009 +TEST(NonlinearLoadBoundary, PreservesSourceOrderDuringGlobalAccumulation) { + const std::filesystem::path source{"nonlinear-static-control.inp"}; + const auto fixture = MakeFixture({}, {{"10", 1, 1.0e16, {source, 30U}}, + {"10", 1, -1.0e16, {source, 31U}}, + {"10", 1, 1.0, {source, 32U}}}); + const fesa::Vector trial = TrialCoordinates(fixture); + const auto first = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, trial, 1.0); + const auto second = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, trial, 1.0); + + ASSERT_TRUE(first.HasValue()); + ASSERT_TRUE(second.HasValue()); + EXPECT_DOUBLE_EQ(first.Value().generalized_external_force[0U], 1.0); + EXPECT_EQ(first.Value().generalized_external_tangent.RowOffsets(), + second.Value().generalized_external_tangent.RowOffsets()); + EXPECT_EQ(first.Value().generalized_external_tangent.ColumnIndices(), + second.Value().generalized_external_tangent.ColumnIndices()); + EXPECT_EQ(first.Value().generalized_external_tangent.Values(), + second.Value().generalized_external_tangent.Values()); +} + +// NSNR-CTRL-010 and NSNR-CTRL-011 +TEST(NonlinearLoadBoundary, + DifferentiatesOneFixedSpatialMomentAndUsesSubtraction) { + const std::filesystem::path source{"nonlinear-static-control.inp"}; + const auto fixture = MakeFixture({}, {{"10", 4, 3.0, {source, 40U}}}); + fesa::Vector trial = TrialCoordinates(fixture); + trial[5U] = 0.4; + const auto result = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, trial, 0.7); + ASSERT_TRUE(result.HasValue()); + + fesa::Vector direction{fixture.dofs->FullDofCount()}; + direction[5U] = 1.0; + constexpr double kStep = 1.0e-6; + const auto plus = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, AddScaled(trial, direction, kStep), 0.7); + const auto minus = fesa::AssembleGlobalFixedLoadContribution( + *fixture.domain, *fixture.dofs, AddScaled(trial, direction, -kStep), 0.7); + ASSERT_TRUE(plus.HasValue()); + ASSERT_TRUE(minus.HasValue()); + + fesa::Vector derivative = plus.Value().generalized_external_force; + derivative.Axpy(-1.0, minus.Value().generalized_external_force); + derivative.Scale(0.5 / kStep); + const fesa::Vector tangent_action = + result.Value().generalized_external_tangent.Multiply(direction); + EXPECT_LE(MaximumAbsoluteDifference(derivative, tangent_action), 1.0e-8); + + fesa::Vector internal{fixture.dofs->FullDofCount()}; + internal[3U] = 5.0; + fesa::Vector residual = internal; + residual.Axpy(-1.0, result.Value().generalized_external_force); + EXPECT_DOUBLE_EQ(residual[3U], + 5.0 - result.Value().generalized_external_force[3U]); + EXPECT_DOUBLE_EQ( + -tangent_action[3U], + -result.Value().generalized_external_tangent.Multiply(direction)[3U]); +} + +// NSNR-CTRL-012, NSNR-CTRL-013, and NSNR-CTRL-014 +TEST(NonlinearConvergence, UsesOwnedRelativeThresholdsForEveryChannel) { + static_assert(fesa::kNewtonRelativeThreshold == 1.0e-2); + static_assert(fesa::kNewtonZeroScaleThreshold == 1.0e-3); + const auto result = + fesa::EvaluateNewtonConvergence(RelativeConvergenceInput()); + + EXPECT_TRUE(result.combined_passed); + const std::array decisions{ + result.force_residual, result.moment_residual, + result.translation_correction, result.rotation_correction}; + for (const auto& decision : decisions) { + EXPECT_FALSE(decision.identity.empty()); + EXPECT_DOUBLE_EQ(decision.numerator_norm, 1.0e-2); + EXPECT_DOUBLE_EQ(decision.denominator_scale, 1.0); + EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative); + EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold); + EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless); + EXPECT_TRUE(decision.passed); + } +} + +// NSNR-CTRL-015 and NSNR-CTRL-016 +TEST(NonlinearConvergence, AppliesTypedZeroScaleGatesToEmptyChannels) { + const fesa::NewtonConvergenceInput input{ + {"residual_force", fesa::Vector{0U}, fesa::Vector{0U}, fesa::Vector{0U}}, + {"residual_moment", fesa::Vector{0U}, fesa::Vector{0U}, fesa::Vector{0U}}, + {"correction_translation", fesa::Vector{0U}, fesa::Vector{0U}}, + {"correction_rotation", fesa::Vector{0U}, fesa::Vector{0U}}, + }; + const auto result = fesa::EvaluateNewtonConvergence(input); + const std::array decisions{ + result.force_residual, result.moment_residual, + result.translation_correction, result.rotation_correction}; + const std::array units{ + fesa::NewtonChannelUnit::kForce, fesa::NewtonChannelUnit::kForceLength, + fesa::NewtonChannelUnit::kLength, + fesa::NewtonChannelUnit::kDimensionless}; + + EXPECT_TRUE(result.combined_passed); + for (std::size_t index = 0U; index < decisions.size(); ++index) { + EXPECT_DOUBLE_EQ(decisions[index].numerator_norm, 0.0); + EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0); + EXPECT_EQ(decisions[index].branch, + fesa::NewtonConvergenceBranch::kZeroScale); + EXPECT_DOUBLE_EQ(decisions[index].threshold, + fesa::kNewtonZeroScaleThreshold); + EXPECT_EQ(decisions[index].threshold_unit, units[index]); + EXPECT_TRUE(decisions[index].passed); + } +} + +// NSNR-CTRL-018 +TEST(NonlinearConvergence, + SelectsTypedZeroScaleFromExactZeroExternalResidualChannels) { + const auto accepted = fesa::EvaluateNewtonConvergence( + ExactZeroExternalResidualInput(fesa::kNewtonZeroScaleThreshold, + fesa::kNewtonZeroScaleThreshold)); + + EXPECT_TRUE(accepted.combined_passed); + const std::array decisions{ + accepted.force_residual, accepted.moment_residual}; + const std::array units{ + fesa::NewtonChannelUnit::kForce, + fesa::NewtonChannelUnit::kForceLength}; + for (std::size_t index = 0U; index < decisions.size(); ++index) { + EXPECT_DOUBLE_EQ(decisions[index].denominator_scale, 0.0); + EXPECT_EQ(decisions[index].branch, + fesa::NewtonConvergenceBranch::kZeroScale); + EXPECT_DOUBLE_EQ(decisions[index].threshold, + fesa::kNewtonZeroScaleThreshold); + EXPECT_EQ(decisions[index].threshold_unit, units[index]); + EXPECT_TRUE(decisions[index].passed); + } + + const double just_over = std::nextafter( + fesa::kNewtonZeroScaleThreshold, + std::numeric_limits::infinity()); + const auto force_rejected = + fesa::EvaluateNewtonConvergence(ExactZeroExternalResidualInput( + just_over, fesa::kNewtonZeroScaleThreshold)); + const auto moment_rejected = + fesa::EvaluateNewtonConvergence(ExactZeroExternalResidualInput( + fesa::kNewtonZeroScaleThreshold, just_over)); + EXPECT_FALSE(force_rejected.force_residual.passed); + EXPECT_FALSE(force_rejected.combined_passed); + EXPECT_FALSE(moment_rejected.moment_residual.passed); + EXPECT_FALSE(moment_rejected.combined_passed); +} + +// NSNR-CTRL-019 +TEST(NonlinearConvergence, + UsesRelativeResidualScaleOnlyWhenMatchingExternalScaleIsNonzero) { + fesa::NewtonConvergenceInput input{ + {"residual_force", VectorFrom({2.0e-2}), VectorFrom({2.0}), + VectorFrom({1.0})}, + {"residual_moment", VectorFrom({2.0e-2}), VectorFrom({1.0}), + VectorFrom({2.0})}, + {"correction_translation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + {"correction_rotation", VectorFrom({1.0e-2}), VectorFrom({1.0})}, + }; + const auto accepted = fesa::EvaluateNewtonConvergence(input); + + EXPECT_TRUE(accepted.combined_passed); + for (const auto& decision : {accepted.force_residual, + accepted.moment_residual}) { + EXPECT_DOUBLE_EQ(decision.denominator_scale, 2.0); + EXPECT_EQ(decision.branch, fesa::NewtonConvergenceBranch::kRelative); + EXPECT_DOUBLE_EQ(decision.threshold, fesa::kNewtonRelativeThreshold); + EXPECT_EQ(decision.threshold_unit, fesa::NewtonChannelUnit::kDimensionless); + EXPECT_TRUE(decision.passed); + } + + const double just_over = std::nextafter(2.0e-2, + std::numeric_limits::infinity()); + input.force_residual.free_residual = VectorFrom({just_over}); + EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).force_residual.passed); + input.force_residual.free_residual = VectorFrom({2.0e-2}); + input.moment_residual.free_residual = VectorFrom({just_over}); + EXPECT_FALSE(fesa::EvaluateNewtonConvergence(input).moment_residual.passed); + + input.moment_residual.free_residual = VectorFrom({2.0e-2}); + input.force_residual.free_residual = VectorFrom({9.0e-4}); + input.force_residual.free_internal = VectorFrom({5.0e-3}); + input.force_residual.free_external = VectorFrom({1.0e-2}); + const auto relative_rejected = fesa::EvaluateNewtonConvergence(input); + EXPECT_FALSE(relative_rejected.force_residual.passed); + EXPECT_FALSE(relative_rejected.combined_passed); +} + +// NSNR-CTRL-020 +TEST(NonlinearConvergence, + RejectsNonfiniteResidualInputsBeforeSelectingOrAcceptingAChannel) { + const std::array invalid_values{ + std::numeric_limits::quiet_NaN(), + std::numeric_limits::infinity()}; + for (const double invalid : invalid_values) { + for (const bool is_moment : {false, true}) { + for (const std::size_t vector_index : {0U, 1U, 2U}) { + auto input = RelativeConvergenceInput(); + fesa::NewtonResidualChannelInput* channel = + is_moment ? &input.moment_residual : &input.force_residual; + if (vector_index == 0U) { + channel->free_residual = VectorFrom({invalid}); + } else if (vector_index == 1U) { + channel->free_internal = VectorFrom({invalid}); + } else { + channel->free_external = VectorFrom({invalid}); + } + const auto result = fesa::EvaluateNewtonConvergence(input); + const auto& decision = + is_moment ? result.moment_residual : result.force_residual; + EXPECT_FALSE(decision.passed); + EXPECT_FALSE(result.combined_passed); + } + } + } + + auto input = RelativeConvergenceInput(); + const double smallest_external = std::nextafter( + 0.0, std::numeric_limits::infinity()); + input.force_residual.free_residual = VectorFrom({0.0}); + input.force_residual.free_internal = VectorFrom({0.0}); + input.force_residual.free_external = VectorFrom({smallest_external}); + const auto relative = fesa::EvaluateNewtonConvergence(input); + EXPECT_TRUE(relative.force_residual.passed); + EXPECT_DOUBLE_EQ(relative.force_residual.denominator_scale, + smallest_external); + EXPECT_EQ(relative.force_residual.branch, + fesa::NewtonConvergenceBranch::kRelative); + EXPECT_DOUBLE_EQ(relative.force_residual.threshold, + fesa::kNewtonRelativeThreshold); + EXPECT_EQ(relative.force_residual.threshold_unit, + fesa::NewtonChannelUnit::kDimensionless); +} + +// NSNR-CTRL-021 +TEST(NonlinearConvergence, RequiresEveryResidualAndCorrectionChannelToPass) { + const auto accepted = fesa::EvaluateNewtonConvergence(RelativeConvergenceInput()); + EXPECT_TRUE(accepted.combined_passed); + EXPECT_DOUBLE_EQ(accepted.translation_correction.denominator_scale, 1.0); + EXPECT_DOUBLE_EQ(accepted.rotation_correction.denominator_scale, 1.0); + EXPECT_DOUBLE_EQ(accepted.translation_correction.threshold, + fesa::kNewtonRelativeThreshold); + EXPECT_DOUBLE_EQ(accepted.rotation_correction.threshold, + fesa::kNewtonRelativeThreshold); + EXPECT_EQ(accepted.translation_correction.threshold_unit, + fesa::NewtonChannelUnit::kDimensionless); + EXPECT_EQ(accepted.rotation_correction.threshold_unit, + fesa::NewtonChannelUnit::kDimensionless); + + for (const std::size_t failed_channel : {0U, 1U, 2U, 3U}) { + auto input = RelativeConvergenceInput(); + const double just_over = std::nextafter( + 1.0e-2, std::numeric_limits::infinity()); + if (failed_channel == 0U) { + input.force_residual.free_residual = VectorFrom({just_over}); + } else if (failed_channel == 1U) { + input.moment_residual.free_residual = VectorFrom({just_over}); + } else if (failed_channel == 2U) { + input.translation_correction.fresh_correction = VectorFrom({just_over}); + } else { + input.rotation_correction.fresh_correction = VectorFrom({just_over}); + } + const auto result = fesa::EvaluateNewtonConvergence(input); + EXPECT_FALSE(result.combined_passed); + } +} + +} // namespace diff --git a/tests/unit/app/output_paths_test.cpp b/tests/unit/app/output_paths_test.cpp new file mode 100644 index 0000000..f21eeaf --- /dev/null +++ b/tests/unit/app/output_paths_test.cpp @@ -0,0 +1,141 @@ +#include "fesa/app/output_paths.h" + +#include +#include +#include +#include +#include + +#include + +#include "fesa/analysis/analysis.h" + +namespace { + +class TempDirectory { + public: + explicit TempDirectory(const std::string& label) { + const auto tick = + std::chrono::steady_clock::now().time_since_epoch().count(); + path_ = std::filesystem::temp_directory_path() / + ("fesa-output-paths-" + label + "-" + std::to_string(tick)); + std::error_code error; + if (!std::filesystem::create_directory(path_, error) || error) { + throw std::runtime_error{"Unable to create an output-path test fixture."}; + } + } + + TempDirectory(const TempDirectory&) = delete; + TempDirectory& operator=(const TempDirectory&) = delete; + + ~TempDirectory() { + std::error_code ignored; + std::filesystem::remove_all(path_, ignored); + } + + const std::filesystem::path& Path() const noexcept { return path_; } + + private: + std::filesystem::path path_; +}; + +void ExpectFailureCode(const fesa::Status& status, const char* code) { + ASSERT_FALSE(status.IsOk()); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics().front().code, code); +} + +// NSNR-CLI-001 and NSNR-CLI-002: a token containing the literal substring +// must fail before input path validation or output derivation. +TEST(OutputPaths, RejectsFirstTokenContainingOutputSubstring) { + const auto paths = fesa::DeriveSingleInputOutputPaths( + {"abc--outputdef", "model.inp", "--output=ignored"}, + std::filesystem::path{"C:/invocation"}); + + ASSERT_FALSE(paths.HasValue()); + ExpectFailureCode(paths.GetStatus(), "cli-usage"); + EXPECT_EQ(paths.GetStatus().Diagnostics().front().entity_identity, + "argument_index=0;argument=abc--outputdef"); +} + +TEST(OutputPaths, RejectsEveryOutputSubstringVariant) { + for (const char* argument : + {"abc--outputdef", "--output-path", "--output=foo", "--output"}) { + const auto paths = fesa::DeriveSingleInputOutputPaths( + {"model.inp", argument}, std::filesystem::path{"C:/invocation"}); + + ASSERT_FALSE(paths.HasValue()) << argument; + ExpectFailureCode(paths.GetStatus(), "cli-usage"); + } +} + +// NSNR-CLI-004: derivation is lexical and does not inspect the filesystem. +TEST(OutputPaths, DerivesNormalizedSiblingNamesFromRelativeInput) { + const auto paths = fesa::DeriveSingleInputOutputPaths( + {"inputs/../models/Beam.Model.INP"}, + std::filesystem::path{"C:/invocation/current"}); + + ASSERT_TRUE(paths.HasValue()) << paths.GetStatus().Diagnostics().size(); + EXPECT_EQ( + paths.Value().input_path, + std::filesystem::path{"C:/invocation/current/models/Beam.Model.INP"}); + EXPECT_EQ(paths.Value().results_path, + std::filesystem::path{ + "C:/invocation/current/models/Beam.Model_results.h5"}); + EXPECT_EQ(paths.Value().log_path, + std::filesystem::path{ + "C:/invocation/current/models/Beam.Model_log.txt"}); +} + +// NSNR-CLI-005: only the final, case-insensitive input extension is removed. +TEST(OutputPaths, PreservesBasenameCaseAndPrecedingDots) { + const auto paths = fesa::DeriveSingleInputOutputPaths( + {"C:/models/.Beam.v2.iNp"}, std::filesystem::path{"C:/unused"}); + + ASSERT_TRUE(paths.HasValue()); + EXPECT_EQ(paths.Value().results_path, + std::filesystem::path{"C:/models/.Beam.v2_results.h5"}); + EXPECT_EQ(paths.Value().log_path, + std::filesystem::path{"C:/models/.Beam.v2_log.txt"}); +} + +TEST(OutputPaths, RejectsInputWithoutInpFinalExtension) { + const auto paths = fesa::DeriveSingleInputOutputPaths( + {"model.inp.bak"}, std::filesystem::path{"C:/invocation"}); + + ASSERT_FALSE(paths.HasValue()); + ExpectFailureCode(paths.GetStatus(), "cli-usage"); +} + +// NSNR-CLI-006: the lease is exclusive and does not create public outputs. +TEST(OutputPaths, LeaseCollisionPreservesPublicOutputPaths) { + TempDirectory directory{"lease"}; + const fesa::DerivedOutputPaths paths{ + directory.Path() / "model.inp", directory.Path() / "model_results.h5", + directory.Path() / "model_log.txt"}; + + auto first = fesa::AcquireOutputWriteLease(paths); + ASSERT_TRUE(first.HasValue()) << first.GetStatus().Diagnostics().size(); + EXPECT_FALSE(std::filesystem::exists(paths.results_path)); + EXPECT_FALSE(std::filesystem::exists(paths.log_path)); + + const auto second = fesa::AcquireOutputWriteLease(paths); + ASSERT_FALSE(second.HasValue()); + ExpectFailureCode(second.GetStatus(), "output-busy"); + EXPECT_FALSE(std::filesystem::exists(paths.results_path)); + EXPECT_FALSE(std::filesystem::exists(paths.log_path)); +} + +// NSNR-CLI-009: procedure calls receive all derived output identities. +TEST(OutputPaths, AnalysisRequestCarriesInputResultAndLogPaths) { + const fesa::AnalysisRequest request{ + std::filesystem::path{"C:/models/model.inp"}, + std::filesystem::path{"C:/models/model_results.h5"}, + std::filesystem::path{"C:/models/model_log.txt"}}; + + EXPECT_EQ(request.input_path, "C:/models/model.inp"); + EXPECT_EQ(request.output_path, "C:/models/model_results.h5"); + EXPECT_EQ(request.log_path, "C:/models/model_log.txt"); +} + +} // namespace diff --git a/tests/unit/elements/finite_rotation_test.cpp b/tests/unit/elements/finite_rotation_test.cpp new file mode 100644 index 0000000..913ec79 --- /dev/null +++ b/tests/unit/elements/finite_rotation_test.cpp @@ -0,0 +1,229 @@ +#include "fesa/elements/finite_rotation.h" + +#include + +#include +#include +#include +#include + +namespace fesa { +namespace { + +constexpr std::size_t kRotationDimension = 3U; + +Matrix InitialFrame() { + Matrix frame{kRotationDimension, kRotationDimension}; + frame(0U, 0U) = 1.0; + frame(1U, 2U) = -1.0; + frame(2U, 1U) = 1.0; + return frame; +} + +Matrix Transpose(const Matrix& matrix) { + Matrix result{matrix.Columns(), matrix.Rows()}; + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t column = 0U; column < matrix.Columns(); ++column) { + result(column, row) = matrix(row, column); + } + } + return result; +} + +Vector3 Multiply(const Matrix& matrix, const Vector3& vector) { + return Vector3{ + matrix(0U, 0U) * vector.X() + matrix(0U, 1U) * vector.Y() + + matrix(0U, 2U) * vector.Z(), + matrix(1U, 0U) * vector.X() + matrix(1U, 1U) * vector.Y() + + matrix(1U, 2U) * vector.Z(), + matrix(2U, 0U) * vector.X() + matrix(2U, 1U) * vector.Y() + + matrix(2U, 2U) * vector.Z()}; +} + +double Determinant(const Matrix& matrix) { + return matrix(0U, 0U) * + (matrix(1U, 1U) * matrix(2U, 2U) - + matrix(1U, 2U) * matrix(2U, 1U)) - + matrix(0U, 1U) * + (matrix(1U, 0U) * matrix(2U, 2U) - + matrix(1U, 2U) * matrix(2U, 0U)) + + matrix(0U, 2U) * + (matrix(1U, 0U) * matrix(2U, 1U) - + matrix(1U, 1U) * matrix(2U, 0U)); +} + +bool IsFinite(const Matrix& matrix) { + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t column = 0U; column < matrix.Columns(); ++column) { + if (!std::isfinite(matrix(row, column))) { + return false; + } + } + } + return true; +} + +void ExpectMatrixNear(const Matrix& actual, const Matrix& expected, + const double tolerance = 1.0e-12) { + ASSERT_EQ(actual.Rows(), expected.Rows()); + ASSERT_EQ(actual.Columns(), expected.Columns()); + for (std::size_t row = 0U; row < actual.Rows(); ++row) { + for (std::size_t column = 0U; column < actual.Columns(); ++column) { + EXPECT_NEAR(actual(row, column), expected(row, column), tolerance) + << "matrix entry (" << row << ", " << column << ")"; + } + } +} + +void ExpectVectorNear(const Vector3& actual, const Vector3& expected, + const double tolerance = 1.0e-12) { + EXPECT_NEAR(actual.X(), expected.X(), tolerance); + EXPECT_NEAR(actual.Y(), expected.Y(), tolerance); + EXPECT_NEAR(actual.Z(), expected.Z(), tolerance); +} + +void ExpectProperOrthogonal(const Matrix& rotation) { + const Matrix orthogonality = Transpose(rotation).Multiply(rotation); + ASSERT_EQ(orthogonality.Rows(), kRotationDimension); + ASSERT_EQ(orthogonality.Columns(), kRotationDimension); + for (std::size_t row = 0U; row < kRotationDimension; ++row) { + for (std::size_t column = 0U; column < kRotationDimension; ++column) { + EXPECT_NEAR(orthogonality(row, column), row == column ? 1.0 : 0.0, + 1.0e-12); + } + } + EXPECT_NEAR(Determinant(rotation), 1.0, 1.0e-12); +} + +TEST(FiniteRotation, ZeroCoordinatePreservesInitialFrameAndDirector) { + const Matrix initial_frame = InitialFrame(); + + const Result result = + MakeFiniteRotationState(Vector3{}, initial_frame); + + ASSERT_TRUE(result.HasValue()); + EXPECT_EQ(result.Value().phi, Vector3{}); + ExpectMatrixNear(result.Value().q, initial_frame); + ExpectVectorNear(result.Value().director, + Multiply(initial_frame, Vector3{0.0, 0.0, 1.0})); +} + +TEST(FiniteRotation, FiniteCoordinateBuildsProperTriadAndDirector) { + const Matrix initial_frame = InitialFrame(); + const Vector3 phi{0.3, -0.4, 0.5}; + + const Result result = + MakeFiniteRotationState(phi, initial_frame); + + ASSERT_TRUE(result.HasValue()); + const Matrix expected_q = ExpSkew(phi).Multiply(initial_frame); + ExpectMatrixNear(result.Value().q, expected_q); + ExpectProperOrthogonal(result.Value().q); + ExpectVectorNear(result.Value().director, + Multiply(result.Value().q, Vector3{0.0, 0.0, 1.0})); +} + +TEST(FiniteRotation, GlobalIncrementRebuildsFixedReferenceOrientation) { + const Matrix initial_frame = InitialFrame(); + const Vector3 phi{0.2, -0.1, 0.3}; + const Vector3 delta_phi{-0.05, 0.15, 0.1}; + const Result committed = + MakeFiniteRotationState(phi, initial_frame); + ASSERT_TRUE(committed.HasValue()); + + const Result updated = + ApplyGlobalRotationIncrement(committed.Value(), delta_phi, initial_frame); + + ASSERT_TRUE(updated.HasValue()); + const Vector3 expected_phi = phi + delta_phi; + EXPECT_EQ(updated.Value().phi, expected_phi); + ExpectMatrixNear(updated.Value().q, + ExpSkew(expected_phi).Multiply(initial_frame)); + ExpectVectorNear(updated.Value().director, + Multiply(updated.Value().q, Vector3{0.0, 0.0, 1.0})); + ExpectMatrixNear(committed.Value().q, ExpSkew(phi).Multiply(initial_frame)); +} + +TEST(FiniteRotation, RejectsCoordinatesInsidePrincipalBranchMargin) { + const Matrix initial_frame = InitialFrame(); + const double pi = std::acos(-1.0); + const double margin = std::sqrt(std::numeric_limits::epsilon()); + + EXPECT_TRUE(MakeFiniteRotationState(Vector3{pi - 2.0 * margin, 0.0, 0.0}, + initial_frame) + .HasValue()); + const Result ambiguous = + MakeFiniteRotationState(Vector3{pi - margin, 0.0, 0.0}, initial_frame); + ASSERT_FALSE(ambiguous.HasValue()); + ASSERT_FALSE(ambiguous.GetStatus().IsOk()); + ASSERT_EQ(ambiguous.GetStatus().Diagnostics().size(), 1U); + EXPECT_EQ(ambiguous.GetStatus().Diagnostics()[0U].code, + "invalid-accepted-state"); +} + +TEST(FiniteRotation, + JacobiansAreFiniteInverseTransposeAndDerivativeConsistent) { + const double pi = std::acos(-1.0); + const std::array rotations{ + Vector3{1.0e-9, -2.0e-9, 3.0e-9}, Vector3{0.4, -0.2, 0.3}, + Vector3{0.0, pi - 1.0e-3, 0.0}}; + const Vector3 direction{0.2, -0.3, 0.5}; + const double perturbation = 1.0e-7; + + for (const Vector3& phi : rotations) { + const Matrix left_jacobian = LeftJacobianSO3(phi); + const Matrix inverse_transpose = InverseTransposeLeftJacobianSO3(phi); + EXPECT_TRUE(IsFinite(left_jacobian)); + EXPECT_TRUE(IsFinite(inverse_transpose)); + + const Matrix identity = + Transpose(left_jacobian).Multiply(inverse_transpose); + for (std::size_t row = 0U; row < kRotationDimension; ++row) { + for (std::size_t column = 0U; column < kRotationDimension; ++column) { + EXPECT_NEAR(identity(row, column), row == column ? 1.0 : 0.0, + 1.0e-11); + } + } + + const Vector3 director = Multiply(ExpSkew(phi), Vector3{0.0, 0.0, 1.0}); + const Vector3 positive = + Multiply(ExpSkew(phi + perturbation * direction), + Vector3{0.0, 0.0, 1.0}); + const Vector3 negative = + Multiply(ExpSkew(phi - perturbation * direction), + Vector3{0.0, 0.0, 1.0}); + const Vector3 observed = (positive - negative) / (2.0 * perturbation); + const Vector3 expected = + Multiply(left_jacobian, direction).Cross(director); + ExpectVectorNear(observed, expected, 1.0e-8); + } +} + +TEST(FiniteRotation, RejectsNonfiniteCoordinatesAndInvalidInitialFrames) { + const Matrix initial_frame = InitialFrame(); + const double infinity = std::numeric_limits::infinity(); + const Result nonfinite = + MakeFiniteRotationState(Vector3{infinity, 0.0, 0.0}, initial_frame); + ASSERT_FALSE(nonfinite.HasValue()); + ASSERT_EQ(nonfinite.GetStatus().Diagnostics().size(), 1U); + EXPECT_EQ(nonfinite.GetStatus().Diagnostics()[0U].code, + "invalid-accepted-state"); + + Matrix invalid_frame = initial_frame; + invalid_frame(0U, 0U) = 2.0; + EXPECT_FALSE(MakeFiniteRotationState(Vector3{}, invalid_frame).HasValue()); + + const Result committed = + MakeFiniteRotationState(Vector3{}, initial_frame); + ASSERT_TRUE(committed.HasValue()); + const Result invalid_increment = + ApplyGlobalRotationIncrement(committed.Value(), + Vector3{0.0, infinity, 0.0}, initial_frame); + ASSERT_FALSE(invalid_increment.HasValue()); + ASSERT_EQ(invalid_increment.GetStatus().Diagnostics().size(), 1U); + EXPECT_EQ(invalid_increment.GetStatus().Diagnostics()[0U].code, + "invalid-accepted-state"); +} + +} // namespace +} // namespace fesa diff --git a/tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp b/tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp new file mode 100644 index 0000000..2379f1e --- /dev/null +++ b/tests/unit/elements/nonlinear_mitc4_shell_tangent_test.cpp @@ -0,0 +1,420 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/finite_rotation.h" +#include "fesa/elements/nonlinear_mitc4_shell.h" +#include "fesa/model/model_types.h" + +namespace { + +using Coordinates = std::array; + +fesa::Node Node(const std::int64_t label, const Coordinates coordinates) { + return {{"Shell-Instance", label, std::to_string(label)}, + coordinates, + {"nonlinear-mitc4-tangent.inp", static_cast(label)}}; +} + +std::array Nodes() { + return {Node(1, {-1.0, -1.0, 0.0}), Node(2, {1.0, -1.0, 0.0}), + Node(3, {1.0, 1.0, 0.0}), Node(4, {-1.0, 1.0, 0.0})}; +} + +std::array NodePointers( + const std::array& nodes) { + return {&nodes[0], &nodes[1], &nodes[2], &nodes[3]}; +} + +std::array Frames() { + return {{{0U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {1U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {2U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {3U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}}}; +} + +fesa::NonlinearMitc4Shell Shell(const std::array& nodes) { + const fesa::ShellSection section{ + "Section", 0.2, 0U, {"nonlinear-mitc4-tangent.inp", 20U}}; + const fesa::LinearElasticMaterial material{ + "Material", 120.0, 0.25, {"nonlinear-mitc4-tangent.inp", 21U}}; + const auto shell = fesa::NonlinearMitc4Shell::Create( + NodePointers(nodes), Frames(), section, material); + if (!shell.HasValue()) { + throw std::runtime_error{shell.GetStatus().Diagnostics()[0U].code}; + } + return shell.Value(); +} + +fesa::NonlinearMitc4TrialDofs Trial() { + fesa::NonlinearMitc4TrialDofs trial{}; + trial.displacement[0U] = {-0.02, 0.01, 0.03}; + trial.displacement[1U] = {0.01, -0.03, -0.01}; + trial.displacement[2U] = {0.03, 0.02, 0.04}; + trial.displacement[3U] = {-0.01, 0.04, -0.02}; + trial.rotation_vector[0U] = {0.03, -0.02, 0.01}; + trial.rotation_vector[1U] = {-0.01, 0.04, -0.02}; + trial.rotation_vector[2U] = {0.02, 0.01, 0.03}; + trial.rotation_vector[3U] = {-0.03, 0.02, -0.01}; + return trial; +} + +fesa::NonlinearMitc4TrialDofs AddScaled( + const fesa::NonlinearMitc4TrialDofs& trial, + const fesa::NonlinearMitc4TrialDofs& direction, const double scale) { + fesa::NonlinearMitc4TrialDofs result = trial; + for (std::size_t node = 0U; node < 4U; ++node) { + result.displacement[node] = + result.displacement[node] + scale * direction.displacement[node]; + result.rotation_vector[node] = + result.rotation_vector[node] + scale * direction.rotation_vector[node]; + } + return result; +} + +fesa::NonlinearMitc4TrialDofs Direction() { + fesa::NonlinearMitc4TrialDofs direction{}; + direction.displacement[0U] = {0.5, -0.2, 0.1}; + direction.displacement[1U] = {-0.1, 0.3, -0.4}; + direction.displacement[2U] = {0.2, 0.1, 0.5}; + direction.displacement[3U] = {-0.3, -0.4, -0.2}; + direction.rotation_vector[0U] = {0.2, -0.1, 0.3}; + direction.rotation_vector[1U] = {-0.3, 0.2, -0.1}; + direction.rotation_vector[2U] = {0.1, 0.3, -0.2}; + direction.rotation_vector[3U] = {-0.2, -0.3, 0.1}; + return direction; +} + +fesa::Vector ToVector(const fesa::NonlinearMitc4TrialDofs& trial) { + fesa::Vector result{24U}; + for (std::size_t node = 0U; node < 4U; ++node) { + for (std::size_t component = 0U; component < 3U; ++component) { + result[6U * node + component] = trial.displacement[node][component]; + result[6U * node + 3U + component] = + trial.rotation_vector[node][component]; + } + } + return result; +} + +double ReferenceLength(const std::array& nodes) { + double length = 0.0; + for (std::size_t first = 0U; first < nodes.size(); ++first) { + for (std::size_t second = first + 1U; second < nodes.size(); ++second) { + length = (std::max)(length, (fesa::Vector3{nodes[first].coordinates} - + fesa::Vector3{nodes[second].coordinates}) + .Norm()); + } + } + return length; +} + +fesa::NonlinearMitc4TrialDofs WorkConjugateDirection( + const std::array& nodes) { + auto direction = Direction(); + double maximum_component = 0.0; + for (std::size_t node = 0U; node < 4U; ++node) { + for (std::size_t component = 0U; component < 3U; ++component) { + maximum_component = + (std::max)(maximum_component, + std::abs(direction.displacement[node][component])); + maximum_component = + (std::max)(maximum_component, + std::abs(direction.rotation_vector[node][component])); + } + } + const double length = ReferenceLength(nodes); + for (std::size_t node = 0U; node < 4U; ++node) { + direction.displacement[node] = + length * direction.displacement[node] / maximum_component; + direction.rotation_vector[node] = + direction.rotation_vector[node] / maximum_component; + } + return direction; +} + +fesa::Vector WorkConjugate(const fesa::Vector& vector, const double length) { + fesa::Vector result = vector; + for (std::size_t node = 0U; node < 4U; ++node) { + for (std::size_t component = 0U; component < 3U; ++component) { + result[6U * node + component] *= length; + } + } + return result; +} + +double ChannelNorm(const fesa::Vector& vector, const bool translation) { + double sum = 0.0; + const std::size_t offset = translation ? 0U : 3U; + for (std::size_t node = 0U; node < 4U; ++node) { + for (std::size_t component = 0U; component < 3U; ++component) { + const double value = vector[6U * node + offset + component]; + sum += value * value; + } + } + return std::sqrt(sum); +} + +double FrobeniusNorm(const fesa::Matrix& matrix) { + double sum = 0.0; + for (std::size_t row = 0U; row < matrix.Rows(); ++row) { + for (std::size_t column = 0U; column < matrix.Columns(); ++column) { + sum += matrix(row, column) * matrix(row, column); + } + } + return std::sqrt(sum); +} + +fesa::Matrix WorkConjugateTangent(const fesa::Matrix& tangent, + const double length) { + fesa::Matrix result = tangent; + for (std::size_t row = 0U; row < tangent.Rows(); ++row) { + const double row_scale = row % 6U < 3U ? length : 1.0; + for (std::size_t column = 0U; column < tangent.Columns(); ++column) { + const double column_scale = column % 6U < 3U ? length : 1.0; + result(row, column) *= row_scale * column_scale; + } + } + return result; +} + +void ExpectRelative(const double actual, const double expected) { + if (expected == 0.0) { + EXPECT_LE(std::abs(actual), 1.0e-12); + return; + } + EXPECT_LE(std::abs(actual - expected) / std::abs(expected), 1.0e-9); +} + +// NSNR-ELEM-TAN-001 +TEST(NonlinearMitc4Residual, EvaluatesResidualTangentAndRecoveryAtOneTrial) { + const auto nodes = Nodes(); + const auto shell = Shell(nodes); + const auto trial = Trial(); + const auto recovery = shell.RecoverState(trial); + const auto result = fesa::EvaluateInternalResidualAndTangent(shell, trial); + + ASSERT_TRUE(recovery.HasValue()); + ASSERT_TRUE(result.HasValue()); + EXPECT_EQ(result.Value().internal_residual.Size(), 24U); + EXPECT_EQ(result.Value().internal_tangent.Rows(), 24U); + EXPECT_EQ(result.Value().internal_tangent.Columns(), 24U); + EXPECT_DOUBLE_EQ(result.Value().physical_strain_energy, + result.Value().recovery.physical_strain_energy); + EXPECT_DOUBLE_EQ(result.Value().recovery.physical_strain_energy, + recovery.Value().physical_strain_energy); + for (std::size_t index = 0U; index < 24U; ++index) { + EXPECT_DOUBLE_EQ(result.Value().internal_residual[index], + result.Value().internal_force[index]); + } + for (std::size_t point = 0U; + point < result.Value().recovery.gauss_points.size(); ++point) { + EXPECT_EQ(result.Value().recovery.gauss_points[point].generalized_strain, + recovery.Value().gauss_points[point].generalized_strain); + EXPECT_EQ(result.Value().recovery.gauss_points[point].section_resultant, + recovery.Value().gauss_points[point].section_resultant); + } +} + +// NSNR-ELEM-TAN-002 and NSNR-ELEM-TAN-003 +TEST(NonlinearMitc4Tangent, MatchesTheApprovedDirectionalSchedule) { + const auto nodes = Nodes(); + const auto shell = Shell(nodes); + const auto trial = Trial(); + const auto direction = WorkConjugateDirection(nodes); + const double length = ReferenceLength(nodes); + const auto equilibrium = + fesa::EvaluateInternalResidualAndTangent(shell, trial); + ASSERT_TRUE(equilibrium.HasValue()); + + const fesa::Vector direction_vector = ToVector(direction); + const fesa::Vector analytical = WorkConjugate( + equilibrium.Value().internal_tangent.Multiply(direction_vector), length); + const std::array steps{1.0e-3, 3.0e-4, 1.0e-4, 3.0e-5, + 1.0e-5, 3.0e-6, 1.0e-6, 3.0e-7}; + std::array force_errors{}; + std::array moment_errors{}; + ASSERT_GT(ChannelNorm(analytical, true), 0.0); + ASSERT_GT(ChannelNorm(analytical, false), 0.0); + for (std::size_t index = 0U; index < steps.size(); ++index) { + const auto plus = fesa::EvaluateInternalResidualAndTangent( + shell, AddScaled(trial, direction, steps[index])); + const auto minus = fesa::EvaluateInternalResidualAndTangent( + shell, AddScaled(trial, direction, -steps[index])); + ASSERT_TRUE(plus.HasValue()); + ASSERT_TRUE(minus.HasValue()); + fesa::Vector derivative = plus.Value().internal_residual; + derivative.Axpy(-1.0, minus.Value().internal_residual); + derivative.Scale(0.5 / steps[index]); + derivative = WorkConjugate(derivative, length); + derivative.Axpy(-1.0, analytical); + force_errors[index] = + ChannelNorm(derivative, true) / ChannelNorm(analytical, true); + moment_errors[index] = + ChannelNorm(derivative, false) / ChannelNorm(analytical, false); + } + + std::size_t force_order_count = 0U; + std::size_t moment_order_count = 0U; + for (std::size_t index = 1U; index < force_errors.size(); ++index) { + if (force_errors[index - 1U] > 0.0 && force_errors[index] > 0.0) { + const double order = + std::log(force_errors[index - 1U] / force_errors[index]) / + std::log(steps[index - 1U] / steps[index]); + if (order >= 1.5) { + ++force_order_count; + } + } + if (moment_errors[index - 1U] > 0.0 && moment_errors[index] > 0.0) { + const double order = + std::log(moment_errors[index - 1U] / moment_errors[index]) / + std::log(steps[index - 1U] / steps[index]); + if (order >= 1.5) { + ++moment_order_count; + } + } + } + EXPECT_GE(force_order_count, 2U); + EXPECT_GE(moment_order_count, 2U); + EXPECT_LE(force_errors[3U], 1.0e-6); + EXPECT_LE(moment_errors[3U], 1.0e-6); +} + +// NSNR-ELEM-TAN-004 and NSNR-ELEM-TAN-005 +TEST(NonlinearMitc4Tangent, PreservesRigidTranslationNullspaceAndSymmetry) { + const auto nodes = Nodes(); + const auto equilibrium = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), {}); + ASSERT_TRUE(equilibrium.HasValue()); + const double length = ReferenceLength(nodes); + + fesa::NonlinearMitc4TrialDofs rigid_translation{}; + for (auto& displacement : rigid_translation.displacement) { + displacement = {0.3, -0.2, 0.4}; + } + const fesa::Vector null_action = + WorkConjugate(equilibrium.Value().internal_tangent.Multiply( + ToVector(rigid_translation)), + length); + EXPECT_LE(null_action.Norm(), 1.0e-10); + + const fesa::Matrix scaled_tangent = + WorkConjugateTangent(equilibrium.Value().internal_tangent, length); + fesa::Matrix antisymmetric = scaled_tangent; + for (std::size_t row = 0U; row < antisymmetric.Rows(); ++row) { + for (std::size_t column = 0U; column < antisymmetric.Columns(); ++column) { + antisymmetric(row, column) -= scaled_tangent(column, row); + } + } + ASSERT_GT(FrobeniusNorm(scaled_tangent), 0.0); + EXPECT_LE(FrobeniusNorm(antisymmetric) / FrobeniusNorm(scaled_tangent), + 1.0e-12); +} + +// NSNR-ELEM-TAN-006 +TEST(NonlinearMitc4Residual, DoesNotAcceptExternalLoadShares) { + const auto nodes = Nodes(); + const auto first = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), Trial()); + const auto second = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), Trial()); + ASSERT_TRUE(first.HasValue()); + ASSERT_TRUE(second.HasValue()); + for (std::size_t index = 0U; index < 24U; ++index) { + EXPECT_DOUBLE_EQ(first.Value().internal_residual[index], + second.Value().internal_residual[index]); + } +} + +// NSNR-ELEM-TAN-007 +TEST(NonlinearMitc4Objectivity, FiniteRigidMotionHasZeroInternalForce) { + const auto nodes = Nodes(); + const fesa::Vector3 rotation{0.3, -0.2, 0.1}; + const fesa::Matrix tensor = fesa::ExpSkew(rotation); + fesa::NonlinearMitc4TrialDofs trial{}; + for (std::size_t node = 0U; node < nodes.size(); ++node) { + const fesa::Vector3 initial{nodes[node].coordinates}; + const fesa::Vector3 rotated{ + tensor(0U, 0U) * initial.X() + tensor(0U, 1U) * initial.Y() + + tensor(0U, 2U) * initial.Z(), + tensor(1U, 0U) * initial.X() + tensor(1U, 1U) * initial.Y() + + tensor(1U, 2U) * initial.Z(), + tensor(2U, 0U) * initial.X() + tensor(2U, 1U) * initial.Y() + + tensor(2U, 2U) * initial.Z()}; + trial.displacement[node] = + rotated + fesa::Vector3{0.7, -0.4, 1.2} - initial; + trial.rotation_vector[node] = rotation; + } + const auto result = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), trial); + ASSERT_TRUE(result.HasValue()); + EXPECT_LE(result.Value().internal_residual.Norm(), 1.0e-10); + EXPECT_LE(result.Value().physical_strain_energy, 1.0e-12); +} + +// NSNR-ELEM-TAN-008 +TEST(NonlinearMitc4Patch, RetainsPhysicalRecoveryIdentities) { + const auto nodes = Nodes(); + const auto shell = Shell(nodes); + constexpr double kMembraneStrain = 1.0e-2; + const double green_strain = + kMembraneStrain + 0.5 * kMembraneStrain * kMembraneStrain; + constexpr double kYoungsModulus = 120.0; + constexpr double kPoissonRatio = 0.25; + constexpr double kThickness = 0.2; + const double plane_stress = + kYoungsModulus / (1.0 - kPoissonRatio * kPoissonRatio); + const double s11 = plane_stress * green_strain; + const double s22 = plane_stress * kPoissonRatio * green_strain; + fesa::NonlinearMitc4TrialDofs trial{}; + for (std::size_t node = 0U; node < nodes.size(); ++node) { + trial.displacement[node] = {kMembraneStrain * nodes[node].coordinates[0U], + 0.0, 0.0}; + } + const auto result = fesa::EvaluateInternalResidualAndTangent(shell, trial); + ASSERT_TRUE(result.HasValue()); + for (const auto& point : result.Value().recovery.gauss_points) { + ExpectRelative(point.generalized_strain[0U], green_strain); + for (std::size_t component = 1U; component < 8U; ++component) { + ExpectRelative(point.generalized_strain[component], 0.0); + } + ExpectRelative(point.section_resultant[0U], kThickness * s11); + ExpectRelative(point.section_resultant[1U], kThickness * s22); + for (std::size_t component = 2U; component < 8U; ++component) { + ExpectRelative(point.section_resultant[component], 0.0); + } + for (const auto& stress : point.stress) { + ExpectRelative(stress.components[0U], s11); + ExpectRelative(stress.components[1U], s22); + ExpectRelative(stress.components[2U], 0.0); + } + } +} + +// NSNR-ELEM-TAN-009 +TEST(NonlinearMitc4Residual, RejectsNonfiniteTrialData) { + const auto nodes = Nodes(); + auto trial = Trial(); + trial.rotation_vector[2U] = {std::numeric_limits::quiet_NaN(), 0.0, + 0.0}; + const auto result = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), trial); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, + "invalid-nonlinear-shell-trial"); + + auto overflow = Trial(); + overflow.displacement[1U] = {1.0e300, 0.0, 0.0}; + const auto overflow_result = + fesa::EvaluateInternalResidualAndTangent(Shell(nodes), overflow); + EXPECT_FALSE(overflow_result.HasValue()); +} + +} // namespace diff --git a/tests/unit/elements/nonlinear_mitc4_shell_test.cpp b/tests/unit/elements/nonlinear_mitc4_shell_test.cpp new file mode 100644 index 0000000..f293d18 --- /dev/null +++ b/tests/unit/elements/nonlinear_mitc4_shell_test.cpp @@ -0,0 +1,263 @@ +#include "fesa/elements/nonlinear_mitc4_shell.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "fesa/elements/finite_rotation.h" +#include "fesa/elements/mitc4_shell.h" +#include "fesa/model/model_types.h" + +namespace { + +using Vector3 = std::array; + +fesa::Node Node(const std::int64_t label, const Vector3 coordinates) { + return {{"Shell-Instance", label, std::to_string(label)}, coordinates, + {"nonlinear-mitc4.inp", static_cast(label)}}; +} + +std::array Nodes() { + return {Node(1, {-1.0, -1.0, 0.0}), Node(2, {1.0, -1.0, 0.0}), + Node(3, {1.0, 1.0, 0.0}), Node(4, {-1.0, 1.0, 0.0})}; +} + +std::array NodePointers( + const std::array& nodes) { + return {&nodes[0], &nodes[1], &nodes[2], &nodes[3]}; +} + +std::array Frames() { + return {{{0U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {1U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {2U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}, + {3U, {0.0, 0.0, 1.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}}}}; +} + +fesa::ShellSection Section() { + return {"Section", 0.2, 0U, {"nonlinear-mitc4.inp", 20U}}; +} + +fesa::LinearElasticMaterial Material() { + return {"Material", 120.0, 0.25, {"nonlinear-mitc4.inp", 21U}}; +} + +fesa::NonlinearMitc4TrialDofs ZeroTrial() { return {}; } + +fesa::Vector3 Multiply(const fesa::Matrix& matrix, const fesa::Vector3& value) { + return {matrix(0U, 0U) * value.X() + matrix(0U, 1U) * value.Y() + + matrix(0U, 2U) * value.Z(), + matrix(1U, 0U) * value.X() + matrix(1U, 1U) * value.Y() + + matrix(1U, 2U) * value.Z(), + matrix(2U, 0U) * value.X() + matrix(2U, 1U) * value.Y() + + matrix(2U, 2U) * value.Z()}; +} + +void ExpectZeroRecovery(const fesa::NonlinearMitc4Recovery& recovery) { + EXPECT_DOUBLE_EQ(recovery.physical_strain_energy, 0.0); + for (const auto& point : recovery.gauss_points) { + for (const double value : point.generalized_strain) { + EXPECT_DOUBLE_EQ(value, 0.0); + } + for (const double value : point.section_resultant) { + EXPECT_DOUBLE_EQ(value, 0.0); + } + for (const auto& stress : point.stress) { + for (const double value : stress.components) { + EXPECT_DOUBLE_EQ(value, 0.0); + } + } + } +} + +fesa::NonlinearMitc4Shell Shell(const std::array& nodes) { + const auto result = fesa::NonlinearMitc4Shell::Create( + NodePointers(nodes), Frames(), Section(), Material()); + EXPECT_TRUE(result.HasValue()); + return result.Value(); +} + +// NSNR-ELEM-KIN-001 +TEST(NonlinearMitc4Shell, UndeformedStateHasZeroPhysicalRecovery) { + const auto nodes = Nodes(); + const auto recovery = Shell(nodes).RecoverState(ZeroTrial()); + + ASSERT_TRUE(recovery.HasValue()); + ExpectZeroRecovery(recovery.Value()); +} + +// NSNR-ELEM-KIN-001A +TEST(NonlinearMitc4Shell, RejectsInvalidNodeAndInitialFrameContracts) { + const auto nodes = Nodes(); + auto node_pointers = NodePointers(nodes); + node_pointers[3U] = nullptr; + const auto null_node = fesa::NonlinearMitc4Shell::Create( + node_pointers, Frames(), Section(), Material()); + ASSERT_FALSE(null_node.HasValue()); + EXPECT_EQ(null_node.GetStatus().Diagnostics()[0U].code, + "invalid-nonlinear-shell-geometry"); + + auto frames = Frames(); + frames[2U].node_index = frames[1U].node_index; + const auto duplicate_frame = fesa::NonlinearMitc4Shell::Create( + NodePointers(nodes), frames, Section(), Material()); + ASSERT_FALSE(duplicate_frame.HasValue()); + EXPECT_EQ(duplicate_frame.GetStatus().Diagnostics()[0U].code, + "invalid-nonlinear-shell-frame"); + + frames = Frames(); + frames[0U].tangent_b = {1.0, 0.0, 0.0}; + const auto invalid_frame = fesa::NonlinearMitc4Shell::Create( + NodePointers(nodes), frames, Section(), Material()); + ASSERT_FALSE(invalid_frame.HasValue()); + EXPECT_EQ(invalid_frame.GetStatus().Diagnostics()[0U].code, + "invalid-nonlinear-shell-frame"); +} + +// NSNR-ELEM-KIN-002 +TEST(NonlinearMitc4Shell, UsesFixedInitialReferenceGeometry) { + const auto nodes = Nodes(); + auto trial = ZeroTrial(); + for (auto& displacement : trial.displacement) { + displacement = {0.2, -0.3, 0.4}; + } + + const auto recovery = Shell(nodes).EvaluateKinematics(trial); + ASSERT_TRUE(recovery.HasValue()); + ExpectZeroRecovery(recovery.Value()); +} + +// NSNR-ELEM-KIN-003 +TEST(NonlinearMitc4Shell, PreservesUnnormalizedInterpolatedDirector) { + const auto nodes = Nodes(); + auto trial = ZeroTrial(); + trial.rotation_vector[0U] = {0.8, 0.0, 0.0}; + trial.rotation_vector[1U] = {-0.8, 0.0, 0.0}; + trial.rotation_vector[2U] = {-0.8, 0.0, 0.0}; + trial.rotation_vector[3U] = {0.8, 0.0, 0.0}; + + const auto recovery = Shell(nodes).EvaluateKinematics(trial); + ASSERT_TRUE(recovery.HasValue()); + EXPECT_GT(recovery.Value().physical_strain_energy, 0.0); + const double expected_membrane = + 0.01 * std::sin(0.8) * std::sin(0.8) / 6.0; + EXPECT_NEAR(recovery.Value().gauss_points[0U].generalized_strain[0U], + expected_membrane, 1.0e-12); +} + +// NSNR-ELEM-KIN-004 +TEST(NonlinearMitc4Shell, RejectsOpposedOrDegenerateCurrentDirectors) { + const auto nodes = Nodes(); + auto trial = ZeroTrial(); + trial.rotation_vector[0U] = {std::acos(-1.0) - 1.0e-5, 0.0, 0.0}; + trial.rotation_vector[1U] = {-(std::acos(-1.0) - 1.0e-5), 0.0, 0.0}; + + const auto recovery = Shell(nodes).EvaluateKinematics(trial); + ASSERT_FALSE(recovery.HasValue()); + EXPECT_EQ(recovery.GetStatus().Diagnostics()[0U].code, + "invalid-nonlinear-shell-director"); +} + +// NSNR-ELEM-KIN-005 +TEST(NonlinearMitc4Shell, MatchesLinearMitc4RecoveryInSmallRotationLimit) { + const auto nodes = Nodes(); + const auto linear = fesa::Mitc4Shell::Create( + NodePointers(nodes), + std::array{{{0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, + {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}}}, + Section(), Material()); + ASSERT_TRUE(linear.HasValue()); + + auto trial = ZeroTrial(); + fesa::Vector linear_dofs{24U}; + for (std::size_t node = 0U; node < 4U; ++node) { + const double x = nodes[node].coordinates[0U]; + const double y = nodes[node].coordinates[1U]; + trial.displacement[node] = {1.0e-7 * x, -2.0e-7 * y, 3.0e-7 * x * y}; + trial.rotation_vector[node] = {-2.0e-7 * y, 1.0e-7 * x, 0.0}; + for (std::size_t component = 0U; component < 3U; ++component) { + linear_dofs[6U * node + component] = trial.displacement[node][component]; + linear_dofs[6U * node + 3U + component] = + trial.rotation_vector[node][component]; + } + } + + const auto nonlinear_recovery = Shell(nodes).EvaluateKinematics(trial); + const auto linear_recovery = linear.Value().RecoverPhysical(linear_dofs); + ASSERT_TRUE(nonlinear_recovery.HasValue()); + ASSERT_TRUE(linear_recovery.HasValue()); + for (std::size_t point = 0U; point < 4U; ++point) { + for (std::size_t component = 0U; component < 8U; ++component) { + EXPECT_NEAR(nonlinear_recovery.Value().gauss_points[point] + .generalized_strain[component], + linear_recovery.Value().points[point] + .generalized_strain[component], + 1.0e-11); + } + } +} + +// NSNR-ELEM-KIN-006 +TEST(NonlinearMitc4Shell, FiniteRigidMotionIsObjective) { + const auto nodes = Nodes(); + const fesa::Vector3 rotation{0.3, -0.2, 0.1}; + const fesa::Matrix rigid_rotation = fesa::ExpSkew(rotation); + const fesa::Vector3 translation{0.7, -0.4, 1.2}; + auto trial = ZeroTrial(); + for (std::size_t node = 0U; node < 4U; ++node) { + const fesa::Vector3 initial{nodes[node].coordinates}; + trial.displacement[node] = + Multiply(rigid_rotation, initial) + translation - initial; + trial.rotation_vector[node] = rotation; + } + + const auto recovery = Shell(nodes).EvaluateKinematics(trial); + ASSERT_TRUE(recovery.HasValue()); + for (const auto& point : recovery.Value().gauss_points) { + for (const double value : point.generalized_strain) { + EXPECT_NEAR(value, 0.0, 1.0e-12); + } + for (const auto& stress : point.stress) { + for (const double value : stress.components) { + EXPECT_NEAR(value, 0.0, 1.0e-12); + } + } + } + EXPECT_NEAR(recovery.Value().physical_strain_energy, 0.0, 1.0e-12); +} + +// NSNR-ELEM-KIN-007 and NSNR-ELEM-KIN-008 +TEST(NonlinearMitc4Recovery, EmitsOnlyFixedPhysicalGaussAndStressRows) { + const auto nodes = Nodes(); + const auto recovery = Shell(nodes).RecoverState(ZeroTrial()); + ASSERT_TRUE(recovery.HasValue()); + const double gauss = 1.0 / std::sqrt(3.0); + constexpr std::array locations{ + fesa::ShellMidsurfaceLocation::kGp1, fesa::ShellMidsurfaceLocation::kGp2, + fesa::ShellMidsurfaceLocation::kGp3, fesa::ShellMidsurfaceLocation::kGp4}; + constexpr std::array positions{ + fesa::ShellSectionPosition::kBottom, fesa::ShellSectionPosition::kMiddle, + fesa::ShellSectionPosition::kTop}; + constexpr std::array zeta{-1.0, 0.0, 1.0}; + + for (std::size_t point = 0U; point < recovery.Value().gauss_points.size(); + ++point) { + const auto& row = recovery.Value().gauss_points[point]; + EXPECT_EQ(row.location, locations[point]); + EXPECT_EQ(row.natural_coordinates[0U], point == 0U || point == 3U ? -gauss + : gauss); + EXPECT_EQ(row.natural_coordinates[1U], point < 2U ? -gauss : gauss); + for (std::size_t stress = 0U; stress < row.stress.size(); ++stress) { + EXPECT_EQ(row.stress[stress].position, positions[stress]); + EXPECT_EQ(row.stress[stress].zeta, zeta[stress]); + EXPECT_EQ(row.stress[stress].components.size(), 3U); + } + } +} + +} // namespace diff --git a/tests/unit/io/abaqus/domain_mapper_test.cpp b/tests/unit/io/abaqus/domain_mapper_test.cpp index a022b41..89f0c73 100644 --- a/tests/unit/io/abaqus/domain_mapper_test.cpp +++ b/tests/unit/io/abaqus/domain_mapper_test.cpp @@ -174,6 +174,12 @@ TipSecond, 6, 1. )inp"; } +std::string NonlinearShellDeck() { + return ReplaceOnce( + ReplaceOnce(ShellDeck(), "nlgeom=NO", "nlgeom=YES"), + "0.1, 1., 0.01, 1.", "0.1, 1., 0.001, 0.1"); +} + std::string SupportedInventoryDeck(bool include_no_ops) { const std::string preprint = include_no_ops ? "*Preprint, echo=NO, model=NO, history=NO, contact=NO\n" @@ -570,6 +576,142 @@ TEST(InpDomainMapping, NoOpAllowlistWarnsWithoutSemanticEffect) { plain.Value().Steps()[0].Loads().size()); } +// NSNR-IO-001, NSNR-IO-005, NSNR-IO-007 +TEST(InpDomainMapping, MapsNonlinearStaticShellProcedureAndRawControls) { + auto result = MapText("nonlinear-static-shell", NonlinearShellDeck()); + + ASSERT_TRUE(result.HasValue()); + const fesa::Domain& domain = result.Value(); + ASSERT_EQ(domain.Steps().Size(), 1U); + const auto& step = domain.Steps()[0U]; + EXPECT_EQ(step.ProcedureKind(), + fesa::StaticProcedureKind::kNonlinearFullNewton); + EXPECT_TRUE(step.IsNonlinearStatic()); + EXPECT_DOUBLE_EQ(step.InitialIncrement(), 0.1); + EXPECT_DOUBLE_EQ(step.TimePeriod(), 1.0); + EXPECT_DOUBLE_EQ(step.MinimumIncrement(), 0.001); + EXPECT_DOUBLE_EQ(step.MaximumIncrement(), 0.1); + EXPECT_TRUE(domain.BeamElements().Empty()); + ASSERT_EQ(domain.ShellElements().Size(), 4U); + EXPECT_EQ(domain.ShellElements()[0U].source_type, + fesa::ShellSourceElementType::kS4); + EXPECT_EQ(domain.ShellElements()[1U].source_type, + fesa::ShellSourceElementType::kS4r); +} + +// NSNR-IO-002, NSNR-IO-003 +TEST(InpDomainMapping, KeepsExplicitAndImplicitLinearStaticProcedures) { + const std::vector decks{ + ShellDeck(), ReplaceOnce(ShellDeck(), ", nlgeom=NO", "")}; + + for (std::size_t index = 0U; index < decks.size(); ++index) { + SCOPED_TRACE(index); + auto result = MapText("linear-static-procedure-" + std::to_string(index), + decks[index]); + ASSERT_TRUE(result.HasValue()); + ASSERT_EQ(result.Value().Steps().Size(), 1U); + EXPECT_EQ(result.Value().Steps()[0U].ProcedureKind(), + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(result.Value().Steps()[0U].IsNonlinearStatic()); + } +} + +// NSNR-IO-004 +TEST(InpDomainMapping, RejectsInvalidNonlinearStaticControlValues) { + struct InvalidCase { + std::string name; + std::string controls; + }; + const std::vector cases{ + {"zero", "0., 1., 0.001, 0.1"}, + {"nonfinite", "nan, 1., 0.001, 0.1"}, + {"nonunit-period", "0.1, 0.5, 0.001, 0.1"}, + {"reversed-bounds", "0.1, 1., 0.2, 0.1"}}; + + for (const auto& test_case : cases) { + SCOPED_TRACE(test_case.name); + auto result = MapText( + "invalid-nonlinear-static-" + test_case.name, + ReplaceOnce(NonlinearShellDeck(), "0.1, 1., 0.001, 0.1", + test_case.controls)); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "invalid-nonlinear-static-data"), + nullptr); + } +} + +// NSNR-IO-006, NSNR-IO-008 +TEST(InpDomainMapping, RejectsUnsupportedNonlinearProceduresAndMixedModels) { + const std::string nonlinear = NonlinearShellDeck(); + const std::vector> procedure_cases{ + {"dynamic", + ReplaceOnce(nonlinear, "*Static\n0.1, 1., 0.001, 0.1", + "*Dynamic\n0.1, 1., 0.001, 0.1")}, + {"mixed-steps", + nonlinear + "*Step, name=Linear, nlgeom=NO\n*Static\n0.1, 1., 0.01, " + "1.\n*End Step\n"}, + {"beam-nlgeom", + ReplaceOnce(MinimalDeck(), "nlgeom=NO", "nlgeom=YES")}}; + + for (const auto& test_case : procedure_cases) { + SCOPED_TRACE(test_case.first); + auto result = MapText("unsupported-nonlinear-" + test_case.first, + test_case.second); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "unsupported-analysis-procedure"), + nullptr); + } + + const std::string mixed_model = ReplaceOnce( + nonlinear, "0020, 2, 5, 6, 3\n*Elset", + "0020, 2, 5, 6, 3\n*Element, type=B33\n30, 1, 2\n*Elset"); + auto mixed_result = MapText("mixed-nonlinear-model", mixed_model); + ASSERT_FALSE(mixed_result.HasValue()); + EXPECT_EQ(mixed_result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(mixed_result.GetStatus(), + "unsupported-mixed-element-model"), + nullptr); +} + +// NSNR-IO-009, NSNR-IO-010, NSNR-IO-011 +TEST(InpDomainMapping, AcceptsOnlyNonlinearPreselectOutputNoOps) { + auto plain = MapText("nonlinear-output-plain", NonlinearShellDeck()); + ASSERT_TRUE(plain.HasValue()); + + for (const std::string_view request : {"field", "history"}) { + const std::string deck = ReplaceOnce( + NonlinearShellDeck(), "*End Step\n", + "*Output, " + std::string{request} + ", variable=PRESELECT\n*End Step\n"); + auto result = MapText("nonlinear-output-" + std::string{request}, deck); + ASSERT_TRUE(result.HasValue()); + EXPECT_EQ(result.Value().Nodes().size(), plain.Value().Nodes().size()); + EXPECT_EQ(result.Value().Steps().Size(), plain.Value().Steps().Size()); + EXPECT_EQ(result.Value().Steps()[0U].BoundaryConditions().size(), + plain.Value().Steps()[0U].BoundaryConditions().size()); + EXPECT_EQ(result.Value().Steps()[0U].Loads().size(), + plain.Value().Steps()[0U].Loads().size()); + ASSERT_EQ(result.Value().Warnings().size(), 1U); + EXPECT_EQ(result.Value().Warnings()[0U].keyword, "OUTPUT"); + } + + const std::vector malformed_requests{ + "*Output, field\n", "*Output, field, history, variable=PRESELECT\n", + "*Output, field, variable=ALL\n"}; + for (std::size_t index = 0U; index < malformed_requests.size(); ++index) { + SCOPED_TRACE(index); + auto result = MapText( + "malformed-nonlinear-output-" + std::to_string(index), + ReplaceOnce(NonlinearShellDeck(), "*End Step\n", + malformed_requests[index] + "*End Step\n")); + ASSERT_FALSE(result.HasValue()); + EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); + ASSERT_NE(FindDiagnostic(result.GetStatus(), "invalid-keyword-parameter"), + nullptr); + } +} + // MITC4-MAP-001 // C-MODEL-002 TEST(InpDomainMapping, MapsS4AndS4rThroughOneMitc4Identity) { @@ -738,8 +880,6 @@ TEST(InpDomainMapping, const std::vector cases{ {"second-step", base + "*Step\n*Static\n1., 1., 1., 1.\n*End Step\n", "unsupported-multiple-step"}, - {"nonlinear-step", ReplaceOnce(base, "nlgeom=NO", "nlgeom=YES"), - "unsupported-nonlinear-geometry"}, {"other-procedure", ReplaceOnce(base, "*Static\n0.1, 1., 0.01, 1.", "*Dynamic\n0.1, 1., 0.01, 1."), @@ -898,7 +1038,7 @@ TEST(InpDomainMapping, RejectsUnsupportedAndInvalidPortfolio) { {"malformed-node-arity", ReplaceOnce(base, "1, 0., 0., 0.", "1, 0., 0."), "invalid-data-arity", fesa::FailureCategory::kInput}, {"nlgeom", ReplaceOnce(base, "nlgeom=NO", "nlgeom=YES"), - "unsupported-nonlinear-geometry", fesa::FailureCategory::kModel}, + "unsupported-analysis-procedure", fesa::FailureCategory::kInput}, {"unknown-keyword", ReplaceOnce(base, "*Assembly, name=Assembly", "*Density\n1.\n*Assembly, name=Assembly"), diff --git a/tests/unit/io/abaqus/domain_mapping_components_test.cpp b/tests/unit/io/abaqus/domain_mapping_components_test.cpp index b9ffbde..3524551 100644 --- a/tests/unit/io/abaqus/domain_mapping_components_test.cpp +++ b/tests/unit/io/abaqus/domain_mapping_components_test.cpp @@ -150,6 +150,9 @@ TEST(DomainMappingComponents, EXPECT_EQ(domain.Materials().Size(), 1U); EXPECT_EQ(domain.Properties().Size(), 1U); ASSERT_EQ(domain.Steps().Size(), 1U); + EXPECT_EQ(domain.Steps()[0].ProcedureKind(), + StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()); EXPECT_EQ(domain.Steps()[0].BoundaryConditions().size(), 7U); EXPECT_EQ(domain.Steps()[0].Loads().size(), 1U); ASSERT_EQ(domain.Warnings().size(), 3U); diff --git a/tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp b/tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp new file mode 100644 index 0000000..a210b1c --- /dev/null +++ b/tests/unit/io/hdf5/nonlinear_hdf5_results_writer_test.cpp @@ -0,0 +1,616 @@ +#include "fesa/io/hdf5/nonlinear_hdf5_results_writer.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "fesa/analysis/analysis_model.h" +#include "fesa/analysis/nonlinear_analysis_state.h" +#include "fesa/fem/dof_manager.h" +#include "fesa/model/domain.h" +#include "fesa/results/nonlinear_results_writer.h" +#include "io/hdf5/hdf5_raii.h" + +namespace { + +using fesa::hdf5_internal::Hdf5Handle; + +constexpr std::array, 3> kIdentityTriad{ + std::array{1.0, 0.0, 0.0}, + std::array{0.0, 1.0, 0.0}, + std::array{0.0, 0.0, 1.0}}; + +class TempDirectory { + public: + explicit TempDirectory(const std::string& leaf) + : path_{std::filesystem::temp_directory_path() / + ("fesa-nonlinear-hdf5-" + leaf)} { + std::error_code error; + std::filesystem::remove_all(path_, error); + if (!std::filesystem::create_directory(path_)) { + throw std::runtime_error{"Unable to create nonlinear HDF5 test directory."}; + } + } + + ~TempDirectory() { + std::error_code error; + std::filesystem::remove_all(path_, error); + } + + const std::filesystem::path& Path() const noexcept { return path_; } + + private: + std::filesystem::path path_; +}; + +class WinHandle { + public: + explicit WinHandle(const HANDLE handle) : handle_{handle} {} + WinHandle(const WinHandle&) = delete; + WinHandle& operator=(const WinHandle&) = delete; + ~WinHandle() { + if (handle_ != INVALID_HANDLE_VALUE) { + (void)CloseHandle(handle_); + } + } + + HANDLE Get() const noexcept { return handle_; } + + private: + HANDLE handle_{INVALID_HANDLE_VALUE}; +}; + +struct Fixture { + std::unique_ptr domain; + std::unique_ptr dofs; + fesa::NonlinearAnalysisState state; +}; + +struct AcceptedFrameRow { + std::uint64_t frame_index; + std::uint64_t increment_index; + double load_factor; + std::uint64_t iteration_count; + std::uint8_t is_factor_one; +}; + +struct DiagnosticRow { + char* severity; + char* code; + char* file; + std::uint64_t line; + char* keyword; + char* entity_identity; + char* message; +}; + +fesa::ModelDefinition MakeDefinition(const std::filesystem::path& source) { + fesa::ModelDefinition definition{}; + definition.source_path = source; + definition.source_content_identity = "nonlinear-hdf5-fixture"; + definition.nodes = { + {{"Shell-1", 10, "10"}, {0.0, 0.0, 0.0}, {source, 1U}}, + {{"Shell-1", 20, "20"}, {1.0, 0.0, 0.0}, {source, 2U}}, + {{"Shell-1", 30, "30"}, {1.0, 1.0, 0.0}, {source, 3U}}, + {{"Shell-1", 40, "40"}, {0.0, 1.0, 0.0}, {source, 4U}}}; + definition.materials = {{"Steel", 210.0e9, 0.3, {source, 5U}}}; + definition.shell_sections = {{"Shell", 0.1, 0U, {source, 6U}}}; + definition.shell_elements = {{{"Shell-1", 1, "1"}, + fesa::ShellSourceElementType::kS4, + {0U, 1U, 2U, 3U}, + 0U, + 0U, + {source, 7U}}}; + for (std::size_t node = 0U; node < definition.nodes.size(); ++node) { + definition.shell_node_initial_frames.push_back( + {static_cast(node), + {0.0, 0.0, 1.0}, + {1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}}); + } + definition.steps = {{"Step-1", + {}, + {}, + fesa::StaticProcedureKind::kNonlinearFullNewton, + true, + 0.5, + 1.0, + 0.001, + 1.0, + {source, 8U}}}; + return definition; +} + +fesa::NonlinearStateBaselineInput MakeBaseline(const fesa::Domain& domain) { + fesa::NonlinearStateBaselineInput baseline{}; + for (std::size_t node = 0U; node < domain.Nodes().size(); ++node) { + baseline.node_baselines.push_back( + {static_cast(node), domain.Nodes()[node].source_id, + kIdentityTriad, {0.0, 0.0, 1.0}}); + } + return baseline; +} + +fesa::ShellResultRow MakeShellRow(const fesa::ShellMidsurfaceLocation location, + const std::array coordinates, + const double seed) { + return {0U, + location, + coordinates, + kIdentityTriad, + {seed, seed + 1.0, seed + 2.0, seed + 3.0, seed + 4.0, + seed + 5.0, seed + 6.0, seed + 7.0}, + {seed + 10.0, seed + 11.0, seed + 12.0, seed + 13.0, + seed + 14.0, seed + 15.0, seed + 16.0, seed + 17.0}, + {{{fesa::ShellSectionPosition::kBottom, + -1.0, + {seed + 20.0, seed + 21.0, seed + 22.0}}, + {fesa::ShellSectionPosition::kMiddle, + 0.0, + {seed + 23.0, seed + 24.0, seed + 25.0}}, + {fesa::ShellSectionPosition::kTop, + 1.0, + {seed + 26.0, seed + 27.0, seed + 28.0}}}}}; +} + +std::vector MakeShellRows(const double seed) { + const double gauss = 1.0 / std::sqrt(3.0); + return { + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp1, {-gauss, -gauss}, + seed), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp2, {gauss, -gauss}, + seed + 30.0), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp3, {gauss, gauss}, + seed + 60.0), + MakeShellRow(fesa::ShellMidsurfaceLocation::kGp4, {-gauss, gauss}, + seed + 90.0)}; +} + +fesa::AcceptedFrameState MakeFrame(const fesa::NonlinearTrialState& committed, + const std::uint32_t frame_index, + const std::uint32_t increment_index, + const double load_factor) { + fesa::AcceptedFrameState frame{ + frame_index, + increment_index, + load_factor, + 2U, + load_factor == 1.0, + committed.nodal_internal_order, + committed.nodal_source_ids, + committed.generalized_coordinates, + committed.displacement, + committed.rotation_vector, + committed.nodal_triad, + committed.nodal_director, + committed.internal_force, + committed.external_force, + committed.residual, + committed.reaction, + MakeShellRows(100.0 * load_factor), + 20.0 * load_factor, + {load_factor, 2.0 * load_factor, 3.0 * load_factor, + 4.0 * load_factor, 5.0 * load_factor, 6.0 * load_factor}}; + for (std::size_t node = 0U; node < frame.nodal_internal_order.size(); ++node) { + const std::size_t offset = 6U * node; + frame.displacement[offset] = load_factor * static_cast(node + 1U); + frame.displacement[offset + 1U] = -frame.displacement[offset]; + frame.displacement[offset + 2U] = 0.5 * frame.displacement[offset]; + frame.rotation_vector[offset + 5U] = 0.1 * load_factor; + for (std::size_t component = 0U; component < 6U; ++component) { + frame.generalized_coordinates[offset + component] = + component < 3U ? frame.displacement[offset + component] + : frame.rotation_vector[offset + component]; + frame.internal_force[offset + component] = + 10.0 * static_cast(component + 1U); + frame.external_force[offset + component] = 0.0; + frame.residual[offset + component] = frame.internal_force[offset + component]; + frame.reaction[offset + component] = frame.residual[offset + component]; + } + } + return frame; +} + +Fixture MakeFixture(const std::filesystem::path& source) { + auto domain_result = fesa::Domain::Create(MakeDefinition(source)); + if (!domain_result.HasValue()) { + throw std::runtime_error{"Unable to construct nonlinear HDF5 Domain."}; + } + auto domain = std::make_unique(std::move(domain_result.Value())); + auto model_result = fesa::AnalysisModel::Create(*domain); + if (!model_result.HasValue()) { + throw std::runtime_error{"Unable to construct nonlinear HDF5 model."}; + } + auto dofs_result = fesa::DofManager::Create(model_result.Value()); + if (!dofs_result.HasValue()) { + throw std::runtime_error{"Unable to construct nonlinear HDF5 DOFs."}; + } + auto dofs = std::make_unique(std::move(dofs_result.Value())); + auto state_result = + fesa::NonlinearAnalysisState::Create(*domain, *dofs, MakeBaseline(*domain)); + if (!state_result.HasValue()) { + throw std::runtime_error{"Unable to construct nonlinear HDF5 state."}; + } + fesa::NonlinearAnalysisState state = std::move(state_result.Value()); + if (!state.CommitAcceptedFrame( + MakeFrame(state.CommittedState(), 0U, 1U, 0.5)) + .IsOk() || + !state.CommitAcceptedFrame( + MakeFrame(state.CommittedState(), 1U, 2U, 1.0)) + .IsOk()) { + throw std::runtime_error{"Unable to commit nonlinear HDF5 test frames."}; + } + return {std::move(domain), std::move(dofs), std::move(state)}; +} + +Hdf5Handle OpenFile(const std::filesystem::path& path) { + return {H5Fopen(path.string().c_str(), H5F_ACC_RDONLY, H5P_DEFAULT), H5Fclose}; +} + +Hdf5Handle OpenDataset(const hid_t file, const std::string& path) { + return {H5Dopen2(file, path.c_str(), H5P_DEFAULT), H5Dclose}; +} + +std::vector DatasetDimensions(const hid_t file, + const std::string& path) { + const auto dataset = OpenDataset(file, path); + Hdf5Handle space{H5Dget_space(dataset.Get()), H5Sclose}; + const int rank = H5Sget_simple_extent_ndims(space.Get()); + std::vector dimensions(static_cast(rank)); + if (rank > 0) { + EXPECT_GE(H5Sget_simple_extent_dims(space.Get(), dimensions.data(), nullptr), + 0); + } + return dimensions; +} + +std::string ReadStringAttribute(const hid_t object, const char* name) { + Hdf5Handle attribute{H5Aopen(object, name, H5P_DEFAULT), H5Aclose}; + Hdf5Handle type{H5Aget_type(attribute.Get()), H5Tclose}; + char* raw = nullptr; + EXPECT_GE(H5Aread(attribute.Get(), type.Get(), &raw), 0); + const std::string value = raw == nullptr ? std::string{} : std::string{raw}; + if (raw != nullptr) { + EXPECT_GE(H5free_memory(raw), 0); + } + return value; +} + +std::uint64_t ReadUint64Attribute(const hid_t object, const char* name) { + Hdf5Handle attribute{H5Aopen(object, name, H5P_DEFAULT), H5Aclose}; + std::uint64_t value = 0U; + EXPECT_GE(H5Aread(attribute.Get(), H5T_NATIVE_UINT64, &value), 0); + return value; +} + +double ReadDoubleAttribute(const hid_t object, const char* name) { + Hdf5Handle attribute{H5Aopen(object, name, H5P_DEFAULT), H5Aclose}; + double value = 0.0; + EXPECT_GE(H5Aread(attribute.Get(), H5T_NATIVE_DOUBLE, &value), 0); + return value; +} + +std::vector ReadDoubleDataset(const hid_t file, + const std::string& path) { + const auto dimensions = DatasetDimensions(file, path); + std::size_t count = 1U; + for (const hsize_t dimension : dimensions) { + count *= static_cast(dimension); + } + std::vector values(count); + const auto dataset = OpenDataset(file, path); + if (!values.empty()) { + EXPECT_GE(H5Dread(dataset.Get(), H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, + H5P_DEFAULT, values.data()), + 0); + } + return values; +} + +Hdf5Handle AcceptedFrameMemoryType() { + Hdf5Handle type{H5Tcreate(H5T_COMPOUND, sizeof(AcceptedFrameRow)), H5Tclose}; + EXPECT_GE(H5Tinsert(type.Get(), "frame_index", + HOFFSET(AcceptedFrameRow, frame_index), + H5T_NATIVE_UINT64), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "increment_index", + HOFFSET(AcceptedFrameRow, increment_index), + H5T_NATIVE_UINT64), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "load_factor", + HOFFSET(AcceptedFrameRow, load_factor), H5T_NATIVE_DOUBLE), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "iteration_count", + HOFFSET(AcceptedFrameRow, iteration_count), + H5T_NATIVE_UINT64), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "is_factor_one", + HOFFSET(AcceptedFrameRow, is_factor_one), + H5T_NATIVE_UINT8), + 0); + return type; +} + +std::vector ReadAcceptedFrames(const hid_t file) { + const auto dataset = + OpenDataset(file, "/steps/Step-1/accepted_frames"); + const auto dimensions = DatasetDimensions(file, "/steps/Step-1/accepted_frames"); + std::vector rows(static_cast(dimensions[0U])); + auto type = AcceptedFrameMemoryType(); + EXPECT_GE(H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, + rows.data()), + 0); + return rows; +} + +Hdf5Handle DiagnosticMemoryType() { + Hdf5Handle string_type{H5Tcopy(H5T_C_S1), H5Tclose}; + EXPECT_GE(H5Tset_size(string_type.Get(), H5T_VARIABLE), 0); + EXPECT_GE(H5Tset_cset(string_type.Get(), H5T_CSET_UTF8), 0); + Hdf5Handle type{H5Tcreate(H5T_COMPOUND, sizeof(DiagnosticRow)), H5Tclose}; + EXPECT_GE(H5Tinsert(type.Get(), "severity", HOFFSET(DiagnosticRow, severity), + string_type.Get()), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "code", HOFFSET(DiagnosticRow, code), + string_type.Get()), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "file", HOFFSET(DiagnosticRow, file), + string_type.Get()), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "line", HOFFSET(DiagnosticRow, line), + H5T_NATIVE_UINT64), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "keyword", HOFFSET(DiagnosticRow, keyword), + string_type.Get()), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "entity_identity", + HOFFSET(DiagnosticRow, entity_identity), string_type.Get()), + 0); + EXPECT_GE(H5Tinsert(type.Get(), "message", HOFFSET(DiagnosticRow, message), + string_type.Get()), + 0); + return type; +} + +std::vector ReadDiagnostics(const hid_t file) { + const auto dataset = OpenDataset(file, "/diagnostics"); + const auto dimensions = DatasetDimensions(file, "/diagnostics"); + std::vector rows(static_cast(dimensions[0U])); + auto type = DiagnosticMemoryType(); + EXPECT_GE(H5Dread(dataset.Get(), type.Get(), H5S_ALL, H5S_ALL, H5P_DEFAULT, + rows.data()), + 0); + return rows; +} + +void ReclaimDiagnostics(const std::vector& rows) { + for (const auto& row : rows) { + for (char* value : {row.severity, row.code, row.file, row.keyword, + row.entity_identity, row.message}) { + if (value != nullptr) { + EXPECT_GE(H5free_memory(value), 0); + } + } + } +} + +std::vector ReadBytes(const std::filesystem::path& path) { + std::ifstream input{path, std::ios::binary}; + return {std::istreambuf_iterator{input}, + std::istreambuf_iterator{}}; +} + +void WriteBytes(const std::filesystem::path& path, + const std::vector& bytes) { + std::ofstream output{path, std::ios::binary | std::ios::trunc}; + output.write(bytes.data(), static_cast(bytes.size())); + if (!output) { + throw std::runtime_error{"Unable to write nonlinear HDF5 test bytes."}; + } +} + +} // namespace + +// NSNR-HDF5-001 through NSNR-HDF5-006, NSNR-HDF5-008 through NSNR-HDF5-010. +TEST(NonlinearHdf5ResultsWriter, + WritesSchemaV1ModelAndCommittedAcceptedFramesOnly) { + TempDirectory directory{"schema"}; + auto fixture = MakeFixture(directory.Path() / "model.inp"); + const auto output = directory.Path() / "model_results.h5"; + + fesa::NonlinearHdf5ResultsWriter writer; + const auto status = writer.Write(output, *fixture.domain, fixture.state, {}); + ASSERT_TRUE(status.IsOk()) << status.Diagnostics().at(0U).message; + + const auto file = OpenFile(output); + ASSERT_GE(file.Get(), 0); + Hdf5Handle metadata{H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT), H5Gclose}; + ASSERT_GE(metadata.Get(), 0); + EXPECT_EQ(ReadUint64Attribute(metadata.Get(), "schema_version"), 1U); + EXPECT_EQ(ReadStringAttribute(metadata.Get(), "feature_id"), + "nonlinear-static-newton-raphson"); + EXPECT_EQ(ReadStringAttribute(metadata.Get(), "analysis_procedure"), + "nonlinear-static-full-newton"); + EXPECT_EQ(ReadStringAttribute(metadata.Get(), "internal_formulation"), + "FESA-MITC4-total-lagrangian"); + EXPECT_EQ(ReadStringAttribute(metadata.Get(), "integration_rule"), + "2x2x2-gauss; mitc4-edge-midpoint-shear"); + EXPECT_EQ(ReadUint64Attribute(metadata.Get(), "factor_zero_is_frame"), 0U); + EXPECT_DOUBLE_EQ(ReadDoubleAttribute(metadata.Get(), "factor_zero_load_factor"), + 0.0); + + for (const char* path : + {"/model/nodes", "/model/elements", "/model/shell/materials", + "/model/shell/sections", "/model/shell/nodal_director", + "/model/shell/nodal_frame", "/model/nodal_constraint_mask", + "/model/prescribed_displacement_start", + "/model/prescribed_displacement_target", + "/model/shell/midsurface_locations", "/model/shell/section_positions"}) { + EXPECT_GT(H5Lexists(file.Get(), path, H5P_DEFAULT), 0) << path; + } + EXPECT_EQ(DatasetDimensions(file.Get(), "/steps/Step-1/accepted_frames"), + std::vector({2U})); + const auto frames = ReadAcceptedFrames(file.Get()); + ASSERT_EQ(frames.size(), 2U); + EXPECT_EQ(frames[0U].frame_index, 0U); + EXPECT_EQ(frames[0U].increment_index, 1U); + EXPECT_DOUBLE_EQ(frames[0U].load_factor, 0.5); + EXPECT_EQ(frames[0U].is_factor_one, 0U); + EXPECT_EQ(frames[1U].frame_index, 1U); + EXPECT_EQ(frames[1U].increment_index, 2U); + EXPECT_DOUBLE_EQ(frames[1U].load_factor, 1.0); + EXPECT_EQ(frames[1U].is_factor_one, 1U); + EXPECT_EQ(H5Lexists(file.Get(), "/steps/Step-1/frames/2", H5P_DEFAULT), 0); + EXPECT_EQ(H5Lexists(file.Get(), "/steps/Step-1/trial_history", H5P_DEFAULT), + 0); + + const std::string root = "/steps/Step-1/frames/1"; + for (const std::string& suffix : + {"/nodal/displacement", "/nodal/triad", "/nodal/director", + "/nodal/generalized_internal_force", "/nodal/generalized_external_force", + "/nodal/generalized_residual", "/nodal/reaction", + "/element/shell/local_frame", "/element/shell/generalized_strain", + "/element/shell/section_resultant", "/element/shell/stress", + "/global/energy", "/global/equilibrium"}) { + EXPECT_GT(H5Lexists(file.Get(), (root + suffix).c_str(), H5P_DEFAULT), 0) + << suffix; + } + EXPECT_EQ(DatasetDimensions(file.Get(), root + "/nodal/displacement"), + std::vector({4U, 6U})); + EXPECT_EQ(DatasetDimensions(file.Get(), root + "/nodal/triad"), + std::vector({4U, 3U, 3U})); + EXPECT_EQ(DatasetDimensions(file.Get(), root + "/element/shell/local_frame"), + std::vector({1U, 4U, 3U, 3U})); + EXPECT_EQ(DatasetDimensions(file.Get(), root + "/element/shell/stress"), + std::vector({1U, 4U, 3U, 3U})); + const auto displacement = ReadDoubleDataset(file.Get(), root + "/nodal/displacement"); + ASSERT_EQ(displacement.size(), 24U); + EXPECT_DOUBLE_EQ(displacement[0U], 1.0); + EXPECT_DOUBLE_EQ(displacement[1U], -1.0); + EXPECT_DOUBLE_EQ(displacement[2U], 0.5); + EXPECT_DOUBLE_EQ(displacement[5U], 0.1); +} + +// NSNR-HDF5-007. +TEST(NonlinearHdf5ResultsWriter, ProjectsRotationalReactionToSpatialMoment) { + TempDirectory directory{"reaction"}; + auto fixture = MakeFixture(directory.Path() / "reaction.inp"); + const auto output = directory.Path() / "reaction_results.h5"; + + fesa::NonlinearHdf5ResultsWriter writer; + ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()); + + const auto file = OpenFile(output); + const auto reaction = ReadDoubleDataset( + file.Get(), "/steps/Step-1/frames/1/nodal/reaction"); + ASSERT_EQ(reaction.size(), 24U); + const double theta = 0.1; + const double quadratic = + (1.0 - 0.5 * theta / std::tan(0.5 * theta)) / (theta * theta); + EXPECT_NEAR(reaction[3U], + (1.0 - quadratic * theta * theta) * 40.0 - + 0.5 * theta * 50.0, + 1.0e-12); + EXPECT_NEAR(reaction[4U], + 0.5 * theta * 40.0 + + (1.0 - quadratic * theta * theta) * 50.0, + 1.0e-12); + EXPECT_NEAR(reaction[5U], 60.0, 1.0e-12); + EXPECT_GT(quadratic, 0.0); +} + +// NSNR-HDF5-014. +TEST(NonlinearHdf5ResultsWriter, WritesSchemaV1GlobalBalanceErrorLocation) { + TempDirectory directory{"global-balance-location"}; + auto fixture = MakeFixture(directory.Path() / "global-balance.inp"); + const auto output = directory.Path() / "global-balance_results.h5"; + + fesa::NonlinearHdf5ResultsWriter writer; + ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, {}).IsOk()); + + const auto file = OpenFile(output); + const auto equilibrium = OpenDataset( + file.Get(), "/steps/Step-1/frames/1/global/equilibrium"); + EXPECT_EQ(DatasetDimensions(file.Get(), + "/steps/Step-1/frames/1/global/equilibrium"), + std::vector({6U})); + EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), "component_names"), + "FORCE_1,FORCE_2,FORCE_3,MOMENT_1,MOMENT_2,MOMENT_3"); + EXPECT_EQ(ReadStringAttribute(equilibrium.Get(), "location"), + "global-balance-error"); + Hdf5Handle metadata{H5Gopen2(file.Get(), "/metadata", H5P_DEFAULT), + H5Gclose}; + ASSERT_GE(metadata.Get(), 0); + EXPECT_EQ(ReadUint64Attribute(metadata.Get(), "schema_version"), 1U); +} + +// NSNR-HDF5-012 and NSNR-HDF5-013. +TEST(NonlinearHdf5ResultsWriter, StoresSortedDiagnosticsThroughBackendNeutralBoundary) { + static_assert(std::is_base_of_v); + TempDirectory directory{"diagnostics"}; + auto fixture = MakeFixture(directory.Path() / "diagnostics.inp"); + const std::vector diagnostics{ + {fesa::Severity::kWarning, + "later", + {fixture.domain->SourcePath(), 20U}, + "*OUTPUT", + "", + "Later warning."}, + {fesa::Severity::kWarning, + "earlier", + {fixture.domain->SourcePath(), 10U}, + "*PREPRINT", + "", + "Earlier warning."}}; + const auto output = directory.Path() / "diagnostics_results.h5"; + + fesa::NonlinearHdf5ResultsWriter writer; + ASSERT_TRUE(writer.Write(output, *fixture.domain, fixture.state, diagnostics) + .IsOk()); + const auto file = OpenFile(output); + const auto rows = ReadDiagnostics(file.Get()); + ASSERT_EQ(rows.size(), 2U); + EXPECT_STREQ(rows[0U].code, "earlier"); + EXPECT_EQ(rows[0U].line, 10U); + EXPECT_STREQ(rows[1U].code, "later"); + EXPECT_EQ(rows[1U].line, 20U); + ReclaimDiagnostics(rows); +} + +// NSNR-HDF5-011. +TEST(NonlinearHdf5ResultsWriter, CandidateFinalizationFailurePreservesPriorFinal) { + TempDirectory directory{"atomic"}; + auto fixture = MakeFixture(directory.Path() / "atomic.inp"); + const auto output = directory.Path() / "atomic_results.h5"; + const std::vector sentinel{'p', 'r', 'i', 'o', 'r'}; + WriteBytes(output, sentinel); + WinHandle lock{CreateFileW(output.c_str(), GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr)}; + ASSERT_NE(lock.Get(), INVALID_HANDLE_VALUE); + + fesa::NonlinearHdf5ResultsWriter writer; + const auto status = writer.Write(output, *fixture.domain, fixture.state, {}); + + ASSERT_FALSE(status.IsOk()); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kOutput); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics()[0U].code, "hdf5-finalization-failure"); + EXPECT_EQ(ReadBytes(output), sentinel); +} diff --git a/tests/unit/model/domain_test.cpp b/tests/unit/model/domain_test.cpp index f4c79e5..93425f4 100644 --- a/tests/unit/model/domain_test.cpp +++ b/tests/unit/model/domain_test.cpp @@ -49,6 +49,8 @@ fesa::ModelDefinition MakeOwnedDefinition() { definition.steps = {{"Step-1", {{"Root", 1, 6, 0.0, {"models/owned.inp", 60U}}}, {{"Tip", 3, -1000.0, {"models/owned.inp", 61U}}}, + fesa::StaticProcedureKind::kLinearSmallDisplacement, + false, 0.1, 1.0, 1.0e-5, @@ -197,6 +199,9 @@ TEST(DomainModel, ImmutableOwnershipPreservesStableOrder) { EXPECT_DOUBLE_EQ(domain.Steps()[0].TimePeriod(), 1.0); EXPECT_DOUBLE_EQ(domain.Steps()[0].MinimumIncrement(), 1.0e-5); EXPECT_DOUBLE_EQ(domain.Steps()[0].MaximumIncrement(), 1.0); + EXPECT_EQ(domain.Steps()[0].ProcedureKind(), + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(domain.Steps()[0].IsNonlinearStatic()); ASSERT_EQ(domain.Steps()[0].BoundaryConditions().size(), 6U); ASSERT_EQ(domain.Steps()[0].Loads().size(), 1U); ASSERT_EQ(domain.Steps()[0].ConcentratedLoads().Size(), 1U); diff --git a/tests/unit/model/model_types_test.cpp b/tests/unit/model/model_types_test.cpp index 994cb4c..0237d69 100644 --- a/tests/unit/model/model_types_test.cpp +++ b/tests/unit/model/model_types_test.cpp @@ -70,8 +70,9 @@ TEST(DomainModel, SourceAndInternalIdentityRemainDistinct) { "Root", 1, 6, 0.0, {"models/beam.inp", 60U}}; const fesa::NodalLoad load{"Tip", 3, -1000.0, {"models/beam.inp", 70U}}; const fesa::StaticStepDefinition step{ - "Step-1", {boundary}, {load}, 0.1, - 1.0, 1.0e-5, 1.0, {"models/beam.inp", 50U}}; + "Step-1", {boundary}, {load}, + fesa::StaticProcedureKind::kLinearSmallDisplacement, false, 0.1, + 1.0, 1.0e-5, 1.0, {"models/beam.inp", 50U}}; const fesa::NodeSet node_set{ "Root", std::string{"Instance-A"}, {5U}, {"models/beam.inp", 25U}}; const fesa::ElementSet element_set{ @@ -118,6 +119,9 @@ TEST(DomainModel, SourceAndInternalIdentityRemainDistinct) { EXPECT_EQ(definition.steps[0].time_period, 1.0); EXPECT_EQ(definition.steps[0].minimum_increment, 1.0e-5); EXPECT_EQ(definition.steps[0].maximum_increment, 1.0); + EXPECT_EQ(definition.steps[0].procedure_kind, + fesa::StaticProcedureKind::kLinearSmallDisplacement); + EXPECT_FALSE(definition.steps[0].nlgeom); ASSERT_EQ(definition.warnings.size(), 1U); EXPECT_EQ(definition.warnings[0].location.line, 75U); diff --git a/tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp b/tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp index fd5f608..1a6953e 100644 --- a/tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp +++ b/tests/unit/solvers/linear/mkl_pardiso_solver_test.cpp @@ -123,6 +123,15 @@ TEST(MklPardisoSolver, ReusesOneFactorizationForRepeatedRhs) { EXPECT_LE(NormalizedResidual(matrix, second, rhs_second), 1.0e-10); } +TEST(MklPardisoSolver, StillRejectsNonsymmetricPublicCsr) { + const auto nonsymmetric = MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0}); + fesa::MklPardisoSolver solver; + + const auto status = solver.Factorize(nonsymmetric); + ExpectStructuredSolverFailure(status); + EXPECT_EQ(status.Diagnostics()[0U].code, "solver-matrix-not-symmetric"); +} + TEST(MklPardisoSolver, RefactorizesWithoutLeakingState) { const auto first_matrix = MakeDenseCsr(2U, {4.0, 1.0, 1.0, 3.0}); const auto second_matrix = MakeDenseCsr(2U, {2.0, 0.0, 0.0, 5.0}); diff --git a/tests/unit/solvers/linear/tangent_solver_test.cpp b/tests/unit/solvers/linear/tangent_solver_test.cpp new file mode 100644 index 0000000..0dab893 --- /dev/null +++ b/tests/unit/solvers/linear/tangent_solver_test.cpp @@ -0,0 +1,132 @@ +#include "fesa/solvers/linear/mkl_pardiso_tangent_solver.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "fesa/fem/dof_manager.h" +#include "fesa/math/sparse_matrix.h" +#include "fesa/math/vector.h" +#include "fesa/solvers/linear/tangent_solver.h" + +namespace { + +fesa::SparseMatrix MakeDenseCsr(const std::size_t size, + const std::vector& values) { + EXPECT_EQ(values.size(), size * size); + + fesa::SparsePattern pattern; + std::vector contributions; + pattern.row_offsets.reserve(size + 1U); + pattern.row_offsets.push_back(0U); + for (std::size_t row = 0U; row < size; ++row) { + for (std::size_t column = 0U; column < size; ++column) { + pattern.column_indices.push_back(column); + contributions.push_back( + {row, column, values[row * size + column], row, column}); + } + pattern.row_offsets.push_back(pattern.column_indices.size()); + } + + auto matrix = fesa::SparseMatrix::FromCoo(size, size, + std::move(contributions), pattern); + EXPECT_TRUE(matrix.HasValue()); + return std::move(matrix.Value()); +} + +fesa::Vector MakeVector(const std::initializer_list values) { + fesa::Vector result{values.size()}; + std::size_t index = 0U; + for (const double value : values) { + result[index++] = value; + } + return result; +} + +void ExpectSolverFailure(const fesa::Status& status) { + EXPECT_FALSE(status.IsOk()); + EXPECT_EQ(status.Category(), fesa::FailureCategory::kSolver); + ASSERT_EQ(status.Diagnostics().size(), 1U); + EXPECT_EQ(status.Diagnostics().front().severity, fesa::Severity::kError); +} + +TEST(TangentSolver, SolvesNonsymmetricKnownCorrection) { + static_assert( + std::is_base_of_v); + static_assert(std::has_virtual_destructor_v); + + const auto matrix = MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0}); + const auto rhs = MakeVector({4.0, 6.0}); + fesa::MklPardisoTangentSolver concrete_solver; + fesa::TangentSolver& solver = concrete_solver; + + ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()); + fesa::Vector correction{2U}; + ASSERT_TRUE(solver.SolveCorrection(rhs, correction).IsOk()); + EXPECT_NEAR(correction[0U], 1.0, 1.0e-14); + EXPECT_NEAR(correction[1U], 2.0, 1.0e-14); +} + +TEST(TangentSolver, SolvesTrivialZeroEquationSystem) { + const auto matrix = MakeDenseCsr(0U, {}); + fesa::MklPardisoTangentSolver solver; + + ASSERT_TRUE(solver.FactorizeFresh(matrix).IsOk()); + fesa::Vector correction{0U}; + EXPECT_TRUE(solver.SolveCorrection(fesa::Vector{0U}, correction).IsOk()); + EXPECT_EQ(correction.Size(), 0U); +} + +TEST(TangentSolver, RejectsNonfiniteInputsWithoutModifyingCorrection) { + const fesa::SparsePattern pattern{{0U, 1U}, {0U}}; + const auto nonfinite_matrix = fesa::SparseMatrix::FromCoo( + 1U, 1U, + {{0U, 0U, (std::numeric_limits::quiet_NaN)(), 0U, 0U}}, + pattern); + EXPECT_FALSE(nonfinite_matrix.HasValue()); + EXPECT_EQ(nonfinite_matrix.GetStatus().Diagnostics().front().code, + "nonfinite-sparse-value"); + + fesa::MklPardisoTangentSolver solver; + ASSERT_TRUE(solver.FactorizeFresh(MakeDenseCsr(2U, {2.0, 1.0, 0.0, 3.0})) + .IsOk()); + auto rhs = MakeVector({4.0, 6.0}); + rhs[1U] = (std::numeric_limits::infinity)(); + fesa::Vector correction = MakeVector({17.0, -4.0}); + + const auto status = solver.SolveCorrection(rhs, correction); + ExpectSolverFailure(status); + EXPECT_EQ(status.Diagnostics().front().code, "nonfinite-solver-rhs"); + EXPECT_DOUBLE_EQ(correction[0U], 17.0); + EXPECT_DOUBLE_EQ(correction[1U], -4.0); +} + +TEST(TangentSolver, ReportsSingularFactorizationDeterministically) { + fesa::MklPardisoTangentSolver solver; + + const auto status = + solver.FactorizeFresh(MakeDenseCsr(2U, {0.0, 0.0, 0.0, 0.0})); + ASSERT_FALSE(status.IsOk()); + ExpectSolverFailure(status); + EXPECT_EQ(status.Diagnostics().front().code, "pardiso-perturbed-pivot"); + EXPECT_EQ(status.Diagnostics().front().entity_identity, "phase=22"); +} + +TEST(TangentSolver, RejectsSolveBeforeSuccessfulFactorization) { + fesa::MklPardisoTangentSolver solver; + fesa::Vector correction = MakeVector({23.0, -9.0}); + + const auto status = + solver.SolveCorrection(MakeVector({1.0, 2.0}), correction); + ExpectSolverFailure(status); + EXPECT_EQ(status.Diagnostics().front().code, "solver-not-factorized"); + EXPECT_DOUBLE_EQ(correction[0U], 23.0); + EXPECT_DOUBLE_EQ(correction[1U], -9.0); +} + +} // namespace