25 #include <queso/ScalarGaussianRandomField.h>
26 #include <queso/GaussianVectorRV.h>
31 template <
class V,
class M>
38 m_env (indexSet.env()),
39 m_prefix ((std::string)(prefix)+
"grf_"),
40 m_indexSet (indexSet),
41 m_meanFunction (meanFunction),
42 m_covarianceFunction (covarianceFunction),
43 m_savedRvImageSpace (NULL),
44 m_savedRvLawExpVector(NULL),
45 m_savedRvLawCovMatrix(NULL),
51 template <
class V,
class M>
56 template <
class V,
class M>
63 template <
class V,
class M>
67 return m_meanFunction;
70 template <
class V,
class M>
74 return m_covarianceFunction;
77 template <
class V,
class M>
81 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
82 *m_env.subDisplayFile() <<
"Entering ScalarGaussianRandomField<V,M>::sampleFunction()"
88 "ScalarGaussianRandomField<V,M>::sampleFunction()",
89 "invalid input data");
91 if ((m_savedPositions.size() == 0 ) &&
92 (m_savedRvImageSpace == NULL) &&
93 (m_savedRvLawExpVector == NULL) &&
94 (m_savedRvLawCovMatrix == NULL) &&
95 (m_savedRv == NULL)) {
98 else if ((m_savedPositions.size() != 0 ) &&
99 (m_savedRvImageSpace != NULL) &&
100 (m_savedRvLawExpVector != NULL) &&
101 (m_savedRvLawCovMatrix != NULL) &&
102 (m_savedRv != NULL)) {
108 "ScalarGaussianRandomField<V,M>::sampleFunction()",
109 "invalid combination of pointer values");
112 unsigned int numberOfPositions = fieldPositions.size();
113 bool instantiate =
true;
114 if (m_savedPositions.size() == numberOfPositions) {
115 bool allPositionsAreEqual =
true;
116 for (
unsigned int i = 0; i < numberOfPositions; ++i) {
119 "ScalarGaussianRandomField<V,M>::sampleFunction()",
120 "m_savedPositions[i] should not be NULL");
121 if ((m_savedPositions[i]->sizeLocal() == fieldPositions[i]->sizeLocal()) &&
122 (*(m_savedPositions[i]) == *(fieldPositions[i]) )) {
126 allPositionsAreEqual =
false;
130 instantiate = !allPositionsAreEqual;
135 delete m_savedRvLawCovMatrix;
136 delete m_savedRvLawExpVector;
137 delete m_savedRvImageSpace;
138 for (
unsigned int i = 0; i < m_savedPositions.size(); ++i) {
139 delete m_savedPositions[i];
141 m_savedPositions.clear();
144 m_savedPositions.resize(numberOfPositions,NULL);
145 for (
unsigned int i = 0; i < m_savedPositions.size(); ++i) {
146 m_savedPositions[i] =
new V(*(fieldPositions[i]));
150 m_savedRvImageSpace =
new VectorSpace<V,M>(m_env,
"grf_", numberOfPositions, NULL);
153 m_savedRvLawExpVector =
new V(m_savedRvImageSpace->zeroVector());
154 for (
unsigned int i = 0; i < numberOfPositions; ++i) {
155 (*m_savedRvLawExpVector)[i] = m_meanFunction.actualValue(*(fieldPositions[i]),NULL,NULL,NULL,NULL);
159 m_savedRvLawCovMatrix =
new M(m_savedRvImageSpace->zeroVector());
160 for (
unsigned int i = 0; i < numberOfPositions; ++i) {
161 for (
unsigned int j = 0; j < numberOfPositions; ++j) {
162 (*m_savedRvLawCovMatrix)(i,j) = m_covarianceFunction.value(*(fieldPositions[i]),*(fieldPositions[j]));
163 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 3)) {
164 *m_env.subDisplayFile() <<
"In ScalarGaussianRandomField<V,M>::sampleFunction()"
167 <<
", *(fieldPositions[i]) = " << *(fieldPositions[i])
168 <<
", *(fieldPositions[j]) = " << *(fieldPositions[j])
169 <<
", (*m_savedRvLawCovMatrix)(i,j) = " << (*m_savedRvLawCovMatrix)(i,j)
177 *m_savedRvImageSpace,
178 *m_savedRvLawExpVector,
179 *m_savedRvLawCovMatrix);
181 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 3)) {
182 *m_env.subDisplayFile() <<
"In ScalarGaussianRandomField<V,M>::sampleFunction()"
183 <<
": just instantiated Gaussian RV"
184 <<
"\n *m_savedRvLawExpVector = " << *m_savedRvLawExpVector
185 <<
"\n *m_savedRvLawCovMatrix = " << *m_savedRvLawCovMatrix
187 for (
unsigned int i = 0; i < numberOfPositions; ++i) {
188 *m_env.subDisplayFile() <<
" *(m_savedPositions[" << i
189 <<
"]) = " << *(m_savedPositions[i])
196 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
197 *m_env.subDisplayFile() <<
"In ScalarGaussianRandomField<V,M>::sampleFunction()"
198 <<
": about to realize sample values"
201 m_savedRv->realizer().realization(sampleValues);
202 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
203 *m_env.subDisplayFile() <<
"In ScalarGaussianRandomField<V,M>::sampleFunction()"
204 <<
": just realized sample values"
208 if ((m_env.subDisplayFile()) && (m_env.displayVerbosity() >= 99)) {
209 *m_env.subDisplayFile() <<
"Leaving ScalarGaussianRandomField<V,M>::sampleFunction()"
A templated (base) class to accommodate scalar covariance functions (of random variables).
ScalarGaussianRandomField(const char *prefix, const VectorSet< V, M > &indexSet, const BaseScalarFunction< V, M > &meanFunction, const BaseScalarCovarianceFunction< V, M > &covarianceFunction)
Constructor.
A templated class for handling sets.
~ScalarGaussianRandomField()
Destructor.
const BaseScalarCovarianceFunction< V, M > & covarianceFunction() const
Covariance function; access to protected attribute m_covarianceFunction.
A templated (base) class for handling scalar functions.
A class representing a vector space.
const VectorSet< V, M > & indexSet() const
Index set; access to protected attribute m_indexSet.
#define UQ_FATAL_TEST_MACRO(test, givenRank, where, what)
void sampleFunction(const std::vector< V * > &fieldPositions, V &sampleValues)
Function that samples from a Gaussian PDF.
std::vector< V * > m_savedPositions
Saved positions.
A class representing a Gaussian vector RV.
const BaseScalarFunction< V, M > & meanFunction() const
Mean function; access to protected attribute m_meanFunction.