hemocell
Loading...
Searching...
No Matches
FluidHdf5IO.hh
Go to the documentation of this file.
1/*
2This file is part of the HemoCell library
3
4HemoCell is developed and maintained by the Computational Science Lab
5in the University of Amsterdam. Any questions or remarks regarding this library
6can be sent to: info@hemocell.eu
7
8When using the HemoCell library in scientific work please cite the
9corresponding paper: https://doi.org/10.3389/fphys.2017.00563
10
11The HemoCell library is free software: you can redistribute it and/or
12modify it under the terms of the GNU Affero General Public License as
13published by the Free Software Foundation, either version 3 of the
14License, or (at your option) any later version.
15
16The library is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU Affero General Public License for more details.
20
21You should have received a copy of the GNU Affero General Public License
22along with this program. If not, see <http://www.gnu.org/licenses/>.
23*/
24#ifndef FLUID_HDF5_IO_HH
25#define FLUID_HDF5_IO_HH
26
27#include "FluidHdf5IO.hh"
28#include "palabos3D.h"
29#include "palabos3D.hh"
30
31#include <hdf5.h>
32#include <hdf5_hl.h>
33
34namespace hemo {
35
36void outputHDF5(hsize_t* dim, hsize_t* chunk, hid_t& file_id, string& name, float* output) {
37 //We can calulate nvalues through the dims
38 chunk[3] = dim[3];
39 //unsigned int nvalues = dim[0]*dim[1]*dim[2]*dim[3];
40
41 hid_t sid = H5Screate_simple(4,dim,NULL);
42 hid_t plist_id = H5Pcreate (H5P_DATASET_CREATE);
43 H5Pset_chunk(plist_id, 4, chunk);
44 H5Pset_deflate(plist_id, 7);
45 hid_t did = H5Dcreate2(file_id,name.c_str(),H5T_NATIVE_FLOAT,sid,H5P_DEFAULT,plist_id,H5P_DEFAULT);
46 H5Dwrite(did,H5T_NATIVE_FLOAT,H5S_ALL,H5S_ALL,H5P_DEFAULT,output);
47 H5Dclose(did);
48 H5Sclose(sid);
49}
50
51template<template<class U> class DD>
52class WriteFluidField : public BoxProcessingFunctional3D
53{
54public:
55 WriteFluidField(HemoCellFields& cellfields_, MultiBlock3D & fluid_, plint iter_, string identifier_, T dx_, T dt_, vector<int> & outputVariables_) :
56 cellfields(cellfields_), fluid(fluid_), iter(iter_), identifier(identifier_), dx(dx_), dt(dt_),outputVariables(outputVariables_) { }
57
59
60 BlockDomain::DomainT appliesTo () const {
61 return BlockDomain::bulk;
62 }
63
65 return new WriteFluidField(*this);
66 }
67
68 void getTypeOfModification ( vector<modif::ModifT>& modified ) const {
69 for (pluint i = 0; i < modified.size(); i++) {
70 modified[i] = modif::nothing;
71 }
72 }
73
74 void processGenericBlocks( Box3D domain, vector<AtomicBlock3D*> blocks ) {
75
76 int id = global::mpi().getRank();
77 ablock = dynamic_cast<BlockLattice3D<T,DD>*>(blocks[0]);
78 particlefield = dynamic_cast<HemoCellParticleField*>(blocks[1]);
79 blockid = particlefield->atomicBlockId; //Nasty trick to prevent us from having to overload the fluid field ( palabos domain)
80
81 this->odomain = &domain; //Access for output functions
82 if (outputVariables.size() == 0 ) {
83 return; //No output needed? ok
84 }
85
87 identifier += "_PRE";
88 }
89 std::string fileName = global::directories().getOutputDir() + "/hdf5/" + zeroPadNumber(iter) + '/' + identifier + "." + zeroPadNumber(iter) + ".p." + to_string(blockid) + ".h5";
90 hid_t file_id;
91 file_id = H5Fcreate(fileName.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
92 H5LTset_attribute_double (file_id, "/", "dx", &dx, 1);
93 H5LTset_attribute_double (file_id, "/", "dt", &dt, 1);
94 long int iterHDF5=iter;
95 H5LTset_attribute_long (file_id, "/", "iteration", &iterHDF5, 1);
96 H5LTset_attribute_int (file_id, "/", "processorId", &id, 1);
97
98 hsize_t Nx = domain.x1 - domain.x0+1 +2;//+1 for = and <=, +2 for an envelope of 1 on each side for paraview
99 hsize_t Ny = domain.y1 - domain.y0+1 +2;
100 hsize_t Nz = domain.z1 - domain.z0+1 +2;
101 hsize_t nCells = Nx*Ny*Nz;
102 this->nCells = &nCells;
103 int ncells = Nx*Ny*Nz;
104 Dot3D rp_temp = blocks[0]->getLocation();
105 int subdomainSize[] = {int(Nz), int(Ny), int(Nx)}; //Reverse for paraview
106 float dxdydz[3] = {1.,1.,1.};
107 float relativePosition[3] = {float(rp_temp.z+domain.z0-1.5),
108 float(rp_temp.y+domain.y0-1.5),
109 float(rp_temp.x+domain.x0-1.5)}; //Reverse for paraview
110
112 relativePosition[0] *= param::dx;
113 relativePosition[1] *= param::dx;
114 relativePosition[2] *= param::dx;
115 dxdydz[0] = param::dx;
116 dxdydz[1] = param::dx;
117 dxdydz[2] = param::dx;
118 }
119
120 H5LTset_attribute_int (file_id, "/", "numberOfCells", &ncells, 1);
121 H5LTset_attribute_int (file_id, "/", "subdomainSize", subdomainSize, 3);
122 H5LTset_attribute_float(file_id, "/", "relativePosition", relativePosition, 3);
123 H5LTset_attribute_float(file_id,"/","dxdydz",dxdydz,3);
124
125 //Also compute chunking here
126 hsize_t chunk[4];
127 chunk[2] = 1000 < Nx ? 1000 : Nx;
128 chunk[1] = 1000 < Ny ? 1000 : Ny;
129 chunk[0] = 1000 < Nz ? 1000 : Nz;
130
131 //I could do fancy schmancy function pointer lookup like with the particles, but it
132 //takes time, just do it here
133 for (int outputVariable : outputVariables) {
134 //These variables should be set by the functions:
135 float * output = 0;
136 hsize_t dim[4] = {Nz,Ny,Nx,0};
137 string name;
138
139 switch(outputVariable) {
140 case OUTPUT_VELOCITY:
141 output = outputVelocity();
142 name = "Velocity";
143 dim[3] = 3;
144 break;
145 case OUTPUT_FORCE:
146 output = outputForce();
147 name = "Force";
148 dim[3] = 3;
149 break;
150 case OUTPUT_DENSITY:
151 output = outputDensity();
152 name = "Density";
153 dim[3] = 1;
154 break;
155 case OUTPUT_BOUNDARY:
156 output = outputBoundary();
157 name = "Boundary";
158 dim[3] = 1;
159 break;
161 output = outputBindingSites();
162 name = "BindingSites";
163 dim[3] = 1;
164 break;
166 output = outputInteriorPoints();
167 name = "InteriorPoints";
168 dim[3] = 1;
169 break;
170 case OUTPUT_OMEGA:
171 output = outputOmega();
172 name = "Omega";
173 dim[3] = 1;
174 break;
176 for (unsigned int i = 0 ; i < cellfields.size() ; i++) {
177 output = outputCellDensity(cellfields[i]->name);
178 name = "CellDensity_" + cellfields[i]->name;
179 dim[3] = 1;
180 outputHDF5(dim,chunk,file_id,name,output);
181 delete[] output;
182 }
183 continue;
185 output = outputShearStress();
186 name = "ShearStress";
187 dim[3] = 6;
188 break;
190 output = outputShearRate();
191 name = "ShearRate";
192 dim[3] = 9;
193 break;
195 output = outputStrainRate();
196 name = "StrainRate";
197 dim[3] = 6;
198 break;
199
200 default:
201
202 continue;
203 }
204
205
206 outputHDF5(dim,chunk,file_id,name,output);
207 delete[] output;
208
209 }
210 H5Fclose(file_id);
211 }
212
213private:
214
215 float * outputVelocity() {
216 float * output = new float [(*nCells)*3];
217 unsigned int n = 0;
218 plb::Array<T,3> vel;
219 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
220 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
221 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
222
223 ablock->get(iX,iY,iZ).computeVelocity(vel);
224 output[n] = vel[0];
225 output[n+1] = vel[1];
226 output[n+2] = vel[2];
227 n += 3;
228 }
229 }
230 }
231
233 for (unsigned int i = 0 ; i < (*nCells)*3 ; i++) {
234 output[i] = output[i]*param::dx/param::dt;
235 }
236 }
237
238 return output;
239 }
240
241 float * outputForce() {
242 float * output = new float [(*nCells)*3];
243 unsigned int n = 0;
245 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
246 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
247 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
248
249 output[n] = ablock->get(iX,iY,iZ).external.data[0];
250 output[n+1] = ablock->get(iX,iY,iZ).external.data[1];
251 output[n+2] = ablock->get(iX,iY,iZ).external.data[2];
252 n += 3;
253 }
254 }
255 }
256
258 for (unsigned int i = 0 ; i < (*nCells)*3 ; i++) {
259 output[i] = output[i]*param::df;
260 }
261 }
262
263 return output;
264 }
265
266 float * outputDensity() {
267 float * output = new float [(*nCells)];
268 unsigned int n = 0;
269 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
270 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
271 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
272
273 output[n] = ablock->get(iX,iY,iZ).computeDensity();
274 n++;
275 }
276 }
277 }
278
280 for (unsigned int i = 0 ; i < (*nCells) ; i++) {
281 output[i] = output[i]*(param::df/(param::dx*param::dx));
282 }
283 }
284
285 return output;
286 }
287
288 float * outputBoundary() {
289 float * output = new float [(*nCells)];
290 unsigned int n = 0;
291 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
292 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
293 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
294
295 if (ablock->get(iX,iY,iZ).getDynamics().isBoundary()) {
296 output[n] = 1;
297 } else {
298 output[n] = 0;
299 }
300 n++;
301 }
302 }
303 }
304 return output;
305 }
306
308 float * output = new float [(*nCells)];
310 pcout << "(FluidHdf5) (Error) OUTPUT_BINDING_SITES requested, but binding sites not used, outputting a zero field" << endl;
311 for (hsize_t i = 0 ; i < *nCells ; i++) {
312 output[i] = 0;
313 }
314 return output;
315 }
316 unsigned int n = 0;
317 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
318 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
319 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
320
321 if (particlefield->bindingField->get(iX,iY,iZ)) {
322 output[n] = 1;
323 } else {
324 output[n] = 0;
325 }
326 n++;
327 }
328 }
329 }
330 return output;
331 }
332
334 float * output = new float [(*nCells)];
336 pcout << "(FluidHdf5) (Error) OUTPUT_INTERIOR_POINTS requested, but interior viscosity not used, outputting a zero field" << endl;
337 for (hsize_t i = 0 ; i < *nCells ; i++) {
338 output[i] = 0;
339 }
340 return output;
341 }
342 unsigned int n = 0;
343 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
344 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
345 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
346 output[n] = (particlefield->interiorViscosityField->get(iX,iY,iZ));
347 n++;
348 }
349 }
350 }
351 return output;
352 }
353
354 float * outputOmega() {
355 float * output = new float [(*nCells)];
356 unsigned int n = 0;
357 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
358 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
359 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
360
361 output[n] = ablock->get(iX,iY,iZ).getDynamics().getOmega();
362 n++;
363 }
364 }
365 }
366
368 for (unsigned int i = 0 ; i < (*nCells) ; i++) {
369 output[i] = output[i]*(param::df/(param::dx*param::dx));
370 }
371 }
372
373 return output;
374 }
375
376 float * outputCellDensity(string name) {
377 float * output = new float [(*nCells)];
378 memset(output, 0, sizeof(float)*(*nCells));
379
380 vector<HemoCellParticle*> found;
382
383 int Ystride = ((odomain->x1-odomain->x0)+3);
384 int Zstride = Ystride*((odomain->y1-odomain->y0)+3);
385
386 for (HemoCellParticle * particle : found) {
387 plint iX,iY,iZ;
388 //Coordinates are relative
389 const Dot3D tmpDot = ablock->getLocation();
390 iX = plint((particle->sv.position[0]-tmpDot.x)+0.5);
391 iY = plint((particle->sv.position[1]-tmpDot.y)+0.5);
392 iZ = plint((particle->sv.position[2]-tmpDot.z)+0.5);
393
394 output[(iX)+(iY)*Ystride+(iZ)*Zstride] += 1;
395 }
396
398 for (unsigned int i = 0 ; i < (*nCells) ; i++) {
399 output[i] *= cellfields[name]->volumeFractionOfLspPerNode;
400 }
401 }
402
403 return output;
404 }
405
407 float * output = new float [(*nCells)*6];
408 unsigned int n = 0;
409 plb::Array<T,6> stress;
410
411 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
412 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
413 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
414
415 ablock->get(iX,iY,iZ).computeShearStress(stress);
416 //Array<T,6> stress_vec = stress.get(iX,iY,iZ);
417 output[n] = stress[0];
418 output[n+1] = stress[1];
419 output[n+2] = stress[2];
420 output[n+3] = stress[3];
421 output[n+4] = stress[4];
422 output[n+5] = stress[5];
423 n += 6;
424 }
425 }
426 }
427
429 for (unsigned int i = 0 ; i < (*nCells)*6 ; i++) {
430 output[i] = output[i]*(param::df/(param::dx*param::dx));
431 }
432 }
433
434 return output;
435 }
436
437 float * outputShearRate() {
438 float * output = new float [(*nCells)*9];
439 unsigned int n = 0;
440 plb::Array<T,9> shearrate;
441 plb::Array<T,3> velp1;
442 plb::Array<T,3> veln1;
443 plb::Array<T,3> velp2;
444 plb::Array<T,3> veln2;
445 plb::Array<T,3> velp3;
446 plb::Array<T,3> veln3;
447
448 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
449 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
450 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
451
452 // velocity gradients in y-direction
453 ablock->get(iX+1,iY,iZ).computeVelocity(velp1); //vel at cell+1
454 ablock->get(iX-1,iY,iZ).computeVelocity(veln1); //vel at cell+1
455
456 // velocity gradients in y-direction
457 ablock->get(iX,iY+1,iZ).computeVelocity(velp2); //vel at cell+1
458 ablock->get(iX,iY-1,iZ).computeVelocity(veln2); //vel at cell+1
459
460 // velocity gradients in z-direction
461 ablock->get(iX,iY,iZ+1).computeVelocity(velp3); //vel at cell+1
462 ablock->get(iX,iY,iZ-1).computeVelocity(veln3); //vel at cell+1
463
464 shearrate[0] = (velp1[0]-veln1[0])/2; // dv_x /2*dx
465 shearrate[3] = (velp1[1]-veln1[1])/2; // dv_y/ 2*dx
466 shearrate[6] = (velp1[2]-veln1[2])/2; // dv_z /2*dx
467 shearrate[1] = (velp2[0]-veln2[0])/2; // dv_x / 2*dy
468 shearrate[4] = (velp2[1]-veln2[1])/2; // dv_y / 2*dy
469 shearrate[7] = (velp2[2]-veln2[2])/2; // dv_z / 2*dy
470 shearrate[2] = (velp3[0]-veln3[0])/2; // dv_x / 2*dz
471 shearrate[5] = (velp3[1]-veln3[1])/2; // dv_y / 2*dz
472 shearrate[8] = (velp3[2]-veln3[2])/2; // dv_z / 2*dz
473
474 output[n] = shearrate[0];
475 output[n+1] = shearrate[1];
476 output[n+2] = shearrate[2];
477 output[n+3] = shearrate[3];
478 output[n+4] = shearrate[4];
479 output[n+5] = shearrate[5];
480 output[n+6] = shearrate[6];
481 output[n+7] = shearrate[7];
482 output[n+8] = shearrate[8];
483 n += 9;
484 }
485 }
486 }
487
489 for (unsigned int i = 0 ; i < (*nCells)*9 ; i++) {
490 output[i] = output[i]*(1/(param::dt));
491 }
492 }
493
494 return output;
495 }
496
498 float * output = new float [(*nCells)*6];
499 unsigned int n = 0;
500 // calculate tensorfield strain rate
501 std::unique_ptr<TensorField3D<T,6> > strainrate (computeStrainRateFromStress(*ablock));
502 // calculate norm of tensorfield
503 std::unique_ptr<ScalarField3D<T> > shearrate (computeSymmetricTensorNorm(*strainrate));
504
505 //strainrate.get()
506
507 for (plint iZ=odomain->z0-1; iZ<=odomain->z1+1; ++iZ) {
508 for (plint iY=odomain->y0-1; iY<=odomain->y1+1; ++iY) {
509 for (plint iX=odomain->x0-1; iX<=odomain->x1+1; ++iX) {
510
511
512 if ((iX < fluid.getBoundingBox().x0-2) || (iX > fluid.getBoundingBox().x1+2) ||
513 (iY < fluid.getBoundingBox().y0-2) || (iY > fluid.getBoundingBox().y1+2) ||
514 (iZ < fluid.getBoundingBox().z0-2) || (iZ > fluid.getBoundingBox().z1+2) )
515 { output[n] = 0;
516 output[n+1] = 0;
517 output[n+2] = 0;
518 output[n+3] = 0;
519 output[n+4] = 0;
520 output[n+5] = 0;
521 n += 6;
522 }
523 else {
524
525 output[n] = strainrate->get(iX,iY,iZ)[0];
526 output[n+1] = strainrate->get(iX,iY,iZ)[1];
527 output[n+2] = strainrate->get(iX,iY,iZ)[2];
528 output[n+3] = strainrate->get(iX,iY,iZ)[3];
529 output[n+4] = strainrate->get(iX,iY,iZ)[4];
530 output[n+5] = strainrate->get(iX,iY,iZ)[5];
531 n += 6;
532 }
533 }
534 }
535 }
536
538 for (unsigned int i = 0 ; i < (*nCells)*6 ; i++) {
539 output[i] = output[i]*(1/(param::dt));
540 }
541 }
542
543 return output;
544 }
545
546
548 MultiBlock3D& fluid;
551 double dx;
552 double dt;
553 Box3D * odomain;
554 BlockLattice3D<T,DD> * ablock;
558 vector<int> & outputVariables;
559};
560}
561#endif
Definition hemoCellFields.h:53
unsigned int size()
Get the number of celltypes.
Definition hemoCellFields.cpp:148
HemoCell & hemocell
Reference to parent.
Definition hemoCellFields.h:169
Definition hemoCellParticleField.h:39
plb::ScalarField3D< bool > * bindingField
Definition hemoCellParticleField.h:206
pluint atomicBlockId
Definition hemoCellParticleField.h:136
plb::ScalarField3D< T > * interiorViscosityField
Definition hemoCellParticleField.h:192
virtual void findParticles(plb::Box3D domain, std::vector< HemoCellParticle * > &found)
plb::Box3D localDomain
Definition hemoCellParticleField.h:202
Definition hemoCellParticle.h:40
bool outputInSiUnits
Specify whether the output is in SI or LBM units.
Definition hemocell.h:201
bool partOfpreInlet
Definition hemocell.h:228
Definition FluidHdf5IO.hh:53
float * outputShearStress()
Definition FluidHdf5IO.hh:406
HemoCellParticleField * particlefield
Definition FluidHdf5IO.hh:555
string identifier
Definition FluidHdf5IO.hh:550
double dx
Definition FluidHdf5IO.hh:551
BlockLattice3D< T, DD > * ablock
Definition FluidHdf5IO.hh:554
plint iter
Definition FluidHdf5IO.hh:549
float * outputInteriorPoints()
Definition FluidHdf5IO.hh:333
float * outputCellDensity(string name)
Definition FluidHdf5IO.hh:376
WriteFluidField * clone() const
Definition FluidHdf5IO.hh:64
double dt
Definition FluidHdf5IO.hh:552
BlockDomain::DomainT appliesTo() const
Definition FluidHdf5IO.hh:60
float * outputShearRate()
Definition FluidHdf5IO.hh:437
hsize_t * nCells
Definition FluidHdf5IO.hh:557
HemoCellFields & cellfields
Definition FluidHdf5IO.hh:547
float * outputOmega()
Definition FluidHdf5IO.hh:354
float * outputStrainRate()
Definition FluidHdf5IO.hh:497
~WriteFluidField()
Definition FluidHdf5IO.hh:58
float * outputDensity()
Definition FluidHdf5IO.hh:266
void getTypeOfModification(vector< modif::ModifT > &modified) const
Definition FluidHdf5IO.hh:68
void processGenericBlocks(Box3D domain, vector< AtomicBlock3D * > blocks)
Definition FluidHdf5IO.hh:74
float * outputBoundary()
Definition FluidHdf5IO.hh:288
float * outputForce()
Definition FluidHdf5IO.hh:241
vector< int > & outputVariables
Definition FluidHdf5IO.hh:558
int blockid
Definition FluidHdf5IO.hh:556
MultiBlock3D & fluid
Definition FluidHdf5IO.hh:548
float * outputBindingSites()
Definition FluidHdf5IO.hh:307
float * outputVelocity()
Definition FluidHdf5IO.hh:215
Box3D * odomain
Definition FluidHdf5IO.hh:553
WriteFluidField(HemoCellFields &cellfields_, MultiBlock3D &fluid_, plint iter_, string identifier_, T dx_, T dt_, vector< int > &outputVariables_)
Definition FluidHdf5IO.hh:55
#define OUTPUT_VELOCITY
Definition constant_defaults.h:99
#define OUTPUT_SHEAR_STRESS
Definition constant_defaults.h:104
#define OUTPUT_INTERIOR_POINTS
Definition constant_defaults.h:109
#define OUTPUT_STRAIN_RATE
Definition constant_defaults.h:111
#define OUTPUT_FORCE
Definition constant_defaults.h:90
double T
Definition constant_defaults.h:118
#define OUTPUT_CELL_DENSITY
Definition constant_defaults.h:103
#define OUTPUT_DENSITY
Definition constant_defaults.h:100
#define OUTPUT_BINDING_SITES
Definition constant_defaults.h:108
#define OUTPUT_OMEGA
Definition constant_defaults.h:106
#define OUTPUT_SHEAR_RATE
Definition constant_defaults.h:110
long int plint
Definition constant_defaults.h:127
#define OUTPUT_BOUNDARY
Definition constant_defaults.h:107
long unsigned int pluint
Definition constant_defaults.h:130
Definition config.cpp:34
std::string zeroPadNumber(int num, int w)
Definition genericFunctions.cpp:112
long long unsigned int hsize_t
Definition FluidHdf5IO.h:34
void outputHDF5(hsize_t *dim, hsize_t *chunk, hid_t &file_id, string &name, float *output)
Definition FluidHdf5IO.hh:36
Definition array.h:39