20 #ifndef JDFTX_CORE_SCALARFIELDARRAY_H 21 #define JDFTX_CORE_SCALARFIELDARRAY_H 34 #define TptrCollection std::vector<std::shared_ptr<T> > 38 { std::vector<typename T::DataType*> xData(x.size());
39 for(
unsigned s=0; s<x.size(); s++)
40 xData[s] = x[s] ? x[s]->
dataPref() : 0;
46 { std::vector<const typename T::DataType*> xData(x.size());
47 for(
unsigned s=0; s<x.size(); s++)
48 xData[s] = x[s] ? x[s]->
dataPref() : 0;
55 for(
unsigned i=0; i<x.size(); i++)
if(x[i]) ret[i] =
clone(x[i]);
61 {
for(
unsigned i=0; i<x.size(); i++)
if(x[i]) x[i] *= alpha;
75 {
assert(x.size()==y.size());
76 for(
unsigned i=0; i<x.size(); i++)
axpy(alpha, x[i], y[i]);
81 {
assert(x.size()==y.size());
83 for(
unsigned i=0; i<x.size(); i++) z[i] = x[i]*y[i];
87 {
assert(x.size()==y.size());
88 for(
unsigned i=0; i<x.size(); i++) x[i] *= y[i];
92 {
assert(x.size()==y.size());
93 for(
unsigned i=0; i<x.size(); i++) y[i] *= x[i];
98 {
for(
unsigned i=0; i<y.size(); i++)
if(y[i]) y[i] *= x;
102 {
for(
unsigned i=0; i<y.size(); i++)
if(y[i]) y[i] *= x;
134 {
assert(x.size()==y.size());
136 for(
unsigned i=0; i<x.size(); i++)
if(x[i] && y[i]) ret +=
dot(x[i], y[i]);
142 {
for(
unsigned i=0; i<x.size(); i++)
initZero(x[i]);
149 for(
unsigned i=0; i<x.size(); i++)
nullToZero(x[i], gInfo);
158 {
for(
unsigned i=0; i<x.size(); i++)
initRandom(x[i], 3.0);
161 template<
typename T>
void loadFromFile(
TptrCollection& x,
const char* filename)
163 off_t expectedLen = 0;
164 for(
unsigned i=0; i<x.size(); i++){expectedLen +=
sizeof(
typename T::DataType) * x[i]->nElem;}
166 if(fLen != expectedLen)
167 {
die(
"\nLength of '%s' was %ld instead of the expected %ld bytes.\n" 168 "Hint: Are you really reading the correct file?\n\n",
169 filename, (
unsigned long)fLen, (
unsigned long)expectedLen);
172 FILE* fp = fopen(filename,
"rb");
173 if(!fp)
die(
"Could not open %s for reading.\n", filename)
174 for(
unsigned i=0; i<x.size(); i++)
175 {
if(!x[i])
die(
"x[%d] was null in loadFromFile(x,\"%s\").\n", i, filename)
176 if(fread(x[i]->data(),
sizeof(
typename T::DataType), x[i]->nElem, fp) <
unsigned(x[i]->nElem))
177 die(
"File ended too soon while reading x[%d] in loadFromFile(x,\"%s\").\n", i, filename)
182 template<
typename T>
void saveToFile(
const TptrCollection& x,
const char* filename)
183 { FILE* fp = fopen(filename,
"wb");
184 if(!fp)
die(
"Could not open %s for writing.\n", filename)
185 for(
unsigned i=0; i<x.size(); i++)
186 {
if(!x[i])
die(
"x[%d] was null in saveToFile(x,\"%s\").\n", i, filename)
187 fwrite(x[i]->data(),
sizeof(
typename T::DataType), x[i]->nElem, fp);
195 {
using namespace ScalarFieldMultipletPrivate;
198 threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
204 {
using namespace ScalarFieldMultipletPrivate;
207 threadUnary(func,
int(X.size()), &out, X);
212 {
using namespace ScalarFieldMultipletPrivate;
215 threadUnary(func,
int(X.size()), &out, X);
220 {
using namespace ScalarFieldMultipletPrivate;
223 threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
228 #undef TptrCollection 229 #endif // JDFTX_CORE_SCALARFIELDARRAY_H ScalarFieldTilde Idag(const ScalarField &, int nThreads=0)
Forward transform transpose: Real space -> PW basis.
TptrCollection & operator-=(TptrCollection &in, const TptrCollection &other)
Decrement.
Definition: ScalarFieldArray.h:112
TptrCollection operator*(TptrCollection &&in, double scaleFac)
Add (destructible input)
Definition: ScalarFieldArray.h:70
std::vector< ScalarField > ScalarFieldArray
dynamic size collection of real space scalar fields
Definition: ScalarFieldArray.h:32
void randomize(TptrCollection &x)
Initialize to normal random numbers:
Definition: ScalarFieldArray.h:157
Simulation grid descriptor.
Definition: GridInfo.h:45
ScalarFieldTilde J(const ScalarField &, int nThreads=0)
Inverse transform: Real space -> PW basis.
TptrCollection & operator+=(TptrCollection &in, const TptrCollection &other)
Increment.
Definition: ScalarFieldArray.h:110
void initRandom(ScalarField &, double cap=0.0)
initialize element-wise with a unit-normal random number (with a cap if cap>0)
#define TptrCollection
shorthand for templates below (undef'd at end of file)
Definition: ScalarFieldArray.h:34
ScalarField Jdag(const ScalarFieldTilde &, bool compat=false, int nThreads=0)
Inverse transform transpose: PW basis -> real space (preserve input)
double dot(const TptrCollection &x, const TptrCollection &y)
Inner product.
Definition: ScalarFieldArray.h:133
void initZero(TptrCollection &x)
Initialize (non-null) data to zero.
Definition: ScalarFieldArray.h:141
std::shared_ptr< ScalarFieldTildeData > ScalarFieldTilde
A smart reference-counting pointer to ScalarFieldTildeData.
Definition: ScalarField.h:44
TptrCollection & operator*=(TptrCollection &x, double alpha)
Scale.
Definition: ScalarFieldArray.h:60
off_t fileSize(const char *filename)
Get the size of a file.
ScalarField I(const ScalarFieldTilde &, bool compat=false, int nThreads=0)
Forward transform: PW basis -> real space (preserve input)
void nullToZero(TptrCollection &x, const GridInfo &gInfo, int N=0)
Definition: ScalarFieldArray.h:147
void initRandomFlat(TptrCollection &x)
Initialize to random numbers (uniform on 0 to 1)
Definition: ScalarFieldArray.h:153
TptrCollection clone(const TptrCollection &x)
Create a copy of the data (note operator= references same data since Tptr's are pointers!) ...
Definition: ScalarFieldArray.h:53
void axpy(double alpha, const TptrCollection &x, TptrCollection &y)
y += alpha x
Definition: ScalarFieldArray.h:74
#define die(...)
Quit with an error message (formatted using printf()). Must be called from all processes.
Definition: Util.h:114
std::vector< typename T::DataType * > dataPref(TptrCollection &x)
Extract a std::vector of data pointers from a ScalarFieldArray.
Definition: ScalarFieldArray.h:37
Generic multiplet of data arrays (and specialized to triplets for vector fields in real/reciprocal sp...
TptrCollection operator+(const TptrCollection &in1, const TptrCollection &in2)
Definition: ScalarFieldArray.h:115
std::vector< const typename T::DataType * > constDataPref(const TptrCollection &x)
Extract a std::vector of const data pointers from a const ScalarFieldArray.
Definition: ScalarFieldArray.h:45
std::shared_ptr< ScalarFieldData > ScalarField
A smart reference-counting pointer to ScalarFieldData.
Definition: ScalarField.h:40
TptrCollection operator-(const TptrCollection &in1, const TptrCollection &in2)
Definition: ScalarFieldArray.h:124
std::vector< ScalarFieldTilde > ScalarFieldTildeArray
dynamic size collection of reciprocal space scalar fields
Definition: ScalarFieldArray.h:33
#define assert(expr)
A custom assertion with stack trace (NOTE: enabled in release modes as well)
Definition: Util.h:100