@@ -42,34 +42,54 @@ double WangRathjePeakCalculator::calcDurationRms(
4242 duration, oscFreq, oscDamping, siteTransFunc);
4343
4444 bool validTransFunc = false ;
45- validTransFunc &= siteTransFunc.size () == _freqs.size ();
46- // Make sure there are some values greater than 1
47- if (validTransFunc) {
45+ // Make sure there are some values greater than 1.1
46+ if (siteTransFunc.size () == _freqs.size ()) {
4847 for (std::complex <double > stf : siteTransFunc) {
49- if (abs (abs ( stf) - 1 .) > 1E- 1 ) {
48+ if (abs (stf) > 1.1 ) {
5049 validTransFunc = true ;
5150 break ;
5251 }
5352 }
5453 }
54+ qDebug () << validTransFunc;
5555
5656 // Modify the duration for the soil response
5757 if (validTransFunc) {
58+ // Compute the expected rock oscillator duration
59+
60+ // Equation 4a
61+ const double fLim = 5.274 * std::pow (duration, -0.640 );
62+ double ratio = 1 ;
63+ // Equation 2
64+ if (0.1 <= oscFreq && oscFreq < fLim ) {
65+ // Equation 4b
66+ const double dur0 = 31.858 * std::pow (duration, -0.849 );
67+ // Equation 4c
68+ const double durMin = 1.009 * duration / (3.583 + duration);
69+ // Equation 3b
70+ const double b = 1 / (dur0 - durMin);
71+ // Equation 3a
72+ const double a = (1 / (dur0 - 1 ) - b) * (fLim - 0.1 );
73+ // Equation 2
74+ ratio = (dur0 - (oscFreq - 0.1 ) / (a + b * (oscFreq - 0.1 )));
75+ }
76+
77+ const double durOscRock = ratio * duration;
78+
79+ // Compute the expected soil oscillator duration
5880 QList<double > modeFreqs;
5981 QList<double > modeAmps;
6082
61- QVector<double > absSiteTransFunc;
62- for (std:: complex < double > stf : siteTransFunc ) {
63- absSiteTransFunc << abs (stf );
83+ QVector<double > absSiteTransFunc (siteTransFunc. size ()) ;
84+ for (int i = 0 ; i < absSiteTransFunc. size (); ++i ) {
85+ absSiteTransFunc[i] = std:: abs (siteTransFunc. at (i) );
6486 }
6587
6688 // Compute the location of the peaks in the transfer function
6789 const int offset = 2 ;
6890 bool valid;
6991 for (int i = offset; i < (_freqs.size () - offset); ++i) {
7092 valid = true ;
71- qDebug () << _freqs.at (i) << absSiteTransFunc.at (i);
72-
7393 for (int j = (i - offset); j <= (i + offset); ++j) {
7494 if (j < i) {
7595 valid &= absSiteTransFunc.at (j) < absSiteTransFunc.at (i);
@@ -90,19 +110,21 @@ double WangRathjePeakCalculator::calcDurationRms(
90110 // Amplitude / frequency ratio of the first mode
91111 double afRatio = modeAmps.at (0 ) / modeFreqs.at (0 );
92112
93- double a ;
113+ double incrMax ;
94114 double c;
95115 double m;
96116 double incr = 0 ;
97117 for (int i = 0 ; i < modeFreqs.size (); ++i) {
98118 c = _coefs.at (i).a * afRatio + _coefs.at (i).b * std::pow (afRatio, 2 );
99119 m = _coefs.at (i).d * afRatio + _coefs.at (i).e * std::pow (afRatio, 2 );
100- a = c * std::exp (-duration / m);
101- incr += (a * std::exp (-std::pow (std::log (oscFreq / modeFreqs.at (i)), 2 ) /
120+ incrMax = c * std::exp (-duration / m);
121+ incr += (incrMax * std::exp (-std::pow (std::log (oscFreq / modeFreqs.at (i)), 2 ) /
102122 (2 * std::pow (_coefs.at (i).sd , 2 )))
103123 );
104124 }
105- durationRms += incr;
125+ const double durOscSoil = durOscRock + incr;
126+ qDebug () << oscFreq << durationRms << durationRms * (durOscSoil/ durOscRock);
127+ durationRms *= (durOscSoil / durOscRock);
106128 }
107129 return durationRms;
108130}
0 commit comments