Brief description of class still missing. More...
#include <DepthDistribution.h>
Public Member Functions | |
| double | a () const |
| bool | calculate () |
| DepthDistribution () | |
| double | derivative (double q) const |
| int | layerCount () const |
| double | maximumDepth (int i) const |
| double | maximumWavelength () const |
| double | minimumDepth (int i) const |
| double | minimumWavelength () const |
| double | q () const |
| void | report (QTextStream &s) const |
| bool | setLayerCount (int layerCount) |
| void | setMaximumWavelength (double m) |
| void | setMinimumWavelength (double m) |
| double | thickness (int i) const |
| double | y (double q) const |
Brief description of class still missing.
Full description of class still missing
| double DepthDistribution::a | ( | ) | const [inline] |
{return _a;}
| bool DepthDistribution::calculate | ( | ) |
References QGpCoreTools::endl(), QGpCoreTools::RootSolverTemplate< double, FunctionClass >::halving(), QGpCoreTools::RootSolverTemplate< double, FunctionClass >::lower(), QGpCoreTools::RootSolverTemplate< double, FunctionClass >::setInterval(), QGpCoreTools::RootSolverTemplate< double, FunctionClass >::setPrecision(), QGpCoreTools::tr(), TRACE, and y().
Referenced by main().
{
TRACE;
_depths.clear();
double z=0.0;
if(_n==1) {
_q=1;
_depths.append(0);
_depths.append(_a);
_depths.append(0.5*_maximumWavelength);
} else {
// To have one solution, the derivative at 1 must be negative
// n*a>max
if(_n*_a>=0.5*_maximumWavelength) {
App::stream() << tr("No solution, decrease the number of layers or increase the ratio between min and max wavelength") << endl;
return false;
}
// Search root with a step that doubles at each iteration
double dx=1e-15;
while(y(1.0+dx)<0.0) {
dx*=2;
}
RootSolver<DepthDistribution> solver(this);
solver.setPrecision(1e-10);
solver.setInterval(1.0+dx*0.5, 1.0+dx);
//solver.newtonRaphson();
solver.halving();
_q=solver.lower();
// Calculate depths at top of each layer
for(int i=0;i<_n+2;i++) {
_depths.append(z);
z+=_a*pow(_q,i);
}
}
return true;
}
| double DepthDistribution::derivative | ( | double | q | ) | const |
{
return _n*_a*pow(q,_n-1)
-0.5*_maximumWavelength;
}
| int DepthDistribution::layerCount | ( | ) | const [inline] |
Referenced by main(), and setLayerCount().
{return _n;}
| double DepthDistribution::maximumDepth | ( | int | i | ) | const |
| double DepthDistribution::maximumWavelength | ( | ) | const [inline] |
{return _maximumWavelength;}
| double DepthDistribution::minimumDepth | ( | int | i | ) | const |
| double DepthDistribution::minimumWavelength | ( | ) | const [inline] |
{return _minimumWavelength;}
| double DepthDistribution::q | ( | ) | const [inline] |
{return _q;}
| void DepthDistribution::report | ( | QTextStream & | s | ) | const |
References QGpCoreTools::endl(), and TRACE.
Referenced by main().
{
TRACE;
s << "# h[i]=" << _a << "*" << _q << "^i" << endl;
s << "# i | h | z at top | z at bottom | min[z] | max[z]" << endl;
for(int i=0;i<_n;i++) {
double z=_depths[i];
double dz1=_depths[i+1]-z;
double dz2=_depths[i+2]-_depths[i+1];
s << i << " " << dz1 << " " << z << " " << z+dz1 << " " << z+0.5*dz1 << " " << z+dz1+0.5*dz2 << endl;
}
s << _n << " inf " << _depths[_n] << endl;
}
| bool DepthDistribution::setLayerCount | ( | int | layerCount | ) |
If layerCount==1 => returns just a range based on min and max
References layerCount(), and TRACE.
Referenced by main().
{
TRACE;
if(layerCount<=0) return false;
_n=layerCount;
return true;
}
| void DepthDistribution::setMaximumWavelength | ( | double | m | ) | [inline] |
Referenced by main().
{_maximumWavelength=m;}
| void DepthDistribution::setMinimumWavelength | ( | double | m | ) |
| double DepthDistribution::thickness | ( | int | i | ) | const |
| double DepthDistribution::y | ( | double | q | ) | const |
Referenced by calculate().