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;
131 {
assert(x.size()==y.size());
133 for(
unsigned i=0; i<x.size(); i++)
if(x[i] && y[i]) ret +=
dot(x[i], y[i]);
139 {
for(
unsigned i=0; i<x.size(); i++)
initZero(x[i]);
146 for(
unsigned i=0; i<x.size(); i++)
nullToZero(x[i], gInfo);
155 {
for(
unsigned i=0; i<x.size(); i++)
initRandom(x[i], 3.0);
158 template<
typename T>
void loadFromFile(
TptrCollection& x,
const char* filename)
160 off_t expectedLen = 0;
161 for(
unsigned i=0; i<x.size(); i++){expectedLen +=
sizeof(
typename T::DataType) * x[i]->nElem;}
163 if(fLen != expectedLen)
164 {
die(
"\nLength of '%s' was %ld instead of the expected %ld bytes.\n" 165 "Hint: Are you really reading the correct file?\n\n",
166 filename, (
unsigned long)fLen, (
unsigned long)expectedLen);
169 FILE* fp = fopen(filename,
"rb");
170 if(!fp)
die(
"Could not open %s for reading.\n", filename)
171 for(
unsigned i=0; i<x.size(); i++)
172 {
if(!x[i])
die(
"x[%d] was null in loadFromFile(x,\"%s\").\n", i, filename)
173 if(
freadLE(x[i]->data(),
sizeof(
typename T::DataType), x[i]->nElem, fp) <
unsigned(x[i]->nElem))
174 die(
"File ended too soon while reading x[%d] in loadFromFile(x,\"%s\").\n", i, filename)
179 template<
typename T>
void saveToFile(
const TptrCollection& x,
const char* filename)
180 { FILE* fp = fopen(filename,
"wb");
181 if(!fp)
die(
"Could not open %s for writing.\n", filename)
182 for(
unsigned i=0; i<x.size(); i++)
183 {
if(!x[i])
die(
"x[%d] was null in saveToFile(x,\"%s\").\n", i, filename)
184 fwriteLE(x[i]->data(),
sizeof(
typename T::DataType), x[i]->nElem, fp);
192 {
using namespace ScalarFieldMultipletPrivate;
195 threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
201 {
using namespace ScalarFieldMultipletPrivate;
204 threadUnary(func,
int(X.size()), &out, X);
209 {
using namespace ScalarFieldMultipletPrivate;
212 threadUnary(func,
int(X.size()), &out, X);
217 {
using namespace ScalarFieldMultipletPrivate;
220 threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
225 #undef TptrCollection 226 #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:109
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:154
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:107
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:130
void initZero(TptrCollection &x)
Initialize (non-null) data to zero.
Definition: ScalarFieldArray.h:138
std::shared_ptr< ScalarFieldTildeData > ScalarFieldTilde
A smart reference-counting pointer to ScalarFieldTildeData.
Definition: ScalarField.h:45
TptrCollection & operator*=(TptrCollection &x, double alpha)
Scale.
Definition: ScalarFieldArray.h:60
off_t fileSize(const char *filename)
Get the size of a file.
size_t freadLE(void *ptr, size_t size, size_t nmemb, FILE *fp)
Read from a little-endian binary file, regardless of operating endianness.
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:144
void initRandomFlat(TptrCollection &x)
Initialize to random numbers (uniform on 0 to 1)
Definition: ScalarFieldArray.h:150
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
size_t fwriteLE(const void *ptr, size_t size, size_t nmemb, FILE *fp)
Write to a little-endian binary file, regardless of operating endianness.
#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:112
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:41
TptrCollection operator-(const TptrCollection &in1, const TptrCollection &in2)
Definition: ScalarFieldArray.h:121
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