Skip to content

Commit 3ea7c3e

Browse files
committed
Improved dependent scattering warning message
1 parent fb2add3 commit 3ea7c3e

7 files changed

Lines changed: 190 additions & 86 deletions

File tree

src/app/calc/calculate.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -470,15 +470,15 @@ void Calculate::DiameterRangeSetting(Parameters *para, unsigned int index)
470470

471471
// Determines the scattering regime based on Tien et. al, A.R. Heat Trandfer 1(1987) & Galy et al. JQSRT 246(2020)
472472
bool Calculate::CheckIndependentScattering(Parameters *para, double &clearanceToWavelength, double &sizeParameter,
473-
double &volFraction, double &criticalWavelength, QString &strRegime,
474-
bool flagVolFlag)
473+
double &volFraction, double &wavelength, double &clearance,
474+
QString &strRegime, bool flagVolFlag)
475475
{
476476
double const volumeConstant = (4.0/3.0) * M_PI ;
477477
double effectiveRadius = 0.0;
478-
double interParticleDistance;
478+
double interparticleDistance;
479479

480-
// Calculate wavelengths in microns
481-
criticalWavelength = para->endWavel;
480+
// Calculate wavelength in the medium in microns
481+
wavelength = 1e-3 * para->endWavel / para->medRef;
482482

483483
if (para->nRadius == 1) //monodisperse
484484
{
@@ -492,7 +492,7 @@ bool Calculate::CheckIndependentScattering(Parameters *para, double &clearanceTo
492492
{
493493
volFraction = singleSphVolume * para->numDensityArray[0] / 1e9;
494494
}
495-
interParticleDistance = 1e3 / pow(para->numDensityArray[0], 1.0 / 3.0);
495+
interparticleDistance = 1e3 / pow(para->numDensityArray[0], 1.0 / 3.0);
496496
}
497497
else //polydisperse
498498
{
@@ -512,14 +512,15 @@ bool Calculate::CheckIndependentScattering(Parameters *para, double &clearanceTo
512512
{
513513
volFraction = totalVolume / 1e9;
514514
}
515-
interParticleDistance = 1e3 / pow(totalNumDensity, 1.0 / 3.0);
515+
interparticleDistance = 1e3 / pow(totalNumDensity, 1.0 / 3.0);
516516

517517
double averageVolume = totalVolume / totalNumDensity;
518518
effectiveRadius = pow(3.0 * averageVolume / (4.0 * M_PI), 1.0/3.0);
519519
}
520520

521-
clearanceToWavelength = (interParticleDistance - 2 * effectiveRadius) * 1e3 * para->medRef / criticalWavelength;
522-
sizeParameter = 2.0 * M_PI * effectiveRadius * 1e3 * para->medRef / criticalWavelength;
521+
clearance = interparticleDistance - 2 * effectiveRadius;
522+
clearanceToWavelength = clearance / wavelength;
523+
sizeParameter = 2.0 * M_PI * effectiveRadius / wavelength;
523524

524525
// Determine the threshold for clearance based on the size parameter (Galy 2020)
525526
double requiredClearance = (sizeParameter <= 2.0) ? 2.0 : 5.0;

src/app/calc/calculate.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class Calculate
3333
double CalculateG(std::complex<double> *S1, std::complex<double> *S2, Parameters *para);
3434
bool CheckIndependentScattering(Parameters *para, double &clearanceToWavelength,
3535
double &sizeParameter, double &volFraction,
36-
double &criticalWavelength, QString &strRegime,
37-
bool flagVolFlag);
36+
double &wavelength, double &clearance,
37+
QString &strRegime, bool flagVolFlag);
3838
};
3939

4040
#endif // CALCULATE_H

src/app/dialog/mainwindow.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ void MainWindow::on_pushButton_RunSimulation_clicked()
170170

171171
//Enable widgets
172172
support.DisableWidgetsDuringSimulation(ui, mPara, false);
173+
174+
//Check dependent scattering
175+
support.CheckIndependentScattering(ui, mPara);
173176
}
174177

175178
//Poly disperse
@@ -195,6 +198,9 @@ void MainWindow::on_pushButton_RunSimulation_clicked()
195198
support.DisableWidgetsDuringCustomPolyDisperseData(ui, true);
196199
else
197200
support.DisableWidgetsDuringCustomPolyDisperseData(ui, false);
201+
202+
//Check dependent scattering
203+
support.CheckIndependentScattering(ui, mPara);
198204
}
199205
}
200206
}

