-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathUfraw2Uc.cpp
135 lines (107 loc) · 4.19 KB
/
Ufraw2Uc.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*-------------------------------------------------------------------------*\
You can redistribute this code and/or modify this code under the
terms of the GNU General Public License (GPL) as published by the
Free Software Foundation, either version 3 of the License, or (at
your option) any later version. see <http://www.gnu.org/licenses/>.
Please see our website for relavant literature making use of this code:
https://www.imperial.ac.uk/earth-science/research/research-groups/pore-scale-modelling/
For further information please contact us by email:
Ali Q Raeini: [email protected]
\*-------------------------------------------------------------------------*/
#include <fstream>
#include <iostream>
#include <vector>
#include <assert.h>
#include "voxelImage.h"
#include "voxelImage.cpp"
using namespace std;
int usage() {
std::cout<<"Ufraw2Uc "<<std::endl;
std::cout<<
" Converts face centred velocities (Uf*s) to cell centred velocities (Uc*s)\n"
" Writes velocity magnitide if third argument (optional) is Umag or UmagOnly\n"
" Converts also file format if third arg starts with '.' (followed by output format)\n\n"
"Usage examples, type:\n"
" #cd PATH/TO/Ufx.*etc first\n"
" Ufraw2Uc raw vxlImage.mhd # generate Uc*s\n"
" Ufraw2Uc raw vxlImage.mhd Umag # write mag(U) as well\n"
" Ufraw2Uc raw vxlImage.mhd UmagOnly # write mag(U) only\n"
" Ufraw2Uc dat vxlImage.mhd # write Uc*s in ascii format\n"
" Ufraw2Uc tif vxlImage.mhd .raw.gz # read .tif and write .raw files"<< std::endl;
return 1;
}
int main(int argc, char** argv) {
if(argc<3) return usage();
imgExt(string(argv[1]));
std::string headerName(argv[2]);
if(headerName.size()<4 || headerName.compare(0,headerName.size(),"vxlImage.mhd") != 0) usage();
string wUmag;
if(argc>3)
{
wUmag=string(argv[3]);
if(wUmag[0]=='U') std::cout<<"Writing Umag: "<<wUmag<<endl;
else ensure(wUmag[0]!='.',"third argument can only be wUmag or UmagOnly or start with '.' (.raw...), ignoring it: "+wUmag);
}else wUmag="ignor";
string writeFrmt = (wUmag[0]=='.') ? wUmag : imgExt();
std::cout<<" Ufraw2Uc "+imgExt()+" "+headerName+" "<<writeFrmt<<endl;
voxelImage vimage(headerName);
ensure(vimage.nz(), headerName+" not read",-1);
int3 n=vimage.size3();
if(writeFrmt=="dat") vimage.write("vxlImage.dat");
vimage.data_.resize(0);
voxelImageT<float> Umg;
if (wUmag[0]=='U') Umg.reset(n[0],n[1],n[2],0.);
{
voxelImageT<float> fField(n[0]+1,n[1],n[2],0.);
fField.readBin("Ufx"+imgExt());
if(writeFrmt!=imgExt()) fField.writeBin("Ufx"+writeFrmt);
for (int k=0; k<fField.nz(); ++k)
for (int j=0; j<fField.ny(); ++j)
for (int i=0; i<fField.nx()-1; ++i)
fField(i,j,k)=0.5*(fField(i,j,k)+fField(i+1,j,k));
if(wUmag!="UmagOnly")
fField.writeBin("Uccx"+writeFrmt, 0,n[0],0,n[1],0,n[2]);
if(wUmag[0]=='U')
forAllkji(Umg) Umg(i,j,k) += sqr(fField(i,j,k));
}
{
voxelImageT<float> fField(n[0],n[1]+1,n[2],0.);
fField.readBin("Ufy"+imgExt());
if(writeFrmt!=imgExt()) fField.writeBin("Ufy"+writeFrmt);
for (int k=0; k<fField.nz(); ++k)
for (int j=0; j<fField.ny()-1; ++j)
for (int i=0; i<fField.nx(); ++i)
fField(i,j,k)=0.5*(fField(i,j,k)+fField(i,j+1,k));
if(wUmag!="UmagOnly")
fField.writeBin("Uccy"+writeFrmt, 0,n[0],0,n[1],0,n[2]);
if(wUmag[0]=='U')
forAllkji(Umg) Umg(i,j,k) += sqr(fField(i,j,k));
}
{
voxelImageT<float> fField(n[0],n[1],n[2]+1,0.);
fField.readBin("Ufz"+imgExt());
if(writeFrmt!=imgExt()) fField.writeBin("Ufz"+writeFrmt);
for (int k=0; k<fField.nz()-1; ++k)
for (int j=0; j<fField.ny(); ++j)
for (int i=0; i<fField.nx(); ++i)
fField(i,j,k)=0.5*(fField(i,j,k)+fField(i,j,k+1));
if(wUmag!="UmagOnly")
fField.writeBin("Uccz"+writeFrmt, 0,n[0],0,n[1],0,n[2]);
if(wUmag[0]=='U')
forAllkji(Umg) Umg(i,j,k) += sqr(fField(i,j,k));
}
if(wUmag[0]=='U') {
forAlliii_(Umg) Umg(iii) = sqrt(Umg(iii));
Umg.writeBin("Umag"+writeFrmt);
}
if(writeFrmt!=imgExt())
{
voxelImageT<float> pField(n[0],n[1],n[2],0.);
pField.readBin("p"+imgExt());
pField.writeBin("p"+writeFrmt);
pField.readBin("psi"+imgExt());
pField.writeBin("psi"+writeFrmt);
}
std::cout<< "end" << std::endl;
return 0;
}