PSDContinuous.h
Go to the documentation of this file.
1 // This file is part of the MercuryDPM project (https://www.mercurydpm.org).
2 // Copyright (c), The MercuryDPM Developers Team. All rights reserved.
3 // License: BSD 3-Clause License; see the LICENSE file in the root directory.
4 
5 #ifndef MERCURYDPM_PSDCONTINUOUS_H
6 #define MERCURYDPM_PSDCONTINUOUS_H
7 
8 #include <fstream>
9 #include <vector>
10 #include "iostream"
11 #include "PSD.h"
12 
30 {
31 // // sets the psd from the probability values given in the file batch_materials_PSD.xlsx
32 // static void checkPSD (std::vector<PSDContinuous>& psd) {
33 // if (psd.empty()) {
34 // logger(ERROR,"psd is empty");
35 // }
36 // if (psd[0].probability!=0) {
37 // logger(WARN,"psd should start with a zero probability");
38 // psd.emplace(psd.begin(),PSDContinuous{psd[0].radius,0});
39 // }
40 // if (psd.back().probability!=1) {
41 // logger(WARN,"psd should end with a unit probability");
42 // psd.emplace_back(PSDContinuous{psd.back().radius,1});
43 // }
44 // }
45 
46  static void print (std::vector<PSDContinuous>& psd);
47 
48  // validate whether psd is a cumulative distribution
49  static void validateCumulativeDistribution (std::vector<PSDContinuous>& psd);
50 
51  // combine vectors of radii and probabilities into psd vector
52  static std::vector<PSDContinuous> createPSDFromRadiiAndProbabilities (const std::vector<double>& radius,
53  const std::vector<double>& probability);
54 
55  // converts a subtractive to a cumulative psd
56  static void convertSubtractiveToCumulative (std::vector<PSDContinuous>& psd);
57 
58  // converst a single to a cumulative psd
59  static void convertCumulativeToSubtractive (std::vector<PSDContinuous>& psd);
60 
61  // converts a subtractive number psd to a subtractive volume psd
62  static void convertSubtractiveVolumeToNumber (std::vector<PSDContinuous>& psd);
63 
64  // converts a cumulative number psd to a cumulative volume psd
65  static void convertCumulativeVolumeToNumber (std::vector<PSDContinuous>& psd);
66 
67  // interpolates the psd linearly
68  static void interpolateCSD (std::vector<PSDContinuous>& psd, unsigned n);
69 
70  // converts a cumulative number psd to a cumulative volume psd and returns
71  static std::vector<PSDContinuous> getCumulativeNumberFromVolume (std::vector<PSDContinuous> psd) {
73  return psd;
74  }
75 
76  //cuts off at given quantiles
77  static std::vector<PSDContinuous> cutoffCumulativeNumber (std::vector<PSDContinuous> psd, double quantileMin, double quantileMax, double minPolydispersity = 0.1) {
78  double radiusMin = getQuantile(psd,quantileMin);
79  double radiusMax = getQuantile(psd,quantileMax);
80  //to get a minimum polydispersity at the base
81  double radiusMinCut = std::min(radiusMin*(1+minPolydispersity),radiusMax);
82  //convert to volume psd
84  //cut off min
85  while (psd.front().radius<=radiusMinCut) psd.erase(psd.begin());
86  psd.insert(psd.begin(),PSDContinuous{radiusMinCut,quantileMin});
87  psd.insert(psd.begin(),PSDContinuous{radiusMin,0});
88  //cut off max
89  while (psd.back().radius>=radiusMax) psd.pop_back();
90  psd.push_back(PSDContinuous{radiusMax,quantileMax});
91  psd.push_back(PSDContinuous{radiusMax,1});
92  //convert to number psd
94  return psd;
95  }
96 
97  //cuts off at given quantiles
98  static std::vector<PSDContinuous> cutoffAndSqueezeCumulativeNumber (std::vector<PSDContinuous> psd, double quantileMin, double quantileMax, double squeeze, double minPolydispersity = 0.1) {
99  double r50 = 0.5*PSDContinuous::getD50(psd);
100  //cut off
101  psd = cutoffCumulativeNumber (psd, quantileMin, quantileMax, minPolydispersity);
102  //convert to volume psd
104  //squeeze psd
105  for (auto& p : psd) {
106  p.radius = r50+(p.radius-r50)*squeeze;
107  }
108  //convert to number psd
110  return psd;
111  }
112 
113  // converts a subtractive number psd to a subtractive volume psd
114  static void convertSubtractiveNumberToVolume (std::vector<PSDContinuous>& psd);
115 
116  // converts a cumulative number psd to a cumulative volume psd
117  static void convertCumulativeNumberToVolume (std::vector<PSDContinuous>& psd);
118 
119 // // returns a cumulative number particle size distribution from a given volume particle size distribution
120 // static std::vector<PSDContinuous> setFromVolumePSD (const std::vector<double>& radius,
121 // const std::vector<double>& probability);
122 
123  // get quantile size
124  //todo the D0 and D100 should be fixed.
125  static double getD0 (const std::vector<PSDContinuous>& psd){
126  return 2.0*getQuantile(psd,0.0);
127  }
128 
129  static double getD10 (const std::vector<PSDContinuous>& psd){
130  return 2.0*getQuantile(psd,0.1);
131  }
132 
133  static double getD50 (const std::vector<PSDContinuous>& psd){
134  return 2.0*getQuantile(psd,0.5);
135  }
136 
137  static double getD90 (const std::vector<PSDContinuous>& psd){
138  return 2.0*getQuantile(psd,0.9);
139  }
140 
141  static double getD100 (const std::vector<PSDContinuous>& psd){
142  return 2.0*getQuantile(psd,1.0);
143  }
144 
145 
146  // get quantile of volume distribution, e.g. 2.0*getQuantile(psd,0.5) gets D50
147  static double getQuantile(std::vector<PSDContinuous> psd, double quantile);
148 
149  // get radius r such that a monodisperse system has the same number of particles as a polydisperse system
150  static double getVolumetricMean(std::vector<PSDContinuous> psd);
151 
160  bool operator<(const double probability) const
161  {
162  return this->probability < probability;
163  }
164 
168  friend std::ostream& operator<<(std::ostream& os, const PSDContinuous& psd) {
169  os << psd.radius << ' ' << psd.probability;
170  return os;
171  }
172 
176  friend std::istream& operator>>(std::istream& is, PSDContinuous& psd) {
177  is >> psd.radius >> psd.probability;
178  return is;
179  }
180 
181  double radius;
182  double probability;
183 };
184 
185 const PSD convertPSD2ToPSD(const std::vector<PSDContinuous>& psd2);
186 #endif //MERCURYDPM_PSD_H
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
const PSD convertPSD2ToPSD(const std::vector< PSDContinuous > &psd2)
Definition: PSDContinuous.cc:188
float * p
Definition: Tutorial_Map_using.cpp:9
Contains a vector with radii and probabilities of a user defined particle size distribution (PSD)
Definition: PSD.h:47
#define min(a, b)
Definition: datatypes.h:22
Definition: PSDContinuous.h:30
static void convertSubtractiveToCumulative(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:65
friend std::ostream & operator<<(std::ostream &os, const PSDContinuous &psd)
Writes to output stream.
Definition: PSDContinuous.h:168
bool operator<(const double probability) const
Definition: PSDContinuous.h:160
static double getD0(const std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.h:125
static void convertSubtractiveVolumeToNumber(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:89
static std::vector< PSDContinuous > getCumulativeNumberFromVolume(std::vector< PSDContinuous > psd)
Definition: PSDContinuous.h:71
static double getD90(const std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.h:137
static void convertCumulativeVolumeToNumber(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:107
static void convertSubtractiveNumberToVolume(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:130
static void validateCumulativeDistribution(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:28
static void convertCumulativeNumberToVolume(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:148
static std::vector< PSDContinuous > cutoffCumulativeNumber(std::vector< PSDContinuous > psd, double quantileMin, double quantileMax, double minPolydispersity=0.1)
Definition: PSDContinuous.h:77
static double getVolumetricMean(std::vector< PSDContinuous > psd)
Definition: PSDContinuous.cc:179
static std::vector< PSDContinuous > cutoffAndSqueezeCumulativeNumber(std::vector< PSDContinuous > psd, double quantileMin, double quantileMax, double squeeze, double minPolydispersity=0.1)
Definition: PSDContinuous.h:98
static double getD10(const std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.h:129
static void convertCumulativeToSubtractive(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:77
static double getQuantile(std::vector< PSDContinuous > psd, double quantile)
Definition: PSDContinuous.cc:167
double probability
Definition: PSDContinuous.h:182
static void interpolateCSD(std::vector< PSDContinuous > &psd, unsigned n)
Definition: PSDContinuous.cc:113
double radius
Definition: PSDContinuous.h:181
static double getD100(const std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.h:141
static double getD50(const std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.h:133
static void print(std::vector< PSDContinuous > &psd)
Definition: PSDContinuous.cc:11
friend std::istream & operator>>(std::istream &is, PSDContinuous &psd)
Reads from input stream.
Definition: PSDContinuous.h:176
static std::vector< PSDContinuous > createPSDFromRadiiAndProbabilities(const std::vector< double > &radius, const std::vector< double > &probability)
Definition: PSDContinuous.cc:47