17 std::vector<RZPair>
x;
31 GridFiles(
const std::string& node_file,
const std::string& element_file,
const std::string& flx_aif_file){
38 file_reader.
open(node_file);
43 std::vector<double> tmp_nodes(
nnodes*4);
44 file_reader.
read(tmp_nodes.data(), tmp_nodes.size());
47 x = std::vector<RZPair>(
nnodes);
49 for(
int i=0; i<
nnodes; i++){
51 x[i].r = tmp_nodes[i*4 + 1];
52 x[i].z = tmp_nodes[i*4 + 2];
53 rgn[i] = tmp_nodes[i*4 + 3];
57 file_reader.
open(element_file);
64 file_reader.
read(tmp_ele.data(), tmp_ele.size());
70 nodes[i].vertex[0] = tmp_ele[i*4 + 1];
71 nodes[i].vertex[1] = tmp_ele[i*4 + 2];
72 nodes[i].vertex[2] = tmp_ele[i*4 + 3];
77 exit_XGC(
"\nError: C++ grid file reader can't read old flux files (i.e. NEW_FLX_AIF must be On)");
79 file_reader.
open(flx_aif_file);
81 int nsurfaces1, nsurfaces2, nsurfaces3a, nsurfaces3b;
82 file_reader.
read(&nsurfaces1, 1);
83 file_reader.
read(&nsurfaces2, 1);
84 file_reader.
read(&nsurfaces3a, 1);
85 file_reader.
read(&nsurfaces3b, 1);
87 nsurfaces = nsurfaces1 + nsurfaces2 + nsurfaces3a + nsurfaces3b;
109 std::vector<int> scalars(4);
168 enum { NE = 0, N, NW, SW, S, SE };
176 for(
int ish = 1; ish<=nshells; ish++){
177 int nodes_in_shell = 6*ish;
178 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
179 int first_node = inode;
180 int inner_shell_node = first_inner_shell_node;
182 double r_track = raxis + rscale*ish;
183 double z_track = zaxis;
184 for (
int inodesh = 0; inodesh < nodes_in_shell; inodesh++){
185 x[inode].r = r_track;
186 x[inode].z = z_track;
187 rgn[inode] = (ish==nshells? OnWall : Inside);
190 nodes[itri].vertex[0] = inner_shell_node;
191 nodes[itri].vertex[1] = inode-1;
192 nodes[itri].vertex[2] = inode;
195 nodes[itri].vertex[0] = inner_shell_node;
196 nodes[itri].vertex[1] = (inodesh == nodes_in_shell - 1) ? first_inner_shell_node : (inner_shell_node+1);
197 nodes[itri].vertex[2] = inode;
204 int hex_region = inodesh/ish;
205 double r_move, z_move;
207 {r_move = -0.5; z_move = 1.0;}
208 else if (hex_region == N)
209 {r_move = -1.0; z_move = 0.0;}
210 else if (hex_region == NW)
211 {r_move = -0.5; z_move = -1.0;}
212 else if (hex_region == SW)
213 {r_move = 0.5; z_move = -1.0;}
214 else if (hex_region == S)
215 {r_move = 1.0; z_move = 0.0;}
216 else if (hex_region == SE)
217 {r_move = 0.5; z_move = 1.0;}
218 r_track += rscale*r_move;
219 z_track += zscale*z_move;
224 nodes[itri].vertex[0] = first_inner_shell_node;
225 nodes[itri].vertex[1] = inode-1;
226 nodes[itri].vertex[2] = first_node;
232 nodes[i].vertex[0]++;
233 nodes[i].vertex[1]++;
234 nodes[i].vertex[2]++;
247 return sqrt((a.
r-b.
r)*(a.
r-b.
r) + (a.
z-b.
z)*(a.
z-b.
z));
274 for(
int ish = 1; ish<=nshells; ish++){
275 int nodes_in_shell = 6*ish;
276 int nodes_in_inner_shell = ish==1 ? 1 : 6*(ish-1);
277 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
278 int first_node = inode;
279 int inner_shell_node = first_inner_shell_node;
281 for (
int inodesh = 0; inodesh <= nodes_in_shell; inodesh++){
283 if(inodesh<nodes_in_shell){
284 double angle =
TWOPI*double(inodesh)/double(nodes_in_shell);
285 x[inode].r = raxis + ish*rscale*cos(angle);
286 x[inode].z = zaxis + ish*zscale*sin(angle);
287 rgn[inode] = (ish==nshells? OnWall : Inside);
292 int outer_node = (inodesh < nodes_in_shell) ? inode : first_node;
293 int prev_outer_node = inode-1;
296 int next_inner_shell_node = inner_shell_node+1;
297 if(next_inner_shell_node-first_inner_shell_node==nodes_in_inner_shell) next_inner_shell_node = first_inner_shell_node;
302 if(distance1>distance2 && next_inner_shell_node!=inner_shell_node){
303 if(itri>=
nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
304 nodes[itri].vertex[0] = inner_shell_node;
305 nodes[itri].vertex[1] = next_inner_shell_node;
306 nodes[itri].vertex[2] = prev_outer_node;
307 inner_shell_node = next_inner_shell_node;
311 if(itri>=
nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
312 nodes[itri].vertex[0] = inner_shell_node;
313 nodes[itri].vertex[1] = prev_outer_node;
314 nodes[itri].vertex[2] = outer_node;
318 if(inodesh<nodes_in_shell){
327 if(itri!=
nodes.size()) {printf(
"\nFewer elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
331 nodes[i].vertex[0]++;
332 nodes[i].vertex[1]++;
333 nodes[i].vertex[2]++;
349 :
nnodes(1 + 3*(nshells+1)*nshells),
374 :
nnodes(1 + 3*(nshells+1)*nshells),
385 double raxis = magnetic_field.
equil.axis_r;
386 double zaxis = magnetic_field.
equil.axis_z;
390 double width = 2*std::min(magnetic_field.
bd_max_r - magnetic_field.
equil.axis_r,
393 double height = 2*std::min(magnetic_field.
bd_max_z - magnetic_field.
equil.axis_z,
401 double triangle_width = width/(2*nshells);
402 double triangle_height = height/(2*nshells);
406 double scale = std::min(width,height)/(2*nshells);
412 GridFiles(
const std::string node_file,
const std::string ele_file){
double bd_max_z
Maximum z (of what exactly?)
Definition: magnetic_field.hpp:23
std::vector< int > nnodes_on_surface
Definition: grid_files.hpp:26
bool is_rank_zero()
Definition: globals.hpp:16
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
int nsurfaces
Definition: grid_files.hpp:25
Definition: magnetic_field.hpp:9
Definition: grid_files.hpp:14
void read(T *var, int n)
Definition: file_reader.hpp:28
void construct_circular_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:259
GridFiles(int nshells, double raxis, double zaxis, double rscale, double zscale, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:348
const double TWOPI
Definition: globals.hpp:98
double z
Definition: grid_structs.hpp:30
Definition: grid_structs.hpp:28
double bd_min_r
Minimum r (of what exactly?)
Definition: magnetic_field.hpp:20
Definition: grid_files.hpp:149
std::vector< Vertex > nodes
Definition: grid_files.hpp:22
GridFiles(MagneticField< HostType > &magnetic_field, int nshells, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:373
int ntriangles
Definition: grid_files.hpp:21
Definition: grid_files.hpp:148
double bd_min_z
Minimum z (of what exactly?)
Definition: magnetic_field.hpp:22
Definition: file_reader.hpp:6
void construct_hex_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:161
double r
Definition: grid_structs.hpp:29
Equilibrium< Device > equil
The object containing information about the magnetic equilibrium.
Definition: magnetic_field.hpp:32
void exit_XGC(std::string msg)
Definition: globals.hpp:26
Definition: magnetic_field.F90:1
int sum_nnodes_on_surfaces
Definition: grid_files.hpp:27
GridCreateOpt
Definition: grid_files.hpp:147
GridFiles(const std::string &node_file, const std::string &element_file, const std::string &flx_aif_file)
Definition: grid_files.hpp:31
std::vector< int > rgn
Definition: grid_files.hpp:18
int nnodes
Definition: grid_files.hpp:16
std::vector< int > nodes_of_surfaces
Definition: grid_files.hpp:28
std::vector< RZPair > x
Definition: grid_files.hpp:17
void skip(int n)
Definition: file_reader.hpp:45
GridFiles(const std::string node_file, const std::string ele_file)
Definition: grid_files.hpp:412
double node_to_node_dist(RZPair a, RZPair b)
Definition: grid_files.hpp:246
void open(const std::string &input)
Definition: file_reader.hpp:13
double bd_max_r
Maximum r (of what exactly?)
Definition: magnetic_field.hpp:21