48 std::cerr <<
"Checking for volume-averaged fields... " << std::endl;
50 std::list<std::string> variableNames;
51 std::string gridname(
"SpatialGrid");
53 r.getVariableNames(gridname,variableNames);
54 if (find(variableNames.begin(), variableNames.end(), std::string(
"fg_b"))!=variableNames.end()) {
58 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"B"))!=variableNames.end()) {
62 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"fg_b_background")) != variableNames.end() &&
63 find(variableNames.begin(), variableNames.end(), std::string(
"fg_b_perturbed")) != variableNames.end()) {
65 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"B_vol"))!=variableNames.end()) {
69 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"vg_b_vol"))!=variableNames.end()) {
73 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"vg_b_background_vol")) != variableNames.end() &&
74 find(variableNames.begin(), variableNames.end(), std::string(
"vg_b_perturbed_vol")) != variableNames.end()) {
77 std::cerr <<
"No B-fields found! Strange file format?" << std::endl;
81 if (find(variableNames.begin(), variableNames.end(), std::string(
"fg_e"))!=variableNames.end()) {
85 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"E"))!=variableNames.end()) {
89 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"E_vol"))!=variableNames.end()) {
93 }
else if (find(variableNames.begin(), variableNames.end(), std::string(
"vg_e_vol"))!=variableNames.end()) {
98 std::cerr <<
"No E-fields found! Strange file format?" << std::endl;
108std::vector<double>
readFieldData(Reader& r, std::string& name,
unsigned int numcomponents) {
110 uint64_t arraySize=0;
111 uint64_t vectorSize=0;
113 vlsv::datatype::type dataType;
114 std::list<std::pair<std::string,std::string> > attribs;
115 attribs.push_back(std::pair<std::string,std::string>(
"name",name));
116 if( r.getArrayInfo(
"VARIABLE",attribs, arraySize,vectorSize,dataType,byteSize) ==
false ) {
117 std::cerr <<
"getArrayInfo returned false when trying to read VARIABLE \""
118 << name <<
"\"." << std::endl;
124 std::vector<double> buffer(arraySize*vectorSize);
126 if( r.readArray(
"VARIABLE",attribs,0,arraySize,(
char*) buffer.data()) ==
false) {
127 std::cerr <<
"readArray failed when trying to read VARIABLE \"" << name <<
"\"." << std::endl;
132 }
else if(byteSize == 4) {
134 std::vector<double> buffer;
135 std::vector<float> fbuffer(arraySize*vectorSize);
137 if( r.readArray(
"VARIABLE",attribs,0,arraySize,(
char*) fbuffer.data()) ==
false) {
138 std::cerr <<
"readArray faied when trying to read VARIABLE \"" << name <<
"\"." << std::endl;
142 for(
float value : fbuffer) {
143 buffer.push_back((
double)value);
148 std::cerr <<
"Datatype of VARIABLE \"" << name <<
"\" entries is not double." << std::endl;
157std::vector<double>
readFsGridData(Reader& r, std::string& name,
unsigned int numcomponents) {
161 vlsv::datatype::type dataType;
163 std::list<std::pair<std::string,std::string> > attribs;
165 attribs.push_back(std::make_pair(
"name",name));
166 attribs.push_back(std::make_pair(
"mesh",
"fsgrid"));
168 if (r.getArrayInfo(
"VARIABLE",attribs,arraySize,vectorSize,dataType,byteSize) ==
false) {
169 std::cerr <<
"getArrayInfo returned false when trying to read VARIABLE \""
170 << name <<
"\"." << std::endl;
174 if(dataType != vlsv::datatype::type::FLOAT || byteSize != 8 || vectorSize != numcomponents) {
175 std::cerr <<
"Datatype of VARIABLE \"" << name <<
"\" entries is not double." << std::endl;
179 int numWritingRanks=0;
180 if(r.readParameter(
"numWritingRanks",numWritingRanks) ==
false) {
181 std::cerr <<
"FSGrid writing rank number not found";
186 std::array<uint, 3> size;
187 r.readParameter(
"xcells_ini",size[0]);
188 r.readParameter(
"ycells_ini",size[1]);
189 r.readParameter(
"zcells_ini",size[2]);
193 size_t storageSize = size[0]*size[1]*size[2];
194 std::vector<Real> buffer(storageSize*numcomponents);
195 std::vector<Real> readBuffer(storageSize*numcomponents);
197 if(r.readArray(
"VARIABLE",attribs,0,arraySize,(
char*) readBuffer.data()) ==
false) {
198 std::cerr <<
"readArray faied when trying to read VARIABLE \"" << name <<
"\"." << std::endl;
222 const std::array<int, 3> fileDecomposition = fsgrid::computeDomainDecomposition(size, numWritingRanks);
225 size_t fileOffset = 0;
226 for(
int task = 0; task < numWritingRanks; task++) {
227 std::array<int,3> overlapStart,overlapEnd,overlapSize;
229 overlapStart[0] = fsgrid::calcLocalStart(size[0], fileDecomposition[0], task/fileDecomposition[2]/fileDecomposition[1]);
230 overlapStart[1] = fsgrid::calcLocalStart(size[1], fileDecomposition[1], (task/fileDecomposition[2])%fileDecomposition[1]);
231 overlapStart[2] = fsgrid::calcLocalStart(size[2], fileDecomposition[2], task%fileDecomposition[2]);
233 overlapSize[0] = fsgrid::calcLocalSize(size[0], fileDecomposition[0], task/fileDecomposition[2]/fileDecomposition[1]);
234 overlapSize[1] = fsgrid::calcLocalSize(size[1], fileDecomposition[1], (task/fileDecomposition[2])%fileDecomposition[1]);
235 overlapSize[2] = fsgrid::calcLocalSize(size[2], fileDecomposition[2], task%fileDecomposition[2]);
237 overlapEnd[0] = overlapStart[0]+overlapSize[0];
238 overlapEnd[1] = overlapStart[1]+overlapSize[1];
239 overlapEnd[2] = overlapStart[2]+overlapSize[2];
250 for(
int z=overlapStart[2]; z<overlapEnd[2]; z++) {
251 for(
int y=overlapStart[1]; y<overlapEnd[1]; y++) {
252 for(
int x=overlapStart[0]; x<overlapEnd[0]; x++) {
253 int index = (z - overlapStart[2]) * overlapSize[0]*overlapSize[1]
254 + (y - overlapStart[1]) * overlapSize[0]
255 + (x - overlapStart[0]);
257 std::memcpy(&buffer[(size[0]*size[1]*z + size[0]*y + x)*numcomponents], &readBuffer[(fileOffset +
index)*numcomponents], numcomponents*
sizeof(
Real));
261 fileOffset += overlapSize[0] * overlapSize[1] * overlapSize[2];
275 char filename_buffer[256];
278 while(t < E0.time || t>= E1.
time) {
279 input_file_counter += step;
283 snprintf(filename_buffer,256,filename_pattern.c_str(),input_file_counter);
287 r.open(filename_buffer);
289 if(!r.readParameter(
"time",t)) {
290 if(!r.readParameter(
"t",t)) {
291 std::cerr <<
"Time parameter in file " << filename_buffer <<
" is neither 't' nor 'time'. Bad file format?"
301 r.readParameter(
"xcells_ini",cells[0]);
302 r.readParameter(
"ycells_ini",cells[1]);
303 r.readParameter(
"zcells_ini",cells[2]);
308 std::vector<double> Bbuffer;
309 std::vector<double> Ebuffer;
313 name =
"fg_b_perturbed";
315 for (
unsigned int i = 0;
i < Bbuffer.size(); ++
i) {
316 Bbuffer[
i] += perturbedBbuffer[
i];
321 for (
unsigned int i = 0;
i < cellIds.size(); ++
i) {
327 name =
"vg_b_perturbed_vol";
328 std::vector<double> perturbedBbuffer =
readFieldData(r,name,3u);
329 for (
unsigned int i = 0;
i < Bbuffer.size(); ++
i) {
330 Bbuffer[
i] += perturbedBbuffer[
i];
336 std::vector<double> Vbuffer;
343 for(
unsigned int i=0;
i<rho_buffer.size();
i++) {
344 Vbuffer.push_back(rho_v_buffer[3*
i] / rho_buffer[
i]);
345 Vbuffer.push_back(rho_v_buffer[3*
i+1] / rho_buffer[
i]);
346 Vbuffer.push_back(rho_v_buffer[3*
i+2] / rho_buffer[
i]);
353 for(uint
i=0;
i< cellIds.size();
i++) {
354 uint64_t
c = cellIds[
i];
355 int64_t x =
c % cells[0];
356 int64_t y = (
c /cells[0]) % cells[1];
357 int64_t z =
c /(cells[0]*cells[1]);
360 double* Btgt = B1.getCellRef(x,y,z);
361 Etgt[0] = Ebuffer[3*
i];
362 Etgt[1] = Ebuffer[3*
i+1];
363 Etgt[2] = Ebuffer[3*
i+2];
364 Btgt[0] = Bbuffer[3*
i];
365 Btgt[1] = Bbuffer[3*
i+1];
366 Btgt[2] = Bbuffer[3*
i+2];
369 double* Vtgt =
V.getCellRef(x,y,z);
370 Vtgt[0] = Vbuffer[3*
i];
371 Vtgt[1] = Vbuffer[3*
i+1];
372 Vtgt[2] = Vbuffer[3*
i+2];
400 std::cerr <<
"Opening " << filename <<
"...";
404 std::cerr <<
"ok." << std::endl;
414 std::vector<double> Bbuffer;
415 std::vector<double> Ebuffer;
420 name =
"fg_b_perturbed";
422 for (
unsigned int i = 0;
i < Bbuffer.size(); ++
i) {
423 Bbuffer[
i] += perturbedBbuffer[
i];
428 for (
unsigned int i = 0;
i < cellIds.size(); ++
i) {
434 name =
"vg_b_perturbed_vol";
435 std::vector<double> perturbedBbuffer =
readFieldData(r,name,3u);
436 for (
unsigned int i = 0;
i < Bbuffer.size(); ++
i) {
437 Bbuffer[
i] += perturbedBbuffer[
i];
443 std::vector<double> rho_v_buffer,rho_buffer;
454 double min[3],
max[3], time;
456 r.readParameter(
"xmin",
min[0]);
457 r.readParameter(
"ymin",
min[1]);
458 r.readParameter(
"zmin",
min[2]);
459 r.readParameter(
"xmax",
max[0]);
460 r.readParameter(
"ymax",
max[1]);
461 r.readParameter(
"zmax",
max[2]);
462 r.readParameter(
"xcells_ini",cells[0]);
463 r.readParameter(
"ycells_ini",cells[1]);
464 r.readParameter(
"zcells_ini",cells[2]);
465 if(!r.readParameter(
"t",time)) {
466 r.readParameter(
"time",time);
474 E.
data.resize(4*cells[0]*cells[1]*cells[2]);
475 B.data.resize(4*cells[0]*cells[1]*cells[2]);
477 V.data.resize(4*cells[0]*cells[1]*cells[2]);
481 if(3*cellIds.size() != Bbuffer.size()) {
482 std::cerr <<
"3 * cellIDs.size (" << cellIds.size() <<
") != Bbuffer.size (" << Bbuffer.size() <<
")!"
486 if(3*cellIds.size() != Ebuffer.size()) {
487 std::cerr <<
"3 * cellIDs.size (" << cellIds.size() <<
") != Ebuffer.size (" << Ebuffer.size() <<
")!"
492 if(3*cellIds.size() != rho_v_buffer.size()) {
493 std::cerr <<
"3 * cellIDs.size (" << cellIds.size() <<
") != rho_v_buffer.size (" << Ebuffer.size() <<
")!"
498 std::cerr <<
"cellIDs.size (" << cellIds.size() <<
") != rho_buffer.size (" << Ebuffer.size() <<
")!"
506 std::cerr <<
"Warning: Field boundary pointers uninitialized!" << std::endl;
512 for(
int i=0;
i<3;
i++) {
515 double shift = E.
dx[
i]/2;
520 E.
time = B.time =
V.time = time;
524 for(uint
i=0;
i< cellIds.size();
i++) {
525 uint64_t
c = cellIds[
i]-1;
526 int64_t x =
c % cells[0];
527 int64_t y = (
c /cells[0]) % cells[1];
528 int64_t z =
c /(cells[0]*cells[1]);
531 double* Btgt = B.getCellRef(x,y,z);
532 Etgt[0] = Ebuffer[3*
i];
533 Etgt[1] = Ebuffer[3*
i+1];
534 Etgt[2] = Ebuffer[3*
i+2];
535 Btgt[0] = Bbuffer[3*
i];
536 Btgt[1] = Bbuffer[3*
i+1];
537 Btgt[2] = Bbuffer[3*
i+2];
540 double* Vtgt =
V.getCellRef(x,y,z);
542 Vtgt[0] = rho_v_buffer[3*
i] / rho_buffer[
i];
543 Vtgt[1] = rho_v_buffer[3*
i+1] / rho_buffer[
i];
544 Vtgt[2] = rho_v_buffer[3*
i+2] / rho_buffer[
i];
546 Vtgt[0] = rho_v_buffer[3*
i];
547 Vtgt[1] = rho_v_buffer[3*
i+1];
548 Vtgt[2] = rho_v_buffer[3*
i+2];
bool readNextTimestep(const std::string &filename_pattern, double t, int step, Field &E0, Field &E1, Field &B0, Field &B1, Field &V, bool doV, int &input_file_counter)
static std::string rho_field_name
static bool divide_rhov_by_rho
static std::string V_field_name