6 #define STELLARATOR_PLANE_LIMIT 4
30 View<RZPair*, HostType>
x;
31 View<int*, HostType>
rgn;
38 View<int*, HostType>
i_x;
51 View<double*, HostType>
psiN;
53 void convert_to_x_rgn_format(
const View<double**, CLayout, HostType>& tmp_nodes, View<RZPair*, HostType>&
x, View<int*, HostType>&
rgn,
bool is_stellarator){
54 Kokkos::parallel_for(
"transpose_x_and_rgn", Kokkos::RangePolicy<HostExSpace>(0,tmp_nodes.extent(0)), KOKKOS_LAMBDA(
const int i ){
56 x(i).r = tmp_nodes(i,1);
57 x(i).z = tmp_nodes(i,2);
58 rgn(i) = is_stellarator ? tmp_nodes(i,5) : tmp_nodes(i,3);
63 Kokkos::parallel_for(
"transpose_x_and_rgn", Kokkos::RangePolicy<HostExSpace>(0,tmp_ele.extent(0)), KOKKOS_LAMBDA(
const int i ){
65 nodes(i).vertex[0] = tmp_ele(i,1);
66 nodes(i).vertex[1] = tmp_ele(i,2);
67 nodes(i).vertex[2] = tmp_ele(i,3);
71 View<int*, HostType>
pack_scalars(
int max_nodes_on_surface,
int n_xpts,
int n_separatrices)
const{
73 View<int*, HostType> scalars_s(
"scalars", n_scalars);
77 scalars_s(3) = max_nodes_on_surface;
79 scalars_s(5) = n_xpts;
80 scalars_s(6) = n_separatrices;
88 void unpack_scalars(
const View<int*, HostType>& scalars,
int& max_nodes_on_surface,
int& n_xpts,
int& n_separatrices){
92 max_nodes_on_surface = scalars(3);
95 n_separatrices = scalars(6);
113 int max_nodes_on_surface = plane_files.
surf_idx.extent(1);
114 int n_xpts = plane_files.
i_x.size();
116 auto scalars_s = plane_files.
pack_scalars(max_nodes_on_surface, n_xpts, n_separatrices);
117 View<int*, HostType> scalars(
"scalars", scalars_s.layout());
118 send_right(my_mpi, scalars_s, scalars);
119 unpack_scalars(scalars, max_nodes_on_surface, n_xpts, n_separatrices);
128 i_x = View<int*, HostType>(
"i_x", n_xpts);
137 send_right(my_mpi, plane_files.
rgn, rgn);
139 View<double*,CLayout, HostType, Kokkos::MemoryTraits<Kokkos::Unmanaged>> x_dbl((
double*)(
x.data()),
x.size()*2);
140 View<double*,CLayout, HostType, Kokkos::MemoryTraits<Kokkos::Unmanaged>> src_x_dbl((
double*)(plane_files.
x.data()), plane_files.
x.size()*2);
141 send_right(my_mpi, src_x_dbl, x_dbl);
142 View<int*,CLayout, HostType, Kokkos::MemoryTraits<Kokkos::Unmanaged>> nodes_dbl((
int*)(nodes.data()), nodes.size()*3);
143 View<int*,CLayout, HostType, Kokkos::MemoryTraits<Kokkos::Unmanaged>> src_nodes_dbl((
int*)(plane_files.
nodes.data()), plane_files.
nodes.size()*3);
144 send_right(my_mpi, src_nodes_dbl, nodes_dbl);
147 send_right(my_mpi, plane_files.
i_x, i_x);
153 send_right(my_mpi, plane_files.
surf_idx, surf_idx);
157 PlaneFiles(
const std::string& node_file,
const std::string& element_file,
const std::string& flx_aif_file,
bool is_stellarator,
const MPI_Comm& comm){
161 MPI_Comm_rank(comm, &my_rank);
167 int max_nodes_on_surface;
171 if(my_rank==ROOT_RANK){
176 file_reader.
open(node_file);
181 View<double**, CLayout, HostType> tmp_nodes(
NoInit(
"tmp_nodes"),
nnodes,4);
184 Kokkos::resize(tmp_nodes,
nnodes,6);
186 file_reader.
read(tmp_nodes.data(), tmp_nodes.size());
194 file_reader.
open(element_file);
200 file_reader.
read(tmp_ele.data(), tmp_ele.size());
203 nodes = View<Vertex*, HostType>(
"nodes",
ntriangles);
208 bool old_flx_aif_format = is_stellarator ?
false :
is_old_flx_format(flx_aif_file);
211 file_reader.
open(flx_aif_file);
214 if(old_flx_aif_format){
215 file_reader.
read(&nsurfaces, 1);
218 i_x = View<int*, HostType>(
"i_x",0);
219 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), 0);
227 file_reader.
read(&n_xpts, 1);
228 i_x = View<int*, HostType>(
"i_x", n_xpts);
232 file_reader.
read(&i_xpt1, 1);
233 file_reader.
read(&i_xpt2, 1);
236 if(n_xpts==1 && i_xpt2 != -1)
exit_XGC(
"Error in flx.aif file: n_xpts=1, but i_xpt2 is specified.\n");
237 if(n_xpts==2 && i_xpt2 <= 0)
exit_XGC(
"Error in flx.aif file: n_xpts=2, but i_xpt2 is not specified.\n");
239 if(n_xpts>=1)
i_x(0) = i_xpt1 - 1;
240 if(n_xpts>=2)
i_x(1) = i_xpt2 - 1;
254 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), n_separatrices);
261 i_x = View<int*, HostType>(
"i_x",0);
262 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), 0);
272 nnodes_on_surface = View<int*, HostType>(
NoInit(
"nnodes_on_surface"),
nsurfaces);
274 file_reader.
read(nnodes_on_surface.data(), nnodes_on_surface.size());
278 for(
int i=0; i<nnodes_on_surface.size(); i++){
281 if(i<nnodes_on_surface.size() - 1) file_reader.
read(&dummy_idx, 1);
286 max_nodes_on_surface = 0;
287 for(
int i=0; i<nnodes_on_surface.size(); i++) max_nodes_on_surface = std::max(
nnodes_on_surface(i), max_nodes_on_surface);
290 surf_idx = View<int**, CLayout, HostType>(
"surf_idx",
nsurfaces, max_nodes_on_surface);
294 for(
int i=0; i<nnodes_on_surface.size(); i++){
298 int surf_idx_counter = 0;
299 for(
int i=0; i<nnodes_on_surface.size(); i++){
307 int should_be_negative_one;
310 file_reader.
read(&should_be_negative_one, 1);
311 if(should_be_negative_one != -1){
312 printf(
"\nExpected -1 at end of section in surface file, encountered %d instead\n", should_be_negative_one);
313 exit_XGC(
"Error reading surface file.\n");
316 file_reader.
read(&num_non_aligned, 1);
317 printf(
" - reading num_non_aligned: %d",num_non_aligned);
326 non_aligned_surf_idx = View<int**, CLayout, HostType>(
"non_aligned_surf_idx",
num_non_aligned, 4);
329 if(old_flx_aif_format){
340 file_reader.
read(&should_be_negative_one, 1);
341 if(should_be_negative_one != -1){
342 printf(
"\nExpected -1 at end of the surface file, encountered %d instead\n", should_be_negative_one);
343 exit_XGC(
"Error reading surface file.\n");
351 auto scalars =
pack_scalars(max_nodes_on_surface, n_xpts, n_separatrices);
355 MPI_Bcast(scalars.data(), scalars.size(), MPI_INT, ROOT_RANK, comm);
358 if(my_rank!=ROOT_RANK){
360 unpack_scalars(scalars, max_nodes_on_surface, n_xpts, n_separatrices);
366 nodes = View<Vertex*, HostType>(
"nodes",
ntriangles);
369 i_x = View<int*, HostType>(
"i_x", n_xpts);
370 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), n_separatrices);
373 non_aligned_surf_idx = View<int**, CLayout, HostType>(
NoInit(
"non_aligned_surf_idx"),
num_non_aligned, 4);
374 nnodes_on_surface = View<int*, HostType>(
NoInit(
"nnodes_on_surface"),
nsurfaces);
375 surf_idx = View<int**, CLayout, HostType>(
NoInit(
"surf_idx"),
nsurfaces, max_nodes_on_surface);
380 MPI_Bcast(
x.data(),
x.size()*2, MPI_DOUBLE, ROOT_RANK, comm);
381 MPI_Bcast( rgn.data(), rgn.size(), MPI_INT, ROOT_RANK, comm);
382 MPI_Bcast( nodes.data(), nodes.size()*3, MPI_INT, ROOT_RANK, comm);
384 if(i_x.size()>0) MPI_Bcast( i_x.data(), i_x.size(), MPI_INT, ROOT_RANK, comm);
385 if(i_surf_separatrices.size()>0) MPI_Bcast( i_surf_separatrices.data(), i_surf_separatrices.size(), MPI_INT, ROOT_RANK, comm);
386 if(non_aligned_vert.size()>0) MPI_Bcast( non_aligned_vert.data(), non_aligned_vert.size(), MPI_INT, ROOT_RANK, comm);
387 if(non_aligned_nsurf.size()>0) MPI_Bcast( non_aligned_nsurf.data(), non_aligned_nsurf.size(), MPI_INT, ROOT_RANK, comm);
388 if(non_aligned_surf_idx.size()>0) MPI_Bcast( non_aligned_surf_idx.data(), non_aligned_surf_idx.size(), MPI_INT, ROOT_RANK, comm);
389 MPI_Bcast( nnodes_on_surface.data(), nnodes_on_surface.size(), MPI_INT, ROOT_RANK, comm);
390 MPI_Bcast( surf_idx.data(), surf_idx.size(), MPI_INT, ROOT_RANK, comm);
417 enum { NE = 0,
N, NW, SW, S, SE };
420 int max_nodes_on_surface = 6*nshells;
421 surf_idx = View<int**, CLayout, HostType>(
NoInit(
"surf_idx"),
nsurfaces, max_nodes_on_surface);
431 for(
int ish = 1; ish<=nshells; ish++){
432 int nodes_in_shell = 6*ish;
433 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
434 int first_node = inode;
435 int inner_shell_node = first_inner_shell_node;
437 double r_track = raxis + rscale*ish;
438 double z_track = zaxis;
439 for (
int inodesh = 0; inodesh < nodes_in_shell; inodesh++){
440 x(inode).r = r_track;
441 x(inode).z = z_track;
447 nodes(itri).vertex[0] = inner_shell_node;
448 nodes(itri).vertex[1] = inode-1;
449 nodes(itri).vertex[2] = inode;
452 nodes(itri).vertex[0] = inner_shell_node;
453 nodes(itri).vertex[1] = (inodesh == nodes_in_shell - 1) ? first_inner_shell_node : (inner_shell_node+1);
454 nodes(itri).vertex[2] = inode;
461 int hex_region = inodesh/ish;
462 double r_move, z_move;
464 {r_move = -0.5; z_move = 1.0;}
465 else if (hex_region ==
N)
466 {r_move = -1.0; z_move = 0.0;}
467 else if (hex_region == NW)
468 {r_move = -0.5; z_move = -1.0;}
469 else if (hex_region == SW)
470 {r_move = 0.5; z_move = -1.0;}
471 else if (hex_region == S)
472 {r_move = 1.0; z_move = 0.0;}
473 else if (hex_region == SE)
474 {r_move = 0.5; z_move = 1.0;}
475 r_track += rscale*r_move;
476 z_track += zscale*z_move;
481 nodes(itri).vertex[0] = first_inner_shell_node;
482 nodes(itri).vertex[1] = inode-1;
483 nodes(itri).vertex[2] = first_node;
491 nodes(i).vertex[0]++;
492 nodes(i).vertex[1]++;
493 nodes(i).vertex[2]++;
498 int n_separatrices = 0;
499 i_x = View<int*, HostType>(
"i_x", n_xpts);
500 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), n_separatrices);
505 non_aligned_surf_idx = View<int**, CLayout, HostType>(
NoInit(
"non_aligned_surf_idx"),
num_non_aligned, 4);
514 return sqrt((a.
r-b.
r)*(a.
r-b.
r) + (a.
z-b.
z)*(a.
z-b.
z));
538 int max_nodes_on_surface = 6*nshells;
539 surf_idx = View<int**, CLayout, HostType>(
NoInit(
"surf_idx"),
nsurfaces, max_nodes_on_surface);
545 for(
int ish = 1; ish<=nshells; ish++){
546 int nodes_in_shell = 6*ish;
547 int nodes_in_inner_shell = ish==1 ? 1 : 6*(ish-1);
548 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
549 int first_node = inode;
550 int inner_shell_node = first_inner_shell_node;
552 for (
int inodesh = 0; inodesh <= nodes_in_shell; inodesh++){
554 if(inodesh<nodes_in_shell){
555 double angle =
TWOPI*double(inodesh)/double(nodes_in_shell);
556 x(inode).r = raxis + ish*rscale*cos(angle);
557 x(inode).z = zaxis + ish*zscale*sin(angle);
565 int outer_node = (inodesh < nodes_in_shell) ? inode : first_node;
566 int prev_outer_node = inode-1;
569 int next_inner_shell_node = inner_shell_node+1;
570 if(next_inner_shell_node-first_inner_shell_node==nodes_in_inner_shell) next_inner_shell_node = first_inner_shell_node;
575 if(distance1>distance2 && next_inner_shell_node!=inner_shell_node){
576 if(itri>=nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
577 nodes(itri).vertex[0] = inner_shell_node;
578 nodes(itri).vertex[1] = next_inner_shell_node;
579 nodes(itri).vertex[2] = prev_outer_node;
580 inner_shell_node = next_inner_shell_node;
584 if(itri>=nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
585 nodes(itri).vertex[0] = inner_shell_node;
586 nodes(itri).vertex[1] = prev_outer_node;
587 nodes(itri).vertex[2] = outer_node;
591 if(inodesh<nodes_in_shell){
599 if(itri!=nodes.size()) {printf(
"\nFewer elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
603 nodes(i).vertex[0]++;
604 nodes(i).vertex[1]++;
605 nodes(i).vertex[2]++;
610 int n_separatrices = 0;
611 i_x = View<int*, HostType>(
"i_x", n_xpts);
612 i_surf_separatrices = View<int*, HostType>(
NoInit(
"i_surf_separatrices"), n_separatrices);
622 non_aligned_surf_idx = View<int**, CLayout, HostType>(
NoInit(
"non_aligned_surf_idx"),
num_non_aligned, 4);
632 if(nnodes<1)
return 0;
633 else return std::ceil(sqrt(12*nnodes - 3)/6 - 0.5);
647 :
nnodes(1 + 3*(nshells+1)*nshells),
652 nsurfaces(nshells+1),
653 nnodes_on_surface(
NoInit(
"nnodes_on_surface"),nsurfaces),
671 :
nnodes(1 + 3*(nshells+1)*nshells),
676 nsurfaces(nshells+1),
677 nnodes_on_surface(
NoInit(
"nnodes_on_surface"),nsurfaces),
697 double triangle_width = width/(2*nshells);
698 double triangle_height = height/(2*nshells);
702 double scale = std::min(width,height)/(2*nshells);
712 View<Equil::XPoint*, HostType> xpts(
NoInit(
"xpts"), i_x.size());
713 for(
int i = 0; i<i_x.size(); i++){
714 xpts(i).r =
x(
i_x(i)).r;
715 xpts(i).z =
x(
i_x(i)).z;
727 return x(
x.size()-1);
758 if(nlr.
get<
bool>(
"sml_create_analytic_grid",
false)==
true){
765 nshells = nlr.
get<
int>(
"nsurfaces", 30);
766 axis_r = nlr.
get<
double>(
"axis_r", 1.5);
769 if(
is_rank_zero()) printf(
"\nCreating a circular analytic grid with %d surfaces and %d nodes.\n", nshells, 1 + 3*(nshells+1)*nshells);
774 double scale = 0.999/nshells;
775 double rscale = scale;
776 double zscale = scale;
784 std::string node_file = nlr.
get<std::string>(
"sml_node_file",
"example_file.node");
785 std::string ele_file = nlr.
get<std::string>(
"sml_ele_file",
"example_file.ele");
786 std::string surf_file = nlr.
get<std::string>(
"sml_surf_file",
"example_file.flx.aif");
787 std::string input_file_dir = nlr.
get<std::string>(
"sml_input_file_dir",
"./");
790 surf_file = nlr.
get<std::string>(
"sml_surf_file",
"example_file.grid");
793 node_file = input_file_dir +
"/equilibrium/" + node_file.substr(0, node_file.size() - 5);
794 ele_file = input_file_dir +
"/equilibrium/" + ele_file.substr(0, ele_file.size() - 4);
796 surf_file = input_file_dir +
"/equilibrium/" + surf_file;
799 int ifile = iplane*2 + 1;
802 if(std::to_string(ifile + 1).length() > n_char)
803 exit_XGC(
"Error, plane number " + std::to_string(ifile + 1) +
" is larger than the maximum number of allowed planes.\n");
805 std::string ifile_str = std::to_string(ifile);
806 ifile_str = std::string(n_char - std::min(n_char, ifile_str.length()),
'0') + ifile_str;
808 std::string midplane_node_file = node_file +
"_" + ifile_str +
".node";
809 std::string midplane_ele_file = ele_file +
"_" + ifile_str +
".ele";
810 std::string midplane_surf_file = surf_file;
816 ifile_str = std::to_string(ifile);
817 ifile_str = std::string(n_char - std::min(n_char, ifile_str.length()),
'0') + ifile_str;
818 node_file = node_file +
"_" + ifile_str +
".node";
819 ele_file = ele_file +
"_" + ifile_str +
".ele";
828 node_file = input_file_dir +
"/" + node_file;
829 ele_file = input_file_dir +
"/" + ele_file;
830 surf_file = input_file_dir +
"/" + surf_file;
RZPair get_reference_point() const
Definition: grid_files.hpp:726
View< int *, HostType > pack_scalars(int max_nodes_on_surface, int n_xpts, int n_separatrices) const
Definition: grid_files.hpp:71
Definition: grid_files.hpp:398
PlaneFiles(int nshells, double raxis, double zaxis, double rscale, double zscale, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:646
FileRegion
Definition: grid_files.hpp:23
static constexpr GridCreateOpt Hexagonal
Definition: grid_files.hpp:733
bool is_rank_zero()
Definition: globals.hpp:27
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
View< int **, CLayout, HostType > surf_idx
Definition: grid_files.hpp:49
MPI_Comm plane_comm
Definition: my_mpi.hpp:38
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:373
static int nshells_from_nnodes(int nnodes)
Definition: grid_files.hpp:627
static constexpr GridCreateOpt Circular
Definition: grid_files.hpp:734
int n_planes() const
Definition: grid_files.hpp:839
int my_intpl_rank
Definition: my_mpi.hpp:49
void set_fortran_flx_aif_format(int is_flx_aif_format_int)
PlaneFiles()
Definition: grid_files.hpp:103
View< int *, HostType > non_aligned_vert
Definition: grid_files.hpp:46
RZPair get_axis() const
Definition: grid_files.hpp:721
Definition: NamelistReader.hpp:193
Definition: magnetic_field.hpp:12
View< int *, HostType > non_aligned_nsurf
Definition: grid_files.hpp:47
int ntriangles
Definition: grid_files.hpp:34
RZBounds bounds
Simulation boundary.
Definition: magnetic_field.hpp:41
Definition: grid_files.hpp:731
Equilibrium equil
The object containing information about the magnetic equilibrium.
Definition: magnetic_field.hpp:44
void read(T *var, int n)
Definition: file_reader.hpp:28
int num_non_aligned
Definition: grid_files.hpp:45
void construct_circular_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:526
View< Equil::XPoint *, HostType > get_xpts() const
Definition: grid_files.hpp:711
int nsurfaces3a
Definition: grid_files.hpp:41
View< int *, HostType > nnodes_on_surface
Definition: grid_files.hpp:43
int n_specified_xpts() const
Definition: grid_files.hpp:707
Definition: grid_files.hpp:397
GridFiles(int nshells, double raxis, double zaxis, double rscale, double zscale, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:742
double z
Definition: grid_structs.hpp:30
Definition: grid_structs.hpp:28
int nsurfaces2
Definition: grid_files.hpp:41
std::vector< PlaneFiles > plane_files_vec
Definition: grid_files.hpp:736
Definition: my_mpi.hpp:19
GridFiles(MagneticField< HostType > &magnetic_field, int nshells, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:746
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:355
View< int *, HostType > i_x
Definition: grid_files.hpp:38
double max_z
Definition: rz_bounds.hpp:8
Definition: grid_files.hpp:25
#define STELLARATOR_PLANE_LIMIT
Definition: grid_files.hpp:6
double min_r
Definition: rz_bounds.hpp:5
Definition: col_grid.hpp:35
int nsurfaces1
Definition: grid_files.hpp:41
Definition: file_reader.hpp:6
void convert_to_node_format(const View< int **, CLayout, HostType > &tmp_ele, View< Vertex *, HostType > &nodes)
Definition: grid_files.hpp:62
const PlaneFiles & operator[](int i) const
Definition: grid_files.hpp:739
View< double *, HostType > psiN
An array of normalized psi coordinates temporarily needed for the stellarator version.
Definition: grid_files.hpp:51
void unpack_scalars(const View< int *, HostType > &scalars, int &max_nodes_on_surface, int &n_xpts, int &n_separatrices)
Definition: grid_files.hpp:88
GridCreateOpt
Definition: grid_files.hpp:396
View< int **, CLayout, HostType > non_aligned_surf_idx
Definition: grid_files.hpp:48
bool namelist_present(const string &namelist)
Definition: NamelistReader.hpp:351
int nnodes
Definition: grid_files.hpp:29
void construct_hex_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:410
int nsurfaces3b
Definition: grid_files.hpp:41
double r
Definition: grid_structs.hpp:29
void exit_XGC(std::string msg)
Definition: globals.hpp:37
Definition: magnetic_field.F90:1
PlaneFiles(MagneticField< HostType > &magnetic_field, int nshells, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:670
static int nshells_from_nnodes(int nnodes)
Definition: grid_files.hpp:848
void convert_to_x_rgn_format(const View< double **, CLayout, HostType > &tmp_nodes, View< RZPair *, HostType > &x, View< int *, HostType > &rgn, bool is_stellarator)
Definition: grid_files.hpp:53
Definition: grid_files.hpp:21
double node_to_node_dist(RZPair a, RZPair b)
Definition: grid_files.hpp:513
void clear()
Definition: grid_files.hpp:843
void parallel_for(const std::string name, int n_ptl, Function func, Option option, HostAoSoA aosoa_h, DeviceAoSoA aosoa_d)
Definition: streamed_parallel_for.hpp:252
double min_z
Definition: rz_bounds.hpp:7
RZPair axis
Definition: equil.hpp:90
View< int *, HostType > rgn
Definition: grid_files.hpp:31
int nsurfaces
Definition: grid_files.hpp:40
void skip(int n)
Definition: file_reader.hpp:45
View< RZPair *, HostType > x
Definition: grid_files.hpp:30
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:68
constexpr double TWOPI
Definition: constants.hpp:9
Definition: grid_files.hpp:24
View< int *, HostType > i_surf_separatrices
Definition: grid_files.hpp:42
View< Vertex *, HostType > nodes
Definition: grid_files.hpp:35
int sum_nnodes_on_surfaces
Definition: grid_files.hpp:44
void open(const std::string &input)
Definition: file_reader.hpp:13
double max_r
Definition: rz_bounds.hpp:6