src/app/dialog/mainwindowsupport.cpp

Lines changed: 82 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -325,16 +325,6 @@ void MainWindowSupport::ProcessMonoDisperse(Ui_MainWindow *ui, Parameters *para)
325325
plot.AssignValuesPhaseFunctionLinearPlot(ui,para);
326326
plot.AssignValuesS1S2Plot(ui, para);
327327
plot.AssignValuesOtherPlots(ui, para);
328-
329-
//Check independent/dependent scattering
330-
double clearanceToWavelength, sizeParameter, volFraction, criticalWavelength;
331-
QString strRegime;
332-
bool flagVolFrac = ui->radioButton_VolFrac->isChecked();
333-
if(mCalc->CheckIndependentScattering(para, clearanceToWavelength, sizeParameter, volFraction,
334-
criticalWavelength, strRegime, flagVolFrac))
335-
{
336-
PrepareScatteringRegimeWarning(clearanceToWavelength, sizeParameter, volFraction, criticalWavelength, strRegime);
337-
}
338328
}
339329

340330
// Run Poly disperse distribution
@@ -355,16 +345,6 @@ void MainWindowSupport::ProcessPolyDisperse(Ui_MainWindow *ui, Parameters *para)
355345
plot.AssignValuesPhaseFunctionLinearPlot(ui,para);
356346
plot.AssignValuesS1S2Plot(ui, para);
357347
plot.AssignValuesOtherPlots(ui, para);
358-
359-
//Check independent/dependent scattering
360-
double clearanceToWavelength, sizeParameter, volFraction, criticalWavelength;
361-
QString strRegime;
362-
bool flagVolFrac = ui->radioButton_VolFrac->isChecked();
363-
if(mCalc->CheckIndependentScattering(para, clearanceToWavelength, sizeParameter, volFraction,
364-
criticalWavelength, strRegime, flagVolFrac))
365-
{
366-
PrepareScatteringRegimeWarning(clearanceToWavelength, sizeParameter, volFraction, criticalWavelength, strRegime);
367-
}
368348
}
369349

370350
//Sphere distribution in polydisperse
@@ -623,34 +603,48 @@ void MainWindowSupport::ReadCustomData(Parameters *para, QString fileName, bool
623603
}
624604
}
625605

