File: pfcc.cpp

package info (click to toggle)
esys-particle 2.3.5%2Bdfsg2-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 13,132 kB
  • sloc: cpp: 81,480; python: 5,872; makefile: 1,259; sh: 313; perl: 225
file content (153 lines) | stat: -rw-r--r-- 4,285 bytes parent folder | download | duplicates (5)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2017 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.apache.org/licenses/LICENSE-2.0              //
//                                                         //
/////////////////////////////////////////////////////////////

#include "pfcc.h"
#include <cstdlib>

// --- STL includes ---
#include <fstream>
#include <vector>
#include <map>

using std::ifstream;
using std::map;
using std::vector;

using std::make_pair;
/*!
  convert pfc (vvf) file to geo

  \param infilename the input file
  \param outfilename the output file
  \param bbx_min the minimum corner of the bounding box
  \param bbx_max the maximum corner of the bounding box
  \param cx circular boundary cond. in x-dir
  \param cy circular boundary cond. in y-dir
  \param cz circular boundary cond. in z-dir
  \param scale scaling factor
*/
void pfc_convert(const string& infilename,const string& outfilename,const Vec3& bbx_min,const Vec3& bbx_max,int cx,int cy,int cz,double scale)
{
  string ins;
  string::size_type idx;
  map<string,int> colmap;

  ifstream infile(infilename.c_str()); 

  // read 1st line -> dummy,nr.of particles
  infile >> ins;
  idx=ins.find(",");
  string s2=ins.substr(idx+1);
  int npart=atoi(s2.c_str());
  cout << "npart= " << npart << endl;
  
  // read 2nd line (formatting) -> throw away
  infile >> ins;

  //read 3rd line (colum description)
  infile >> ins;
  // split into strings 
  int count=0;
  string::size_type idx_old=0;
  do {
    idx=ins.find(",",idx_old);
    s2=ins.substr(idx_old,idx-idx_old);
    colmap.insert(make_pair(s2,count));
    count++;
    idx_old=idx+1;
  } while (idx!=string::npos);
  // exctact locations of the interesting columns
  int id_col=colmap["EVENT_LABEL"];
  int posx_col=colmap["PFC_BALL_LOCX"];
  int posy_col=colmap["PFC_BALL_LOCY"];
  int posz_col=colmap["PFC_BALL_LOCZ"];
  int rad_col=colmap["PFC_BALL_RADIUS"];
  int tag_col=colmap["PFC_BALL_ATTR"];

  // write geo header
  ofstream outfile(outfilename.c_str());
  outfile << "LSMGeometry 1.2" << endl;
  outfile << "BoundingBox " << bbx_min << " " << bbx_max << endl;
  outfile << "PeriodicBoundaries " << cx << " " << cy << " " << cz << endl;
  outfile << "Dimensions 3D" << endl;
  outfile << "BeginParticles" << endl;
  outfile << "Simple" << endl;
  outfile << npart << endl;
  vector<string> temp(count);
  for(int ipart=0;ipart<npart;ipart++){
    // read pfc Line
    for(int j=0;j<count;j++){
      infile >> temp[j];
    }
    int pid=atoi((temp[id_col]).c_str());
    Vec3 pos=Vec3(atof((temp[posx_col]).c_str()),atof((temp[posy_col]).c_str()),atof((temp[posz_col]).c_str()));
    double rad=atof((temp[rad_col]).c_str());
    int tag=atoi((temp[tag_col]).c_str());
    // write geo line
    outfile << pos << " " << rad << " " << pid << " " << tag << endl;
  }
  // write geo footer
  outfile << "EndParticles" << endl;
  outfile << "BeginConnect" << endl;
  outfile << "0" << endl;
  outfile << "EndConnect" << endl;
  // close files
  outfile.close();
  infile.close();
}

/*!
  read bounding box file
*/
pair<Vec3,Vec3> read_bbx(const string& filename)
{
  Vec3 min,max;
  double xmin=0.0,ymin=0.0,zmin=0.0;
  double xmax=0.0,ymax=0.0,zmax=0.0;
  double tmp=0.0;
  string id,dummy;

  ifstream infile(filename.c_str());

  for(int i=0;i<6;i++){
    infile >> id >> dummy >> tmp;
    if(id=="wx1"){
      xmax=tmp;
    } else if(id=="wx2"){
      xmin=tmp;
    } else if(id=="wy1"){
      ymax=tmp;
    } else if(id=="wy2"){
      ymin=tmp;
    } else if(id=="wz1"){
      zmax=tmp;
    } else if(id=="wz2"){
      zmin=tmp;
    }
  }
  infile.close();

  if (xmin>xmax) {
    tmp=xmin;xmin=xmax;xmax=tmp;
  }
  if (ymin>ymax) {
    tmp=ymin;ymin=ymax;ymax=tmp;
  }
  if (zmin>zmax) {
    tmp=zmin;zmin=zmax;zmax=tmp;
  }

  min=Vec3(xmin,ymin,zmin);
  max=Vec3(xmax,ymax,zmax);

  return make_pair(min,max);
}