Fem: Add radiation heat transfer (#13466)

* FEM: Add radiation heat transfer
* FEM: Add radiation heat transfer to CalculiX writer
* FEM: Update .inp files
* Fem: Rename heat flux ui members

---------

Co-authored-by: FEA-eng <59876896+FEA-eng@users.noreply.github.com>
This commit is contained in:
marioalexis84
2024-04-29 12:53:59 -03:00
committed by GitHub
parent 5d69945f6e
commit ff285b6c60
40 changed files with 278 additions and 18 deletions

View File

@@ -62,13 +62,14 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(
&TaskFemConstraintHeatflux::onReferenceDeleted);
connect(ui->rb_convection, &QRadioButton::clicked, this, &TaskFemConstraintHeatflux::Conv);
connect(ui->rb_radiation, &QRadioButton::clicked, this, &TaskFemConstraintHeatflux::Rad);
connect(ui->rb_dflux, &QRadioButton::clicked, this, &TaskFemConstraintHeatflux::Flux);
connect(ui->if_heatflux,
qOverload<double>(&InputField::valueChanged),
this,
&TaskFemConstraintHeatflux::onHeatFluxChanged);
connect(ui->if_ambienttemp,
connect(ui->if_ambienttemp_conv,
qOverload<double>(&InputField::valueChanged),
this,
&TaskFemConstraintHeatflux::onAmbientTempChanged);
@@ -76,6 +77,14 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(
qOverload<double>(&InputField::valueChanged),
this,
&TaskFemConstraintHeatflux::onFilmCoefChanged);
connect(ui->if_emissivity,
qOverload<double>(&InputField::valueChanged),
this,
&TaskFemConstraintHeatflux::onEmissivityChanged);
connect(ui->if_ambienttemp_rad,
qOverload<double>(&InputField::valueChanged),
this,
&TaskFemConstraintHeatflux::onAmbientTempChanged);
connect(ui->lw_references,
&QListWidget::itemClicked,
this,
@@ -84,9 +93,11 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(
this->groupLayout()->addWidget(proxy);
// Temporarily prevent unnecessary feature recomputes
ui->if_ambienttemp->blockSignals(true);
ui->if_ambienttemp_conv->blockSignals(true);
// ui->if_facetemp->blockSignals(true);
ui->if_filmcoef->blockSignals(true);
ui->if_emissivity->blockSignals(true);
ui->if_ambienttemp_rad->blockSignals(true);
ui->lw_references->blockSignals(true);
ui->btnAdd->blockSignals(true);
ui->btnRemove->blockSignals(true);
@@ -98,26 +109,41 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(
std::vector<std::string> SubElements = pcConstraint->References.getSubValues();
// Fill data into dialog elements
ui->if_ambienttemp->setMinimum(0);
ui->if_ambienttemp->setMaximum(FLOAT_MAX);
ui->if_ambienttemp_conv->setMinimum(0);
ui->if_ambienttemp_conv->setMaximum(FLOAT_MAX);
ui->if_filmcoef->setMinimum(0);
ui->if_filmcoef->setMaximum(FLOAT_MAX);
ui->if_emissivity->setMinimum(0);
ui->if_emissivity->setMaximum(FLOAT_MAX);
ui->if_ambienttemp_rad->setMinimum(0);
ui->if_ambienttemp_rad->setMaximum(FLOAT_MAX);
std::string constraint_type = pcConstraint->ConstraintType.getValueAsString();
if (constraint_type == "Convection") {
ui->rb_convection->setChecked(true);
ui->sw_heatflux->setCurrentIndex(0);
Base::Quantity t =
Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature);
ui->if_ambienttemp->setValue(t);
ui->if_ambienttemp_conv->setValue(t);
Base::Quantity f = Base::Quantity(pcConstraint->FilmCoef.getValue(),
Base::Unit::ThermalTransferCoefficient);
ui->if_filmcoef->setValue(f);
}
else if (constraint_type == "Radiation") {
ui->rb_radiation->setChecked(true);
ui->sw_heatflux->setCurrentIndex(1);
Base::Quantity t =
Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature);
ui->if_ambienttemp_rad->setValue(t);
Base::Quantity e = Base::Quantity(pcConstraint->Emissivity.getValue(), Base::Unit());
ui->if_emissivity->setValue(e);
}
else if (constraint_type == "DFlux") {
ui->rb_dflux->setChecked(true);
ui->sw_heatflux->setCurrentIndex(1);
ui->sw_heatflux->setCurrentIndex(2);
Base::Quantity c = Base::Quantity(pcConstraint->DFlux.getValue(), Base::Unit::HeatFlux);
ui->if_heatflux->setValue(c);
}
@@ -134,9 +160,11 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(
buttonGroup->addButton(ui->btnAdd, (int)SelectionChangeModes::refAdd);
buttonGroup->addButton(ui->btnRemove, (int)SelectionChangeModes::refRemove);
ui->if_ambienttemp->blockSignals(false);
ui->if_ambienttemp_conv->blockSignals(false);
// ui->if_facetemp->blockSignals(false);
ui->if_filmcoef->blockSignals(false);
ui->if_emissivity->blockSignals(false);
ui->if_ambienttemp_rad->blockSignals(false);
ui->lw_references->blockSignals(false);
ui->btnAdd->blockSignals(false);
ui->btnRemove->blockSignals(false);
@@ -169,6 +197,13 @@ void TaskFemConstraintHeatflux::onFilmCoefChanged(double val)
pcConstraint->FilmCoef.setValue(val); // [W]/[[m^2]/[K]]
}
void TaskFemConstraintHeatflux::onEmissivityChanged(double val)
{
Fem::ConstraintHeatflux* pcConstraint =
static_cast<Fem::ConstraintHeatflux*>(ConstraintView->getObject());
pcConstraint->Emissivity.setValue(val); // [-]
}
void TaskFemConstraintHeatflux::onHeatFluxChanged(double val)
{
Fem::ConstraintHeatflux* pcConstraint =
@@ -186,7 +221,7 @@ void TaskFemConstraintHeatflux::Conv()
name.c_str(),
get_constraint_type().c_str());
Base::Quantity t = Base::Quantity(300, Base::Unit::Temperature);
ui->if_ambienttemp->setValue(t);
ui->if_ambienttemp_conv->setValue(t);
pcConstraint->AmbientTemp.setValue(300);
Base::Quantity f = Base::Quantity(10, Base::Unit::ThermalTransferCoefficient);
ui->if_filmcoef->setValue(f);
@@ -194,6 +229,24 @@ void TaskFemConstraintHeatflux::Conv()
ui->sw_heatflux->setCurrentIndex(0);
}
void TaskFemConstraintHeatflux::Rad()
{
Fem::ConstraintHeatflux* pcConstraint =
static_cast<Fem::ConstraintHeatflux*>(ConstraintView->getObject());
std::string name = ConstraintView->getObject()->getNameInDocument();
Gui::Command::doCommand(Gui::Command::Doc,
"App.ActiveDocument.%s.ConstraintType = %s",
name.c_str(),
get_constraint_type().c_str());
Base::Quantity t = Base::Quantity(300, Base::Unit::Temperature);
ui->if_ambienttemp_rad->setValue(t);
pcConstraint->AmbientTemp.setValue(300);
Base::Quantity e = Base::Quantity(1, Base::Unit());
ui->if_emissivity->setValue(e);
pcConstraint->Emissivity.setValue(1);
ui->sw_heatflux->setCurrentIndex(1);
}
void TaskFemConstraintHeatflux::Flux()
{
Fem::ConstraintHeatflux* pcConstraint =
@@ -206,7 +259,7 @@ void TaskFemConstraintHeatflux::Flux()
Base::Quantity c = Base::Quantity(0, Base::Unit::HeatFlux);
ui->if_heatflux->setValue(c);
pcConstraint->DFlux.setValue(0);
ui->sw_heatflux->setCurrentIndex(1);
ui->sw_heatflux->setCurrentIndex(2);
}
void TaskFemConstraintHeatflux::addToSelection()
@@ -363,7 +416,13 @@ const std::string TaskFemConstraintHeatflux::getReferences() const
double TaskFemConstraintHeatflux::getAmbientTemp() const
{
Base::Quantity temperature = ui->if_ambienttemp->getQuantity();
Base::Quantity temperature;
if (ui->rb_convection->isChecked()) {
temperature = ui->if_ambienttemp_conv->getQuantity();
}
else if (ui->rb_radiation->isChecked()) {
temperature = ui->if_ambienttemp_rad->getQuantity();
}
double temperature_in_kelvin = temperature.getValueAs(Base::Quantity::Kelvin);
return temperature_in_kelvin;
}
@@ -376,12 +435,22 @@ double TaskFemConstraintHeatflux::getFilmCoef() const
return filmcoef_in_units;
}
double TaskFemConstraintHeatflux::getEmissivity() const
{
Base::Quantity emissivity = ui->if_emissivity->getQuantity();
double emissivity_in_units = emissivity.getValueAs(Base::Quantity(1.0, Base::Unit()));
return emissivity_in_units;
}
std::string TaskFemConstraintHeatflux::get_constraint_type() const
{
std::string type;
if (ui->rb_convection->isChecked()) {
type = "\"Convection\"";
}
else if (ui->rb_radiation->isChecked()) {
type = "\"Radiation\"";
}
else if (ui->rb_dflux->isChecked()) {
type = "\"DFlux\"";
}
@@ -397,11 +466,15 @@ void TaskFemConstraintHeatflux::changeEvent(QEvent* e)
{
TaskBox::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
ui->if_ambienttemp->blockSignals(true);
ui->if_ambienttemp_conv->blockSignals(true);
ui->if_filmcoef->blockSignals(true);
ui->if_emissivity->blockSignals(true);
ui->if_ambienttemp_rad->blockSignals(true);
ui->retranslateUi(proxy);
ui->if_ambienttemp->blockSignals(false);
ui->if_ambienttemp_conv->blockSignals(false);
ui->if_filmcoef->blockSignals(false);
ui->if_emissivity->blockSignals(true);
ui->if_ambienttemp_rad->blockSignals(false);
}
}
@@ -465,6 +538,11 @@ bool TaskDlgFemConstraintHeatflux::accept()
name.c_str(),
parameterHeatflux->getFilmCoef());
Gui::Command::doCommand(Gui::Command::Doc,
"App.ActiveDocument.%s.Emissivity = %f",
name.c_str(),
parameterHeatflux->getEmissivity());
scale = parameterHeatflux->getScale(); // OvG: determine modified scale
Gui::Command::doCommand(Gui::Command::Doc,
"App.ActiveDocument.%s.Scale = %s",