606+
//Check independent/dependent scattering
607+
void MainWindowSupport::CheckIndependentScattering(Ui_MainWindow *ui, Parameters *para)
608+
{
609+
mCalc = new Calculate();
610+
611+
double clearanceToWavelength, sizeParameter, volFraction, wavelength, clearance;
612+
QString strRegime;
613+
bool flagVolFrac = ui->radioButton_VolFrac->isChecked();
614+
if(mCalc->CheckIndependentScattering(para, clearanceToWavelength, sizeParameter, volFraction,
615+
wavelength, clearance, strRegime, flagVolFrac))
616+
{
617+
PrepareScatteringRegimeWarning(clearanceToWavelength, sizeParameter, volFraction,
618+
wavelength, clearance, strRegime);
619+
}
620+
}
621+
626622
//Prepare Scattering Regime Warning
627623
void MainWindowSupport::PrepareScatteringRegimeWarning(double clearanceToWavelength, double sizeParameter,
628-
double volFraction, double criticalWavelength,
629-
QString strRegime)
624+
double volFraction, double wavelength,
625+
double clearance, QString strRegime)
630626
{
631627
QString strClearance = QString::number(clearanceToWavelength, 'f', 3);
628+
bool isIndependentTien = true;
629+
bool isIndependentGaly = true;
630+
QString strTienCriteria;
631+
QString strGalyCriteria;
632632

633-
// Logic, Threshold Strings and Hyperlink for Tien and Drolen
634-
bool isIndependentTien = (clearanceToWavelength > 0.5);
635-
QString strTienResult = isIndependentTien ?
636-
QString("<font color='green'>Independent</font> (c/&lambda;=%1)").arg(strClearance) :
637-
QString("<font color='red'>Dependent</font> (c/&lambda;=%1)").arg(strClearance);
638-
QString strTienCriteria = "c/&lambda; > 0.5";
639633
QString strTienDorlenLink = "<a href='https://doi.org/10.1615/AnnualRevHeatTransfer.v1.30' style='color: #0000EE;'>Tien and Drolen (1987)</a>";
640-
641-
// Logic, Threshold Strings and Hyperlink for Galy et al.
642-
bool isIndependentGaly = false;
643-
QString strGalyCriteria;
644634
QString strGalyLink = "<a href='https://doi.org/10.1016/j.jqsrt.2020.106924' style='color: #0000EE;'>Galy et al. (2020)</a>";
645635

636+
// Low Concentration Regime
646637
if (volFraction <= 0.006)
647638
{
648639
if (sizeParameter > 0.388)
649640
{
641+
isIndependentTien = (clearanceToWavelength > 0.5);
642+
strTienCriteria = "c/&lambda; > 0.5 (&chi; &ge; 0.388)";
643+
650644
if (sizeParameter <= 2.0)
651645
{
652646
isIndependentGaly = (clearanceToWavelength > 2.0);
653-
strGalyCriteria = "c/&lambda; > 2.0 (0.388 &le; &chi; &le; 2)";
647+
strGalyCriteria = "c/&lambda; > 2.0 (&chi; &le; 2)";
654648
}
655649
else
656650
{
@@ -660,45 +654,72 @@ void MainWindowSupport::PrepareScatteringRegimeWarning(double clearanceToWavelen
660654
}
661655
else
662656
{
657+
isIndependentTien = true;
658+
strTienCriteria = "&chi; &le; 0.388";
663659
isIndependentGaly = true;
664-
strGalyCriteria = "Independent (&chi; &le; 0.388)";
660+
strGalyCriteria = "&chi; &le; 0.388";
665661
}
666662
}
667663
else
668664
{
669-
if (sizeParameter <= 2.0)
665+
// High Concentration Regime
666+
if (volFraction > 0.1)
670667
{
671-
isIndependentGaly = (clearanceToWavelength > 2.0);
672-
strGalyCriteria = "c/&lambda; > 2.0 (&chi; &le; 2)";
668+
isIndependentTien = false;
669+
strTienCriteria = "f<sub>v</sub> &le; 0.1";
670+
isIndependentGaly = false;
671+
strGalyCriteria = "f<sub>v</sub> &le; 0.1";
673672
}
674-
else
673+
else // Transitional Regime (0.006 < fv <= 0.1)
675674
{
676-
isIndependentGaly = (clearanceToWavelength > 5.0);
677-
strGalyCriteria = "c/&lambda; > 5.0 (&chi; > 2)";
675+
isIndependentTien = (clearanceToWavelength > 0.5);
676+
strTienCriteria = "c/&lambda; > 0.5";
677+
678+
if (sizeParameter <= 2.0)
679+
{
680+
isIndependentGaly = (clearanceToWavelength > 2.0);
681+
strGalyCriteria = "c/&lambda; > 2.0 (&chi; &le; 2)";
682+
}
683+
else
684+
{
685+
isIndependentGaly = (clearanceToWavelength > 5.0);
686+
strGalyCriteria = "c/&lambda; > 5.0 (&chi; > 2)";
687+
}
678688
}
679689
}
680-
QString strGalyResult = isIndependentGaly ?
681-
QString("<font color='green'>Independent</font> (c/&lambda;=%1)").arg(strClearance) :
682-
QString("<font color='red'>Dependent</font> (c/&lambda;=%1)").arg(strClearance);
683690

684-
// --- Detailed Context Section ---
691+
QString strTienResult;
692+
QString strGalyResult;
693+
if (volFraction > 0.1)
694+
{
695+
// Display Volume Fraction as the primary reason for dependency
696+
QString strVolFraction = QString::number(volFraction, 'g', 4);
697+
strTienResult = QString("<font color='red'>Dependent</font> (f<sub>v</sub>=%1)").arg(strVolFraction);
698+
strGalyResult = QString("<font color='red'>Dependent</font> (f<sub>v</sub>=%1)").arg(strVolFraction);
699+
}
700+
else
701+
{
702+
strTienResult = isIndependentTien ?
703+
QString("<font color='green'>Independent</font> (c/&lambda;=%1)").arg(strClearance) :
704+
QString("<font color='red'>Dependent</font> (c/&lambda;=%1)").arg(strClearance);
705+
706+
strGalyResult = isIndependentGaly ?
707+
QString("<font color='green'>Independent</font> (c/&lambda;=%1)").arg(strClearance) :
708+
QString("<font color='red'>Dependent</font> (c/&lambda;=%1)").arg(strClearance);
709+
}
710+
711+
// Detailed Context Section
685712
QString strRegimeContext =
686713
"<b>Regime Definitions:</b><br>"
687714
"• Low Concentration Regime:<b> f<sub>v</sub> &le; 0.006</b><br>"
688715
"• Transitional Regime:<b> 0.006 &lt; f<sub>v</sub> &le; 0.1</b><br>"
689716
"• High Concentration Regime:<b> f<sub>v</sub> &gt; 0.1</b>";
690717

691-
692-
// --- Constructing the Message ---
718+
// Constructing the Message
693719
QString msg = QString(
694720
"<h3>Dependent Scattering Warning</h3>"
695721
"The current parameters suggest <b>dependent</b> scattering effects in the <b>%1</b>. "
696-
"Results should be interpreted with caution.<br><br>"
697-
698-
"<b>Current Parameters:</b><br>"
699-
"• Volume Fraction (<b>f<sub>v</sub></b>) = <b>%8</b><br>"
700-
"• Size Parameter (<b>&chi;</b>) = <b>%9</b> at Wavelength (<b>&lambda;</b>) = <b>%11 nm</b><br>"
701-
"• Clearance to Wavelength Ratio (<b>c/&lambda;</b>) = <b>%10</b><br>"
722+
"Results should be interpreted with caution.<br>"
702723

703724
"<table border='1' cellspacing='0' cellpadding='4' style='border-collapse: collapse; width: 100%;'>"
704725
" <tr bgcolor='#f2f2f2'>"
@@ -710,22 +731,27 @@ void MainWindowSupport::PrepareScatteringRegimeWarning(double clearanceToWavelen
710731
" <tr><td>%5</td><td>%6</td><td>%7</td></tr>"
711732
"</table><br><br>"
712733

713-
"%12"
734+
"<b>Current Parameters:</b><br>"
735+
"• Volume Fraction (<b>f<sub>v</sub></b>) = <b>%8</b><br>"
736+
"• Size Parameter (<b>&chi;</b>) = <b>%9</b><br>"
737+
"• Clearance (<b>c</b>) = Interparticle Distance - 2 &times; Radius = <b>%12 &mu;m </b><br>"
738+
"• Medium Wavelength (<b>&lambda;</b>) = <b>%11 &mu;m</b><br>"
739+
"• Clearance to Wavelength Ratio (<b>c/&lambda;</b>) = <b>%10</b><br><br>"
740+
"%13"
714741
)
715742
.arg(strRegime)
716743
.arg(strTienDorlenLink).arg(strTienCriteria).arg(strTienResult)
717744
.arg(strGalyLink).arg(strGalyCriteria).arg(strGalyResult)
718745
.arg(volFraction, 0, 'g', 4)
719746
.arg(sizeParameter, 0, 'g', 3)
720747
.arg(clearanceToWavelength, 0, 'f', 3)
721-
.arg(criticalWavelength, 0, 'g', 5)
748+
.arg(wavelength, 0, 'g', 5)
749+
.arg(clearance, 0, 'g', 5)
722750
.arg(strRegimeContext);
723751

724752
DisplayWarning(msg);
725753
}
726754

727-
728-
729755
// Display warning message
730756
void MainWindowSupport::DisplayWarning(QString warningMessage)
731757
{

src/app/dialog/mainwindowsupport.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ class MainWindowSupport
2323
void DisableWidgetsDuringSimulation(Ui_MainWindow *ui, Parameters *para, bool flag);
2424
void DisableWidgetsDuringCustomPolyDisperseData(Ui_MainWindow *ui, bool flag);
2525
void ReadCustomData(Parameters * para, QString fileName, bool * dataValidFlag);
26+
void CheckIndependentScattering(Ui_MainWindow *ui, Parameters *para);
2627
void PrepareScatteringRegimeWarning(double clearanceToWavelength, double sizeParameter,
27-
double volFraction, double criticalWavelength,
28-
QString strRegime);
28+
double volFraction, double wavelength,
29+
double clearance, QString strRegime);
2930
void DisplayWarning(QString warningMessage);
3031

3132
private:

0 commit comments

Comments
 (0)