|
[Sponsors] |
Write Cell Volumes and Velocities for each TimeStep |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
April 19, 2017, 05:35 |
Write Cell Volumes and Velocities for each TimeStep
|
#1 |
Member
Sebastian Trunk
Join Date: Mar 2015
Location: Erlangen, Germany
Posts: 60
Rep Power: 11 |
Hello everybody,
I am write a little post-processing tool which writes out the cell volumes and the velocities in the cells for a specific region in the domain. Since I am only interested in a small part of my domain, I define a distance from z_min to z_max in an so called CoordinatesDict in the constant directory. I want to write the data in a .dat file to proceed working with python. At the moment the code looks like this... Code:
// This file is based on OpenFOAM. // Description // Write mesh cell volumes in volumes.dat file and velocity in // velocity.dat file in current folder. #include "OFstream.H" #include "argList.H" #include "timeSelector.H" #include "Time.H" #include "fvMesh.H" #include "vectorIOField.H" #include "volFields.H" #include "surfaceFields.H" //#include "fvCFD.H" using namespace Foam; int main(int argc, char *argv[]) { timeSelector::addOptions(); # include "setRootCase.H" Info << "\n***EXTRACT CELL VOLUMES AND VELOCITIES***\n" << endl; Info << "This applications is extacting the volumes and the velocities from a region in the domain\n" << endl; # include "createTime.H" instantList timeDirs = timeSelector::select0(runTime, args); # include "createMesh.H" # include "createFields.H" Info << "1) Reading all volumes..." << endl; Info << "Extracting cells between z = " << z_min.value(); Info << " and z = " << z_max.value() << endl; OFstream volumes("volumes_" + runTime.timeName() + ".dat"); forAll(mesh.C(), idx) { if (mesh.C()[idx].component(2) >= z_min.value()) if (mesh.C()[idx].component(2) <= z_max.value()) { volumes << idx << ' ' << mesh.V()[idx] << ' ' << mesh.C()[idx] << endl; } } Info << "Volumes DONE...\n" << endl; Info << "2) Reading velocities...\n" << endl; forAll(timeDirs, timeI) { runTime.setTime(timeDirs[timeI], timeI); Info<< "Time = " << runTime.timeName() << endl; #include "createMesh.H" #include "createFields.H" OFstream velocity("velocity_" + runTime.timeName() + ".dat"); Info << "Extracting cells between z = " << z_min.value(); Info << " and z = " << z_max.value() << endl; //Extract the z component of the cell centers Info << "Writing data to the files velocity_" + runTime.timeName() + ".dat" << "\n" << endl; forAll(mesh.C(), idx) { if (mesh.C()[idx].component(2) >= z_min.value()) if (mesh.C()[idx].component(2) <= z_max.value()) { velocity << idx << ' ' << U[idx].component(0) << ' ' << U[idx].component(1) << ' ' << U[idx].component(2) << endl; } } } Info << "Writing done \n" << endl; return 0; } Code:
#include "createMesh.H" #include "createFields.H" I tried so come around with mesh.readUpdate() but I did not work out... Thank a lot for your input! Best regards |
|
April 20, 2017, 06:51 |
Default Write Cell Volumes and Velocities for each TimeStep
|
#2 |
New Member
Max
Join Date: Sep 2016
Location: Delft
Posts: 22
Rep Power: 10 |
Hi Sisetrum
I do not know a way to get around reading Code:
#include "createMesh.H" #include "createFields.H" Code:
runTime.setTime(timeDirs[timeDirs.size()-1], timeDirs.size()-1); Info<< "Time = " << runTime.timeName() << endl; Hope I could help |
|
April 20, 2017, 07:22 |
|
#3 |
Member
Sebastian Trunk
Join Date: Mar 2015
Location: Erlangen, Germany
Posts: 60
Rep Power: 11 |
Hey,
thank you for your reply! I had something similar to your version. As you said, this gets the data of the last time step... What I want to get, is a tool that it works in the same way as the sample utility: Read the mesh only one time to write out the volumes of the cells and extract the velocities from the data in the time directories. Code:
SAMPLE: Create time ---> CREATE THE MESH Create mesh for time = 0 Reading set description: lineX1 Reading surface description: constantPlane ---> SAMPLE ON THE MESH FOR DIFFERENT TIME STEPS Time = 0 Time = 0.25 Time = 0.37 End |
|
April 20, 2017, 07:32 |
Links to sample
|
#4 |
New Member
Max
Join Date: Sep 2016
Location: Delft
Posts: 22
Rep Power: 10 |
I recommend you look at the sample utility then.
https://cpp.openfoam.org/v3/a04479_source.html and check how it loads the mesh in "#include "createNamedMesh.H"" before forAll. Last edited by WildeCat; April 20, 2017 at 07:33. Reason: Pressed enter too soon |
|
April 20, 2017, 07:33 |
|
#5 |
Member
Sebastian Trunk
Join Date: Mar 2015
Location: Erlangen, Germany
Posts: 60
Rep Power: 11 |
Thanks, I will give it a try...
|
|
April 20, 2017, 07:55 |
Sample code
|
#6 |
New Member
Max
Join Date: Sep 2016
Location: Delft
Posts: 22
Rep Power: 10 |
Hi Sisetrun,
I have taken the liberty to modify your code to import the mesh only once. I think this should work. An idea to speed up your code is not not use "createFields.H" but write in only the variables you need specifically. I have not figured out if createFields or the equivalent variables can be written out of the time loop. To write only the variables you need look at other post processing utilities. I Hope this helps. Code:
// This file is based on OpenFOAM. // Description // Write mesh cell volumes in volumes.dat file and velocity in // velocity.dat file in current folder. #include "OFstream.H" #include "argList.H" #include "timeSelector.H" #include "Time.H" #include "fvMesh.H" #include "vectorIOField.H" #include "volFields.H" #include "surfaceFields.H" //#include "fvCFD.H" using namespace Foam; int main(int argc, char *argv[]) { timeSelector::addOptions(); # include "setRootCase.H" Info << "\n***EXTRACT CELL VOLUMES AND VELOCITIES***\n" << endl; Info << "This applications is extacting the volumes and the velocities from a region in the domain\n" << endl; # include "createTime.H" instantList timeDirs = timeSelector::select0(runTime, args); // modification end #include "createMesh.H" Info << "1) Reading all volumes..." << endl; Info << "Extracting cells between z = " << z_min.value(); Info << " and z = " << z_max.value() << endl; OFstream volumes("volumes_" + runTime.timeName() + ".dat"); forAll(mesh.C(), idx) { if (mesh.C()[idx].component(2) >= z_min.value()) if (mesh.C()[idx].component(2) <= z_max.value()) { volumes << idx << ' ' << mesh.V()[idx] << ' ' << mesh.C()[idx] << endl; } } Info << "Volumes DONE...\n" << endl; Info << "2) Reading velocities...\n" << endl; forAll(timeDirs, timeI) { runTime.setTime(timeDirs[timeI], timeI); Info<< "Time = " << runTime.timeName() << endl; mesh.readUpdate(); #include "createFields.H" //eventually write your own createFields.H OFstream velocity("velocity_" + runTime.timeName() + ".dat"); Info << "Extracting cells between z = " << z_min.value(); Info << " and z = " << z_max.value() << endl; //Extract the z component of the cell centers Info << "Writing data to the files velocity_" + runTime.timeName() + ".dat" << "\n" << endl; forAll(mesh.C(), idx) { if (mesh.C()[idx].component(2) >= z_min.value()) if (mesh.C()[idx].component(2) <= z_max.value()) { velocity << idx << ' ' << U[idx].component(0) << ' ' << U[idx].component(1) << ' ' << U[idx].component(2) << endl; } } } Info << "Writing done \n" << endl; return 0; } |
|
April 20, 2017, 08:29 |
|
#7 |
Member
Sebastian Trunk
Join Date: Mar 2015
Location: Erlangen, Germany
Posts: 60
Rep Power: 11 |
Awesome... Thanks a lot for your help!
|
|
|
|