YetAnotherCoupler 3.1.1
Loading...
Searching...
No Matches
Data Structures | Functions | Variables
clipping.c File Reference
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "geometry.h"
#include "clipping.h"
#include "area.h"
#include "ensure_array_size.h"
#include "utils_core.h"
Include dependency graph for clipping.c:

Go to the source code of this file.

Data Structures

struct  point_list_element
 
struct  point_list
 

Functions

static void init_point_list (struct point_list *list)
 
static void reset_point_list (struct point_list *list)
 
static size_t generate_point_list (struct point_list *list, struct grid_cell cell, int cell_ordering, struct yac_circle *circle_buffer)
 
static struct point_list_elementget_free_point_list_element (struct point_list *list)
 
static size_t remove_points (struct point_list *list)
 
static size_t remove_zero_length_edges (struct point_list *list)
 returns number of edges/corners
 
static void free_point_list (struct point_list *list)
 
static int get_cell_points_ordering (struct grid_cell cell)
 
static void generate_cell (struct point_list *list, struct grid_cell *cell)
 
static enum yac_cell_type get_cell_type (struct grid_cell target_cell)
 
static struct grid_cellget_overlap_cell_buffer (size_t N)
 
static double get_edge_direction (double *ref_corner, double *corner_a, double *corner_b)
 
void yac_compute_overlap_info (size_t N, struct grid_cell *source_cell, struct grid_cell target_cell, double *overlap_areas, double(*overlap_barycenters)[3])
 calculates partial areas for all overlapping parts of the source cells with arbitrary target cells, this is required for conservative remapping. In addition, the barycenter of each overlap is calculated.
 
static double dotproduct (double a[], double b[])
 
void yac_compute_overlap_areas (size_t N, struct grid_cell *source_cell, struct grid_cell target_cell, double *partial_areas)
 calculates partial areas for all overlapping parts of the source cells with arbitrary target cells, this is required for conservative remapping.
 
int yac_circle_compare (void const *a, void const *b)
 
static void compute_norm_vector_kahan (double const a[3], double const b[3], double norm_vector[3])
 
void yac_circle_generate (double const *a, double const *b, enum yac_edge_type type, int edge_ordering, struct yac_circle *circle)
 
static struct yac_circle generate_lat_circle (double z, int north_is_out)
 
int yac_circle_point_is_inside (double const point[3], struct yac_circle *circle)
 
int yac_circle_compare_distances (double const a[3], double const b[3], struct yac_circle *circle)
 
int yac_circle_contains_north_pole (struct yac_circle *circle)
 
static void circle_clipping (struct point_list *cell, size_t num_cell_edges, struct yac_circle **clipping_circles, size_t num_clipping_circles)
 
static void point_list_clipping (struct point_list *source_list, struct point_list target_list, size_t nct)
 
static void copy_point_list (struct point_list in, struct point_list *out)
 
void yac_cell_clipping (size_t N, struct grid_cell *source_cell, struct grid_cell target_cell, struct grid_cell *overlap_buffer)
 cell clipping to get the cells describing the intersections
 
static void yac_lon_lat_cell_lat_clipping (struct grid_cell *cell, double z_upper_bound, double z_lower_bound, struct grid_cell *overlap_buffer)
 
static double get_closest_pole (struct point_list *cell_list)
 
void yac_cell_lat_clipping (size_t N, struct grid_cell *cells, double lat_bounds[2], struct grid_cell *overlap_buffer)
 cell clipping to get the cells describing the intersections
 
void yac_correct_weights (size_t nSourceCells, double *weight)
 correct interpolation weights
 
static void compute_norm_vector (double a[], double b[], double norm[])
 
static int is_empty_gc_cell (struct point_list *list, size_t num_edges)
 
static enum yac_edge_type circle2edge_type (enum yac_circle_type type)
 

Variables

static double const tol = 1.0e-12
 
static struct grid_celloverlap_cell_buffer = NULL
 
static size_t overlap_cell_buffer_size = 0
 

Function Documentation

◆ circle2edge_type()

static enum yac_edge_type circle2edge_type ( enum yac_circle_type  type)
inlinestatic

Definition at line 1737 of file clipping.c.

Here is the caller graph for this function:

◆ circle_clipping()

static void circle_clipping ( struct point_list cell,
size_t  num_cell_edges,
struct yac_circle **  clipping_circles,
size_t  num_clipping_circles 
)
static

cell clipping using Sutherland-Hodgman algorithm;

Definition at line 574 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ compute_norm_vector()

static void compute_norm_vector ( double  a[],
double  b[],
double  norm[] 
)
static

Definition at line 1695 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ compute_norm_vector_kahan()

static void compute_norm_vector_kahan ( double const  a[3],
double const  b[3],
double  norm_vector[3] 
)
static

Definition at line 390 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ copy_point_list()

static void copy_point_list ( struct point_list  in,
struct point_list out 
)
static

Definition at line 1053 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ dotproduct()

static double dotproduct ( double  a[],
double  b[] 
)
inlinestatic

Definition at line 256 of file clipping.c.

