double LocalPointValueHeat::variableValue(PhysicFieldVariable physicFieldVariable, PhysicFieldVariableComp physicFieldVariableComp) { switch (physicFieldVariable) { case PhysicFieldVariable_Heat_Temperature: { return temperature; } break; case PhysicFieldVariable_Heat_TemperatureGradient: { switch (physicFieldVariableComp) { case PhysicFieldVariableComp_X: return G.x; break; case PhysicFieldVariableComp_Y: return G.y; break; case PhysicFieldVariableComp_Magnitude: return G.magnitude(); break; } } break; case PhysicFieldVariable_Heat_Flux: { switch (physicFieldVariableComp) { case PhysicFieldVariableComp_X: return F.x; break; case PhysicFieldVariableComp_Y: return F.y; break; case PhysicFieldVariableComp_Magnitude: return F.magnitude(); break; } } break; case PhysicFieldVariable_Heat_Conductivity: { return thermal_conductivity; } break; default: cerr << "Physical field variable '" + physicFieldVariableString(physicFieldVariable).toStdString() + "' is not implemented. LocalPointValueHeat::variableValue(PhysicFieldVariable physicFieldVariable, PhysicFieldVariableComp physicFieldVariableComp)" << endl; throw; break; } }
void ChartDialog::plotTime() { logMessage("ChartDialog::plotTime()"); if (!txtPointX->evaluate()) return; if (!txtPointY->evaluate()) return; doChartLine(); // variable PhysicFieldVariable physicFieldVariable = (PhysicFieldVariable) cmbFieldVariable->itemData(cmbFieldVariable->currentIndex()).toInt(); if (physicFieldVariable == PhysicFieldVariable_Undefined) return; PhysicFieldVariableComp physicFieldVariableComp = (PhysicFieldVariableComp) cmbFieldVariableComp->itemData(cmbFieldVariableComp->currentIndex()).toInt(); if (physicFieldVariableComp == PhysicFieldVariableComp_Undefined) return; // store timestep int timeStep = Util::scene()->sceneSolution()->timeStep(); int count = Util::scene()->sceneSolution()->timeStepCount(); double *xval = new double[count]; double *yval = new double[count]; // chart->setTitle(physicFieldVariableString(physicFieldVariable) + " - " + physicFieldVariableCompString(physicFieldVariableComp)); QwtText text(""); text.setFont(QFont("Helvetica", 10, QFont::Normal)); text.setText(QString("%1 (%2)"). arg(physicFieldVariableString(physicFieldVariable)). arg(physicFieldVariableUnitsString(physicFieldVariable))); chart->setAxisTitle(QwtPlot::yLeft, text); // table trvTable->clear(); trvTable->setRowCount(count); QStringList headers = Util::scene()->problemInfo()->hermes()->localPointValueHeader(); trvTable->setColumnCount(headers.count()); trvTable->setHorizontalHeaderLabels(headers); // chart text.setText(tr("Time (s)")); chart->setAxisTitle(QwtPlot::xBottom, text); // calculate values QStringList row; for (int i = 0; i<Util::scene()->sceneSolution()->timeStepCount(); i++) { // change time level Util::scene()->sceneSolution()->setTimeStep(i, false); Point point(txtPointX->value().number, txtPointY->value().number); LocalPointValue *localPointValue = Util::scene()->problemInfo()->hermes()->localPointValue(point); // x value xval[i] = Util::scene()->sceneSolution()->time(); // y value yval[i] = localPointValue->variableValue(physicFieldVariable, physicFieldVariableComp); // table row.clear(); row << localPointValue->variables(); for (int j = 0; j<row.count(); j++) trvTable->setItem(i, j, new QTableWidgetItem(row.at(j))); delete localPointValue; } chart->setData(xval, yval, count); delete[] xval; delete[] yval; // restore previous timestep Util::scene()->sceneSolution()->setTimeStep(timeStep); }
void ChartDialog::plotGeometry() { logMessage("ChartDialog::plotGeometry()"); if (!txtStartX->evaluate()) return; if (!txtStartY->evaluate()) return; if (!txtEndX->evaluate()) return; if (!txtEndY->evaluate()) return; if (!txtAngle->evaluate()) return; doChartLine(); // variable PhysicFieldVariable physicFieldVariable = (PhysicFieldVariable) cmbFieldVariable->itemData(cmbFieldVariable->currentIndex()).toInt(); if (physicFieldVariable == PhysicFieldVariable_Undefined) return; PhysicFieldVariableComp physicFieldVariableComp = (PhysicFieldVariableComp) cmbFieldVariableComp->itemData(cmbFieldVariableComp->currentIndex()).toInt(); if (physicFieldVariableComp == PhysicFieldVariableComp_Undefined) return; int count = txtAxisPoints->value(); double *xval = new double[count]; double *yval = new double[count]; // chart->setTitle(physicFieldVariableString(physicFieldVariable) + " - " + physicFieldVariableCompString(physicFieldVariableComp)); QwtText text(""); text.setFont(QFont("Helvetica", 10, QFont::Normal)); text.setText(QString("%1 (%2)"). arg(physicFieldVariableString(physicFieldVariable)). arg(physicFieldVariableUnitsString(physicFieldVariable))); chart->setAxisTitle(QwtPlot::yLeft, text); // table trvTable->clear(); trvTable->setRowCount(count); QStringList headers = Util::scene()->problemInfo()->hermes()->localPointValueHeader(); trvTable->setColumnCount(headers.count()); trvTable->setHorizontalHeaderLabels(headers); // chart if (radAxisLength->isChecked()) text.setText(tr("Length (m)")); if (radAxisX->isChecked()) text.setText(Util::scene()->problemInfo()->labelX() + " (m):"); if (radAxisY->isChecked()) text.setText(Util::scene()->problemInfo()->labelY() + " (m):"); chart->setAxisTitle(QwtPlot::xBottom, text); // line ChartLine chartLine(Point(txtStartX->value().number, txtStartY->value().number), Point(txtEndX->value().number, txtEndY->value().number), txtAngle->value().number, count); QList<Point> points = chartLine.getPoints(); // calculate values QStringList row; for (int i = 0; i < points.length(); i++) { LocalPointValue *localPointValue = Util::scene()->problemInfo()->hermes()->localPointValue(points.at(i)); // x value if (radAxisLength->isChecked()) { if (i == 0) xval[i] = 0.0; else if (fabs(chartLine.angle) < EPS_ZERO) { xval[i] = xval[i-1] + sqrt(sqr(points.at(i).x - points.at(i-1).x) + sqr(points.at(i).y - points.at(i-1).y)); } else { Point center = centerPoint(points.at(i-1), points.at(i), chartLine.angle/(points.length() - 1)); double radius = (points.at(i-1) - center).magnitude(); double angle = atan2(points.at(i).y - center.y, points.at(i).x - center.x) - atan2(points.at(i-1).y - center.y, points.at(i-1).x - center.x); xval[i] = xval[i-1] + radius * angle; } } if (radAxisX->isChecked()) xval[i] = points.at(i).x; if (radAxisY->isChecked()) xval[i] = points.at(i).y; // y value yval[i] = localPointValue->variableValue(physicFieldVariable, physicFieldVariableComp); // table row.clear(); row << localPointValue->variables(); for (int j = 0; j<row.count(); j++) trvTable->setItem(chkAxisPointsReverse->isChecked() ? points.length() - 1 - i : i, j, new QTableWidgetItem(row.at(j))); delete localPointValue; } // reverse vertical axis if (chkAxisPointsReverse->isChecked()) { for (int i = 0; i < points.length() / 2; i++) { double tmp = yval[i]; yval[i] = yval[points.length() - i - 1]; yval[points.length() - i - 1] = tmp; } } chart->setData(xval, yval, count); delete[] xval; delete[] yval; }
void ViewScalarFilterHeat::calculateVariable(int i) { switch (m_physicFieldVariable) { case PhysicFieldVariable_Heat_Temperature: { node->values[0][0][i] = value1[i]; } break; case PhysicFieldVariable_Heat_TemperatureGradient: { switch (m_physicFieldVariableComp) { case PhysicFieldVariableComp_X: { node->values[0][0][i] = - dudx1[i]; } break; case PhysicFieldVariableComp_Y: { node->values[0][0][i] = - dudy1[i]; } break; case PhysicFieldVariableComp_Magnitude: { node->values[0][0][i] = sqrt(sqr(dudx1[i]) + sqr(dudy1[i])); } break; } } break; case PhysicFieldVariable_Heat_Flux: { SceneMaterialHeat *marker = dynamic_cast<SceneMaterialHeat *>(material); switch (m_physicFieldVariableComp) { case PhysicFieldVariableComp_X: { node->values[0][0][i] = - marker->thermal_conductivity.number * dudx1[i]; } break; case PhysicFieldVariableComp_Y: { node->values[0][0][i] = - marker->thermal_conductivity.number * dudy1[i]; } break; case PhysicFieldVariableComp_Magnitude: { node->values[0][0][i] = marker->thermal_conductivity.number * sqrt(sqr(dudx1[i]) + sqr(dudy1[i])); } break; } } break; case PhysicFieldVariable_Heat_Conductivity: { SceneMaterialHeat *marker = dynamic_cast<SceneMaterialHeat *>(material); node->values[0][0][i] = marker->thermal_conductivity.number; } break; default: cerr << "Physical field variable '" + physicFieldVariableString(m_physicFieldVariable).toStdString() + "' is not implemented. ViewScalarFilterHeat::calculateVariable()" << endl; throw; break; } }
QString ReportDialog::replaceTemplates(const QString &source) { logMessage("ReportDialog::()replaceTemplates"); QString destination = source; // stylesheet destination.replace("[StyleSheet]", "./style.css", Qt::CaseSensitive); // problem name destination.replace("[Report.Label]", "<h1>" + Util::scene()->problemInfo()->name + "</h1>", Qt::CaseSensitive); // description if (chkDescription->isChecked()) { destination.replace("[Description.Label]", "<h2>" + tr("Description") + "</h2>", Qt::CaseSensitive); destination.replace("[Description]", "<p>" + Util::scene()->problemInfo()->description + "</p>", Qt::CaseSensitive); } else { destination.remove("[Description.Label]", Qt::CaseSensitive); destination.remove("[Description]", Qt::CaseSensitive); } // problem information if (chkProblemInformation->isChecked()) { destination.replace("[ProblemInformation.Label]", "<h2>" + tr("Problem Information") + "</h2>", Qt::CaseSensitive); destination.replace("[ProblemInformation.Name]", "<table><tr><td>" + tr("Name:") + "</td><td>" + Util::scene()->problemInfo()->name + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.Date]", "<tr><td>" + tr("Date:") + "</td><td>" + Util::scene()->problemInfo()->date.toString("dd.MM.yyyy") + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.FileName]", "<tr><td>" + tr("Filename:") + "</td><td>" + QFileInfo(Util::scene()->problemInfo()->fileName).fileName() + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.ProblemType]", "<tr><td>" + tr("Problem type:") + "</td><td>" + problemTypeString(Util::scene()->problemInfo()->problemType) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.PhysicField]", "<tr><td>" + tr("Physic field:") + "</td><td>" + physicFieldString(Util::scene()->problemInfo()->physicField()) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.AnalysisType]", "<tr><td>" + tr("Analysis type:") + "</td><td>" + analysisTypeString(Util::scene()->problemInfo()->analysisType) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.NumberOfRefinements]", "<tr><td>" + tr("Number of refinements:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->numberOfRefinements) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.PolynomialOrder]", "<tr><td>" + tr("Polynomial order:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->polynomialOrder) + "</td></tr></table>", Qt::CaseSensitive); if (Util::scene()->problemInfo()->adaptivityType != AdaptivityType_None && chkProblemInformation->isChecked()) { destination.replace("[ProblemInformation.AdaptivityType]", "<table><tr><td>" + tr("Adaptivity type:") + "</td><td>" + adaptivityTypeString(Util::scene()->problemInfo()->adaptivityType) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.AdaptivitySteps]", "<tr><td>" + tr("Adaptivity steps:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->adaptivitySteps) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.AdaptivityTolerance]", "<tr><td>" + tr("Adaptivity tolerance:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->adaptivityTolerance) + "</td></tr></table>", Qt::CaseSensitive); destination.replace("[ProblemInformation.MaxDOFs]", "<tr><td>" + tr("Maximum DOFs:") + "</td><td>" + QString::number(Util::config()->maxDofs) + "</td></tr></table>", Qt::CaseSensitive); } else { // remove empty tags QString tag [4] = {"[ProblemInformation.AdaptivityType]", "[ProblemInformation.AdaptivitySteps]", "[ProblemInformation.AdaptivityTolerance]", "[ProblemInformation.MaxDOFs]"}; for (int i = 0; i < 3; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } if ((Util::scene()->problemInfo()->hermes()->hasHarmonic() || Util::scene()->problemInfo()->analysisType == AnalysisType_Transient) && chkProblemInformation->isChecked()) { destination.replace("[ProblemInformation.Frequency]", "<table><tr><td>" + tr("Adaptivity type:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->frequency) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.TimeStep]", "<tr><td>" + tr("Adaptivity type:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->timeStep.number) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.TimeTotal]", "<tr><td>" + tr("Adaptivity type:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->timeTotal.number) + "</td></tr>", Qt::CaseSensitive); destination.replace("[ProblemInformation.InititalCondition]", "<tr><td>" + tr("Adaptivity type:") + "</td><td>" + QString::number(Util::scene()->problemInfo()->initialCondition.number) + "</td></tr></table>", Qt::CaseSensitive); } else { // remove empty tags QString tag [4] = {"[ProblemInformation.Frequency]", "[ProblemInformation.TimeStep]", "[ProblemInformation.TimeTotal]", "[ProblemInformation.InititalCondition]",}; for (int i = 0; i < 4; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } } else { // remove empty tags QString tag [17] = {"[ProblemInformation.Label]", "[ProblemInformation.Name]", "[ProblemInformation.Date]", "[ProblemInformation.FileName]", "[ProblemInformation.ProblemType]", "[ProblemInformation.PhysicField]", "[ProblemInformation.AnalysisType]", "[ProblemInformation.NumberOfRefinements]", "[ProblemInformation.PolynomialOrder]", "[ProblemInformation.AdaptivityType]", "[ProblemInformation.AdaptivityType]", "[ProblemInformation.AdaptivitySteps]", "[ProblemInformation.AdaptivityTolerance]", "[ProblemInformation.Frequency]", "[ProblemInformation.TimeStep]", "[ProblemInformation.TimeTotal]", "[ProblemInformation.InititalCondition]"}; for (int i = 0; i < 16; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } // startup script if (chkStartupScript->isChecked()) { destination.replace("[StartupScript.Label]", "<h2>" + tr("Startup Script") + "</h2>", Qt::CaseSensitive); destination.replace("[StartupScript]", "<pre>" + Util::scene()->problemInfo()->scriptStartup + "</pre>", Qt::CaseSensitive); } else { destination.remove("[StartupScript.Label]", Qt::CaseSensitive); destination.remove("[StartupScript]", Qt::CaseSensitive); } // physical properties if (chkPhysicalProperties->isChecked()) { destination.replace("[PhysicalProperties.Label]", "<h2>" + tr("Physical Properties") + "</h2>", Qt::CaseSensitive); destination.replace("[Materials.Label]", "<h3>" + tr("Materials") + "</h3>", Qt::CaseSensitive); destination.replace("[Materials]", htmlMaterials(), Qt::CaseSensitive); destination.replace("[Boundaries.Label]", "<h3>" + tr("Boundaris conditions") + "</h3>", Qt::CaseSensitive); destination.replace("[Boundaries]", htmlBoundaries(), Qt::CaseSensitive); } else { // remove empty tags QString tag [5] = {"[PhysicalProperties.Label]", "[Materials.Label]", "[Materials]", "[Boundaries.Label]", "[Boundaries]"}; for (int i = 0; i < 5; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } // geometry if (chkGeometry->isChecked()) { destination.replace("[Geometry.Label]", "<h2>" + tr("Geometry") + "</h2>", Qt::CaseSensitive); destination.replace("[Geometry.Nodes.Label]", "<h3>" + tr("Nodes") + "</h3>", Qt::CaseSensitive); destination.replace("[Geometry.Nodes]", htmlGeometryNodes(), Qt::CaseSensitive); destination.replace("[Geometry.Edges.Label]", "<h3>" + tr("Edges") + "</h3>", Qt::CaseSensitive); destination.replace("[Geometry.Edges]", htmlGeometryEdges(), Qt::CaseSensitive); destination.replace("[Geometry.Labels.Label]", "<h3>" + tr("Labels") + "</h3>", Qt::CaseSensitive); destination.replace("[Geometry.Labels]", htmlGeometryLabels(), Qt::CaseSensitive); } else { // remove empty tags QString tag [7] = {"[Geometry.Label]", "[Geometry.Nodes.Label]", "[Geometry.Nodes]", "[Geometry.Edges.Label]", "[Geometry.Edges]", "[Geometry.Labels.Label]", "[Geometry.Labels]"}; for (int i = 0; i < 7; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } // solver if (chkMeshAndSolution->isChecked()) { QTime time; time = milisecondsToTime(Util::scene()->sceneSolution()->timeElapsed()); destination.replace("[MeshAndSolver.Label]", "<h2>" + tr("Mesh and Solution") + "</h2>", Qt::CaseSensitive); destination.replace("[Solver.Label]", "<h3>" + tr("Solver information") + "</h3>", Qt::CaseSensitive); destination.replace("[Solver.Nodes]", "<table><tr><td>" + tr("Nodes:") + "</td><td>" + QString::number(Util::scene()->sceneSolution()->meshInitial()->get_num_nodes()) + "</td></tr>", Qt::CaseSensitive); destination.replace("[Solver.Elements]", "<tr><td>" + tr("Elements:") + "</td><td>" + QString::number(Util::scene()->sceneSolution()->meshInitial()->get_num_active_elements()) + "</td></tr>", Qt::CaseSensitive); destination.replace("[Solver.DOFs]", "<tr><td>" + tr("DOFs:") + "</td><td>" + QString::number(Util::scene()->sceneSolution()->sln()->get_num_dofs()) + "</td></tr>", Qt::CaseSensitive); destination.replace("[Solver.TimeElapsed]", "<tr><td>" + tr("Elapsed time:") + "</td><td>" + time.toString("mm:ss.zzz") + " s</td></tr></table>", Qt::CaseSensitive); if (Util::scene()->problemInfo()->adaptivityType != AdaptivityType_None) { destination.replace("[Solver.AdaptiveError]", "<table><tr><td>" + tr("Adaptive error:") + "</td><td>" + QString::number(Util::scene()->sceneSolution()->adaptiveError(), 'f', 3) + "</td></tr>", Qt::CaseSensitive); destination.replace("[Solver.AdaptiveSteps]", "<tr><td>" + tr("Adaptive steps:") + "</td><td>" + QString::number(Util::scene()->sceneSolution()->adaptiveSteps()) + "</td></tr></table>", Qt::CaseSensitive); } else { // remove empty tags QString tag [2] = {"[Solver.AdaptiveError]", "[Solver.AdaptiveSteps]"}; for (int i = 0; i < 2; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } } else { // remove empty tags QString tag [8] = {"[MeshAndSolver.Label]", "[Solver.Label]", "[Solver.Nodes]", "[Solver.Elements]", "[Solver.DOFs]", "[Solver.TimeElapsed]", "[Solver.AdaptiveError]", "[Solver.AdaptiveSteps]"}; for (int i = 0; i < 8; i++) { destination.remove(tag[i].toUtf8(), Qt::CaseSensitive); } } // script if (chkScript->isChecked()) { destination.replace("[Script.Label]", "<h2>" + tr("Script") + "</h2>", Qt::CaseSensitive); destination.replace("[Script]", "<pre>" + createPythonFromModel() + "</pre>", Qt::CaseSensitive); } else { destination.remove("[Script.Label]", Qt::CaseSensitive); destination.remove("[Script]", Qt::CaseSensitive); } // footer destination.replace("[Report.Footer]", "<p id=\"footer\">" + tr("Computed by Agros2D (<a href=\"http://agros2d.org/\">http://agros2d.org/</a>)") + "</p>"); // figures if (chkFigureGeometry->isChecked()) destination.replace("[Figure.Geometry]", htmlFigure("geometry.png", tr("Geometry")), Qt::CaseSensitive); else destination.remove("[Figure.Geometry]", Qt::CaseSensitive); if (chkFigureMesh->isChecked()) destination.replace("[Figure.Mesh]", htmlFigure("mesh.png", tr("Mesh")), Qt::CaseSensitive); else destination.remove("[Figure.Mesh]", Qt::CaseSensitive); if (chkFigureOrder->isChecked()) destination.replace("[Figure.Order]", htmlFigure("order.png", tr("Polynomial order")), Qt::CaseSensitive); else destination.remove("[Figure.Order]", Qt::CaseSensitive); if (chkFigureScalarView->isChecked()) destination.replace("[Figure.ScalarView]", htmlFigure("scalarview.png", tr("ScalarView: ") + physicFieldVariableString(Util::scene()->problemInfo()->hermes()->scalarPhysicFieldVariable())), Qt::CaseSensitive); else destination.remove("[Figure.ScalarView]", Qt::CaseSensitive); if (chkFigureContourView->isChecked()) destination.replace("[Figure.ContourView]", htmlFigure("contourview.png", tr("ContourView: ") + physicFieldVariableString(Util::scene()->problemInfo()->hermes()->contourPhysicFieldVariable())), Qt::CaseSensitive); else destination.remove("[Figure.ContourView]", Qt::CaseSensitive); if (chkFigureVectorView->isChecked()) destination.replace("[Figure.VectorView]", htmlFigure("vectorview.png", tr("VectorView: ") + physicFieldVariableString(Util::scene()->problemInfo()->hermes()->vectorPhysicFieldVariable())), Qt::CaseSensitive); else destination.remove("[Figure.VectorView]", Qt::CaseSensitive); return destination; }