ASCOT5
Toggle main menu visibility
Loading...
Searching...
No Matches
wall
wall_2d.c
Go to the documentation of this file.
1
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <
math.h
>
8
#include "
../ascot5.h
"
9
#include "
../print.h
"
10
#include "
wall_2d.h
"
11
22
int
wall_2d_init
(
wall_2d_data
* data,
int
nelements,
real
* r,
real
* z,
23
int
* flag) {
24
25
data->
n
= nelements;
26
data->
flag
= (
int
*)malloc(nelements *
sizeof
(
int
));
27
data->
wall_r
= (
real
*) malloc( nelements *
sizeof
(
real
) );
28
data->
wall_z
= (
real
*) malloc( nelements *
sizeof
(
real
) );
29
real
rmin = r[0], rmax = r[0];
30
real
zmin = z[0], zmax = z[0];
31
for
(
int
i=0; i < nelements; i++) {
32
rmin = fmin(rmin, r[i]);
33
rmax = fmax(rmax, r[i]);
34
zmin = fmin(zmin, z[i]);
35
zmax = fmax(zmax, z[i]);
36
data->
wall_r
[i] = r[i];
37
data->
wall_z
[i] = z[i];
38
data->
flag
[i] = flag[i];
39
}
40
41
print_out
(
VERBOSE_IO
,
"\n2D wall model (wall_2D)\n"
);
42
print_out
(
VERBOSE_IO
,
"Number of wall elements = %d,"
43
" R extend = [%2.2f, %2.2f], z extend = [%2.2f, %2.2f]\n"
,
44
nelements, rmin, rmax, zmin, zmax);
45
return
0;
46
}
47
53
void
wall_2d_free
(
wall_2d_data
* data) {
54
free(data->
wall_r
);
55
free(data->
wall_z
);
56
}
57
63
void
wall_2d_offload
(
wall_2d_data
* data) {
64
GPU_MAP_TO_DEVICE(
65
data->
wall_r
[0:data->
n
],
66
data->
wall_z
[0:data->
n
],
67
data->
flag
[0:data->
n
]
68
)
69
}
70
87
int
wall_2d_inside
(
real
r,
real
z,
wall_2d_data
* w) {
88
int
hits = 0;
89
for
(
int
i = 0; i < w->
n
; i++) {
90
real
wr1, wr2, wz1, wz2;
91
if
(i == w->
n
- 1) {
92
wz1 = w->
wall_z
[i] - z;
93
wz2 = w->
wall_z
[0] - z;
94
wr1 = w->
wall_r
[i] - r;
95
wr2 = w->
wall_r
[0] - r;
96
}
else
{
97
wz1 = w->
wall_z
[i] - z;
98
wz2 = w->
wall_z
[i+1] - z;
99
wr1 = w->
wall_r
[i] - r;
100
wr2 = w->
wall_r
[i+1] - r;
101
}
102
if
(wz1 * wz2 < 0) {
103
real
ri = wr1 + (wz1*(wr2-wr1)) / (wz1-wz2);
104
if
(ri > 0) {
105
hits++;
106
}
107
}
108
}
109
return
hits % 2;
110
}
111
128
int
wall_2d_hit_wall
(
real
r1,
real
phi1,
real
z1,
real
r2,
real
phi2,
real
z2,
129
wall_2d_data
* w,
real
* w_coll) {
130
return
wall_2d_find_intersection
(r1, z1, r2, z2, w, w_coll);
131
}
132
149
int
wall_2d_find_intersection
(
real
r1,
real
z1,
real
r2,
real
z2,
150
wall_2d_data
* w,
real
* w_coll) {
151
int
tile = 0;
152
real
t0 = 2.0;
// Helper variable to pick the closest intersection
153
for
(
int
i=0; i<w->
n
; i++) {
154
real
r3, z3, r4, z4;
155
if
(i == w->
n
-1) {
156
r3 = w->
wall_r
[i];
157
z3 = w->
wall_z
[i];
158
r4 = w->
wall_r
[0];
159
z4 = w->
wall_z
[0];
160
}
else
{
161
r3 = w->
wall_r
[i];
162
z3 = w->
wall_z
[i];
163
r4 = w->
wall_r
[i+1];
164
z4 = w->
wall_z
[i+1];
165
}
166
167
real
div = (r1 - r2) * (z3 - z4) - (z1 - z2) * (r3 - r4);
168
real
t = ( (r1 - r3) * (z3 - z4) - (z1 - z3) * (r3 - r4) ) / div;
169
real
u = ( (r1 - r3) * (z1 - z2) - (z1 - z3) * (r1 - r2) ) / div;
170
if
(0 <= t && t <= 1.0 && 0 <= u && u <= 1.0 && t < t0) {
171
t0 = t;
172
tile = i + 1;
173
}
174
}
175
*w_coll = t0;
176
return
tile;
177
}
ascot5.h
Main header file for ASCOT5.
real
double real
Definition
ascot5.h:85
math.h
Header file for math.c.
print.h
Macros for printing console output.
print_out
#define print_out(v,...)
Print to standard output.
Definition
print.h:31
VERBOSE_IO
@ VERBOSE_IO
Definition
print.h:20
wall_2d_data
2D wall data parameters
Definition
wall_2d.h:15
wall_2d_data::n
int n
Definition
wall_2d.h:16
wall_2d_data::wall_z
real * wall_z
Definition
wall_2d.h:18
wall_2d_data::flag
int * flag
Definition
wall_2d.h:19
wall_2d_data::wall_r
real * wall_r
Definition
wall_2d.h:17
wall_2d_offload
void wall_2d_offload(wall_2d_data *data)
Offload data to the accelerator.
Definition
wall_2d.c:63
wall_2d_find_intersection
int wall_2d_find_intersection(real r1, real z1, real r2, real z2, wall_2d_data *w, real *w_coll)
Find intersection between the wall element and line segment.
Definition
wall_2d.c:149
wall_2d_inside
int wall_2d_inside(real r, real z, wall_2d_data *w)
Check if coordinates are within 2D polygon wall.
Definition
wall_2d.c:87
wall_2d_init
int wall_2d_init(wall_2d_data *data, int nelements, real *r, real *z, int *flag)
Load 2D wall data and prepare parameters.
Definition
wall_2d.c:22
wall_2d_free
void wall_2d_free(wall_2d_data *data)
Free allocated resources.
Definition
wall_2d.c:53
wall_2d_hit_wall
int wall_2d_hit_wall(real r1, real phi1, real z1, real r2, real phi2, real z2, wall_2d_data *w, real *w_coll)
Check if trajectory from (r1, phi1, z1) to (r2, phi2, z2) intersects the wall.
Definition
wall_2d.c:128
wall_2d.h
Header file for wall_2d.c.
Generated on
for ASCOT5 by
1.18.0