From d35f3b9a977029f337bfcb73f724edb7ad6b32ad Mon Sep 17 00:00:00 2001 From: Christoph Schmidt Date: Tue, 16 Jun 2026 14:27:47 +0200 Subject: [PATCH 1/4] Add safety check to condition definition and minor clean-up. --- .../condition/4C_fem_condition_definition.cpp | 20 ++++++++++++------- .../condition/4C_fem_condition_definition.hpp | 8 ++++---- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/core/fem/src/condition/4C_fem_condition_definition.cpp b/src/core/fem/src/condition/4C_fem_condition_definition.cpp index 1f4accdae78..714debe5fd3 100644 --- a/src/core/fem/src/condition/4C_fem_condition_definition.cpp +++ b/src/core/fem/src/condition/4C_fem_condition_definition.cpp @@ -19,13 +19,12 @@ FOUR_C_NAMESPACE_OPEN -/* -----------------------------------------------------------------------------------------------* - | Class ConditionDefinition | - * -----------------------------------------------------------------------------------------------*/ - +/*----------------------------------------------------------------------* + *----------------------------------------------------------------------*/ Core::Conditions::ConditionDefinition::ConditionDefinition(std::string sectionname, - std::string conditionname, std::string description, Core::Conditions::ConditionType condtype, - bool buildgeometry, Core::Conditions::GeometryType gtype) + std::string conditionname, std::string description, + const Core::Conditions::ConditionType condtype, const bool buildgeometry, + const Core::Conditions::GeometryType gtype) : sectionname_(std::move(sectionname)), conditionname_(std::move(conditionname)), description_(std::move(description)), @@ -67,7 +66,7 @@ void Core::Conditions::ConditionDefinition::add_component(const Core::IO::InputS /*----------------------------------------------------------------------* *----------------------------------------------------------------------*/ void Core::Conditions::ConditionDefinition::read( - Core::IO::InputFile& input, std::vector& condition_specs) const + const Core::IO::InputFile& input, std::vector& condition_specs) const { Core::IO::InputParameterContainer container; try @@ -86,6 +85,13 @@ void Core::Conditions::ConditionDefinition::read( { auto parsed_condition_data = read_condition_data(condition_data); + if (parsed_condition_data.node_set_name.has_value()) + { + FOUR_C_ASSERT_ALWAYS(parsed_condition_data.node_set_name.value().size() <= 32, + "NODE_SET_NAME '{}' exceeds the maximum length of 32 characters.", + parsed_condition_data.node_set_name.value()); + } + condition_specs.emplace_back(parsed_condition_data); } } diff --git a/src/core/fem/src/condition/4C_fem_condition_definition.hpp b/src/core/fem/src/condition/4C_fem_condition_definition.hpp index c8cb73df50e..9181b78d17d 100644 --- a/src/core/fem/src/condition/4C_fem_condition_definition.hpp +++ b/src/core/fem/src/condition/4C_fem_condition_definition.hpp @@ -116,16 +116,16 @@ namespace Core::Conditions \param condition_specs vector of the validated condition specifications in the input to be filled. */ - void read(Core::IO::InputFile& input, std::vector& condition_specs) const; + void read(const Core::IO::InputFile& input, std::vector& condition_specs) const; /// name of my section in input file - std::string section_name() const { return sectionname_; } + [[nodiscard]] std::string section_name() const { return sectionname_; } /// my condition name - std::string name() const { return conditionname_; } + [[nodiscard]] std::string name() const { return conditionname_; } /// my GeometryType - Core::Conditions::GeometryType geometry_type() const { return gtype_; } + [[nodiscard]] Core::Conditions::GeometryType geometry_type() const { return gtype_; } /// Get the InputSpec for this ConditionDefinition [[nodiscard]] Core::IO::InputSpec spec() const; From c629aec477ff55595584af42f8705164098472ae Mon Sep 17 00:00:00 2001 From: Christoph Schmidt Date: Fri, 12 Jun 2026 17:31:20 +0200 Subject: [PATCH 2/4] Adapt battery tutorial --- .../battery/tutorial_battery.4C.yaml | 279 ++++++++++-------- tests/tutorials/battery/tutorial_battery.e | Bin 35328 -> 54900 bytes tests/tutorials/battery/tutorial_battery.jou | 221 +++++++------- 3 files changed, 272 insertions(+), 228 deletions(-) diff --git a/tests/tutorials/battery/tutorial_battery.4C.yaml b/tests/tutorials/battery/tutorial_battery.4C.yaml index 977828503ab..ad846c77765 100644 --- a/tests/tutorials/battery/tutorial_battery.4C.yaml +++ b/tests/tutorials/battery/tutorial_battery.4C.yaml @@ -4,6 +4,7 @@ PROBLEM TYPE: IO: STRUCT_STRESS: "Cauchy" STDOUTEVERY: 0 + ELEMENT_MAT_ID: true IO/RUNTIME VTK OUTPUT: INTERVAL_STEPS: 1 @@ -15,8 +16,8 @@ IO/RUNTIME VTK OUTPUT/STRUCTURE: SSI CONTROL: NUMSTEP: 2 - MAXTIME: 2e+07 - TIMESTEP: 1000 + MAXTIME: 2.0e7 + TIMESTEP: 10.0e3 COUPALGO: ssi_Monolithic SCATRATIMINTTYPE: "Elch" @@ -61,7 +62,7 @@ SCALAR TRANSPORT DYNAMIC/S2I COUPLING: MESHTYING_CONDITIONS_INDEPENDENT_SETUP: true SOLVER 1: - SOLVER: "UMFPACK" + SOLVER: MUMPS MATERIALS: - MAT: 1 @@ -73,6 +74,7 @@ MATERIALS: OCP_MODEL: Function: OCP_FUNCT_NUM: 6 + - MAT: 2 MAT_MultiplicativeSplitDefgradElastHyper: NUMMATEL: 1 @@ -80,10 +82,12 @@ MATERIALS: NUMFACINEL: 1 INELDEFGRADFACIDS: [4] DENS: 4780 + - MAT: 3 ELAST_CoupNeoHooke: YOUNG: 1.8485e+11 NUE: 0.3 + - MAT: 4 MAT_InelasticDefgradPolyIntercalFracIso: SCALAR1: 1 @@ -94,18 +98,21 @@ MATERIALS: X_min: 0.152 X_max: 0.94 MATID: 1 + - MAT: 5 MAT_elchmat: NUMDOF: 2 NUMSCAL: 1 NUMPHASE: 1 PHASEIDS: [6] + - MAT: 6 MAT_elchphase: EPSILON: 1 TORTUOSITY: 1 NUMMAT: 1 MATIDS: [7] + - MAT: 7 MAT_newman: VALENCE: 1 @@ -113,6 +120,7 @@ MATERIALS: COND: 16.11 TRANSFERENCE_NR: 1.0 THERM_FAC: 1.0 + - MAT: 8 MAT_MultiplicativeSplitDefgradElastHyper: NUMMATEL: 1 @@ -120,12 +128,15 @@ MATERIALS: NUMFACINEL: 1 INELDEFGRADFACIDS: [10] DENS: 1850 + - MAT: 9 ELAST_CoupNeoHooke: YOUNG: 2.601e+10 NUE: 0.27 + - MAT: 10 MAT_InelasticDefgradNoGrowth: {} + - MAT: 11 MAT_electrode: DIFF_COEF: 1.0 @@ -135,6 +146,7 @@ MATERIALS: OCP_MODEL: Function: OCP_FUNCT_NUM: 7 + - MAT: 12 MAT_MultiplicativeSplitDefgradElastHyper: NUMMATEL: 1 @@ -142,16 +154,19 @@ MATERIALS: NUMFACINEL: 1 INELDEFGRADFACIDS: [14] DENS: 530 + - MAT: 13 ELAST_CoupNeoHooke: YOUNG: 4.9e+09 NUE: 0.42 + - MAT: 14 MAT_InelasticDefgradLinScalarAniso: SCALAR1: 1 SCALAR1_MolarGrowthFac: 1.2998e-05 SCALAR1_RefConc: 1 GrowthDirection: [1, 0, 0] + - MAT: 15 MAT_electrode: DIFF_COEF: 1.0 @@ -161,6 +176,7 @@ MATERIALS: OCP_MODEL: Function: OCP_FUNCT_NUM: 7 + - MAT: 16 MAT_MultiplicativeSplitDefgradElastHyper: NUMMATEL: 1 @@ -168,10 +184,12 @@ MATERIALS: NUMFACINEL: 1 INELDEFGRADFACIDS: [10] DENS: 8920 + - MAT: 17 ELAST_CoupNeoHooke: YOUNG: 1.15e+11 NUE: 0.34 + - MAT: 19 MAT_electrode: DIFF_COEF: 1.0 @@ -181,6 +199,7 @@ MATERIALS: OCP_MODEL: Function: OCP_FUNCT_NUM: 7 + - MAT: 20 MAT_MultiplicativeSplitDefgradElastHyper: NUMMATEL: 1 @@ -188,6 +207,7 @@ MATERIALS: NUMFACINEL: 1 INELDEFGRADFACIDS: [10] DENS: 2700 + - MAT: 21 ELAST_CoupNeoHooke: YOUNG: 6.9e+10 @@ -198,18 +218,22 @@ CLONING MATERIAL MAP: SRC_MAT: 2 TAR_FIELD: "scatra" TAR_MAT: 1 + - SRC_FIELD: "structure" SRC_MAT: 8 TAR_FIELD: "scatra" TAR_MAT: 5 + - SRC_FIELD: "structure" SRC_MAT: 12 TAR_FIELD: "scatra" TAR_MAT: 11 + - SRC_FIELD: "structure" SRC_MAT: 16 TAR_FIELD: "scatra" TAR_MAT: 15 + - SRC_FIELD: "structure" SRC_MAT: 20 TAR_FIELD: "scatra" @@ -253,198 +277,206 @@ FUNCT6: FUNCT7: - FASTPOLYNOMIAL: NUMCOEFF: 1 - COEFF: [0] + COEFF: [0.0] RESULT DESCRIPTION: - SCATRA: DIS: "scatra" NODE: 32 QUANTITY: "phi1" - VALUE: 1.26777850815654229e+01 - TOLERANCE: 1.3e-07 + VALUE: 1.17729179835590955e+02 + TOLERANCE: 1.2e-06 - SCATRA: DIS: "scatra" NODE: 32 QUANTITY: "phi2" - VALUE: 5.63408408249148287e-06 + VALUE: 5.63420877183655170e-06 TOLERANCE: 5.6e-14 - SCATRA: DIS: "scatra" NODE: 95 QUANTITY: "phi1" - VALUE: 1.2e3 + VALUE: 1.20023216963911113e+03 TOLERANCE: 1.2e-05 - SCATRA: DIS: "scatra" NODE: 95 QUANTITY: "phi2" - VALUE: 1.93918473648069017e-04 - TOLERANCE: 1.9e-12 + VALUE: 2.02652764799278619e-04 + TOLERANCE: 2.0e-12 - SCATRA: DIS: "scatra" NODE: 232 QUANTITY: "phi1" - VALUE: 4.18389051248949399e+04 - TOLERANCE: 4.2e-4 + VALUE: 4.31876698510277783e+04 + TOLERANCE: 4.3e-4 - SCATRA: DIS: "scatra" NODE: 232 QUANTITY: "phi2" - VALUE: 3.60022131383473765e+00 + VALUE: 3.60019943891482708e+00 TOLERANCE: 3.6e-08 - STRUCTURE: DIS: "structure" NODE: 32 QUANTITY: "dispx" - VALUE: -6.66773032761887734e-08 - TOLERANCE: 6.7e-15 + VALUE: 8.44280151667777646e-08 + TOLERANCE: 8.4e-16 - STRUCTURE: DIS: "structure" NODE: 32 QUANTITY: "dispy" - VALUE: -2.07081933892450716e-10 - TOLERANCE: 1.0e-16 + VALUE: -8.44280151749625117e-08 + TOLERANCE: 8.4e-16 - STRUCTURE: DIS: "structure" NODE: 32 QUANTITY: "dispz" - VALUE: 2.07081926671139049e-10 - TOLERANCE: 1.0e-16 + VALUE: -9.67592544354235016e-08 + TOLERANCE: 9.7e-16 - STRUCTURE: DIS: "structure" NODE: 95 QUANTITY: "dispx" - VALUE: -2.46786207653848376e-08 - TOLERANCE: 2.5e-16 + VALUE: 2.07719538778803939e-09 + TOLERANCE: 1.0e-16 - STRUCTURE: DIS: "structure" NODE: 95 QUANTITY: "dispy" - VALUE: 5.06484398044960120e-09 + VALUE: -8.12085065370041722e-09 TOLERANCE: 1.0e-16 - STRUCTURE: DIS: "structure" NODE: 95 QUANTITY: "dispz" - VALUE: -5.06484397125480544e-09 - TOLERANCE: 1.0e-16 + VALUE: -1.76358836650572382e-08 + TOLERANCE: 1.8e-16 - STRUCTURE: DIS: "structure" NODE: 232 QUANTITY: "dispx" - VALUE: -1.92532124495455729e-08 - TOLERANCE: 2.0e-16 + VALUE: 3.14013986975288425e-09 + TOLERANCE: 1.0e-16 - STRUCTURE: DIS: "structure" NODE: 232 QUANTITY: "dispz" - VALUE: 3.77494081961681657e-08 - TOLERANCE: 3.8e-16 + VALUE: -7.04564778319423031e-08 + TOLERANCE: 7.0e-16 PROBLEM SIZE: DIM: 3 DESIGN SURF TRANSPORT NEUMANN CONDITIONS: - - E: 12 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: surface_normal_z_cat_cc NUMDOF: 2 ONOFF: [0, 1] VAL: [0, 5.839316572e-06] - FUNCT: [0, 0] + FUNCT: [null, null] DESIGN POINT DIRICH CONDITIONS: - - E: 23 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: vertices_an_side_cc NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 24 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: vertices_cat_side_cc NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] DESIGN LINE DIRICH CONDITIONS: - - E: 16 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: curves_y_dir_an_cc NUMDOF: 3 ONOFF: [1, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 17 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: curves_x_dir_an_cc NUMDOF: 3 - ONOFF: [1, 1, 0] + ONOFF: [0, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 18 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: curves_(-1_1_0)_dir_an_cc NUMDOF: 3 - ONOFF: [1, 1, 0] + ONOFF: [1, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 19 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: curves_y_dir_cat_cc + NUMDOF: 3 + ONOFF: [1, 0, 1] + VAL: [0, 0, 0] + FUNCT: [null, null, null] + + - NODE_SET_NAME: curves_x_dir_cat_cc NUMDOF: 3 ONOFF: [0, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] + - NODE_SET_NAME: curves_(-1_1_0)_dir_cat_cc + NUMDOF: 3 + ONOFF: [1, 0, 1] + VAL: [0, 0, 0] + FUNCT: [null, null, null] + + - NODE_SET_NAME: curves_z_dir + NUMDOF: 3 + ONOFF: [1, 1, 0] + VAL: [0, 0, 0] + FUNCT: [null, null, null] + DESIGN SURF DIRICH CONDITIONS: - - E: 1 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: surface_normal_z_an_cc NUMDOF: 3 - ONOFF: [1, 0, 0] + ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 12 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: surface_normal_z_cat_cc NUMDOF: 3 - ONOFF: [1, 0, 0] + ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 13 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: surface_normal_y NUMDOF: 3 ONOFF: [0, 1, 0] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 14 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: surface_normal_x NUMDOF: 3 - ONOFF: [0, 0, 1] + ONOFF: [1, 0, 0] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 15 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: surface_normal_(1_1_0) NUMDOF: 3 ONOFF: [0, 1, 0] VAL: [0, 0, 0] FUNCT: [null, null, null] DESIGN SURF TRANSPORT DIRICH CONDITIONS: - - E: 1 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: surface_normal_z_an_cc NUMDOF: 2 ONOFF: [0, 1] VAL: [0, 0] FUNCT: [0, 0] DESIGN VOL TRANSPORT DIRICH CONDITIONS: - - E: 2 - ENTITY_TYPE: element_block_id - NUMDOF: 2 - ONOFF: [1, 0] - VAL: [1200, 0] - FUNCT: [0, 0] - E: 4 ENTITY_TYPE: element_block_id NUMDOF: 2 ONOFF: [1, 0] VAL: [1200, 0] FUNCT: [0, 0] + - E: 5 ENTITY_TYPE: element_block_id NUMDOF: 2 @@ -457,42 +489,49 @@ DESIGN VOL INITIAL FIELD CONDITIONS: ENTITY_TYPE: element_block_id FIELD: "ScaTra" FUNCT: 1 + - E: 2 ENTITY_TYPE: element_block_id FIELD: "ScaTra" FUNCT: 2 + - E: 3 ENTITY_TYPE: element_block_id FIELD: "ScaTra" FUNCT: 3 + - E: 4 ENTITY_TYPE: element_block_id FIELD: "ScaTra" FUNCT: 4 + - E: 5 ENTITY_TYPE: element_block_id FIELD: "ScaTra" FUNCT: 5 DESIGN LINE LOCSYS CONDITIONS: - - E: 18 - ENTITY_TYPE: node_set_id - ROTANGLE: [0.7853981634, 0, 0] + - NODE_SET_NAME: curves_(-1_1_0)_dir_cat_cc + ROTANGLE: [0, 0, -0.7853981634] + FUNCT: [0, 0, 0] + USEUPDATEDNODEPOS: 0 + USECONSISTENTNODENORMAL: 0 + + - NODE_SET_NAME: curves_(-1_1_0)_dir_an_cc + ROTANGLE: [0, 0, -0.7853981634] FUNCT: [0, 0, 0] USEUPDATEDNODEPOS: 0 USECONSISTENTNODENORMAL: 0 DESIGN SURF LOCSYS CONDITIONS: - - E: 15 - ENTITY_TYPE: node_set_id - ROTANGLE: [0.7853981634, 0, 0] + - NODE_SET_NAME: surface_normal_(1_1_0) + ROTANGLE: [0, 0, -0.7853981634] FUNCT: [0, 0, 0] USEUPDATEDNODEPOS: 0 USECONSISTENTNODENORMAL: 0 DESIGN S2I KINETICS SURF CONDITIONS: - - E: 2 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cc_side(s)_an-cc_interface ConditionID: 0 INTERFACE_SIDE: "Slave" KINETIC_MODEL: "ConstantInterfaceResistance" @@ -500,12 +539,12 @@ DESIGN S2I KINETICS SURF CONDITIONS: RESISTANCE: 1e-05 E-: 1 IS_PSEUDO_CONTACT: false - - E: 3 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: an_side(t)_an-cc_interface ConditionID: 0 INTERFACE_SIDE: "Master" - - E: 4 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: an_side(s)_an-el_interface ConditionID: 1 INTERFACE_SIDE: "Slave" KINETIC_MODEL: "Butler-VolmerReduced" @@ -516,16 +555,16 @@ DESIGN S2I KINETICS SURF CONDITIONS: ALPHA_A: 0.5 ALPHA_C: 0.5 IS_PSEUDO_CONTACT: false - - E: 5 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_an-el_interface ConditionID: 1 INTERFACE_SIDE: "Master" - - E: 6 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_cat-el_interface ConditionID: 2 INTERFACE_SIDE: "Master" - - E: 7 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cat_side(s)_cat-el_interface ConditionID: 2 INTERFACE_SIDE: "Slave" KINETIC_MODEL: "Butler-Volmer" @@ -536,12 +575,12 @@ DESIGN S2I KINETICS SURF CONDITIONS: ALPHA_A: 0.5 ALPHA_C: 0.5 IS_PSEUDO_CONTACT: false - - E: 8 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cat_side(t)_cat-cc_interface ConditionID: 3 INTERFACE_SIDE: "Master" - - E: 9 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cc_side(s)_am_cat-cc_interface ConditionID: 3 INTERFACE_SIDE: "Slave" KINETIC_MODEL: "ConstantInterfaceResistance" @@ -549,12 +588,12 @@ DESIGN S2I KINETICS SURF CONDITIONS: RESISTANCE: 1e-05 E-: 1 IS_PSEUDO_CONTACT: false - - E: 10 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_el_cat-cc_interface ConditionID: 4 INTERFACE_SIDE: "Master" - - E: 11 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cc_side(s)_el_cat-cc_interface ConditionID: 4 INTERFACE_SIDE: "Slave" KINETIC_MODEL: "NoInterfaceFlux" @@ -568,61 +607,59 @@ DESIGN ELECTRODE STATE OF CHARGE VOL CONDITIONS: ONE_HOUR: 3.6e+06 DESIGN CELL VOLTAGE SURF CONDITIONS: - - E: 1 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: surface_normal_z_an_cc ConditionID: 0 - - E: 12 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: surface_normal_z_cat_cc ConditionID: 1 DESIGN SSI INTERFACE MESHTYING SURF CONDITIONS: - - E: 2 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cc_side(s)_an-cc_interface ConditionID: 0 INTERFACE_SIDE: "Slave" S2I_KINETICS_ID: 0 - - E: 3 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: an_side(t)_an-cc_interface ConditionID: 0 INTERFACE_SIDE: "Master" S2I_KINETICS_ID: 0 - - E: 4 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: an_side(s)_an-el_interface ConditionID: 1 INTERFACE_SIDE: "Slave" S2I_KINETICS_ID: 1 - - E: 5 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_an-el_interface ConditionID: 1 INTERFACE_SIDE: "Master" S2I_KINETICS_ID: 1 - - E: 6 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_cat-el_interface ConditionID: 2 INTERFACE_SIDE: "Master" S2I_KINETICS_ID: 2 - - E: 7 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cat_side(s)_cat-el_interface ConditionID: 2 INTERFACE_SIDE: "Slave" S2I_KINETICS_ID: 2 - - E: 8 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cat_side(t)_cat-cc_interface ConditionID: 3 INTERFACE_SIDE: "Master" S2I_KINETICS_ID: 3 - - E: 9 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cc_side(s)_am_cat-cc_interface ConditionID: 3 INTERFACE_SIDE: "Slave" S2I_KINETICS_ID: 3 - - E: 10 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: el_side(t)_el_cat-cc_interface ConditionID: 4 INTERFACE_SIDE: "Master" S2I_KINETICS_ID: 4 - - E: 11 - ENTITY_TYPE: node_set_id + + - NODE_SET_NAME: cc_side(s)_el_cat-cc_interface ConditionID: 4 INTERFACE_SIDE: "Slave" S2I_KINETICS_ID: 4 @@ -631,31 +668,31 @@ STRUCTURE GEOMETRY: FILE: "tutorial_battery.e" SHOW_INFO: "summary" ELEMENT_BLOCKS: - - ID: 1 + - NAME: anode SOLIDSCATRA: TET4: MAT: 12 KINEM: nonlinear TYPE: ElchElectrode - - ID: 2 + - NAME: electrolyte SOLIDSCATRA: TET4: MAT: 8 KINEM: nonlinear TYPE: ElchDiffCond - - ID: 3 + - NAME: cathode SOLIDSCATRA: TET4: MAT: 2 KINEM: nonlinear TYPE: ElchElectrode - - ID: 4 + - NAME: anode_cc SOLIDSCATRA: TET4: MAT: 16 KINEM: nonlinear TYPE: ElchElectrode - - ID: 5 + - NAME: cathode_cc SOLIDSCATRA: TET4: MAT: 20 diff --git a/tests/tutorials/battery/tutorial_battery.e b/tests/tutorials/battery/tutorial_battery.e index c97c207f0d5e7371ca45c59e568e9dd54e790f6d..ee9557788965a396f1afebc07b068788cf6b2e56 100644 GIT binary patch literal 54900 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 diff --git a/tests/tutorials/battery/tutorial_battery.jou b/tests/tutorials/battery/tutorial_battery.jou index 88c326dcf07..b493c33e3aa 100644 --- a/tests/tutorials/battery/tutorial_battery.jou +++ b/tests/tutorials/battery/tutorial_battery.jou @@ -32,15 +32,15 @@ $ -------------------------- $ | geometry | $ -------------------------- $ anode -create brick x {an} y {2*r*cos(theta/360*PI)} z {2*r*cos(theta/360*PI)} +create brick x {2*r*cos(theta/360*PI)} y {2*r*cos(theta/360*PI)} z {an} compress -move volume 1 x {an/2 + (2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} +move volume 1 z {an/2 + (2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} compress $ electrolyte -create brick x {(n_c-1)*2*r*cos(theta/360*PI)+2*r+sep} y {2*r*cos(theta/360*PI)} z {2*r*cos(theta/360*PI)} +create brick x {2*r*cos(theta/360*PI)} y {2*r*cos(theta/360*PI)} z {(n_c-1)*2*r*cos(theta/360*PI)+2*r+sep} compress -move volume 2 x {(n_c-2)*r*cos(theta/360*PI)+r+sep/2} +move volume 2 z {(n_c-2)*r*cos(theta/360*PI)+r+sep/2} compress $ cathode @@ -48,7 +48,7 @@ $ cathode # {Loop(n_c)} create sphere radius {r} # {if(i>0)} - move volume 4 x {i*2*r*cos(theta/360*PI)} + move volume 4 z {i*2*r*cos(theta/360*PI)} unite volume 3 4 compress # {endif} @@ -58,21 +58,21 @@ compress $ insert one non-connected sphere create sphere radius {r_non_conn} -move volume 4 x {-r*cos(theta/360*PI)} y {-r*cos(theta/360*PI)} z {r*cos(theta/360*PI)} +move volume 4 x {r*cos(theta/360*PI)} y {-r*cos(theta/360*PI)} z {-r*cos(theta/360*PI)} intersect volume 2 4 keep subtract volume 4 from volume 2 volume 5 id 4 $ anode current collector -create brick x {cc_an} y {2*r*cos(theta/360*PI)} z {2*r*cos(theta/360*PI)} +create brick x {2*r*cos(theta/360*PI)} y {2*r*cos(theta/360*PI)} z {cc_an} compress -move volume 5 x {cc_an/2 + an + (2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} +move volume 5 z {cc_an/2 + an + (2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} compress $ cathode current collector -create brick x {cc_cat} y {2*r*cos(theta/360*PI)} z {2*r*cos(theta/360*PI)} +create brick x {2*r*cos(theta/360*PI)} y {2*r*cos(theta/360*PI)} z {cc_cat} compress -move volume 6 x {-cc_cat/2-r*cos(theta/360*PI)} +move volume 6 z {-cc_cat/2-r*cos(theta/360*PI)} $ trim the connected cathode spheres to the box size and cut those spheres from the electrolyte intersect volume 2 3 keep @@ -81,14 +81,14 @@ volume 7 id 3 compress $ cut out symmetric cuboid -webcut volume all with plane zplane imprint +webcut volume all with plane xplane imprint delete volume 7 8 9 10 11 compress webcut volume all with plane yplane imprint delete volume 7 8 9 10 11 compress $ cut out symmetric wedge -webcut volume all with plane yplane rotate 45 about x imprint +webcut volume all with plane yplane rotate -45 about z imprint delete volume 7 8 9 10 11 12 compress @@ -109,25 +109,23 @@ set tetmesher optimize level 3 overconstrained off sliver off set tetmesher boundary recovery off volume 1 size {meshsize_a*r} # {if(interfacemeshsize_a>0.0)} - surface with x_max = {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} in volume 1 size {interfacemeshsize_a} + surface with z_max = {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} in volume 1 size {interfacemeshsize_a} # {endif} volume 2 size {meshsize_e*r} volume 3 size {meshsize_c*r} # {if(interfacemeshsize_c>0.0)} - surface with not is_plane in volume 3 size {interfacemeshsize_c} -# {endif} -# {if(contactcurveintervals_e>0 && (matching!=1 || (interfacemeshsize_a==0.0 && interfacemeshsize_c==0.0)))} - curve with length <= {2*PI*r*sin(theta/360*PI)} and with Y_Min == Y_Max in volume 2 interval {contactcurveintervals_e} + surface with not is_plane in volume 3 size {interfacemeshsize_c*r} + surface with not is_plane in volume 4 size {interfacemeshsize_c*r} # {endif} # {if(particlediameterintervals_c>0)} curve with Y_Min == 0 and Y_Max == 0 in volume 3 interval {n_c*particlediameterintervals_c} scheme equal # {endif} volume 4 size {meshsize_cat_non*r} -volume 5 size {meshsize_cc_an} -volume 6 size {meshsize_cc_cat} +volume 5 size {meshsize_cc_an*r} +volume 6 size {meshsize_cc_cat*r} mesh volume all # {if(meshrefinements_a>0)} - refine surface with x_max = {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} in volume 1 numsplit {meshrefinements_a} bias 1.0 depth 1 smooth + refine surface with z_max = {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep} in volume 1 numsplit {meshrefinements_a} bias 1.0 depth 1 smooth # {endif} # {if(meshrefinements_c>0)} refine surface with not is_plane in volume 3 numsplit {meshrefinements_c} bias 1.0 depth 1 smooth @@ -156,130 +154,139 @@ block 3 Name "cathode" # anode side current collector block 4 volume 5 -block 4 Name "anode cc" +block 4 Name "anode_cc" # cathode side current collector block 5 volume 6 -block 5 Name "cathode cc" +block 5 Name "cathode_cc" # anode-side current collector -nodeset 1 surface with x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol} in volume 5 -nodeset 1 Name "an-side cc" +nodeset 1 surface with z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol} in volume 5 +nodeset 1 Name "surface_normal_z_an_cc" # current collector-side of anode-current collector interface -nodeset 2 surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 -nodeset 2 Name "cc-side (sl) of an-cc interface" +nodeset 2 surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 +nodeset 2 Name "cc_side(s)_an-cc_interface" # anode-side of anode-current collector interface -nodeset 3 surface with x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an-tol} in volume 1 -nodeset 3 Name "an-side (ma) of an-cc interface" +nodeset 3 surface with z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an-tol} in volume 1 +nodeset 3 Name "an_side(t)_an-cc_interface" # anode-side of anode-electrolyte interface -nodeset 4 surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 -nodeset 4 Name "an-side (sl) of an-el interface" +nodeset 4 surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 +nodeset 4 Name "an_side(s)_an-el_interface" # electrolyte-side of anode-electrolyte interface -nodeset 5 surface with x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep-tol} in volume 2 -nodeset 5 Name "el-side (ma) of an-el interface" +nodeset 5 surface with z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep-tol} in volume 2 +nodeset 5 Name "el_side(t)_an-el_interface" # electrolyte-side of cathode-electrolyte interface nodeset 6 surface with not is_plane in volume 2 -nodeset 6 Name "el-side (ma) of cat-el interface" +nodeset 6 Name "el_side(t)_cat-el_interface" # cathode-side of cathode-electrolyte interface nodeset 7 surface with not is_plane in volume 3 4 -#nodeset 7 Name "cat-side (sl) of cat-el interface" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names +nodeset 7 Name "cat_side(s)_cat-el_interface" # cathode-side of composite cathode-current collector interface -nodeset 8 surface with x_max <= {-r*cos(theta/360*PI) + tol} in volume 3 4 -#nodeset 8 Name "cat-side (ma) of cat-cc interface" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names +nodeset 8 surface with z_max <= {-r*cos(theta/360*PI) + tol} in volume 3 4 +nodeset 8 Name "cat_side(t)_cat-cc_interface" # current collector-side of cathode part composite cathode-current collector interface -nodeset 9 surface with x_min >= {-r*cos(theta/360*PI) - tol} and z_max <= {0.5*r*cos(theta/360*PI)} in volume 6 -nodeset 9 surface with x_min >= {-r*cos(theta/360*PI) - tol} and z_min >= {0.5*r*cos(theta/360*PI)} in volume 6 -#nodeset 9 Name "cc-side (sl) of cat-comp_cat-cc interface" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names +nodeset 9 surface with z_min >= {-r*cos(theta/360*PI) - tol} and x_max <= {r*sin(theta/360*PI)*cos(45/180*PI)+tol} in volume 6 +nodeset 9 surface with z_min >= {-r*cos(theta/360*PI) - tol} and x_min >= {r*cos(theta/360*PI)-r_non_conn-tol} in volume 6 +nodeset 9 Name "cc_side(s)_am_cat-cc_interface" # solid electrolyte-side of composite cathode-current collector interface -nodeset 10 surface with x_max <= {-r*cos(theta/360*PI) + tol} in volume 2 -#nodeset 10 Name "sol-el-side (ma) of comp_cat-cc interface" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names +nodeset 10 surface with z_max <= {-r*cos(theta/360*PI) + tol} in volume 2 +nodeset 10 Name "el_side(t)_el_cat-cc_interface" # current collector-side of cathode part composite cathode-current collector interface -nodeset 11 surface with x_min >= {-r*cos(theta/360*PI) - tol} and z_min <= {0.5*r*cos(theta/360*PI)} and z_max >= {0.5*r*cos(theta/360*PI)} in volume 6 -#nodeset 11 Name "cc-side (sl) of sol-el-comp_cat-cc interface" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names +nodeset 11 surface with z_min >= {-r*cos(theta/360*PI) - tol} and x_min == {0.0} and x_max >= {r*sin(theta/360*PI)*sin(45/180*PI) + tol} in volume 6 +nodeset 11 Name "cc_side(s)_el_cat-cc_interface" # cathode-side current collector -nodeset 12 surface with x_max <= {-r*cos(theta/360*PI)-cc_cat} in volume 6 -nodeset 12 Name "cat-side cc" +nodeset 12 surface with z_max <= {-r*cos(theta/360*PI)-cc_cat+tol} in volume 6 +nodeset 12 Name "surface_normal_z_cat_cc" # battery surface normal to y axis # add all surfaces that are normal to the y axis -nodeset 13 surface with y_max <= {-r*cos(theta/360*PI)} in volume all -# remove lines of cathode and anode as they are the slave side nodes -> no DBC can be prescribed here +nodeset 13 surface with y_max <= {-r*cos(theta/360*PI)+tol} in volume all +# remove lines of cathode and anode as they are the source side nodes -> no DBC can be prescribed here nodeset 13 node in surface with not is_plane in volume 3 4 remove -nodeset 13 node in surface with x_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove -nodeset 13 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove -nodeset 13 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove -nodeset 13 Name "battery surface normal to y" - -# battery surface normal to z axis -# add all surfaces that are normal to the z axis -nodeset 14 surface with z_max <= {0.0} in volume all -# remove lines of cathode and anode as they are the slave side nodes -> no DBC can be prescribed here +nodeset 13 node in surface with z_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove +nodeset 13 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove +nodeset 13 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove +nodeset 13 Name "surface_normal_y" + +# battery surface normal to x axis +# add all surfaces that are normal to the x axis +nodeset 14 surface with x_max <= {tol} in volume all +# remove lines of cathode and anode as they are the source side nodes -> no DBC can be prescribed here nodeset 14 node in surface with not is_plane in volume 3 4 remove -nodeset 14 node in surface with x_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove -nodeset 14 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove -nodeset 14 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove -nodeset 14 Name "battery surface normal to z" - -# battery surface which normal vector is (0 1 1) -# add surfaces that are normal to (0 1 1) - vector of volume 1 -nodeset 15 surface with ((x_max - x_min > {an-tol} ) && (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) && (z_max - z_min > {0.7071*r*cos(theta/360*PI)} )) in volume 1 -# add surfaces that are normal to (0 1 1) - vector of volume 2 & 3 -nodeset 15 surface with ((x_max - x_min > {r+(2*n_c - 1)*r*cos(theta/360*PI) - tol} ) && (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) && (z_max - z_min > {0.7071*r*cos(theta/360*PI)} ) && is_plane ) in volume 2 & 3 -# add surfaces that are normal to (0 1 1) - vector of volume 4 -nodeset 15 surface with (x_max - x_min > {r_non_conn - tol} ) && y_max > {-r*cos(theta/360*PI) + tol} && is_plane in volume 4 -# add surfaces that are normal to (0 1 1) - vector of volume 5 -nodeset 15 surface with ((x_max - x_min > {cc_an-tol} ) && (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) && (z_max - z_min > {0.7071*r*cos(theta/360*PI)} )) in volume 5 -# add surfaces that are normal to (0 1 1) - vector of volume 6 -nodeset 15 surface with ((x_max - x_min > {cc_cat-tol} ) && (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) && (z_max - z_min > {0.7071*r*cos(theta/360*PI)} )) in volume 6 -# remove lines of cathode and anode as they are the slave side nodes -> no DBC can be prescribed here -nodeset 15 node in surface with not is_plane in volume 3 4 remove -nodeset 15 node in surface with x_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove -nodeset 15 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove -nodeset 15 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove -#nodeset 15 Name "battery surface normal to (0 1 1) vector" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names - -# lines in y-direction that need a DBC -nodeset 16 curve with (((x_max - x_min) < {tol}) && ((z_max - z_min) < {tol}) && (x_max <= {-r*cos(theta/360*PI)-cc_cat})) in volume 6 -nodeset 16 curve with (((x_max - x_min) < {tol}) && ((z_max - z_min) < {tol}) && (x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 -nodeset 16 Name "battery curves in y-direction" - -# lines in z-direction that need a DBC -nodeset 17 curve with (((x_max - x_min) < {tol}) && ((y_max - y_min) < {tol}) && (x_max <= {-r*cos(theta/360*PI)-cc_cat})) in volume 6 -nodeset 17 curve with (((x_max - x_min) < {tol}) && ((y_max - y_min) < {tol}) && (x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 -nodeset 17 Name "battery curves in z-direction" - -# all lines in (0 1 -1) direction that need a DBC -nodeset 18 curve with ((y_max - y_min) > {tol} && (z_max - z_min) > {tol} && (x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 -nodeset 18 curve with ((y_max - y_min) > {tol} && (z_max - z_min) > {tol} && (x_max <= {-r*cos(theta/360*PI)-cc_cat})) in volume 6 -#nodeset 18 Name "battery curves in (0 1 -1)-direction" #commented since string is too long for the tutorial-framework, yet it is good to have descriptive names - -# all lines at the battery edges in x-direction -nodeset 19 curve with ((y_max == y_min) && (z_max == z_min)) in volume all -# remove slave side nodes -nodeset 19 node in surface with not is_plane in volume 3 4 remove -nodeset 19 node in surface with x_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove -nodeset 19 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove -nodeset 19 node in surface with x_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove -nodeset 19 Name "battery curves in x-direction" +nodeset 14 node in surface with z_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove +nodeset 14 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove +nodeset 14 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove +nodeset 14 Name "surface_normal_x" + +# lines in y-direction at cathode-side current collector +nodeset 15 curve with (((z_max - z_min) < {tol}) and ((x_max - x_min) < {tol}) and (z_max <= {-r*cos(theta/360*PI)-cc_cat+tol})) in volume 6 +nodeset 15 Name "curves_y_dir_cat_cc" + +# lines in x-direction at cathode-side current collector +nodeset 16 curve with (((z_max - z_min) < {tol}) and ((y_max - y_min) < {tol}) and (z_max <= {-r*cos(theta/360*PI)-cc_cat+tol})) in volume 6 +nodeset 16 Name "curves_x_dir_cat_cc" + +# all lines at the battery edges in z-direction +nodeset 17 curve with (((x_max - x_min) < {tol}) and ((y_max - y_min) < {tol})) in volume all +# remove source side nodes +nodeset 17 node in surface with not is_plane in volume 3 4 remove +nodeset 17 node in surface with z_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove +nodeset 17 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove +nodeset 17 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove +nodeset 17 Name "curves_z_dir" + +# lines in y-direction at anode-side current collector +nodeset 18 curve with (((z_max - z_min) < {tol}) and ((x_max - x_min) < {tol}) and (z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 +nodeset 18 Name "curves_y_dir_an_cc" + +# lines in x-direction at anode-side current collector +nodeset 19 curve with (((z_max - z_min) < {tol}) and ((y_max - y_min) < {tol}) and (z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 +nodeset 19 Name "curves_x_dir_an_cc" # all vertices at anode-side current collector -nodeset 23 vertex in surface with x_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol} in volume 5 -nodeset 23 Name "vertices an-side cc +nodeset 20 vertex in surface with z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol} in volume 5 +nodeset 20 Name "vertices_an_side_cc" # all vertices at the cathode-side current collector -nodeset 24 vertex in surface with x_max <= {-r*cos(theta/360*PI)-cc_cat} in volume 6 -nodeset 24 Name "vertices cat-side cc" +nodeset 21 vertex in surface with z_max <= {-r*cos(theta/360*PI)-cc_cat+tol} in volume 6 +nodeset 21 Name "vertices_cat_side_cc" + +# battery surface which normal vector is (1 1 0) +# add surfaces that are normal to (1 1 0) - vector of volume 1 +nodeset 22 surface with ((z_max - z_min > {an-tol} ) and (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) and (x_max - x_min > {0.7071*r*cos(theta/360*PI)} )) in volume 1 +# add surfaces that are normal to (1 1 0) - vector of volume 2 & 3 +nodeset 22 surface with ((z_max - z_min > {r+(2*n_c - 1)*r*cos(theta/360*PI) - tol} ) and (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) and (x_max - x_min > {0.7071*r*cos(theta/360*PI)} ) and is_plane ) in volume 2 3 +# add surfaces that are normal to (1 1 0) - vector of volume 4 +nodeset 22 surface with (z_max - z_min > {r_non_conn - tol} ) and y_max > {-r*cos(theta/360*PI) + tol} and is_plane in volume 4 +# add surfaces that are normal to (1 1 0) - vector of volume 5 +nodeset 22 surface with ((z_max - z_min > {cc_an-tol} ) and (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) and (x_max - x_min > {0.7071*r*cos(theta/360*PI)} )) in volume 5 +# add surfaces that are normal to (1 1 0) - vector of volume 6 +nodeset 22 surface with ((z_max - z_min > {cc_cat-tol} ) and (y_max - y_min > {0.7071*r*cos(theta/360*PI)} ) and (x_max - x_min > {0.7071*r*cos(theta/360*PI)} )) in volume 6 +# remove lines of cathode and anode as they are the source side nodes -> no DBC can be prescribed here +nodeset 22 node in surface with not is_plane in volume 3 4 remove +nodeset 22 node in surface with z_min >= {-r*cos(theta/360*PI)-tol} in volume 6 remove +nodeset 22 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+tol} in volume 5 remove +nodeset 22 node in surface with z_max <= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+tol} in volume 1 remove +nodeset 22 Name "surface_normal_(1_1_0)" + +# lines in (-1 1 0) direction at cathode-side current collector +nodeset 23 curve with ((y_max - y_min) > {tol} and (x_max - x_min) > {tol} and (z_max <= {-r*cos(theta/360*PI)-cc_cat+tol})) in volume 6 +nodeset 23 Name "curves_(-1_1_0)_dir_cat_cc" + +# lines in (-1 1 0) direction at anode-side current collector +nodeset 24 curve with ((y_max - y_min) > {tol} and (x_max - x_min) > {tol} and (z_min >= {(2*n_c-3)*r*cos(theta/360*PI)+2*r+sep+an+cc_an-tol})) in volume 5 +nodeset 24 Name "curves_(-1_1_0)_dir_an_cc" $ -------------------------- $ | scaling | @@ -289,5 +296,5 @@ volume all scale {scaling} $ -------------------------- $ | export | $ -------------------------- -export genesis "tutorial_battery.e" block all dimension 3 overwrite +export mesh "tutorial_battery.e" dimension 3 overwrite exit From 39105052cfd1c5e50b5aec89ebe5eaf808262ecc Mon Sep 17 00:00:00 2001 From: Christoph Schmidt Date: Tue, 16 Jun 2026 16:56:17 +0200 Subject: [PATCH 3/4] Adapt fsi 2D tutorial --- tests/tutorials/fsi/tutorial_fsi_2d.4C.yaml | 42 +++++++------------- tests/tutorials/fsi/tutorial_fsi_2d.e | Bin 60712 -> 65012 bytes tests/tutorials/fsi/tutorial_fsi_2d.jou | 28 ++++++------- 3 files changed, 28 insertions(+), 42 deletions(-) diff --git a/tests/tutorials/fsi/tutorial_fsi_2d.4C.yaml b/tests/tutorials/fsi/tutorial_fsi_2d.4C.yaml index 8eaca9db877..74dde5e62a0 100644 --- a/tests/tutorials/fsi/tutorial_fsi_2d.4C.yaml +++ b/tests/tutorials/fsi/tutorial_fsi_2d.4C.yaml @@ -142,85 +142,71 @@ FLUID GEOMETRY: NA: ALE DESIGN POINT DIRICH CONDITIONS: - - E: 3 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_vertices NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] - - E: 4 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_fsi_vertices NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] - - E: 10 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_vertices_top NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [1, 0, 0] FUNCT: [1, 0, 0] - - E: 11 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_vertices NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [0, 0, 0] FUNCT: [0, 0, 0] - - E: 12 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_fsi_vertices NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [0, 0, 0] FUNCT: [0, 0, 0] DESIGN LINE DIRICH CONDITIONS: - - E: 1 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_clamping_curves NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] - - E: 5 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_wall_curves NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [0, 0, 0] FUNCT: [0, 0, 0] - - E: 6 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_volume_curve_top NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [1, 0, 0] FUNCT: [1, 0, 0] - - E: 7 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_area_curve NUMDOF: 3 ONOFF: [1, 1, 0] VAL: [1, 0, 0] FUNCT: [2, 0, 0] DESIGN POINT ALE DIRICH CONDITIONS: - - E: 13 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_vertices_all NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] DESIGN LINE ALE DIRICH CONDITIONS: - - E: 6 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_volume_curve_top NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] - - E: 8 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_curves_in_y-direction NUMDOF: 2 ONOFF: [1, 1] VAL: [0, 0] FUNCT: [0, 0] DESIGN FSI COUPLING LINE CONDITIONS: - - E: 2 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_fsi_curve coupling_id: 1 - - E: 9 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_fsi_curve coupling_id: 1 diff --git a/tests/tutorials/fsi/tutorial_fsi_2d.e b/tests/tutorials/fsi/tutorial_fsi_2d.e index abd53d8d42bec46c1c5679f2eee3f443fc42adef..42d5c2609279bfe0e12462dfe4b8de44df94055b 100644 GIT binary patch delta 3702 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 MnNmA96DL>y0f&!^{Qv*} diff --git a/tests/tutorials/fsi/tutorial_fsi_2d.jou b/tests/tutorials/fsi/tutorial_fsi_2d.jou index 49a341b228a..2e3881417e5 100644 --- a/tests/tutorials/fsi/tutorial_fsi_2d.jou +++ b/tests/tutorials/fsi/tutorial_fsi_2d.jou @@ -199,15 +199,15 @@ block 1 name "flexible_bottom" $ curves nodeset 1 curve in structure_ycurves -nodeset 1 name "structure clamping curves" +nodeset 1 name "structure_clamping_curves" nodeset 2 curve in group structure_fsi_xcurves -nodeset 2 name "structure fsi curve" +nodeset 2 name "structure_fsi_curve" $ vertices nodeset 3 vertex in group structure_vertex -nodeset 3 name "structure vertices" +nodeset 3 name "structure_vertices" nodeset 4 vertex in group structure_vertex_fsi -nodeset 4 name "structure fsi vertices" +nodeset 4 name "structure_fsi_vertices" $======================= Fluid $ surfaces @@ -216,25 +216,25 @@ block 2 name "fluid" $ curves nodeset 5 curve in group cavity_ycurves -nodeset 5 name "cavity wall curves" +nodeset 5 name "cavity_wall_curves" nodeset 6 curve in group inflow_vol_xcurves_top -nodeset 6 name "inflow volume curve top" +nodeset 6 name "inflow_volume_curve_top" nodeset 7 curve in group inflow_ycurves -nodeset 7 name "inflow area curve" +nodeset 7 name "inflow_area_curve" nodeset 8 curve in group fluid_ycurves -nodeset 8 name "fluid curves in y-direction" +nodeset 8 name "fluid_curves_in_y-direction" nodeset 9 curve in group cavity_fsi_xcurves -nodeset 9 name "fluid fsi curve" +nodeset 9 name "fluid_fsi_curve" $ vertices nodeset 10 vertex in group inflow_vertex_top -nodeset 10 name "inflow vertices top" +nodeset 10 name "inflow_vertices_top" nodeset 11 vertex in group cavity_vertex -nodeset 11 name "cavity vertices" +nodeset 11 name "cavity_vertices" nodeset 12 vertex in group fluid_vertex_fsi -nodeset 12 name "fluid fsi vertices" +nodeset 12 name "fluid_fsi_vertices" nodeset 13 vertex in group fluid_vertex -nodeset 13 name "fluid vertices all" +nodeset 13 name "fluid_vertices_all" $======================= export mesh -export mesh "tutorial_fsi.e" block all dimension 2 overwrite +export mesh "tutorial_fsi_2d.e" block all dimension 2 overwrite From ce4676df9ae1c1834757aadca424257fdc492e92 Mon Sep 17 00:00:00 2001 From: Christoph Schmidt Date: Tue, 16 Jun 2026 18:35:09 +0200 Subject: [PATCH 4/4] Adapt fsi 3D tutorial --- tests/tutorials/fsi/tutorial_fsi_3d.4C.yaml | 183 +++++++------------- tests/tutorials/fsi/tutorial_fsi_3d.e | Bin 161832 -> 188092 bytes tests/tutorials/fsi/tutorial_fsi_3d.jou | 72 ++++---- 3 files changed, 97 insertions(+), 158 deletions(-) diff --git a/tests/tutorials/fsi/tutorial_fsi_3d.4C.yaml b/tests/tutorials/fsi/tutorial_fsi_3d.4C.yaml index b8c7c0b6985..d758c102360 100644 --- a/tests/tutorials/fsi/tutorial_fsi_3d.4C.yaml +++ b/tests/tutorials/fsi/tutorial_fsi_3d.4C.yaml @@ -105,369 +105,308 @@ FLUID GEOMETRY: NA: ALE DESIGN POINT DIRICH CONDITIONS: - - E: 32 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_vertex_front_left_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 33 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_vertex_back_left_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 34 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_vertex_back_right_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 35 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_vertex_front_right_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 36 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_vertex_front_1 NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 36 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_vertex_front_1 NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 38 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_vertex_front_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] - - E: 39 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_vertex_back_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] DESIGN LINE DIRICH CONDITIONS: - - E: 6 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_edge_front_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 7 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_edge_back_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 8 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_edge_back_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 9 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_edge_front_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 18 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_front_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 19 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_back_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 20 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_back_right NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 21 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_front_right NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 22 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_front_bottom NUMDOF: 4 ONOFF: [0, 0, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 23 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_back_bottom NUMDOF: 4 ONOFF: [0, 0, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 24 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_left_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 25 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_right_bottom NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 26 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_edge NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 27 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_edge_front NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [2, null, null, null] - - E: 28 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_edge_back NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [2, null, null, null] - - E: 29 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] - - E: 30 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_front NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] - - E: 31 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_back NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] DESIGN SURF DIRICH CONDITIONS: - - E: 1 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_surface_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 2 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_surface_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 3 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_surface_front NUMDOF: 3 ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 4 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_surface_back NUMDOF: 3 ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 10 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_wall_left NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 11 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_wall_right NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 12 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_wall_front NUMDOF: 4 ONOFF: [0, 0, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 13 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_wall_back NUMDOF: 4 ONOFF: [0, 0, 1, 0] VAL: [0, 0, 0, 0] FUNCT: [null, null, null, null] - - E: 15 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [1, null, null, null] - - E: 16 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow NUMDOF: 4 ONOFF: [1, 1, 1, 0] VAL: [1, 0, 0, 0] FUNCT: [2, null, null, null] DESIGN POINT ALE DIRICH CONDITIONS: - - E: 36 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_vertex_front_1 NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 37 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_vertex_front_2 NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 38 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_vertex_front_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 39 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_vertex_back_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] DESIGN LINE ALE DIRICH CONDITIONS: - - E: 18 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_front_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 19 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_back_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 20 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_back_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 21 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_front_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 24 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_left_bottom NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 25 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_edge_right_bottom NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 26 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity-inflow_edge NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 27 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_edge_front NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 28 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow_edge_back NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 29 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 30 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_front NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 31 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid_edge_back NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] DESIGN SURF ALE DIRICH CONDITIONS: - - E: 10 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_wall_left NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 11 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: cavity_wall_right NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 12 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_wall_front NUMDOF: 3 ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 13 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_wall_back NUMDOF: 3 ONOFF: [0, 0, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 15 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: lid NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 16 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: inflow NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] - - E: 17 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: outflow NUMDOF: 3 ONOFF: [1, 1, 1] VAL: [0, 0, 0] FUNCT: [null, null, null] DESIGN FSI COUPLING SURF CONDITIONS: - - E: 5 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: structure_coupling_surface coupling_id: 1 - - E: 14 - ENTITY_TYPE: node_set_id + - NODE_SET_NAME: fluid_coupling_surface coupling_id: 1 diff --git a/tests/tutorials/fsi/tutorial_fsi_3d.e b/tests/tutorials/fsi/tutorial_fsi_3d.e index 376ddba1199cb28ed32000b8b239cfde9309bc44..8d64ec0e8098795c1f46ac8bbafcdc86414b1847 100644 GIT binary patch delta 16622 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