OpenFOAM按进程输出和输入文件

OpenFOAM按进程输出和输入文件

在某些前处理过程中需要按进程输入或者输出某些文件,
例如输出网格中心高度大于0.2m的网格中心点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const volVectorField& C = mesh_.C();
string nProc = std::to_string(Pstream::myProcNo());//不同编译器形式不同
fileName gamma = "gamma" + "-" + nProc + ".data";
label count = 0;
forAll(C,cellI){
if(C[cellI][2]>0.2){
count++
}
}
FILE *fout = fopen(gamma.c_str(),"w");
fprintf(fout,"nGamma %d\n",count);
forAll(C,i){
if (C[i][2] <0.2){
fprintf(fout,"%f %f %f\n",C[i][0],C[i][1],C[i][2]);
}
}
fclose(fout);

在另一个程序中输入这些网格中心,并找到相应的cellID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
char tmp[128];
int nGamma = 0;
float a = 0.0; //a,b,c必须被定义为float,不能用scalar;
float b = 0.0;
float c = 0.0;
string nProc = std::to_string(Pstream::myProcNo());
fileName gamma = "gamma" +"-" +nProc+".data";
FILE* fin = fopen(gamma.c_str(),"r");
if(fin == NULL){
Info<< "cannot find gamma file" << endl;
}
fscanf(fin,"%s %d",tmp,&nGamma);
vector listGamma;
for(int k = 0;k<nGamma;k++){
fscanf(fin,"%f %f %f",&a,&b,&c);
listGamma[0] = a ;
listGamma[1] = b ;
listGamma[2] = c ;
label cellID = mesh.findCell(listGamma);
}
fclose(fin);

需要注意的是在使用FILE输入输出文件时,最好使用C++本身函数,与openfoam自带函数有歧义时,需要添加std::