fortplot_streamline_placement Module

Streamline placement algorithms for matplotlib compatibility

Implements matplotlib's approach: - StreamMask for collision detection (30x30 base grid scaled by density) - Spiral seed point generation starting from boundaries - Coordinate system mapping between data, grid, and mask coordinates

Following SOLID principles with single responsibility for placement logic StreamMask for collision detection - equivalent to matplotlib's StreamMask Coordinate mapper for data ↔ grid ↔ mask transformations



Derived Types

type, public ::  stream_mask_t

Components

Type Visibility Attributes Name Initial
integer, public :: nx

Mask dimensions

integer, public :: ny

Mask dimensions

integer, public, allocatable :: mask(:,:)

Collision mask (0=free, 1=occupied)

integer, public, allocatable :: trajectory(:,:)

Current trajectory points for undo

integer, public :: traj_length = 0

Length of current trajectory

integer, public :: current_x = -1

Current position

integer, public :: current_y = -1

Current position

Type-Bound Procedures

procedure, public :: initialize => mask_initialize
procedure, public :: is_free => mask_is_free
procedure, public :: start_trajectory => mask_start_trajectory
procedure, public :: update_trajectory => mask_update_trajectory
procedure, public :: try_update_trajectory => mask_try_update_trajectory
procedure, public :: undo_trajectory => mask_undo_trajectory

type, public ::  coordinate_mapper_t

Components

Type Visibility Attributes Name Initial
real(kind=wp), public :: x_min

Data bounds

real(kind=wp), public :: x_max

Data bounds

real(kind=wp), public :: y_min

Data bounds

real(kind=wp), public :: y_max

Data bounds

integer, public :: grid_nx

Grid dimensions

integer, public :: grid_ny

Grid dimensions

integer, public :: mask_nx

Mask dimensions

integer, public :: mask_ny

Mask dimensions

real(kind=wp), public :: x_grid2mask

Grid to mask scaling

real(kind=wp), public :: y_grid2mask

Grid to mask scaling

real(kind=wp), public :: x_mask2grid

Mask to grid scaling

real(kind=wp), public :: y_mask2grid

Mask to grid scaling

real(kind=wp), public :: x_data2grid

Data to grid scaling

real(kind=wp), public :: y_data2grid

Data to grid scaling

Type-Bound Procedures

procedure, public :: initialize => mapper_initialize
procedure, public :: data2grid => mapper_data2grid
procedure, public :: grid2data => mapper_grid2data
procedure, public :: mask2grid => mapper_mask2grid
procedure, public :: grid2mask => mapper_grid2mask

Subroutines

public subroutine generate_spiral_seeds(mask_shape, seed_points, n_seeds)

Generate seed points in spiral pattern starting from boundary Implements matplotlib's _gen_starting_points algorithm

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: mask_shape(2)
integer, intent(out), allocatable :: seed_points(:,:)
integer, intent(out) :: n_seeds