ASCOT5
|
2D wall collision checks More...
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "../ascot5.h"
#include "../print.h"
#include "wall_2d.h"
Go to the source code of this file.
Functions | |
int | wall_2d_init (wall_2d_data *data, int nelements, real *r, real *z) |
Load 2D wall data and prepare parameters. | |
void | wall_2d_free (wall_2d_data *data) |
Free allocated resources. | |
void | wall_2d_offload (wall_2d_data *data) |
Offload data to the accelerator. | |
int | wall_2d_inside (real r, real z, wall_2d_data *w) |
Check if coordinates are within 2D polygon 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. | |
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. | |
2D wall collision checks
Definition in file wall_2d.c.
int wall_2d_init | ( | wall_2d_data * | data, |
int | nelements, | ||
real * | r, | ||
real * | z ) |
void wall_2d_free | ( | wall_2d_data * | data | ) |
void wall_2d_offload | ( | wall_2d_data * | data | ) |
int wall_2d_inside | ( | real | r, |
real | z, | ||
wall_2d_data * | w ) |
Check if coordinates are within 2D polygon wall.
This function checks if the given coordinates are within the walls defined by a 2D polygon using a modified axis crossing method [1]. Origin is moved to the coordinates and the number of wall segments crossing the positive r-axis are calculated. If this is odd, the point is inside the polygon.
[1] D.G. Alciatore, R. Miranda. A Winding Number and Point-in-Polygon Algorithm. Technical report, Colorado State University, 1995. https://www.engr.colostate.edu/~dga/documents/papers/point_in_polygon.pdf
r | r coordinate [m] |
z | z coordinate [m] |
w | 2D wall data structure |
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.
r1 | start point R coordinate [m] |
phi1 | start point phi coordinate [rad] |
z1 | start point z coordinate [m] |
r2 | end point R coordinate [m] |
phi2 | end point phi coordinate [rad] |
z2 | end point z coordinate [m] |
w | pointer to data struct on target |
w_coll | pointer for storing the parameter in P = P1 + w_coll * (P2-P1), where P is the point where the collision occurred. |
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.
If there are multiple intersections, the one that is closest to P1 is returned.
r1 | R1 coordinate of the line segment [P1,P2] [m] |
z1 | z1 coordinate of the line segment [P1,P2] [m] |
r2 | R2 coordinate of the line segment [P1,P2] [m] |
z2 | z2 coordinate of the line segment [P1,P2] [m] |
w | pointer to the wall data |
w_coll | pointer for storing the parameter in P = P1 + w_coll * (P2-P1), where P is the point where the collision occurred. |