void CumulativeVolume::computeMode1(Geometry *geometry, int timestep) {
    QVector<float> &x = geometry->deltaXVector();
    QVector<float> &y = geometry->deltaYVector();
    QVector<float> &z = geometry->deltaZVector();

    double totalVolume = 0;
    for(int i=0; i<x.size(); i++) {
        totalVolume += x[i]*x[i]*x[i];
        totalVolume += y[i]*y[i]*y[i];
        totalVolume += z[i]*z[i]*z[i];
    }

    double oneOverTotalVolume = 1.0 / totalVolume;
    int numberOfPores = 3*x.size();

    gsl_vector * poreVolumes = gsl_vector_alloc (numberOfPores);
    gsl_vector * poreVolumesNormalized = gsl_vector_alloc (numberOfPores);
    gsl_vector * poreLengths = gsl_vector_alloc(numberOfPores);
    int poreIndex = 0;
    for(int i=0; i<x.size(); i++) {
        float pores[3];
        pores[0] = x[i];
        pores[1] = y[i];
        pores[2] = z[i];
        for(int a=0; a<3; a++) {
            float poreLength = pores[a];
            const float dV = poreLength*poreLength*poreLength;
            gsl_vector_set(poreVolumes, poreIndex, dV);
            gsl_vector_set(poreLengths, poreIndex, poreLength);
            gsl_vector_set(poreVolumesNormalized, poreIndex, dV * oneOverTotalVolume);
            poreIndex++;
        }
    }

    gsl_sort_vector2(poreVolumes, poreLengths); // Sort both vectors based on the first
    gsl_sort_vector(poreVolumesNormalized);

    // Set the x values and be ready to make plot data
    m_points.clear();
    m_points.reserve(bins());
    float dx = (max() - min()) / (bins() - 1);
    for(int i=0; i<bins(); i++) {
        float x = min() + i*dx;
        m_points.push_back(QPointF(x,0));
    }

    for(int i=0; i<numberOfPores; i++) {
        float dVN = gsl_vector_get(poreVolumesNormalized, i); // dVN deltaVolumeNormalized
        float poreSize = gsl_vector_get(poreLengths, i);
        int bin = poreSize / dx;
        if(bin>=bins()) continue; // Some pore sizes might be larger than largest? Don't seg fault
        m_points[bin].setY(m_points[bin].y() + dVN);
    }

    for(int i=1; i<bins(); i++) {
        qreal newValue = m_points[i].y() + m_points[i-1].y();
        m_points[i].setY(newValue);
    }
}
void CumulativeVolume::computeMode0(Geometry *geometry, int timestep) {
    QVector<float> &x = geometry->deltaXVector();
    QVector<float> &y = geometry->deltaYVector();
    QVector<float> &z = geometry->deltaZVector();

    double totalVolume = geometry->totalVolume();
    double oneOverTotalVolume = 1.0 / totalVolume;
    int numberOfPores = x.size()*y.size()*z.size();

    gsl_vector * poreVolumes = gsl_vector_alloc (numberOfPores);
    gsl_vector * poreVolumesNormalized = gsl_vector_alloc (numberOfPores);
    gsl_vector * poreLengths = gsl_vector_alloc(numberOfPores);
    int poreIndex = 0;
    for(int i=0; i<x.size(); i++) {
        const float dx = x[i];
        for(int j=0; j<y.size(); j++) {
            const float dy = y[j];
            for(int k=0; k<z.size(); k++) {
                const float dz = z[k];
                const float dV = dx*dy*dz;
                float poreLength = std::min(std::min(dx, dy), dz);
#ifdef POREISCBRT
                poreLength = cbrt(dV);
#endif
                gsl_vector_set(poreVolumes, poreIndex, dV);
                gsl_vector_set(poreLengths, poreIndex, poreLength);
                gsl_vector_set(poreVolumesNormalized, poreIndex, dV * oneOverTotalVolume);
                poreIndex++;
            }
        }
    }

    gsl_sort_vector2(poreVolumes, poreLengths); // Sort both vectors based on the first
    gsl_sort_vector(poreVolumesNormalized);

    // Set the x values and be ready to make plot data
    m_points.clear();
    m_points.reserve(bins());
    float dx = (max() - min()) / (bins() - 1);
    for(int i=0; i<bins(); i++) {
        float x = min() + i*dx;
        m_points.push_back(QPointF(x,0));
    }

    for(int i=0; i<numberOfPores; i++) {
        float dVN = gsl_vector_get(poreVolumesNormalized, i); // dVN deltaVolumeNormalized
        float poreSize = gsl_vector_get(poreLengths, i);
        int bin = poreSize / dx;
        if(bin>=bins()) continue; // Some pore sizes might be larger than largest? Don't seg fault
        m_points[bin].setY(m_points[bin].y() + dVN);
    }

    for(int i=1; i<bins(); i++) {
        qreal newValue = m_points[i].y() + m_points[i-1].y();
        m_points[i].setY(newValue);
    }


}
Example #3
0
File: necorrJ.c Project: pa345/lib
int
search_Ne_peak(const time_t t, const double peak_qd_min,
               const double peak_qd_max, const track_workspace *track_p,
               const satdata_mag *data, curr_profile *prof)
{
  int s = 0;
  size_t i;
  int track_idx = -1;

  for (i = 0; i < track_p->n; ++i)
    {
      track_data *tptr = &(track_p->tracks[i]);
      time_t t_eq = satdata_epoch2timet(tptr->t_eq);

      if (abs(t - t_eq) < 10)
        {
          track_idx = (int) i;
          break;
        }
    }

  if (track_idx < 0)
    {
      fprintf(stderr, "search_Ne_peak: track not found for time %ld\n", t);
      return -1;
    }

  {
    const size_t width_points = 100;        /* number of points in half-width of peak */
    track_data *tptr = &(track_p->tracks[track_idx]);
    size_t sidx = tptr->start_idx;
    size_t n = tptr->n;
    gsl_vector_view qd = gsl_vector_view_array(&(data->qdlat[sidx]), n);
    gsl_vector_view ne = gsl_vector_view_array(&(data->ne[sidx]), n);
    size_t npeak;
    peak_workspace *peak_p = peak_alloc(n);
    size_t ne_idx[MAX_PEAKS];

    npeak = find_ne_peaks(peak_qd_min, peak_qd_max, width_points,
                          &qd.vector, &ne.vector, ne_idx, peak_p);

    /* if more than 1 peak found, choose the largest */
    if (npeak > 1)
      {
        double max_Ne = -1.0e6;
        size_t max_idx = 0;

        for (i = 0; i < npeak; ++i)
          {
            size_t idx = ne_idx[i];
            double Ne = gsl_vector_get(&ne.vector, idx);

            if (Ne > max_Ne)
              {
                max_Ne = Ne;
                max_idx = idx;
              }
          }

        ne_idx[0] = max_idx;
        npeak = 1;
      }

    if (npeak == 1)
      {
        gsl_vector *qdvec = gsl_vector_alloc(n);
        gsl_vector *nevec = gsl_vector_alloc(n);
        double eq_Ne; /* value of Ne at equator */

        gsl_vector_memcpy(qdvec, &qd.vector);
        gsl_vector_memcpy(nevec, &ne.vector);
        gsl_sort_vector2(qdvec, nevec);

        eq_Ne = interp_xy(qdvec->data, nevec->data, n, 0.0);

        prof->qdlat_Ne = gsl_vector_get(&qd.vector, ne_idx[0]);
        prof->peak_Ne = gsl_vector_get(&ne.vector, ne_idx[0]);
        prof->ctr_Ne = prof->peak_Ne - eq_Ne;

        gsl_vector_free(qdvec);
        gsl_vector_free(nevec);

        s = 0;
      }
    else
      s = -1; /* peak not found */

    peak_free(peak_p);
  }

  return s;
}