18 View<RZPair*, HostType>
x;
19 View<int*, HostType>
rgn;
32 Kokkos::parallel_for(
"transpose_x_and_rgn", Kokkos::RangePolicy<HostExSpace>(0,tmp_nodes.extent(0)), KOKKOS_LAMBDA(
const int i ){
34 x(i).r = tmp_nodes(i,1);
35 x(i).z = tmp_nodes(i,2);
36 rgn(i) = tmp_nodes(i,3);
41 Kokkos::parallel_for(
"transpose_x_and_rgn", Kokkos::RangePolicy<HostExSpace>(0,tmp_ele.extent(0)), KOKKOS_LAMBDA(
const int i ){
43 nodes(i).vertex[0] = tmp_ele(i,1);
44 nodes(i).vertex[1] = tmp_ele(i,2);
45 nodes(i).vertex[2] = tmp_ele(i,3);
50 GridFiles(
const std::string& node_file,
const std::string& element_file,
const std::string& flx_aif_file){
57 file_reader.
open(node_file);
62 View<double**, CLayout, HostType> tmp_nodes(
NoInit(
"tmp_nodes"),
nnodes,4);
63 file_reader.
read(tmp_nodes.data(), tmp_nodes.size());
71 file_reader.
open(element_file);
77 file_reader.
read(tmp_ele.data(), tmp_ele.size());
119 View<int*, HostType> scalars(
"scalars", 4);
128 MPI_Bcast(scalars.data(), scalars.size(), MPI_INT, root_rank,
SML_COMM_WORLD);
178 enum { NE = 0,
N, NW, SW, S, SE };
186 for(
int ish = 1; ish<=nshells; ish++){
187 int nodes_in_shell = 6*ish;
188 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
189 int first_node = inode;
190 int inner_shell_node = first_inner_shell_node;
192 double r_track = raxis + rscale*ish;
193 double z_track = zaxis;
194 for (
int inodesh = 0; inodesh < nodes_in_shell; inodesh++){
195 x(inode).r = r_track;
196 x(inode).z = z_track;
197 rgn(inode) = (ish==nshells? OnWall : Inside);
200 nodes(itri).vertex[0] = inner_shell_node;
201 nodes(itri).vertex[1] = inode-1;
202 nodes(itri).vertex[2] = inode;
205 nodes(itri).vertex[0] = inner_shell_node;
206 nodes(itri).vertex[1] = (inodesh == nodes_in_shell - 1) ? first_inner_shell_node : (inner_shell_node+1);
207 nodes(itri).vertex[2] = inode;
214 int hex_region = inodesh/ish;
215 double r_move, z_move;
217 {r_move = -0.5; z_move = 1.0;}
218 else if (hex_region ==
N)
219 {r_move = -1.0; z_move = 0.0;}
220 else if (hex_region == NW)
221 {r_move = -0.5; z_move = -1.0;}
222 else if (hex_region == SW)
223 {r_move = 0.5; z_move = -1.0;}
224 else if (hex_region == S)
225 {r_move = 1.0; z_move = 0.0;}
226 else if (hex_region == SE)
227 {r_move = 0.5; z_move = 1.0;}
228 r_track += rscale*r_move;
229 z_track += zscale*z_move;
234 nodes(itri).vertex[0] = first_inner_shell_node;
235 nodes(itri).vertex[1] = inode-1;
236 nodes(itri).vertex[2] = first_node;
242 nodes(i).vertex[0]++;
243 nodes(i).vertex[1]++;
244 nodes(i).vertex[2]++;
257 return sqrt((a.
r-b.
r)*(a.
r-b.
r) + (a.
z-b.
z)*(a.
z-b.
z));
284 for(
int ish = 1; ish<=nshells; ish++){
285 int nodes_in_shell = 6*ish;
286 int nodes_in_inner_shell = ish==1 ? 1 : 6*(ish-1);
287 int first_inner_shell_node = ish==1 ? 0 : inode - 6*(ish-1);
288 int first_node = inode;
289 int inner_shell_node = first_inner_shell_node;
291 for (
int inodesh = 0; inodesh <= nodes_in_shell; inodesh++){
293 if(inodesh<nodes_in_shell){
294 double angle =
TWOPI*double(inodesh)/double(nodes_in_shell);
295 x(inode).r = raxis + ish*rscale*cos(angle);
296 x(inode).z = zaxis + ish*zscale*sin(angle);
297 rgn(inode) = (ish==nshells? OnWall : Inside);
302 int outer_node = (inodesh < nodes_in_shell) ? inode : first_node;
303 int prev_outer_node = inode-1;
306 int next_inner_shell_node = inner_shell_node+1;
307 if(next_inner_shell_node-first_inner_shell_node==nodes_in_inner_shell) next_inner_shell_node = first_inner_shell_node;
312 if(distance1>distance2 && next_inner_shell_node!=inner_shell_node){
313 if(itri>=
nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
314 nodes(itri).vertex[0] = inner_shell_node;
315 nodes(itri).vertex[1] = next_inner_shell_node;
316 nodes(itri).vertex[2] = prev_outer_node;
317 inner_shell_node = next_inner_shell_node;
321 if(itri>=
nodes.size()) {printf(
"\nMore elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
322 nodes(itri).vertex[0] = inner_shell_node;
323 nodes(itri).vertex[1] = prev_outer_node;
324 nodes(itri).vertex[2] = outer_node;
328 if(inodesh<nodes_in_shell){
337 if(itri!=
nodes.size()) {printf(
"\nFewer elements than expected in circular grid generation. Dynamically resize?"); exit(1); }
341 nodes(i).vertex[0]++;
342 nodes(i).vertex[1]++;
343 nodes(i).vertex[2]++;
359 :
nnodes(1 + 3*(nshells+1)*nshells),
384 :
nnodes(1 + 3*(nshells+1)*nshells),
395 double raxis = magnetic_field.
equil.axis_r;
396 double zaxis = magnetic_field.
equil.axis_z;
400 double width = 2*std::min(magnetic_field.
bd_max_r - magnetic_field.
equil.axis_r,
403 double height = 2*std::min(magnetic_field.
bd_max_z - magnetic_field.
equil.axis_z,
411 double triangle_width = width/(2*nshells);
412 double triangle_height = height/(2*nshells);
416 double scale = std::min(width,height)/(2*nshells);
427 std::string node_file = nlr.
get<std::string>(
"sml_node_file",
"example_file.node");
428 std::string ele_file = nlr.
get<std::string>(
"sml_ele_file",
"example_file.ele");
429 std::string surf_file = nlr.
get<std::string>(
"sml_surf_file",
"example_file.flx.aif");
430 std::string input_file_dir = nlr.
get<std::string>(
"sml_input_file_dir",
"./");
433 node_file = input_file_dir +
"/" + node_file;
434 ele_file = input_file_dir +
"/" + ele_file;
435 surf_file = input_file_dir +
"/" + surf_file;
438 return GridFiles(node_file, ele_file, surf_file);
double bd_max_z
Maximum z (of what exactly?)
Definition: magnetic_field.hpp:23
View< int *, HostType > nodes_of_surfaces
Definition: grid_files.hpp:29
void convert_to_x_rgn_format(const View< double **, CLayout, HostType > &tmp_nodes, View< RZPair *, HostType > &x, View< int *, HostType > &rgn)
Definition: grid_files.hpp:31
bool is_rank_zero()
Definition: globals.hpp:26
MPI_Comm SML_COMM_WORLD
Definition: my_mpi.cpp:4
T get(const string ¶m, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:353
View< Vertex *, HostType > nodes
Definition: grid_files.hpp:23
int nsurfaces
Definition: grid_files.hpp:26
Definition: NamelistReader.hpp:163
Definition: magnetic_field.hpp:9
Definition: grid_files.hpp:15
static GridFiles grid_files_from_namelist(NLReader::NamelistReader &nlr)
Definition: grid_files.hpp:424
void read(T *var, int n)
Definition: file_reader.hpp:28
View< int *, HostType > nnodes_on_surface
Definition: grid_files.hpp:27
void construct_circular_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:269
View< int *, HostType > rgn
Definition: grid_files.hpp:19
GridFiles(int nshells, double raxis, double zaxis, double rscale, double zscale, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:358
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
View< RZPair *, HostType > x
Definition: grid_files.hpp:18
Definition: grid_files.hpp:159
GridFiles(MagneticField< HostType > &magnetic_field, int nshells, GridCreateOpt grid_opt=Hexagonal)
Definition: grid_files.hpp:383
int ntriangles
Definition: grid_files.hpp:22
void use_namelist(const string &namelist)
Definition: NamelistReader.hpp:322
Definition: grid_files.hpp:158
double bd_min_z
Minimum z (of what exactly?)
Definition: magnetic_field.hpp:22
void convert_to_node_format(const View< int **, CLayout, HostType > &tmp_ele, View< Vertex *, HostType > &nodes)
Definition: grid_files.hpp:40
Definition: col_grid.hpp:35
Definition: file_reader.hpp:6
constexpr double TWOPI
Definition: globals.hpp:123
void construct_hex_grid(int nshells, double raxis, double zaxis, double rscale, double zscale)
Definition: grid_files.hpp:171
double r
Definition: grid_structs.hpp:29
Equilibrium< Device > equil
The object containing information about the magnetic equilibrium.
Definition: magnetic_field.hpp:32
Definition: magnetic_field.F90:1
int sum_nnodes_on_surfaces
Definition: grid_files.hpp:28
GridCreateOpt
Definition: grid_files.hpp:157
GridFiles(const std::string &node_file, const std::string &element_file, const std::string &flx_aif_file)
Definition: grid_files.hpp:50
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
int nnodes
Definition: grid_files.hpp:17
void skip(int n)
Definition: file_reader.hpp:45
Kokkos::ViewAllocateWithoutInitializing NoInit
Definition: space_settings.hpp:61
double node_to_node_dist(RZPair a, RZPair b)
Definition: grid_files.hpp:256
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