26 #include <queso/Defines.h>
27 #include <queso/Miscellaneous.h>
28 #include <queso/GslVector.h>
29 #include <queso/GslMatrix.h>
41 const std::string& inputString,
42 std::vector<double>& outputDoubles)
47 outputDoubles.clear();
48 bool aDoubleIsBeingRead =
false;
49 std::string::size_type positionOfFirstChar = 0;
50 std::string::size_type numberOfChars = 0;
51 for (std::string::size_type i = 0; i < inputString.size(); ++i) {
53 if (inputString[i] ==
' ') {
54 if (aDoubleIsBeingRead ==
true) {
56 char tmpVar[numberOfChars+1];
57 for (std::string::size_type j = 0; j < numberOfChars; ++j) {
58 tmpVar[j] = inputString[positionOfFirstChar+j];
60 tmpVar[numberOfChars] =
'\0';
61 outputDoubles.push_back(strtod(tmpVar,NULL));
64 aDoubleIsBeingRead =
false;
65 positionOfFirstChar = 0;
70 if (aDoubleIsBeingRead ==
false) {
71 aDoubleIsBeingRead =
true;
72 positionOfFirstChar = i;
77 if (aDoubleIsBeingRead ==
true) {
79 char tmpVar[numberOfChars+1];
80 for (std::string::size_type j = 0; j < numberOfChars; ++j) {
81 tmpVar[j] = inputString[positionOfFirstChar+j];
83 tmpVar[numberOfChars] =
'\0';
84 outputDoubles.push_back(strtod(tmpVar,NULL));
86 std::vector<double>(outputDoubles).swap(outputDoubles);
93 const std::string& inputString,
94 std::vector<std::string>& outputWords)
100 bool aWordIsBeingRead =
false;
101 std::string::size_type positionOfFirstChar = 0;
102 std::string::size_type numberOfChars = 0;
103 for (std::string::size_type i = 0; i < inputString.size(); ++i) {
105 if (inputString[i] ==
' ') {
106 if (aWordIsBeingRead ==
true) {
108 char tmpVar[numberOfChars+1];
109 for (std::string::size_type j = 0; j < numberOfChars; ++j) {
110 tmpVar[j] = inputString[positionOfFirstChar+j];
112 tmpVar[numberOfChars] =
'\0';
113 outputWords.push_back(tmpVar);
116 aWordIsBeingRead =
false;
117 positionOfFirstChar = 0;
122 if (aWordIsBeingRead ==
false) {
123 aWordIsBeingRead =
true;
124 positionOfFirstChar = i;
129 if (aWordIsBeingRead ==
true) {
131 char tmpVar[numberOfChars+1];
132 for (std::string::size_type j = 0; j < numberOfChars; ++j) {
133 tmpVar[j] = inputString[positionOfFirstChar+j];
135 tmpVar[numberOfChars] =
'\0';
136 outputWords.push_back(tmpVar);
138 std::vector<std::string>(outputWords).swap(outputWords);
162 std::string& termString,
168 if ((ifs.rdstate() & std::ifstream::failbit)) {
171 else if (termValue) {
172 if (termString == std::string(
"inf")) {
173 *termValue = INFINITY;
175 else if (termString == std::string(
"-inf")) {
176 *termValue = -INFINITY;
178 else if (termString == std::string(
"nan")) {
179 *termValue = nan(
"");
182 *termValue = strtod(termString.c_str(),NULL);
193 std::string& termString,
195 bool& endOfLineAchieved)
198 endOfLineAchieved =
false;
203 if ((ifs.rdstate() & std::ifstream::failbit)) {
210 unsigned int pos = 0;
213 while ((pos < 512) && (c !=
'\n') && (c !=
'\0') && (c !=
' ')) {
215 if ((ifs.rdstate() & std::ifstream::failbit)) {
224 if (c ==
'\n') endOfLineAchieved =
true;
229 if (termString == std::string(
"inf")) {
230 *termValue = INFINITY;
232 else if (termString == std::string(
"-inf")) {
233 *termValue = -INFINITY;
235 else if (termString == std::string(
"nan")) {
236 *termValue = nan(
"");
239 *termValue = strtod(termString.c_str(),NULL);
259 double c = 1./std::sqrt(9.*d);
270 double compValue = 1.-0.0331*std::pow(x,4.);
271 if (u < compValue)
break;
272 compValue = 0.5*std::pow(x,2.)+d*(1.-w+log(w));
273 if (log(u) < compValue)
break;
286 struct timeval timevalNow;
288 gettimeofday(&timevalNow, NULL);
290 result = (double) (timevalNow.tv_sec - timeval0->tv_sec );
292 result += (double) (timevalNow.tv_usec - timeval0->tv_usec);
300 double angle = 2.*M_PI*((double) j)/((double) N);
301 double result = 0.53836 - 0.46164*cos(angle);
308 double sigma2 = sigma*sigma;
311 return (1./std::sqrt(2*M_PI*sigma2))*std::exp(-.5*diff*diff/sigma2);
319 std::cout <<
"Passing in MiscUintDebugMessage(), value = " << value <<
", message = " << message << std::endl;
329 std::cout <<
"Passing in MiscIntDebugMessage(), value = " << value <<
", message = " << message << std::endl;
339 std::cout <<
"Passing in MiscDoubleDebugMessage(), value = " << value <<
", message = " << message << std::endl;
368 return(grvy_check_file_path(pathname));
371 const int MAX_DEPTH = 50;
381 pathlocal = strdup(pathname);
382 dirstring = strdup(pathname);
383 parents = dirname(pathlocal);
385 if(strcmp(parents,
".") == 0)
394 bool abs_path =
false;
396 std::string leading_char(
"");
397 std::string path_to_check;
399 if(strncmp(parents,
"/",1) == 0)
407 if( (token = strtok(parents,
"/")) != NULL )
409 path_to_check += leading_char + token;
421 sprintf(dirstring,
"/%s",token);
423 sprintf(dirstring,
"%s",token);
425 while ( (token = strtok(0,
"/")) && (depth < MAX_DEPTH) )
427 dirstring = strcat(dirstring,
"/");
438 if(depth >= MAX_DEPTH )
440 std::cerr << __func__ <<
": error - Max directory depth exceeded, limit = " << MAX_DEPTH << std::endl;
460 if(stat(dirname,&st) != 0)
462 if( mkdir(dirname,0700) != 0 )
464 std::cerr << __func__ <<
": error - unable to create directory " << dirname << std::endl;
468 else if (!S_ISDIR(st.st_mode))
470 std::cerr << __func__ <<
": error - entry exists, but is not a directory " << dirname << std::endl;
480 double acceptableTreshold,
482 const char* whereString)
485 if (comm.
MyPID() < 0)
return true;
487 double localValue = (double) inputValue;
488 double sumValue = 0.;
491 "failed MPI on 'sumValue' inside MiscCheckForSameValueInAllNodes()");
493 double totalNumNodes = (double) comm.
NumProc();
494 double testValue = fabs(1. - localValue/(sumValue/totalNumNodes));
495 unsigned int boolSum = 0;
497 unsigned int boolResult = 0;
498 if (testValue > acceptableTreshold) boolResult = 1;
501 "failed MPI on 'boolSum' inside MiscCheckForSameValueInAllNodes()");
505 for (
int i = 0; i < comm.
NumProc(); ++i) {
506 if (i == comm.
MyPID()) {
507 std::cerr <<
"WARNING, "
509 <<
", inside MiscCheckForSameValueInAllNodes()"
510 <<
", rank (in this communicator) = " << i
511 <<
": boolSum = " << boolSum
512 <<
", localValue = " << localValue
513 <<
", sumValue = " << sumValue
514 <<
", totalNumNodes = " << totalNumNodes
515 <<
", avgValue = " << (sumValue/totalNumNodes)
516 <<
", relativeTest = " << testValue
525 "failed MPI on 'boolSum' inside MiscCheckForSameValueInAllNodes()");
526 inputValue = localValue;
529 queso_require_less_equal_msg(testValue, acceptableTreshold,
"not all nodes have the same value inside MiscCheckForSameValueInAllNodes()");
532 return (boolSum == 0);
539 std::vector<V*>& positions)
542 switch (positions.size()) {
548 positions[0] =
new V((1. - factor) * minValues + factor * maxValues);
552 for (
unsigned int i = 0; i < positions.size(); ++i) {
553 factor = ((double) i)/(((double) positions.size()) - 1.);
554 positions[i] =
new V((1. - factor) * minValues + factor * maxValues);
562 template <
class V1,
class V2>
571 "only 1 processor (per sub environment) should be necessary for the storage of a parameter vector");
573 "only 1 processor (per sub environment) should be necessary for the storage of a parameter vector");
579 if ((vec1.numOfProcsForStorage() == 1) &&
580 (vec2.numOfProcsForStorage() == 1)) {
583 else if ((vec1.numOfProcsForStorage() == numProcsPerSubEnvironment) &&
584 (vec2.numOfProcsForStorage() == numProcsPerSubEnvironment)) {
588 queso_error_msg(
"number of processors required for a vector storage should be equal to either 1 or to the number of processors in the sub environment");
592 queso_error_msg(
"number of processors per sub environment is less than 1!");
601 template bool QUESO::MiscCheckForSameValueInAllNodes<bool>(
bool&, double,
QUESO::MpiComm const&,
char const*);
602 template bool QUESO::MiscCheckForSameValueInAllNodes<double>(
double&, double,
QUESO::MpiComm const&,
char const*);
double MiscGammar(double a, double b, const RngBase *rngObject)
int NumProc() const
Returns total number of processes.
int MiscReadCharsAndDoubleFromFile(std::ifstream &ifs, std::string &termString, double *termValue, bool &endOfLineAchieved)
void Barrier() const
Pause every process in *this communicator until all the processes reach this point.
double MiscGetEllapsedSeconds(struct timeval *timeval0)
bool MiscCheckForSameValueInAllNodes(T &inputValue, double acceptableTreshold, const MpiComm &comm, const char *whereString)
int subRank() const
Access function for sub-rank.
int CheckFilePath(const char *path)
void MiscReadWordsFromString(const std::string &inputString, std::vector< std::string > &outputWords)
This (virtual) class sets up the environment underlying the use of the QUESO library by an executable...
int MyPID() const
Return my process ID.
double MiscGaussianDensity(double x, double mu, double sigma)
void MiscReadDoublesFromString(const std::string &inputString, std::vector< double > &outputDoubles)
#define queso_require_equal_to_msg(expr1, expr2, msg)
int MiscReadStringAndDoubleFromFile(std::ifstream &ifs, std::string &termString, double *termValue)
double MiscHammingWindow(unsigned int N, unsigned int j)
Class for vector operations using GSL library.
#define RawValue_MPI_DOUBLE
void MiscComputePositionsBetweenMinMax(V minValues, V maxValues, std::vector< V * > &positions)
Class for random number generation (base class for either GSL or Boost RNG).
virtual double uniformSample() const =0
Samples a value from a uniform distribution.
double MiscDoubleDebugMessage(double value, const char *message)
unsigned int numSubEnvironments() const
Access function to the number of sub-environments.
int MiscIntDebugMessage(int value, const char *message)
#define queso_require_not_equal_to_msg(expr1, expr2, msg)
#define queso_require_less_equal_msg(expr1, expr2, msg)
const MpiComm & subComm() const
Access function for MpiComm sub communicator.
The QUESO MPI Communicator Class.
const MpiComm & fullComm() const
Access function for MpiComm full communicator.
unsigned int MiscUintDebugMessage(unsigned int value, const char *message)
void MiscCheckTheParallelEnvironment(const V1 &vec1, const V2 &vec2)
int GRVY_CheckDir(const char *dirname)
const int UQ_FAILED_READING_FILE_RC
#define queso_error_msg(msg)
virtual double gaussianSample(double stdDev) const =0
Samples a value from a Gaussian distribution with standard deviation given by stdDev.
void Allreduce(void *sendbuf, void *recvbuf, int count, RawType_MPI_Datatype datatype, RawType_MPI_Op op, const char *whereMsg, const char *whatMsg) const
Combines values from all processes and distributes the result back to all processes.
void Bcast(void *buffer, int count, RawType_MPI_Datatype datatype, int root, const char *whereMsg, const char *whatMsg) const
Broadcast values from the root process to the slave processes.