ASCOT5
Loading...
Searching...
No Matches
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
22int 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
54 free(data->wall_r);
55 free(data->wall_z);
56}
57
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
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
128int 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
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}
Main header file for ASCOT5.
double real
Definition ascot5.h:85
Header file for math.c.
Macros for printing console output.
#define print_out(v,...)
Print to standard output.
Definition print.h:31
@ VERBOSE_IO
Definition print.h:20
2D wall data parameters
Definition wall_2d.h:15
real * wall_z
Definition wall_2d.h:18
int * flag
Definition wall_2d.h:19
real * wall_r
Definition wall_2d.h:17
void wall_2d_offload(wall_2d_data *data)
Offload data to the accelerator.
Definition wall_2d.c:63
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
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
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
void wall_2d_free(wall_2d_data *data)
Free allocated resources.
Definition wall_2d.c:53
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
Header file for wall_2d.c.