Technical Documentation¶
This is the technical documentation page. See Tutorials to get started.
Properties¶
-
afv_grid.diffusion¶ Type: num_e\(\times 1\) vector of doublesDescription: Diffusion across the given edge. It is set by the users before computing transition matrices
-
afv_grid.drift¶ Type: num_e\(\times 1\) vector of doublesDescription: Drift across the given edge. It is set by the users before computing transition matrices
-
afv_grid.e2bd¶ Type: ( num_e\(\times\) (2 \(\cdot\)afv_grid.n_dim))-matrix of doublesDescription: Boundary values of edges Note: boundaries are stacked in lexicographic order of (coordinate direction, left/right boundary)
-
afv_grid.e2dir¶ Type: ( num_e\(\times 1\))-vector of integersDescription: Normal/coordinate direction of the edge
-
afv_grid.e2n¶ Type: ( num_e\(\times\) 2)-matrix of integersDescription: Connectivity graph from edges to nodes
-
afv_grid.e_weights¶ Type: ( num_e\(\times 1\))-vector of doublesDescription: (integral) weights of the edges
-
afv_grid.n2bd¶ Type: ( afv_grid.num_e\(\times\) (2 \(\cdot\)afv_grid.n_dim) )-matrix of doublesDescription: Boundary values of the cell Note: boundaries are stacked in lexicographic order of (left/right boundary, coordinate direction)
-
afv_grid.n2e¶ Type: ( afv_grid.num_e\(\times\)afv_grid.n_dim\(\times 2\)) cell array of vector of integersDescription: Connectivity graph from nodes to edges.
-
afv_grid.n2n¶ Type: Description: Neighbor structure of nodes. The third index corresponds to
- 1: left neighbors
- 2: right neighbors
-
afv_grid.n_dim¶ Type: integer Description: Dimensionality of the grid
-
afv_grid.n_points¶ Type: integer Description: Total number of nodes Warning: This is DEPRECATED, and will be eventually removed. Kept for code-reusability with Mean Field Games Toolbox. Use num_eornum_ninstead.
-
afv_grid.num_e¶ Type: integer Description: Total number of edges
-
afv_grid.num_n¶ Type: integer Description: Total number of nodes
-
afv_grid.num_nb¶ Type: Description: Number of neighbors of nodes. The third index corresponds to
- 1: left neighbors
- 2: right neighbors
Functions¶
-
afv_grid.add_new_nodes(obj, n2bd_new, ind_to_consider, flag_compute_left)¶ Add new nodes to the grid
Parameters: - n2bd_new – boundaries of new node points
- ind_to_consider (vector of indices) – (optional) indices of nodes that have interface with new nodes
- flag_compute_left (bool) – (default: false) whether to compute left neighbors as well.
Returns: [n2n] (implicit in class)
- n2n : (in class) neighbor structure
Note
The computing neighbor structure from scratch is an expensive operation. Therefore, one should use new_ind whenever possible. This behavior is guaranteed if one computes using
split_initorsplit, so one should use that function whenever it is feasible.
-
afv_grid.afv_grid(n_dim)¶ Empty Constructor
Parameters: n_dim (integer) – Dimensionality of the grid See also
-
afv_grid.compute_diffusion_distance(obj, ind)¶ INTERNAL METHOD: Calculate the diffusion distance to approximate \(\frac{dg}{dx}\) for diffusion in finite volume method
Parameters: ind (vector of indices) – indices of the node to compute the diffusion distance Returns: the distance to be used in diffusion computation. Return type: r_dist (vector of doubles)
-
afv_grid.compute_edge_midpoints(obj, ind, dir, is_left_edge)¶ Compute the midpoint of the given edge of a node
Parameters: - ind (n-vector of indices) – indices of the node to compute the mid-point of the edge
- dir (n-vector of integers) – coordinate direction of the edge to consider
- is_left_edge (n-vector of bools) – whether computing the mid-points of the left edge or not
Returns: midpoints of the edge
Return type: midpts (n \(\times\)
n_dimof doubles)Note
This function is to calculate external edges of the node that does not face a different node. For internal nodes, consider using function
edge_midpoints
-
afv_grid.compute_node_bds(obj, x_knots)¶ INTERNAL FUNCTION: computes boundaries of new nodes
Parameters: x_knots (cell of vector of doubles) – the boundary knots that define the tensor cut split of a node Returns: boundaries of the nodes Return type: output (matrix of doubles)
-
afv_grid.compute_num_neighbors(obj)¶ Compute the number of neighbors
Parameters: n2n – (implicit) n2nReturns: [num_nb] implicit in class
-
afv_grid.compute_transition_matrix_boundary(obj, ind, dir, flow, is_left_edge)¶ Compute the transition matrix corresponding to the boundary of the given node
Parameters: - ind (vector of indices) – indices of the node to compute the edge dynamics
- dir (vector of integers) – coordinate directions of the edges/flows to consider
- flow (vector of doubles) – flow/drift rate across the edges
- is_left_edge (vector of bool) – whether the edge is a left edge or not
Returns: the transition matrix of the FPK-equation for the given flows across the edges.
Return type: Note
There is
compute_transition_matrix_modifiedfunction that handles the construction of the transition matrix for internal edges facing other cells. This function is supposed to be used for creating the flows for the boundary conditions.
-
afv_grid.compute_transition_matrix_center(obj)¶ Compute the transition matrix corresponding to the Fokker Planck equation
\[\frac{dg}{dt} = -\frac{d}{dx}\left(s(x)\cdot g(x)\right) + \nu \frac{d^2 g}{dx^2}\]using central difference approximation.
Parameters: - e2n – implicit in class
- drift – implicit in class
- diffusion – implicit in class
- node_weights – implicit in class
- e_weights – implicit in class
Returns: the transition matrix from the FPK-equation
Return type: Note
- Many separate parts are needed before this function can be called properly. Instead of setting them manually, try to use the given functions that guarantee the internal structure.
- This function is for internal edges, for external edges, use
compute_transition_matrix_boundary. - Central value approximation is not guaranteed to be stable, if the solution do not behave well consider using
compute_transition_matrix_modified.
-
afv_grid.compute_transition_matrix_modified(obj, weighter)¶ Compute the transition matrix corresponding to the Fokker-Planck equation
\[\frac{dg}{dt} = -\frac{d}{dx}\left(s(x)\cdot g(x)\right) + \nu \frac{d^2 g}{dx^2}\]using the modified upwind scheme (equation 2.3) of [Axelsson & Gustafsson, 1979].
Parameters: - e2n – implicit in class
- drift – implicit in class
- diffusion – implicit in class
- node_weights – implicit in class
- e_weights – implicit in class
Returns: the transition matrix from the FPK-equation
Return type: Note
- Many separate parts are needed before this function can be called properly. Instead of setting them manually, try to use the given functions that guarantee the internal structure.
- This function is for internal edges, for external edges, use
compute_transition_matrix_boundary.
References
-
afv_grid.compute_transition_matrix_upwind(obj)¶ Compute the transition matrix corresponding to the Fokker Planck equation
\[\frac{dg}{dt} = -\frac{d}{dx}\left(s(x)\cdot g(x)\right) + \nu \frac{d^2 g}{dx^2}\]using upwind approximation.
Parameters: - e2n – implicit in class
- drift – implicit in class
- diffusion – implicit in class
- node_weights – implicit in class
- e_weights – implicit in class
Returns: the transition matrix from the FPK-equation
Return type: Warning
Upwind introduced numerical diffusion, so the solution is not accurate compared to other methods. Use
compute_transition_matrix_modifiedunless there is a strong reason to use the upwind scheme.Note
- Many separate parts are needed before this function can be called properly. Instead of setting them manually, try to use the given functions that guarantee the internal structure.
- This function is for internal edges, for external edges, use
compute_transition_matrix_boundary.
-
afv_grid.edge_midpoints(obj, ind)¶ Compute mid-points of the edges
Parameters: ind (vector of indices) – indices of the edges to compute the mid-points Returns: mid-points of the edges Return type: e_midpoints (vector of doubles) See also
-
afv_grid.edge_weights(obj, ind)¶ Compute weight of the given edge
Parameters: ind (vector of indices) – indices of the edges to compute the surface area Returns: surface area of the edges Return type: e_weight (vector of doubles)
-
afv_grid.extract_edges(obj)¶ Extract edges from nodal connections. This function only finds internal edges
Parameters: Returns: [e2bd, e2n, e2dir, e_weights, num_e] (implicit in class)
- e2bd : (in class) boundaries of the edges
- e2n : (in class) connectivity of the edges to the nodes
- e2dir : (in class) normal direction of the edge
- e_weights : (in class) surface area of the edge
- num_e : (in class) total number of edges
-
afv_grid.find_neighbor(obj, ind, dir, is_left, varargin)¶ Find the neighboring node for the given (single) node
Parameters: - ind (integer) – index of the node to find the neighbors of
- dir (integer) – direction to find the neighbors in
- is_left (bool) – whether to look for left neighbors or not
- varargin{1} (vector of indices) – indices of nodes to consider for neighbors (assumed unique)
- n2bd – (implicit in class)
n2bd - n_dim – (implicit in class)
n_dim
Returns: nbs (vector of indices): indices of the neighbors
Note
find_neighbor_structure()runs this function for all nodes.
-
afv_grid.find_neighbor_structure(obj, new_ind, flag_compute_left)¶ Construct neighbor structure
Parameters: - new_ind (sorted vector of indices) – (optional) indices of new nodes to append to the neighbor structure
- flag_compute_left (bool) – (default: false) whether to compute left neighbors as well
Returns: [n2n] (implicit in class)
- n2n : (in class) neighbor structure
Note
The computing neighbor structure from scratch is an expensive operation. Therefore, one should use new_ind whenever possible. This behavior is guaranteed if one computes using
split_initorsplit, so one should use that function whenever it is feasible.
-
afv_grid.node_midpoints(obj, ind)¶ Compute mid-points of the nodes
Parameters: ind (vector of indices) – (default: ‘:’) indices of the nodes to compute the mid-points Returns: n_midpoints (vector of doubles): mid-points of the nodes
-
afv_grid.node_weights(obj, ind)¶ Compute the weight of the given node
Parameters: ind (vector of indices) – indices of the nodes to compute the volume Returns: volume of the nodes Return type: n_weight (vector of doubles)
-
afv_grid.set_dim(obj, n)¶ Sets dimensionality of the problem. This function works as the initializer for the class
Parameters: n (int) – dimensionality of the problem Returns: (implicit in class) Note
Due to object-oriented design, the set of codes assumes a certain internal consistency of states. Hence, one should always set dimentionality of the problem through
set_dim.
-
afv_grid.split(obj, ind, x_cuts, flag_compute_left)¶ Split nodes
Parameters: - ind (vector of indices) – indices of the nodes to split
- x_cuts (cell of vector of double) – for each (node, dimension) the cut points to split the node
- flag_compute_left (bool) – (default: false) whether to compute left neighbors as well
Returns: updates all node structure and edge structure of the grid
-
afv_grid.split_init(obj, node_ind, x_cuts)¶ Split a given node which is a starting point
Parameters: - node_ind (integer) – index of the cell to split
- x_cuts (cell of vectors) – points to introduce new edges
Returns: (implicit in class) internally update states to introduce new cells for the given cell