JDFTx  1.1.0
ScalarFieldArray.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------
2 Copyright 2011 Ravishankar Sundararaman, Deniz Gunceler
3 
4 This file is part of JDFTx.
5 
6 JDFTx is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10 
11 JDFTx is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with JDFTx. If not, see <http://www.gnu.org/licenses/>.
18 -------------------------------------------------------------------*/
19 
20 #ifndef JDFTX_CORE_SCALARFIELDARRAY_H
21 #define JDFTX_CORE_SCALARFIELDARRAY_H
22 
23 
26 
27 #include <core/VectorField.h>
28 #include <vector>
29 
30 #include <cstdio>
31 
32 typedef std::vector<ScalarField> ScalarFieldArray;
33 typedef std::vector<ScalarFieldTilde> ScalarFieldTildeArray;
34 #define TptrCollection std::vector<std::shared_ptr<T> >
35 
36 template<typename T> std::vector<typename T::DataType*> dataPref(TptrCollection& x)
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;
41  return xData;
42 }
43 
45 template<typename T> std::vector<const typename T::DataType*> constDataPref(const TptrCollection& x)
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;
49  return xData;
50 }
51 
53 template<typename T> TptrCollection clone(const TptrCollection& x)
54 { TptrCollection ret(x.size());
55  for(unsigned i=0; i<x.size(); i++) if(x[i]) ret[i] = clone(x[i]);
56  return ret;
57 }
58 
60 template<typename T> TptrCollection& operator*=(TptrCollection& x, double alpha)
61 { for(unsigned i=0; i<x.size(); i++) if(x[i]) x[i] *= alpha;
62  return x;
63 }
64 template<class T> TptrCollection operator*(const TptrCollection& in, double scaleFac) {
65  TptrCollection out(clone(in)); return out *= scaleFac;
66 }
67 template<class T> TptrCollection operator*(double scaleFac, const TptrCollection& in) {
68  TptrCollection out(clone(in)); return out *= scaleFac;
69 }
70 template<class T> TptrCollection operator*(TptrCollection&& in, double scaleFac) { return in *= scaleFac; }
71 template<class T> TptrCollection operator*(double scaleFac, TptrCollection&& in) { return in *= scaleFac; }
72 
74 template<typename T> void axpy(double alpha, const TptrCollection& x, TptrCollection& y)
75 { assert(x.size()==y.size());
76  for(unsigned i=0; i<x.size(); i++) axpy(alpha, x[i], y[i]);
77 }
78 
81 { assert(x.size()==y.size());
82  ScalarFieldArray z(x.size());
83  for(unsigned i=0; i<x.size(); i++) z[i] = x[i]*y[i];
84  return z;
85 }
87 { assert(x.size()==y.size());
88  for(unsigned i=0; i<x.size(); i++) x[i] *= y[i];
89  return x;
90 }
92 { assert(x.size()==y.size());
93  for(unsigned i=0; i<x.size(); i++) y[i] *= x[i];
94  return y;
95 }
96 
98 { for(unsigned i=0; i<y.size(); i++) if(y[i]) y[i] *= x;
99  return y;
100 }
102 { for(unsigned i=0; i<y.size(); i++) if(y[i]) y[i] *= x;
103  return y;
104 }
105 inline ScalarFieldArray operator*(const ScalarField& x, const ScalarFieldArray& y) { return x * clone(y); }
106 inline ScalarFieldArray operator*(const ScalarFieldArray& y, const ScalarField& x) { return y * clone(x); }
107 
108 
110 template<class T> TptrCollection& operator+=(TptrCollection& in, const TptrCollection& other) { axpy(+1.0, other, in); return in; }
112 template<class T> TptrCollection& operator-=(TptrCollection& in, const TptrCollection& other) { axpy(-1.0, other, in); return in; }
113 
114 // Addition
115 template<class T> TptrCollection operator+(const TptrCollection& in1, const TptrCollection& in2) {
116  TptrCollection out(clone(in1));
117  return out += in2;
118 }
119 template<class T> TptrCollection operator+(const TptrCollection& in1, TptrCollection&& in2) { return in2 += in1; }
120 template<class T> TptrCollection operator+(TptrCollection&& in1, const TptrCollection& in2) { return in1 += in2; }
121 template<class T> TptrCollection operator+(TptrCollection&& in1, TptrCollection&& in2) { return in1 += in2; }
122 
123 // Subtraction
124 template<class T> TptrCollection operator-(const TptrCollection& in1, const TptrCollection& in2) {
125  TptrCollection out(clone(in1));
126  return out -= in2;
127 }
128 template<class T> TptrCollection operator-(const TptrCollection& in1, TptrCollection&& in2) { return in2 -= in1; }
129 template<class T> TptrCollection operator-(TptrCollection&& in1, const TptrCollection& in2) { return in1 -= in2; }
130 template<class T> TptrCollection operator-(TptrCollection&& in1, TptrCollection&& in2) { return in1 -= in2; }
131 
133 template<typename T> double dot(const TptrCollection& x, const TptrCollection& y)
134 { assert(x.size()==y.size());
135  double ret = 0.0;
136  for(unsigned i=0; i<x.size(); i++) if(x[i] && y[i]) ret += dot(x[i], y[i]);
137  return ret;
138 }
139 
141 template<typename T> void initZero(TptrCollection& x)
142 { for(unsigned i=0; i<x.size(); i++) initZero(x[i]);
143 }
144 
147 template<typename T> void nullToZero(TptrCollection& x, const GridInfo& gInfo, int N=0)
148 { if(N) x.resize(N);
149  for(unsigned i=0; i<x.size(); i++) nullToZero(x[i], gInfo);
150 }
151 
153 template<typename T> void initRandomFlat(TptrCollection& x)
154 { for(unsigned i=0; i<x.size(); i++) initRandomFlat(x[i]);
155 }
157 template<typename T> void randomize(TptrCollection& x)
158 { for(unsigned i=0; i<x.size(); i++) initRandom(x[i], 3.0);
159 }
160 
161 template<typename T> void loadFromFile(TptrCollection& x, const char* filename)
162 { //Checks for the correct filesize
163  off_t expectedLen = 0;
164  for(unsigned i=0; i<x.size(); i++){expectedLen += sizeof(typename T::DataType) * x[i]->nElem;}
165  off_t fLen = fileSize(filename);
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);
170  }
171 
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)
178  }
179  fclose(fp);
180 }
181 
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);
188  }
189  fclose(fp);
190 }
191 
192 //----------------- Transform operators -------------------------
193 
194 inline ScalarFieldArray I(ScalarFieldTildeArray&& X, bool compat=false)
195 { using namespace ScalarFieldMultipletPrivate;
196  ScalarFieldArray out(X.size());
197  ScalarField (*func)(ScalarFieldTilde&&,int) = compat ? IcompatTrue : IcompatFalse;
198  threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
199  return out;
200 }
201 inline ScalarFieldArray I(const ScalarFieldTildeArray& X, bool compat=false) { return I(clone(X), compat); }
202 
204 { using namespace ScalarFieldMultipletPrivate;
205  ScalarFieldTildeArray out(X.size());
206  ScalarFieldTilde (*func)(const ScalarField&,int) = J;
207  threadUnary(func, int(X.size()), &out, X);
208  return out;
209 }
210 
212 { using namespace ScalarFieldMultipletPrivate;
213  ScalarFieldTildeArray out(X.size());
214  ScalarFieldTilde (*func)(const ScalarField&,int) = Idag;
215  threadUnary(func, int(X.size()), &out, X);
216  return out;
217 }
218 
219 inline ScalarFieldArray Jdag(ScalarFieldTildeArray&& X, bool compat=false)
220 { using namespace ScalarFieldMultipletPrivate;
221  ScalarFieldArray out(X.size());
222  ScalarField (*func)(ScalarFieldTilde&&,int) = compat ? JdagCompatTrue : JdagCompatFalse;
223  threadUnary<ScalarField,ScalarFieldTilde&&>(func, int(X.size()), &out, X);
224  return out;
225 }
226 inline ScalarFieldArray Jdag(const ScalarFieldTildeArray& X, bool compat=false) { return Jdag(clone(X), compat); }
227 
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&#39;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&#39;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