Here is the caller graph for this function:

◆ free_point_list()

static void free_point_list ( struct point_list list)
static

Definition at line 1673 of file clipping.c.

Here is the caller graph for this function:

◆ generate_cell()

static void generate_cell ( struct point_list list,
struct grid_cell cell 
)
static
Examples
test_partial_areas.c.

Definition at line 1746 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ generate_lat_circle()

static struct yac_circle generate_lat_circle ( double  z,
int  north_is_out 
)
inlinestatic

Definition at line 449 of file clipping.c.

Here is the caller graph for this function:

◆ generate_point_list()

static size_t generate_point_list ( struct point_list list,
struct grid_cell  cell,
int  cell_ordering,
struct yac_circle circle_buffer 
)
static

Definition at line 1615 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_cell_points_ordering()

static int get_cell_points_ordering ( struct grid_cell  cell)
static

Definition at line 1456 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_cell_type()

static enum yac_cell_type get_cell_type ( struct grid_cell  target_cell)
static

Definition at line 274 of file clipping.c.

Here is the caller graph for this function:

◆ get_closest_pole()

static double get_closest_pole ( struct point_list cell_list)
static

Definition at line 1294 of file clipping.c.

Here is the caller graph for this function:

◆ get_edge_direction()

static double get_edge_direction ( double *  ref_corner,
double *  corner_a,
double *  corner_b 
)
static

Definition at line 89 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_free_point_list_element()

static struct point_list_element * get_free_point_list_element ( struct point_list list)
static

Definition at line 1645 of file clipping.c.

Here is the caller graph for this function:

◆ get_overlap_cell_buffer()

static struct grid_cell * get_overlap_cell_buffer ( size_t  N)
inlinestatic

Definition at line 69 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_point_list()

static void init_point_list ( struct point_list list)
static

Definition at line 1511 of file clipping.c.

Here is the caller graph for this function:

◆ is_empty_gc_cell()

static int is_empty_gc_cell ( struct point_list list,
size_t  num_edges 
)
static

Definition at line 1706 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ point_list_clipping()

static void point_list_clipping ( struct point_list source_list,
struct point_list  target_list,
size_t  nct 
)
static

Definition at line 1030 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_points()

static size_t remove_points ( struct point_list list)
static

Definition at line 1529 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_zero_length_edges()

static size_t remove_zero_length_edges ( struct point_list list)
static

returns number of edges/corners

Definition at line 1585 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reset_point_list()

static void reset_point_list ( struct point_list list)
static

Definition at line 1517 of file clipping.c.

Here is the caller graph for this function:

◆ yac_cell_clipping()

void yac_cell_clipping ( size_t  N,
struct grid_cell source_cell,
struct grid_cell  target_cell,
struct grid_cell overlap_buffer 
)

cell clipping to get the cells describing the intersections

The routine takes (a list of) source cells and a target cell. It sets the target cell data and does some further initialisation. Thus it needs to be called for each new target cell intersection calculation

The vertices of source and target cells can be either provided in a clockwise or anticlockwise sense.

Parameters
[in]Nnumber of source cells
[in]source_celllist of source cells
[in]target_celltarget cell
[in]overlap_bufferbuffer for the overlaps between the target and the source cells
Remarks
source cells can be either convex or concave
target cell has to be convex
cells in overlap_buffer can be concave (even if source cell was convex)
overlap_buffer must contain valid grid_cells (have to be initialised using yac_init_grid_cell; initialisation have to be done only once, in consecutive calls, the cells can be reused with have to be reinitialised)
Examples
test_area.c, test_clipping.c, and test_compute_overlap_area.c.

Definition at line 1078 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ yac_cell_lat_clipping()

void yac_cell_lat_clipping ( size_t  N,
struct grid_cell cells,
double  lat_bounds[2],
struct grid_cell overlap_buffer 
)

cell clipping to get the cells describing the intersections

The routine takes (a list of) cells and two latitude bounds.

Parameters
[in]Nnumber of cells
[in]cellslist of cells
[in]lat_boundslatitude bounds in radiant
[in]overlap_bufferbuffer for the overlaps between the cells and latitude band
Remarks
cells in overlap_buffer can be concave
overlap_buffer must contain valid grid_cells (have to be initialised using yac_init_grid_cell; initialisation have to be done only once, in consecutive calls, the cells can be reused with have to be reinitialised)
this routine is currently not being used within YAC but potentially used within the CDOs
Examples
test_lat_clipping.c.

Definition at line 1315 of file clipping.c.

Here is the call graph for this function:

◆ yac_circle_compare()

int yac_circle_compare ( void const *  a,
void const *  b 
)

Compare routine for yac circles (first by type and second parameters of the circle, if types are identical)

Parameters
[in]ayac circle a
[in]byac circle b
Returns
-1, 0, or 1 depending on the circles (lat circles always come last)
Examples
test_circle.c.

Definition at line 332 of file clipping.c.

Here is the caller graph for this function:

◆ yac_circle_compare_distances()

