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); } }
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; }