{
  "esm": "1.1.0",
  "metadata": {
    "name": "Geometry",
    "description": "Standard-library polygon-overlap templates (esm-spec §9.7.1 template-library file). Match-less expression templates giving the pure-AST overlap area of two convex polygons, the quantity the `polygon_intersection_area` geometry leaf returns (esm-spec §8.6.1). `overlap_area_planar(ring_a, cell_a, nv_a, ring_b, cell_b, nv_b)` takes two `[cells, verts, 2]` lon-lat (or x-y) ring stacks and returns the area with straight edges, in squared coordinate units (the leaf's `planar` manifold). `overlap_area_spherical(ring_a, cell_a, nv_a, ring_b, cell_b, nv_b)` takes two `[cells, verts, 3]` stacks of unit vectors and returns the area with great-circle edges, in steradians (the leaf's `spherical` and `geodesic` manifolds); `lonlat_to_unit(ring, cell, vert, comp)` gives component `comp` of the unit vector of a lon-lat vertex in degrees, so a caller builds the unit-vector stack once per cell with a `faq`. `cell` is the cell index and `nv` the number of vertex slots (an integer used as a `faq` `ranges` bound, esm-spec §9.6.1). Rings close implicitly, may run either way round, and may carry repeated vertices (an explicit closing duplicate or rectangular-storage padding): a zero-length edge contributes exactly zero and constrains nothing. By Green's theorem the overlap area is the sum over every edge of each polygon of its shoelace (planar) or signed spherical-triangle (spherical, Van Oosterom-Strackee) contribution restricted to the part inside the other polygon; for convex polygons that part is one chord-parameter interval, a `max`/`min` `faq` over the other polygon's closed half-planes. An edge shared by both polygons is counted once, by `ring_a`, when the two run the same way, and not at all when they run opposite ways. Each step is a `geo_` helper template the public bodies call by reference (esm-spec §9.7.3); the loop symbols and every `faq` stay in the public bodies. Generated by scripts/gen-lib-geometry.py. Import with `expression_template_imports` and invoke with `apply_expression_template`; see docs/content/standard_library.md.",
    "authors": [
      "EarthSciML"
    ],
    "created": "2026-11-07T00:00:00Z",
    "tags": [
      "standard-library",
      "geometry",
      "conservative-regridding",
      "polygon_intersection_area",
      "expression-templates"
    ],
    "references": [
      {
        "citation": "esm-spec.md §8.6.1 (the polygon_intersection_area leaf, operand rings, padding); §9.6 (expression templates); §9.7.1 (template-library files); §9.7.3 (references between templates); CONFORMANCE_SPEC.md §5.8 (geometry tolerance contract)."
      },
      {
        "citation": "Van Oosterom, A. and Strackee, J. (1983). The solid angle of a plane triangle. IEEE Transactions on Biomedical Engineering BME-30(2), 125-126.",
        "doi": "10.1109/TBME.1983.325207"
      }
    ]
  },
  "expression_templates": {
    "overlap_area_planar": {
      "params": [
        "ring_a",
        "cell_a",
        "nv_a",
        "ring_b",
        "cell_b",
        "nv_b"
      ],
      "description": "Overlap area of two convex polygons with straight edges in the plane: cell `cell_a` of the `[cells, nv_a, 2]` ring stack `ring_a` and cell `cell_b` of `ring_b` (vertex v = [x, y], e.g. [lon, lat]). The value of `polygon_intersection_area` with `manifold: \"planar\"` within the esm-spec §8.6.1 / CONFORMANCE_SPEC §5.8.2 tolerance. Either ring orientation; repeated vertices contribute exactly zero. Contributions are taken about the first vertex of `ring_a`, so translating both polygons together changes the result only by rounding. A half-plane test within `geo_tol2` of zero counts as on the line, which is what makes shared edges and vertices exact. Disjoint or edge-touching polygons give 0, and so does a ring of no extent. Non-convex input is outside the contract.",
      "body": {"op":"ifelse","args":[{"op":"or","args":[{"op":"==","args":[{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}},0]},{"op":"==","args":[{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}},0]}]},0,{"op":"+","args":[{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_planar_3":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_contrib2","bindings":{"gp_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gp_t0":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"max","ranges":{"k_overlap_area_planar_4":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t0","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]},"gs_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]},"gs_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",1]},"gs_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",2]},"gs_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},1]},"gs_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},2]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},"gs_py":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},"gs_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",1]},"gs_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",2]},"gs_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},1]},"gs_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},2]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gb_tol":{"op":"apply_expression_template","args":[],"name":"geo_tol2","bindings":{"gt_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]},"gt_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]},"gt_qx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},"gt_qy":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},"gt_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",1]},"gt_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",2]},"gt_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},1]},"gt_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},2]}}},"gb_cl":{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":[{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},{"op":"+","args":[{"op":"*","args":[{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},1]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",1]}]},{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]}]}]},{"op":"*","args":[{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_4","gn_n":"nv_b"}},2]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_4",2]}]},{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]}]}]}]}]},0]},1,0]}}}},"gp_t1":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"min","ranges":{"k_overlap_area_planar_5":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t1","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]},"gs_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]},"gs_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",1]},"gs_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",2]},"gs_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},1]},"gs_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},2]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},"gs_py":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},"gs_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",1]},"gs_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",2]},"gs_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},1]},"gs_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},2]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gb_tol":{"op":"apply_expression_template","args":[],"name":"geo_tol2","bindings":{"gt_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]},"gt_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]},"gt_qx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},"gt_qy":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},"gt_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",1]},"gt_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_5",2]},"gt_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},1]},"gt_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_5","gn_n":"nv_b"}},2]}}}}}},"gp_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",1]},"gp_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_3",2]},"gp_qx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},1]},"gp_qy":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_3","gn_n":"nv_a"}},2]},"gp_ox":{"op":"index","args":["ring_a","cell_a",1,1]},"gp_oy":{"op":"index","args":["ring_a","cell_a",1,2]}}}},{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_planar_6":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_contrib2","bindings":{"gp_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gp_t0":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"max","ranges":{"k_overlap_area_planar_7":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t0","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]},"gs_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]},"gs_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",1]},"gs_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",2]},"gs_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},1]},"gs_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},2]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},"gs_py":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},"gs_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",1]},"gs_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",2]},"gs_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},1]},"gs_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},2]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gb_tol":{"op":"apply_expression_template","args":[],"name":"geo_tol2","bindings":{"gt_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]},"gt_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]},"gt_qx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},"gt_qy":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},"gt_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",1]},"gt_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",2]},"gt_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},1]},"gt_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},2]}}},"gb_cl":{"op":"ifelse","args":[{"op":"==","args":[{"op":"*","args":[{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},{"op":"+","args":[{"op":"*","args":[{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},1]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",1]}]},{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]}]}]},{"op":"*","args":[{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_7","gn_n":"nv_a"}},2]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_7",2]}]},{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]}]}]}]}]},0]},0,1]}}}},"gp_t1":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"min","ranges":{"k_overlap_area_planar_8":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t1","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]},"gs_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]},"gs_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",1]},"gs_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",2]},"gs_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},1]},"gs_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},2]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side2","bindings":{"gs_px":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},"gs_py":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},"gs_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",1]},"gs_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",2]},"gs_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},1]},"gs_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},2]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_planar_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gb_tol":{"op":"apply_expression_template","args":[],"name":"geo_tol2","bindings":{"gt_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]},"gt_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]},"gt_qx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},"gt_qy":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},"gt_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",1]},"gt_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_planar_8",2]},"gt_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},1]},"gt_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_8","gn_n":"nv_a"}},2]}}}}}},"gp_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",1]},"gp_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_planar_6",2]},"gp_qx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},1]},"gp_qy":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_6","gn_n":"nv_b"}},2]},"gp_ox":{"op":"index","args":["ring_a","cell_a",1,1]},"gp_oy":{"op":"index","args":["ring_a","cell_a",1,2]}}}}]}]}
    },
    "overlap_area_spherical": {
      "params": [
        "ring_a",
        "cell_a",
        "nv_a",
        "ring_b",
        "cell_b",
        "nv_b"
      ],
      "description": "Overlap area in steradians (unit sphere) of two convex spherical polygons with great-circle edges: cell `cell_a` of the `[cells, nv_a, 3]` unit-vector stack `ring_a` and cell `cell_b` of `ring_b` (build a stack from lon-lat degrees with `lonlat_to_unit`). The value of `polygon_intersection_area` with `manifold: \"spherical\"` (or `\"geodesic\"`, the same great-circle model) within the CONFORMANCE_SPEC §5.8.2 tolerance; multiply by R^2 for a physical area. Either ring orientation (the interior is the side of less than a hemisphere); repeated vertices contribute exactly zero. Half-space tests are linear in the chord parameter; each clipped edge contributes the signed area of the spherical triangle it spans with the first vertex of `ring_a` (Van Oosterom-Strackee, `atan2`). A half-space test within 1e-14 of zero counts as on the great circle. Each polygon must lie within a hemisphere; non-convex input is outside the contract.",
      "body": {"op":"ifelse","args":[{"op":"or","args":[{"op":"==","args":[{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}},0]},{"op":"==","args":[{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}},0]}]},0,{"op":"+","args":[{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_spherical_3":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_contrib3","bindings":{"gq_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gq_t0":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"max","ranges":{"k_overlap_area_spherical_4":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t0","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",1]},"gh_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",2]},"gh_pz":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",3]},"gh_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",1]},"gh_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",2]},"gh_az":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",3]},"gh_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},1]},"gh_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},2]},"gh_bz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},3]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},1]},"gh_py":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},2]},"gh_pz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},3]},"gh_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",1]},"gh_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",2]},"gh_az":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",3]},"gh_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},1]},"gh_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},2]},"gh_bz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},3]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gb_tol":1e-14,"gb_cl":{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":[{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},1]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",1]}]},"gd_uy":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},2]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",2]}]},"gd_uz":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_4","gn_n":"nv_b"}},3]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_4",3]}]},"gd_wx":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},1]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",1]}]},"gd_wy":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},2]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",2]}]},"gd_wz":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},3]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",3]}]}}}]},0]},1,0]}}}},"gq_t1":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"min","ranges":{"k_overlap_area_spherical_5":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t1","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",1]},"gh_py":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",2]},"gh_pz":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",3]},"gh_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",1]},"gh_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",2]},"gh_az":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",3]},"gh_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},1]},"gh_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},2]},"gh_bz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},3]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},1]},"gh_py":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},2]},"gh_pz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},3]},"gh_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",1]},"gh_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",2]},"gh_az":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_5",3]},"gh_bx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},1]},"gh_by":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},2]},"gh_bz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_5","gn_n":"nv_b"}},3]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gb_tol":1e-14}}},"gq_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",1]},"gq_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",2]},"gq_az":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_3",3]},"gq_qx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},1]},"gq_qy":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},2]},"gq_qz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_3","gn_n":"nv_a"}},3]},"gq_ox":{"op":"index","args":["ring_a","cell_a",1,1]},"gq_oy":{"op":"index","args":["ring_a","cell_a",1,2]},"gq_oz":{"op":"index","args":["ring_a","cell_a",1,3]}}}},{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_spherical_6":[1,"nv_b"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_contrib3","bindings":{"gq_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},"gq_t0":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"max","ranges":{"k_overlap_area_spherical_7":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t0","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",1]},"gh_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",2]},"gh_pz":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",3]},"gh_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",1]},"gh_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",2]},"gh_az":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",3]},"gh_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},1]},"gh_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},2]},"gh_bz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},3]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},1]},"gh_py":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},2]},"gh_pz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},3]},"gh_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",1]},"gh_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",2]},"gh_az":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",3]},"gh_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},1]},"gh_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},2]},"gh_bz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},3]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gb_tol":1e-14,"gb_cl":{"op":"ifelse","args":[{"op":"==","args":[{"op":"*","args":[{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_b","bindings":{"gf_ring":"ring_b","gf_cell":"cell_b","gf_n":"nv_b","gf_other":"ring_a"}}}},{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},1]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",1]}]},"gd_uy":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},2]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",2]}]},"gd_uz":{"op":"-","args":[{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_7","gn_n":"nv_a"}},3]},{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_7",3]}]},"gd_wx":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},1]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",1]}]},"gd_wy":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},2]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",2]}]},"gd_wz":{"op":"-","args":[{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},3]},{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",3]}]}}}]},0]},0,1]}}}},"gq_t1":{"op":"faq","args":["ring_a","ring_b"],"output_idx":[],"reduce":"min","ranges":{"k_overlap_area_spherical_8":[1,"nv_a"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_t1","bindings":{"gb_g0":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",1]},"gh_py":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",2]},"gh_pz":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",3]},"gh_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",1]},"gh_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",2]},"gh_az":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",3]},"gh_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},1]},"gh_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},2]},"gh_bz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},3]}}},"gb_g1":{"op":"apply_expression_template","args":[],"name":"geo_side3","bindings":{"gh_px":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},1]},"gh_py":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},2]},"gh_pz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},3]},"gh_ax":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",1]},"gh_ay":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",2]},"gh_az":{"op":"index","args":["ring_a","cell_a","k_overlap_area_spherical_8",3]},"gh_bx":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},1]},"gh_by":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},2]},"gh_bz":{"op":"index","args":["ring_a","cell_a",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_8","gn_n":"nv_a"}},3]}}},"gb_s":{"op":"apply_expression_template","args":[],"name":"geo_sign","bindings":{"gg_x":{"op":"apply_expression_template","args":[],"name":"overlap_area_spherical_fan_a","bindings":{"gf_ring":"ring_a","gf_cell":"cell_a","gf_n":"nv_a","gf_other":"ring_b"}}}},"gb_tol":1e-14}}},"gq_ax":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",1]},"gq_ay":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",2]},"gq_az":{"op":"index","args":["ring_b","cell_b","k_overlap_area_spherical_6",3]},"gq_qx":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},1]},"gq_qy":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},2]},"gq_qz":{"op":"index","args":["ring_b","cell_b",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_6","gn_n":"nv_b"}},3]},"gq_ox":{"op":"index","args":["ring_a","cell_a",1,1]},"gq_oy":{"op":"index","args":["ring_a","cell_a",1,2]},"gq_oz":{"op":"index","args":["ring_a","cell_a",1,3]}}}}]}]}
    },
    "lonlat_to_unit": {
      "params": [
        "ring",
        "cell",
        "vert",
        "comp"
      ],
      "description": "Component `comp` (1, 2, 3 = x, y, z) of the unit vector of vertex `vert` of cell `cell` of the `[cells, verts, 2]` lon-lat ring stack `ring` (degrees): (cos(lat) cos(lon), cos(lat) sin(lon), sin(lat)), with degrees converted by the binary64 constant pi/180. Applied in a `faq` over cells, vertex slots and a 3-element component axis, it builds the `[cells, verts, 3]` stack `overlap_area_spherical` takes.",
      "body": {"op":"ifelse","args":[{"op":"==","args":["comp",1]},{"op":"*","args":[{"op":"cos","args":[{"op":"*","args":[{"op":"index","args":["ring","cell","vert",2]},0.017453292519943295]}]},{"op":"cos","args":[{"op":"*","args":[{"op":"index","args":["ring","cell","vert",1]},0.017453292519943295]}]}]},{"op":"ifelse","args":[{"op":"==","args":["comp",2]},{"op":"*","args":[{"op":"cos","args":[{"op":"*","args":[{"op":"index","args":["ring","cell","vert",2]},0.017453292519943295]}]},{"op":"sin","args":[{"op":"*","args":[{"op":"index","args":["ring","cell","vert",1]},0.017453292519943295]}]}]},{"op":"sin","args":[{"op":"*","args":[{"op":"index","args":["ring","cell","vert",2]},0.017453292519943295]}]}]}]}
    },
    "geo_next": {
      "params": [
        "gn_v",
        "gn_n"
      ],
      "description": "The vertex slot after `gn_v` in a ring of `gn_n` slots: gn_v + 1, wrapping to 1.",
      "body": {"op":"ifelse","args":[{"op":"<","args":["gn_v","gn_n"]},{"op":"+","args":["gn_v",1]},1]}
    },
    "geo_cross2": {
      "params": [
        "gc_ux",
        "gc_uy",
        "gc_wx",
        "gc_wy"
      ],
      "description": "The planar cross product u x w = ux wy - uy wx.",
      "body": {"op":"-","args":[{"op":"*","args":["gc_ux","gc_wy"]},{"op":"*","args":["gc_uy","gc_wx"]}]}
    },
    "geo_side2": {
      "params": [
        "gs_px",
        "gs_py",
        "gs_ax",
        "gs_ay",
        "gs_bx",
        "gs_by"
      ],
      "description": "(b - a) x (p - a): positive when p is left of the directed line a -> b.",
      "body": {"op":"apply_expression_template","args":[],"name":"geo_cross2","bindings":{"gc_ux":{"op":"-","args":["gs_bx","gs_ax"]},"gc_uy":{"op":"-","args":["gs_by","gs_ay"]},"gc_wx":{"op":"-","args":["gs_px","gs_ax"]},"gc_wy":{"op":"-","args":["gs_py","gs_ay"]}}}
    },
    "geo_l1": {
      "params": [
        "gl_x",
        "gl_y"
      ],
      "description": "The L1 norm |x| + |y|.",
      "body": {"op":"+","args":[{"op":"abs","args":["gl_x"]},{"op":"abs","args":["gl_y"]}]}
    },
    "geo_tol2": {
      "params": [
        "gt_px",
        "gt_py",
        "gt_qx",
        "gt_qy",
        "gt_ax",
        "gt_ay",
        "gt_bx",
        "gt_by"
      ],
      "description": "The planar on-the-line tolerance of edge p -> q against the half-plane of edge a -> b: L1(b - a) (L1(p) + L1(q) + L1(a)) 1e-12.",
      "body": {"op":"*","args":[{"op":"apply_expression_template","args":[],"name":"geo_l1","bindings":{"gl_x":{"op":"-","args":["gt_bx","gt_ax"]},"gl_y":{"op":"-","args":["gt_by","gt_ay"]}}},{"op":"+","args":[{"op":"apply_expression_template","args":[],"name":"geo_l1","bindings":{"gl_x":"gt_px","gl_y":"gt_py"}},{"op":"apply_expression_template","args":[],"name":"geo_l1","bindings":{"gl_x":"gt_qx","gl_y":"gt_qy"}},{"op":"apply_expression_template","args":[],"name":"geo_l1","bindings":{"gl_x":"gt_ax","gl_y":"gt_ay"}}]},1e-12]}
    },
    "geo_dot3": {
      "params": [
        "gd_ux",
        "gd_uy",
        "gd_uz",
        "gd_wx",
        "gd_wy",
        "gd_wz"
      ],
      "description": "The dot product u . w.",
      "body": {"op":"+","args":[{"op":"*","args":["gd_ux","gd_wx"]},{"op":"*","args":["gd_uy","gd_wy"]},{"op":"*","args":["gd_uz","gd_wz"]}]}
    },
    "geo_triple": {
      "params": [
        "gr_ox",
        "gr_oy",
        "gr_oz",
        "gr_ax",
        "gr_ay",
        "gr_az",
        "gr_bx",
        "gr_by",
        "gr_bz"
      ],
      "description": "The triple product o . (a x b).",
      "body": {"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gr_ox","gd_uy":"gr_oy","gd_uz":"gr_oz","gd_wx":{"op":"-","args":[{"op":"*","args":["gr_ay","gr_bz"]},{"op":"*","args":["gr_az","gr_by"]}]},"gd_wy":{"op":"-","args":[{"op":"*","args":["gr_az","gr_bx"]},{"op":"*","args":["gr_ax","gr_bz"]}]},"gd_wz":{"op":"-","args":[{"op":"*","args":["gr_ax","gr_by"]},{"op":"*","args":["gr_ay","gr_bx"]}]}}}
    },
    "geo_side3": {
      "params": [
        "gh_px",
        "gh_py",
        "gh_pz",
        "gh_ax",
        "gh_ay",
        "gh_az",
        "gh_bx",
        "gh_by",
        "gh_bz"
      ],
      "description": "(a x b) . p: positive when p is left of the great circle a -> b.",
      "body": {"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":{"op":"-","args":[{"op":"*","args":["gh_ay","gh_bz"]},{"op":"*","args":["gh_az","gh_by"]}]},"gd_uy":{"op":"-","args":[{"op":"*","args":["gh_az","gh_bx"]},{"op":"*","args":["gh_ax","gh_bz"]}]},"gd_uz":{"op":"-","args":[{"op":"*","args":["gh_ax","gh_by"]},{"op":"*","args":["gh_ay","gh_bx"]}]},"gd_wx":"gh_px","gd_wy":"gh_py","gd_wz":"gh_pz"}}
    },
    "geo_sign": {
      "params": [
        "gg_x"
      ],
      "description": "The orientation sign of a fan sum: 1 when gg_x >= 0, else -1.",
      "body": {"op":"ifelse","args":[{"op":">=","args":["gg_x",0]},1,-1]}
    },
    "geo_t0": {
      "params": [
        "gb_g0",
        "gb_g1",
        "gb_s",
        "gb_tol",
        "gb_cl"
      ],
      "description": "The lower chord-parameter bound one closed half-plane imposes on an edge whose endpoints lie at signed distances s g0, s g1 (>= 0 inside; s is the half-plane polygon's orientation, which cancels from the root g0 / (g0 - g1)). A distance within `tol` of zero is on the line; both endpoints on the line make a collinear edge, whose bound is `cl` (0: no constraint, 1: excluded). An endpoint on the line enters at exactly that endpoint.",
      "body": {"op":"ifelse","args":[{"op":"and","args":[{"op":"<=","args":[{"op":"abs","args":["gb_g0"]},"gb_tol"]},{"op":"<=","args":[{"op":"abs","args":["gb_g1"]},"gb_tol"]}]},"gb_cl",{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":["gb_s","gb_g0"]},{"op":"-","args":["gb_tol"]}]},{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":["gb_s","gb_g1"]},{"op":"-","args":["gb_tol"]}]},1,{"op":"ifelse","args":[{"op":"<=","args":[{"op":"abs","args":["gb_g1"]},"gb_tol"]},1,{"op":"/","args":["gb_g0",{"op":"ifelse","args":[{"op":"==","args":["gb_g0","gb_g1"]},1,{"op":"-","args":["gb_g0","gb_g1"]}]}]}]}]},0]}]}
    },
    "geo_t1": {
      "params": [
        "gb_g0",
        "gb_g1",
        "gb_s",
        "gb_tol"
      ],
      "description": "The upper chord-parameter bound one closed half-plane imposes on an edge (see geo_t0); a collinear edge is not bounded above, and an endpoint on the line leaves at exactly that endpoint.",
      "body": {"op":"ifelse","args":[{"op":"and","args":[{"op":"<=","args":[{"op":"abs","args":["gb_g0"]},"gb_tol"]},{"op":"<=","args":[{"op":"abs","args":["gb_g1"]},"gb_tol"]}]},1,{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":["gb_s","gb_g0"]},{"op":"-","args":["gb_tol"]}]},1,{"op":"ifelse","args":[{"op":"<","args":[{"op":"*","args":["gb_s","gb_g1"]},{"op":"-","args":["gb_tol"]}]},{"op":"ifelse","args":[{"op":"<=","args":[{"op":"abs","args":["gb_g0"]},"gb_tol"]},0,{"op":"/","args":["gb_g0",{"op":"ifelse","args":[{"op":"==","args":["gb_g0","gb_g1"]},1,{"op":"-","args":["gb_g0","gb_g1"]}]}]}]},1]}]}]}
    },
    "geo_contrib2": {
      "params": [
        "gp_s",
        "gp_t0",
        "gp_t1",
        "gp_px",
        "gp_py",
        "gp_qx",
        "gp_qy",
        "gp_ox",
        "gp_oy"
      ],
      "description": "A planar edge p -> q's contribution over the chord interval [t0, t1], about the origin o: s max(0, t1 - t0) ((p - o) x (q - o)) / 2, s the edge's polygon's orientation.",
      "body": {"op":"*","args":["gp_s",{"op":"max","args":[0,{"op":"-","args":["gp_t1","gp_t0"]}]},{"op":"apply_expression_template","args":[],"name":"geo_cross2","bindings":{"gc_ux":{"op":"-","args":["gp_px","gp_ox"]},"gc_uy":{"op":"-","args":["gp_py","gp_oy"]},"gc_wx":{"op":"-","args":["gp_qx","gp_ox"]},"gc_wy":{"op":"-","args":["gp_qy","gp_oy"]}}},0.5]}
    },
    "geo_vos": {
      "params": [
        "gv_t",
        "gv_tau",
        "gv_oa1",
        "gv_lin",
        "gv_dd"
      ],
      "description": "atan2 of the Van Oosterom-Strackee half-angle of the spherical triangle (o, a, x(t)), x(t) the point at chord parameter t on the edge a -> q: atan2(t tau, (1 + o.a)(|a + t d| + 1) + t (o.d + a.d)) with d = q - a, tau = o . (a x q), dd = d . d and |a + t d| = sqrt(1 - t (1 - t) dd).",
      "body": {"op":"atan2","args":[{"op":"*","args":["gv_t","gv_tau"]},{"op":"+","args":[{"op":"*","args":["gv_oa1",{"op":"+","args":[{"op":"sqrt","args":[{"op":"-","args":[1,{"op":"*","args":["gv_t",{"op":"-","args":[1,"gv_t"]},"gv_dd"]}]}]},1]}]},{"op":"*","args":["gv_t","gv_lin"]}]}]}
    },
    "geo_contrib3": {
      "params": [
        "gq_s",
        "gq_t0",
        "gq_t1",
        "gq_ax",
        "gq_ay",
        "gq_az",
        "gq_qx",
        "gq_qy",
        "gq_qz",
        "gq_ox",
        "gq_oy",
        "gq_oz"
      ],
      "description": "A spherical edge a -> q's contribution over the chord interval [t0, t1], about the vertex o: the signed area 2 s (vos(t1) - vos(t0)) of the spherical triangle the clipped edge spans with o when t1 > t0, else 0; s is the edge's polygon's orientation.",
      "body": {"op":"ifelse","args":[{"op":">","args":["gq_t1","gq_t0"]},{"op":"*","args":[2,"gq_s",{"op":"-","args":[{"op":"apply_expression_template","args":[],"name":"geo_vos","bindings":{"gv_t":"gq_t1","gv_tau":{"op":"apply_expression_template","args":[],"name":"geo_triple","bindings":{"gr_ox":"gq_ox","gr_oy":"gq_oy","gr_oz":"gq_oz","gr_ax":"gq_ax","gr_ay":"gq_ay","gr_az":"gq_az","gr_bx":"gq_qx","gr_by":"gq_qy","gr_bz":"gq_qz"}},"gv_oa1":{"op":"+","args":[1,{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ox","gd_uy":"gq_oy","gd_uz":"gq_oz","gd_wx":"gq_ax","gd_wy":"gq_ay","gd_wz":"gq_az"}}]},"gv_lin":{"op":"+","args":[{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ox","gd_uy":"gq_oy","gd_uz":"gq_oz","gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}},{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ax","gd_uy":"gq_ay","gd_uz":"gq_az","gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}}]},"gv_dd":{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":{"op":"-","args":["gq_qx","gq_ax"]},"gd_uy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_uz":{"op":"-","args":["gq_qz","gq_az"]},"gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}}}},{"op":"apply_expression_template","args":[],"name":"geo_vos","bindings":{"gv_t":"gq_t0","gv_tau":{"op":"apply_expression_template","args":[],"name":"geo_triple","bindings":{"gr_ox":"gq_ox","gr_oy":"gq_oy","gr_oz":"gq_oz","gr_ax":"gq_ax","gr_ay":"gq_ay","gr_az":"gq_az","gr_bx":"gq_qx","gr_by":"gq_qy","gr_bz":"gq_qz"}},"gv_oa1":{"op":"+","args":[1,{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ox","gd_uy":"gq_oy","gd_uz":"gq_oz","gd_wx":"gq_ax","gd_wy":"gq_ay","gd_wz":"gq_az"}}]},"gv_lin":{"op":"+","args":[{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ox","gd_uy":"gq_oy","gd_uz":"gq_oz","gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}},{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":"gq_ax","gd_uy":"gq_ay","gd_uz":"gq_az","gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}}]},"gv_dd":{"op":"apply_expression_template","args":[],"name":"geo_dot3","bindings":{"gd_ux":{"op":"-","args":["gq_qx","gq_ax"]},"gd_uy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_uz":{"op":"-","args":["gq_qz","gq_az"]},"gd_wx":{"op":"-","args":["gq_qx","gq_ax"]},"gd_wy":{"op":"-","args":["gq_qy","gq_ay"]},"gd_wz":{"op":"-","args":["gq_qz","gq_az"]}}}}}]}]},0]}
    },
    "overlap_area_planar_fan_a": {
      "params": [
        "gf_ring",
        "gf_cell",
        "gf_n",
        "gf_other"
      ],
      "description": "The signed orientation fan sum of ring `gf_ring` (cell `gf_cell`, `gf_n` slots): positive when it runs counter-clockwise. Loop symbol `k_overlap_area_planar_1`.",
      "body": {"op":"faq","args":["gf_ring","gf_other"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_planar_1":[1,"gf_n"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_cross2","bindings":{"gc_ux":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_planar_1",1]},{"op":"index","args":["gf_ring","gf_cell",1,1]}]},"gc_uy":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_planar_1",2]},{"op":"index","args":["gf_ring","gf_cell",1,2]}]},"gc_wx":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_1","gn_n":"gf_n"}},1]},{"op":"index","args":["gf_ring","gf_cell",1,1]}]},"gc_wy":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_1","gn_n":"gf_n"}},2]},{"op":"index","args":["gf_ring","gf_cell",1,2]}]}}}}
    },
    "overlap_area_planar_fan_b": {
      "params": [
        "gf_ring",
        "gf_cell",
        "gf_n",
        "gf_other"
      ],
      "description": "The signed orientation fan sum of ring `gf_ring` (cell `gf_cell`, `gf_n` slots): positive when it runs counter-clockwise. Loop symbol `k_overlap_area_planar_2`.",
      "body": {"op":"faq","args":["gf_other","gf_ring"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_planar_2":[1,"gf_n"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_cross2","bindings":{"gc_ux":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_planar_2",1]},{"op":"index","args":["gf_ring","gf_cell",1,1]}]},"gc_uy":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_planar_2",2]},{"op":"index","args":["gf_ring","gf_cell",1,2]}]},"gc_wx":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_2","gn_n":"gf_n"}},1]},{"op":"index","args":["gf_ring","gf_cell",1,1]}]},"gc_wy":{"op":"-","args":[{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_planar_2","gn_n":"gf_n"}},2]},{"op":"index","args":["gf_ring","gf_cell",1,2]}]}}}}
    },
    "overlap_area_spherical_fan_a": {
      "params": [
        "gf_ring",
        "gf_cell",
        "gf_n",
        "gf_other"
      ],
      "description": "The signed orientation fan sum of ring `gf_ring` (cell `gf_cell`, `gf_n` slots): positive when it runs counter-clockwise. Loop symbol `k_overlap_area_spherical_1`.",
      "body": {"op":"faq","args":["gf_ring","gf_other"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_spherical_1":[1,"gf_n"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_triple","bindings":{"gr_ox":{"op":"index","args":["gf_ring","gf_cell",1,1]},"gr_oy":{"op":"index","args":["gf_ring","gf_cell",1,2]},"gr_oz":{"op":"index","args":["gf_ring","gf_cell",1,3]},"gr_ax":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_1",1]},"gr_ay":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_1",2]},"gr_az":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_1",3]},"gr_bx":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_1","gn_n":"gf_n"}},1]},"gr_by":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_1","gn_n":"gf_n"}},2]},"gr_bz":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_1","gn_n":"gf_n"}},3]}}}}
    },
    "overlap_area_spherical_fan_b": {
      "params": [
        "gf_ring",
        "gf_cell",
        "gf_n",
        "gf_other"
      ],
      "description": "The signed orientation fan sum of ring `gf_ring` (cell `gf_cell`, `gf_n` slots): positive when it runs counter-clockwise. Loop symbol `k_overlap_area_spherical_2`.",
      "body": {"op":"faq","args":["gf_other","gf_ring"],"output_idx":[],"reduce":"+","ranges":{"k_overlap_area_spherical_2":[1,"gf_n"]},"expr":{"op":"apply_expression_template","args":[],"name":"geo_triple","bindings":{"gr_ox":{"op":"index","args":["gf_ring","gf_cell",1,1]},"gr_oy":{"op":"index","args":["gf_ring","gf_cell",1,2]},"gr_oz":{"op":"index","args":["gf_ring","gf_cell",1,3]},"gr_ax":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_2",1]},"gr_ay":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_2",2]},"gr_az":{"op":"index","args":["gf_ring","gf_cell","k_overlap_area_spherical_2",3]},"gr_bx":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_2","gn_n":"gf_n"}},1]},"gr_by":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_2","gn_n":"gf_n"}},2]},"gr_bz":{"op":"index","args":["gf_ring","gf_cell",{"op":"apply_expression_template","args":[],"name":"geo_next","bindings":{"gn_v":"k_overlap_area_spherical_2","gn_n":"gf_n"}},3]}}}}
    }
  }
}