int yac_circle_compare_distances ( double const  a[3],
double const  b[3],
struct yac_circle circle 
)

Compares the distances of two points to a given yac circle

Parameters
[in]apoint a
[in]bpoint b
[in]circleyac circle
Returns
-1 if point a is closer to the circle than point b
0 if point a and b have the same distance to the circle
1 if point b is closer to the circle than point a
Examples
test_circle.c.

Definition at line 497 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ yac_circle_contains_north_pole()

int yac_circle_contains_north_pole ( struct yac_circle circle)

Determines whether the provided yac circle contains the north pole

Parameters
[in]circleyac circle
Returns
1 if the circle contains the north pole, 0 otherwise
Examples
test_circle.c.

Definition at line 551 of file clipping.c.

Here is the caller graph for this function:

◆ yac_circle_generate()

void yac_circle_generate ( double const *  a,
double const *  b,
enum yac_edge_type  type,
int  edge_ordering,
struct yac_circle circle 
)

Generate a yac circle

Parameters
[in]apoint a
[in]bpoint b
[in]typetyp of edge connecting points a and b
[in]edge_orderingordering of the points a and b
[out]circleyac circle
Examples
test_circle.c.

Definition at line 403 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ yac_circle_point_is_inside()

int yac_circle_point_is_inside ( double const  point[3],
struct yac_circle circle 
)

Determines whether a given point is on the "inside"-side of a plane defined by the given yac circle

Parameters
[in]pointpoint to be checked
[in]circleyac circle
Returns
0 if the point is not inside
1 if the point is inside
2 if the point is on the plane
Examples
test_circle.c.

Definition at line 459 of file clipping.c.

Here is the caller graph for this function:

◆ yac_compute_overlap_areas()

void yac_compute_overlap_areas ( size_t  N,
struct grid_cell source_cell,
struct grid_cell  target_cell,
double *  partial_areas 
)

calculates partial areas for all overlapping parts of the source cells with arbitrary target cells, this is required for conservative remapping.

Some of the underlying concepts can be found in

See e.g. Joseph O'Rourke, Computational Geometry in C, 2nd Ed., 1998 Sec. 7.6 Intersections of Convex Polygons, page 253.

The routine takes (a list of) source cells and a target cell. It determines the clipping points of the intersection between a source and the target cells using cell_clipping internally. In a second step areas are calculated for each intersection described in the overlap cells. If a target cell is fully covered by N source cells the N partial areas should add up to the area of the target cell.

Parameters
[in]Nnumber of source cells
[in]source_celllist of source cells
[in]target_celltarget cell
[out]partial_areaslist of N partial weights, one weight for each source-target intersection
Examples
test_compute_overlap_area.c, and test_partial_areas.c.

Definition at line 263 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ yac_compute_overlap_info()

void yac_compute_overlap_info ( size_t  N,
struct grid_cell source_cell,
struct grid_cell  target_cell,
double *  overlap_areas,
double(*)  overlap_barycenters[3] 
)

calculates partial areas for all overlapping parts of the source cells with arbitrary target cells, this is required for conservative remapping. In addition, the barycenter of each overlap is calculated.

Some of the underlying concepts can be found in

See e.g. Joseph O'Rourke, Computational Geometry in C, 2nd Ed., 1998 Sec. 7.6 Intersections of Convex Polygons, page 253.

The routine takes (a list of) source cells and a target cell. It determines the clipping points of the intersection between a source and the target cells using cell_clipping internally. In a second step areas are calculated for each intersection described in the overlap cells. If a target cell is fully covered by N source cells the N partial areas should add up to the area of the target cell.

Parameters
[in]Nnumber of source cells
[in]source_celllist of source cells
[in]target_celltarget cell
[out]overlap_areaslist of N partial weights, one weight for each source-target intersection
[out]overlap_barycenterscoordinates of the barycenters of the overlap cell
Examples
test_compute_overlap_area.c, and test_partial_areas.c.

Definition at line 109 of file clipping.c.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ yac_correct_weights()

void yac_correct_weights ( size_t  N,
double *  weight 
)

correct interpolation weights

Returns weights with a sum close to 1.0

Parameters
[in]Nnumber of source cells
[out]weightlist of N partial weights
Examples
test_clipping.c, test_interp_method_avg_parallel.c, and test_partial_areas.c.

Definition at line 1435 of file clipping.c.

Here is the caller graph for this function:

◆ yac_lon_lat_cell_lat_clipping()

static void yac_lon_lat_cell_lat_clipping ( struct grid_cell cell,
double  z_upper_bound,
double  z_lower_bound,
struct grid_cell overlap_buffer 
)
static

Definition at line 1185 of file clipping.c.

Here is the caller graph for this function:

Variable Documentation

◆ overlap_cell_buffer

struct grid_cell* overlap_cell_buffer = NULL
static

Definition at line 66 of file clipping.c.

◆ overlap_cell_buffer_size

size_t overlap_cell_buffer_size = 0
static

Definition at line 67 of file clipping.c.

◆ tol

double const tol = 1.0e-12
static

Definition at line 23 of file clipping.c.