From 96a705dc7d6c9f69ffb4a6a47ebb41dcb3cdf8cd Mon Sep 17 00:00:00 2001 From: kgoao Date: Tue, 20 Dec 2016 18:10:20 +0100 Subject: [PATCH] FEM: FemConstraintHeatflux: Add DFLUX option to heat flux constraint --- src/Base/Unit.cpp | 4 +- src/Base/Unit.h | 1 + src/Gui/DlgUnitsCalculatorImp.cpp | 2 +- src/Mod/Fem/App/FemConstraintHeatflux.cpp | 6 + src/Mod/Fem/App/FemConstraintHeatflux.h | 3 + src/Mod/Fem/FemInputWriterCcx.py | 29 +++-- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp | 66 +++++++++- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h | 5 +- src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui | 116 +++++++++++++----- 9 files changed, 187 insertions(+), 45 deletions(-) diff --git a/src/Base/Unit.cpp b/src/Base/Unit.cpp index 6fd5f5546..f0315b552 100644 --- a/src/Base/Unit.cpp +++ b/src/Base/Unit.cpp @@ -485,7 +485,8 @@ QString Unit::getTypeString(void) const if(*this == Unit::ThermalExpansionCoefficient ) return QString::fromLatin1("ThermalExpansionCoefficient"); else if(*this == Unit::SpecificHeat ) return QString::fromLatin1("SpecificHeat"); else if(*this == Unit::ThermalTransferCoefficient ) return QString::fromLatin1("ThermalTransferCoefficient"); else - + if(*this == Unit::HeatFluxDensity ) return QString::fromLatin1("HeatFluxDensity"); else + return QString(); } @@ -517,3 +518,4 @@ Unit Unit::ThermalConductivity (1,1,-3,0,-1); Unit Unit::ThermalExpansionCoefficient (0,0,0,0,-1); Unit Unit::SpecificHeat (2,0,-2,0,-1); Unit Unit::ThermalTransferCoefficient (0,1,-3,0,-1); +Unit Unit::HeatFluxDensity (0,1,-3,0,0); diff --git a/src/Base/Unit.h b/src/Base/Unit.h index 65c213e0e..00ab80230 100644 --- a/src/Base/Unit.h +++ b/src/Base/Unit.h @@ -120,6 +120,7 @@ public: static Unit ThermalExpansionCoefficient; static Unit SpecificHeat; static Unit ThermalTransferCoefficient; + static Unit HeatFluxDensity; //@} protected: diff --git a/src/Gui/DlgUnitsCalculatorImp.cpp b/src/Gui/DlgUnitsCalculatorImp.cpp index f25e1a23c..f6deb02cd 100644 --- a/src/Gui/DlgUnitsCalculatorImp.cpp +++ b/src/Gui/DlgUnitsCalculatorImp.cpp @@ -71,7 +71,7 @@ DlgUnitsCalculator::DlgUnitsCalculator( QWidget* parent, Qt::WindowFlags fl ) << Base::Unit::AmountOfSubstance << Base::Unit::LuminoseIntensity << Base::Unit::Stress << Base::Unit::Pressure << Base::Unit::Force << Base::Unit::Work << Base::Unit::Power << Base::Unit::ThermalConductivity << Base::Unit::ThermalExpansionCoefficient - << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient; + << Base::Unit::SpecificHeat << Base::Unit::ThermalTransferCoefficient <::iterator it = units.begin(); it != units.end(); ++it) { ui->unitsBox->addItem(it->getTypeString()); } diff --git a/src/Mod/Fem/App/FemConstraintHeatflux.cpp b/src/Mod/Fem/App/FemConstraintHeatflux.cpp index 02b4632d4..86068f6d7 100644 --- a/src/Mod/Fem/App/FemConstraintHeatflux.cpp +++ b/src/Mod/Fem/App/FemConstraintHeatflux.cpp @@ -41,11 +41,17 @@ using namespace Fem; PROPERTY_SOURCE(Fem::ConstraintHeatflux, Fem::Constraint); +static const char* ConstraintTypes[] = {"DFlux","Convection", NULL}; + ConstraintHeatflux::ConstraintHeatflux() { ADD_PROPERTY(AmbientTemp,(0.0)); /*ADD_PROPERTY(FaceTemp,(0.0));*/ ADD_PROPERTY(FilmCoef,(0.0)); + ADD_PROPERTY(DFlux,(0.0)); + ADD_PROPERTY_TYPE(ConstraintType,(1),"ConstraintHeatflux",(App::PropertyType)(App::Prop_None), + "Type of constraint, surface convection or surface heat flux"); + ConstraintType.setEnums(ConstraintTypes); ADD_PROPERTY_TYPE(Points,(Base::Vector3d()),"ConstraintHeatflux",App::PropertyType(App::Prop_ReadOnly|App::Prop_Output), "Points where symbols are drawn"); diff --git a/src/Mod/Fem/App/FemConstraintHeatflux.h b/src/Mod/Fem/App/FemConstraintHeatflux.h index 4d74f4bcd..035cc84c0 100644 --- a/src/Mod/Fem/App/FemConstraintHeatflux.h +++ b/src/Mod/Fem/App/FemConstraintHeatflux.h @@ -41,6 +41,9 @@ public: App::PropertyFloat AmbientTemp; /*App::PropertyFloat FaceTemp;*/ App::PropertyFloat FilmCoef; + App::PropertyFloat DFlux; + App::PropertyEnumeration ConstraintType; + App::PropertyVectorList Points; App::PropertyVectorList Normals; diff --git a/src/Mod/Fem/FemInputWriterCcx.py b/src/Mod/Fem/FemInputWriterCcx.py index 102fa47ed..85ac5a913 100644 --- a/src/Mod/Fem/FemInputWriterCcx.py +++ b/src/Mod/Fem/FemInputWriterCcx.py @@ -818,15 +818,26 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter): f.write('** written by {} function\n'.format(sys._getframe().f_code.co_name)) for hfobj in self.heatflux_objects: heatflux_obj = hfobj['Object'] - f.write('*FILM\n') - for o, elem_tup in heatflux_obj.References: - for elem in elem_tup: - ho = o.Shape.getElement(elem) - if ho.ShapeType == 'Face': - v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) - f.write("** Heat flux on face {}\n".format(elem)) - for i in v: - f.write("{},F{},{},{}\n".format(i[0], i[1], heatflux_obj.AmbientTemp, heatflux_obj.FilmCoef * 0.001)) # SvdW add factor to force heatflux to units system of t/mm/s/K # OvG: Only write out the VolumeIDs linked to a particular face + if heatflux_obj.ConstraintType == "Convection": + f.write('*FILM\n') + for o, elem_tup in heatflux_obj.References: + for elem in elem_tup: + ho = o.Shape.getElement(elem) + if ho.ShapeType == 'Face': + v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) + f.write("** Heat flux on face {}\n".format(elem)) + for i in v: + f.write("{},F{},{},{}\n".format(i[0], i[1], heatflux_obj.AmbientTemp, heatflux_obj.FilmCoef * 0.001)) # SvdW add factor to force heatflux to units system of t/mm/s/K # OvG: Only write out the VolumeIDs linked to a particular face + elif heatflux_obj.ConstraintType == "DFlux": + f.write('*DFLUX\n') + for o, elem_tup in heatflux_obj.References: + for elem in elem_tup: + ho = o.Shape.getElement(elem) + if ho.ShapeType == 'Face': + v = self.mesh_object.FemMesh.getccxVolumesByFace(ho) + f.write("** Heat flux on face {}\n".format(elem)) + for i in v: + f.write("{},S{},{}\n".format(i[0], i[1], heatflux_obj.DFlux)) def write_outputs_types(self, f): f.write('\n***********************************************************\n') diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp index fff52529d..42c11354a 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.cpp @@ -65,6 +65,11 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(ViewProviderFemConstraintHe ui->lw_references->addAction(action); ui->lw_references->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(ui->rb_convection, SIGNAL(clicked(bool)), this, SLOT(Conv())); + connect(ui->rb_dflux, SIGNAL(clicked(bool)), this, SLOT(Flux())); + + connect(ui->if_heatflux, SIGNAL(valueChanged(double)), + this, SLOT(onHeatFluxChanged(double))); connect(ui->if_ambienttemp, SIGNAL(valueChanged(double)), this, SLOT(onAmbientTempChanged(double))); //connect(ui->if_facetemp, SIGNAL(valueChanged(double)), @@ -90,13 +95,24 @@ TaskFemConstraintHeatflux::TaskFemConstraintHeatflux(ViewProviderFemConstraintHe // Fill data into dialog elements ui->if_ambienttemp->setMinimum(0); ui->if_ambienttemp->setMaximum(FLOAT_MAX); - Base::Quantity t = Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature); - ui->if_ambienttemp->setValue(t); ui->if_filmcoef->setMinimum(0); ui->if_filmcoef->setMaximum(FLOAT_MAX); - Base::Quantity f = Base::Quantity(pcConstraint->FilmCoef.getValue(), Base::Unit::ThermalTransferCoefficient); - ui->if_filmcoef->setValue(f); + + std::string constraint_type = pcConstraint->ConstraintType.getValueAsString(); + if (constraint_type == "Convection") { + ui->rb_convection->setChecked(1); + ui->sw_heatflux->setCurrentIndex(0); + Base::Quantity t = Base::Quantity(pcConstraint->AmbientTemp.getValue(), Base::Unit::Temperature); + ui->if_ambienttemp->setValue(t); + Base::Quantity f = Base::Quantity(pcConstraint->FilmCoef.getValue(), Base::Unit::ThermalTransferCoefficient); + ui->if_filmcoef->setValue(f); + } else if (constraint_type == "DFlux") { + ui->rb_dflux->setChecked(1); + ui->sw_heatflux->setCurrentIndex(1); + Base::Quantity c = Base::Quantity(pcConstraint->DFlux.getValue(), Base::Unit::HeatFluxDensity); + ui->if_heatflux->setValue(c); + } ui->lw_references->clear(); for (std::size_t i = 0; i < Objects.size(); i++) { @@ -154,6 +170,38 @@ void TaskFemConstraintHeatflux::onFilmCoefChanged(double val) pcConstraint->FilmCoef.setValue(val); // [W]/[[m^2]/[K]] } +void TaskFemConstraintHeatflux::onHeatFluxChanged(double val) +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(ConstraintView->getObject()); + pcConstraint->DFlux.setValue(val); + +} + +void TaskFemConstraintHeatflux::Conv() +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(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->setValue(t); + pcConstraint->AmbientTemp.setValue(300); + Base::Quantity f = Base::Quantity(10, Base::Unit::ThermalTransferCoefficient); + ui->if_filmcoef->setValue(f); + pcConstraint->FilmCoef.setValue(10); + ui->sw_heatflux->setCurrentIndex(0); +} + +void TaskFemConstraintHeatflux::Flux() +{ + Fem::ConstraintHeatflux* pcConstraint = static_cast(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 c = Base::Quantity(0, Base::Unit::HeatFluxDensity); + ui->if_heatflux->setValue(c); + pcConstraint->DFlux.setValue(0); + ui->sw_heatflux->setCurrentIndex(1); +} + void TaskFemConstraintHeatflux::addToSelection() { std::vector selection = Gui::Selection().getSelectionEx(); //gets vector of selected objects of active document @@ -327,6 +375,16 @@ double TaskFemConstraintHeatflux::getFilmCoef(void) const return filmcoef_in_units; } +std::string TaskFemConstraintHeatflux::get_constraint_type(void) const { + std::string type; + if (ui->rb_convection->isChecked()) { + type = "\"Convection\""; + } else if (ui->rb_dflux->isChecked()) { + type = "\"DFlux\""; + } + return type; +} + void TaskFemConstraintHeatflux::changeEvent(QEvent *e) { TaskBox::changeEvent(e); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h index 086ccc436..4d0e0d46a 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.h @@ -53,6 +53,7 @@ public: double getAmbientTemp(void) const; /*double getFaceTemp(void) const;*/ double getFilmCoef(void) const; + std::string get_constraint_type(void) const; virtual const std::string getReferences() const; private Q_SLOTS: @@ -60,7 +61,9 @@ private Q_SLOTS: void onAmbientTempChanged(double val); /*void onFaceTempChanged(double val);*/ void onFilmCoefChanged(double val); - + void onHeatFluxChanged(double val); + void Conv(); + void Flux(); void addToSelection(); void removeFromSelection(); void setSelection(QListWidgetItem* item); diff --git a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui index 28feb3078..7c78b140a 100644 --- a/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui +++ b/src/Mod/Fem/Gui/TaskFemConstraintHeatflux.ui @@ -7,13 +7,13 @@ 0 0 379 - 400 + 531 TaskFemConstraintHeatflux - + @@ -43,46 +43,104 @@ - + - + - Ambient Temperature + Surface Convection - + - 300 K - - - K + Surface heat flux - - - - - Film coefficient - - - - - - - 1 W/m^2/K - - - W/m^2/K - - - - + + + 1 + + + + + + + + + + + Film coefficient + + + + + + + 1 W/m^2/K + + + W/m^2/K + + + + + + + + + + + Ambient Temperature + + + + + + + 300 K + + + K + + + + + + + + + + + + + + + + + Surface heat flux + + + + + + + 300 K + + + K + + + + + + + +