Add thermal effects to the multiplicative split material#2083
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR thermo-couples the multiplicative split defgrad elast-hyper material by adding thermal expansion stress contributions and wiring plastic-dissipation heat sources into the thermo element, plus adding regression coverage for monolithic vs partitioned TSI.
Changes:
- Add thermal expansion parameters and thermal-stress contributions to
MAT_MultiplicativeSplitDefgradElastHyper - Extend thermo element dissipation handling to support multiplicative-split viscoplastic heat sources
- Add two TSI regression tests (monolithic + partitioned) to validate consistency
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| unittests/mat/4C_multiplicative_split_defgrad_elasthyper_test.cpp | Updates unit test setup and adapts to new evaluated_sdi_fin signature requiring thermal quantities |
| tests/list_of_tests.cmake | Registers new thermo-viscoplastic TSI regression tests (monolithic/partitioned) |
| tests/input_files/mat_iso_thermoviscoplast_refJC_log_timint_tsi_partitioned.4C.yaml | Adds partitioned TSI input exercising thermo-viscoplastic dissipation + thermal expansion |
| tests/input_files/mat_iso_thermoviscoplast_refJC_log_timint_tsi_monolithic.4C.yaml | Adds monolithic TSI input exercising the same scenario for consistency |
| src/tsi/4C_tsi_monolithic.cpp | Sets differentiation type to temperature for structure coupling matrix assembly |
| src/thermo/src/element/4C_thermo_ele_impl.cpp | Extends dissipation evaluation/tangents to handle multiplicative-split material heat source and derivatives |
| src/mat/4C_mat_trait_thermo_solid.hpp | Adjusts ThermoSolid trait inheritance (removes Solid) |
| src/mat/4C_mat_multiplicative_split_defgrad_elasthyper.hpp | Adds thermo-solid trait, thermal expansion API, and heat-source evaluation entry point |
| src/mat/4C_mat_multiplicative_split_defgrad_elasthyper.cpp | Implements thermal expansion stress contribution and heat source forwarding to viscoplastic factor |
2580977 to
b1124a5
Compare
b1124a5 to
0139ca2
Compare
- Heat source due to plastic dissipation is wired from the viscoplastic factor to the thermo element implementation. - Stress contribution from thermal expansion is added - Two new regression tests are added, for partitioned and monolithic TSI Limitations: - Supported only for a single viscoplastic factor. - The thermo-elastic contribution in the via `stress_temperature_modulus_and_deriv` is neglected so far.
0139ca2 to
d59f530
Compare
|
Thanks for running copilot @c-p-schmidt, mine ran out of tokens apparently :) |
dragos-ana
left a comment
There was a problem hiding this comment.
Looks great!
Particularly, your use of tensors and the newly added TensorAndTemperatureDerivative have simplified the code a lot!
I added some minor comments / suggestions
| void reinit(const Core::LinAlg::Tensor<double, 3, 3>* defgrd, | ||
| const Core::LinAlg::SymmetricTensor<double, 3, 3>& glstrain, double temperature, | ||
| unsigned gp) override { /* do nothing */ }; | ||
|
|
There was a problem hiding this comment.
This has nothing to do with your PR, but reinit is a very strange / non-descriptive name for what the function does.
Maybe a matter for private discussion, but shouldn't we at least include the stress-temperature modulus into the residual and neglect the linearization first?
| * @brief Evaluate the mechanical dissipation produced by this material. Currently, this is only | ||
| * enabled for the viscoplastic factor. |
There was a problem hiding this comment.
| * @brief Evaluate the mechanical dissipation produced by this material. Currently, this is only | |
| * enabled for the viscoplastic factor. | |
| * @brief Evaluate the heat source produced by this material. Currently, this is only | |
| * enabled for the viscoplastic factor. |
To prevent confusion as also noted in a previous PR ;) It's still my opinion that this is better named as the Taylor-Quinney heating, but I am also fine with heat source.
| } | ||
| else if (num_contributions > 1) | ||
| { | ||
| FOUR_C_THROW("Mechanical Dissipation is only implemented for a single factor so far."); |
There was a problem hiding this comment.
| FOUR_C_THROW("Mechanical Dissipation is only implemented for a single factor so far."); | |
| FOUR_C_THROW("Evaluation of additional heat source is only implemented for a single factor so far."); |
| Core::LinAlg::Matrix<8, 1> curr_delta{Core::LinAlg::Initialization::zero}; | ||
|
|
||
| //! thermal contribution due to thermal expansion to the thermo-elastic 2PK stress | ||
| TensorAndTemperatureDerivative curr_ST{}; |
There was a problem hiding this comment.
| TensorAndTemperatureDerivative curr_ST{}; | |
| TensorAndTemperatureDerivative curr_ST_and_temp_deriv{}; |
Maybe?
| TIMESTEP: 0.05 | ||
| NUMSTEP: 200 |
There was a problem hiding this comment.
TSI Dynamic governs the time settings, but it would be nice if they match the set values in both the dedicated structure and thermal sections.
| SOLVER 2: | ||
| SOLVER: Belos | ||
| SOLVER_XML_FILE: "xml/linear_solver/iterative_gmres_template.xml" | ||
| PRECONDITIONER_XML_FILE: "xml/block_preconditioner/thermo_solid.xml" |
There was a problem hiding this comment.
If I see this right, Belos is not used here at all? Maybe it should be removed if that is not the case.
| thermoplhyperelast = std::dynamic_pointer_cast<Mat::ThermoPlasticHyperElast>(structmat); | ||
| // true: error if cast fails |
There was a problem hiding this comment.
Since the dynamic pointer cast does not throw by default, it could be helpful to explicitly assert that it is not a nullptr after the cast.
Description and Context
For now, the last PR to make the viscoplastic factor thermo-coupled:
Current Limitations:
stress_temperature_modulus_and_derivis neglected so far.Related Issues and Pull Requests
following #2041
Doesn't touch any factor code, so independent of #2082 (@dragos-ana) Edit: I ended up re-designing some of the
ThermalQuantitiesstruct, mainly due to performance concerns, which now lead to some changes in the factor, but quite limited. The thermal expansion evaluations now also use tensors instead of matrices.