[MOAB-dev] Digging into ray_intersect_* in the OBBTreeTool - proposing an interface change
Paul Wilson
paul.wilson at wisc.edu
Wed Dec 14 14:17:30 CST 2016
Hi Iulian,
To summarize... It seems we have use cases within the Sigma project that
include:
* moab::DAGMC - currently only calls moab::..::ray_intersect_sets with
special purpose arguments
* meshkit::EBMesher - currently only calls either
moab::..::ray_intersect_sets or moab::..::ray_intersect_triangles
with no special purpose arguments
* cgm::iGeom::iGeom_getPntRayIntsct - currently calls
cgm::...::fire_ray() methods
* meshkit::advancing_front_alg - currently calls
cgm::..::closest_point_along_vector
The first two of these are impacted by changes we are proposing here,
but the latter two are completely different.
Given the way that EBMesher works, it is probably best to keep both
interfaces in OrientedBoxTreeTool.
Paul
On 12/14/2016 10:08 AM, Grindeanu, Iulian R. wrote:
> Hello,
> I am all for simplifying if possible.
>
> It is clear that DagMC is the main user of this API, which works
> directly on a OBB tree.
> The only other place we are using it is for EBMesher; there, we use
> both ,ray_intersect_sets and ray_intersect_triangles on a obb tree.
>
> For EBMesher, we actually fire only in 3 directions, but from many
> points, along a structured mesh; but it is important to retrieve all
> intersections, and it is important to understand what portion of the
> ray is inside/outside the "solid body geometry" we fire upon. A solid
> body is defined by its boundary shell (a brep).
>
> EBMesher should actually work directly with iGeom, so it should not
> care about obb tree; EBMesher is not using iGeom, though, probably
> because it was too complex/unstable at that time:
> /**\brief Intersect a ray with the model
> *
> * Intersect a ray with the model. Storage orders passed in
> should be a
> * member of the iBase_StorageOrder enumeration.
> * \param instance iGeom instance handle
> * \param x Point from which ray is fired
> * \param y Point from which ray is fired
> * \param z Point from which ray is fired
> * \param dir_x Direction in which ray is fired
> * \param dir_y Direction in which ray is fired
> * \param dir_z Direction in which ray is fired
> * \param intersect_entity_handles Entities intersected by ray
> * \param intersect_entity_handles_allocated Allocated size of
> * intersections array
> * \param intersect_entity_hangles_size Occupied size of
> intersections array
> * \param storage_order Storage order of coordinates passed back
> * \param intersect_coords Coordinates of intersections
> * \param intersect_coords_allocated Allocated size of coordinates
> array
> * \param intersect_coords_size Occupied size of coordinates array
> * \param param_coords Distances along ray of intersections
> * \param param_coords_allocated Allocated size of param_coords array
> * \param param_coords_size Occupied size of param_coords array
> * \param *err Pointer to error type returned from function
> */
> void iGeom_getPntRayIntsct( iGeom_Instance instance,
> double x,
> double y,
> double z,
> double dir_x,
> double dir_y,
> double dir_z,
> iBase_EntityHandle**
> intersect_entity_handles,
> int* intersect_entity_handles_allocated,
> int* intersect_entity_hangles_size,
> int storage_order,
> double** intersect_coords,
> int* intersect_coords_allocated,
> int* intersect_coords_size,
> double** param_coords,
> int* param_coords_allocated,
> int* param_coords_size,
> int* err );
>
> Should we keep these APIs related ? They are doing about the same thing
>
> iGeom is actually calling this, down deep:
> return GeometryQueryTool::instance()->
> fire_ray( nc_point, nc_direction, target_entities, ray_params, 0,
> EPSILON, &entities );
>
> which is actually calling this (of GeometryQueryEngine)
> // Do the ray fire. Note we will sort the hits by distance and append
> to the output lists.
> if( gqe->fire_ray( origin, direction, tb_list, tmp_ray_params,
> max_hits, ray_radius, tb_hit_list_ptr ) == CUBIT_FAILURE )
>
> I don't want to complicate our lives, but should we look at these APIs
> for comparison?
>
> Or maybe not....
>
> In Meshkit, we need another "ray intersect capability" for the new
> implementation of an advancing front algorithm , done by Evan;
> There, he is using cgm directly, with something like
>
> RefFace* cgmFacePtr =
> dynamic_cast<RefFace*>(reinterpret_cast<RefEntity*>(surface));
> Surface* cgmSrfcPtr = cgmFacePtr->get_surface_ptr();
> CubitStatus posDirResult = cgmSrfcPtr->closest_point_along_vector(
> cvRayOrigin, cvRayDir, cvPointOnSrfc);
>
> There, it is important to get just the first hit along the ray, to
> project a 2d mesh from working plane on a 3d surface (the working
> plane is relatively close to the 3d surface the mesh needs to be
> projected on)
>
>
> Iulian
>
> ------------------------------------------------------------------------
> *From:* moab-dev-bounces at mcs.anl.gov [moab-dev-bounces at mcs.anl.gov] on
> behalf of Paul Wilson [paul.wilson at wisc.edu]
> *Sent:* Tuesday, December 13, 2016 11:18 AM
> *To:* Vijay S. Mahadevan; Patrick Shriwise
> *Cc:* moab-dev at mcs.anl.gov
> *Subject:* Re: [MOAB-dev] Digging into ray_intersect_* in the
> OBBTreeTool - proposing an interface change
>
> Hi Vijay,
>
>
> On 12/13/2016 11:03 AM, Vijay S. Mahadevan wrote:
>> Paul, IMO, if there is DagMC specific logic embedded in general ray
>> intersection code, and if no one has complained about it so far, my
>> guess is there aren't many users relying on that API. In which case,
>> I'm all for simplifying it.
>>
>>> These methods would no longer return lists of intersections, but would return them one at a time for consideration by the calling application.
>> However, it is very unclear to me how a calling application would know
>> whether to stop querying again or if it should be satisfied once the
>> first successful entity is found. If there is a stronger reasoning for
>> this behavioral change, that would help motivate the change better.
>> But as I said above, if DagMC is the sole consumer of this API, do
>> modify it so that it is part of the next version.
>
> Conceptually there is really no difference imposed by this change.
> The calling application will be asked to accept intersections one at a
> time rather than getting a list all at once. As it is, the calling
> application has to decide how to deal with that list (if it has more
> than one entry). The simplest approach is to just add them all to a
> list and end up with the same information as was originally available.
>
> Perhaps the interface can offer both options:
>
> 1. methods that return complete lists with not opportunity for
> filtering/disambiguation and don't require a callback function
> 2. methods that return nothing but require a callback function to
> register each intersection as they arise
>
> Paul
>
>
>> Vijay
>>
>> On Tue, Dec 13, 2016 at 9:17 AM, Patrick Shriwise<shriwise at wisc.edu> wrote:
>>> Hi all,
>>>
>>> Having seen how many other ray tracing codes operate I think that these are
>>> valuable changes to the OrientedBoxTreeTool which will allow it to be
>>> extended to many other applications.
>>>
>>> Pulling out these DAGMC-specific intersection disambiguation operations into
>>> separate functions for filtering intersections will also allow them to be
>>> applied in other ray tracing kernels (AdaptiveKDTree, etc.) if desired.
>>>
>>> -Patrick
>>>
>>> Patrick C. Shriwise
>>> Research Fellow
>>> University of Wisconsin - Madison
>>> Engineering Research Building - Rm. 428
>>> 1500 Engineering Drive
>>> Madison, WI 53706
>>> (608) 446-8173
>>>
>>> On 12/09/2016 04:44 PM, Paul Wilson wrote:
>>>
>>> Hello all,
>>>
>>> I have been spending a lot of quality time with the ray_intersect_* methods
>>> of the OrientedBoxTreeTool over the last few weeks. I think I have
>>> (re)learned all the subtleties of the additional code that exists in
>>> RayIntersectSets::leaf() (invoked with API function ray_intersect_sets).
>>>
>>> In general, these are all additional tests that make sense only in the
>>> context of a call from DagMC:
>>>
>>> is this facet in a list of previous facets intersected by this ray prior to
>>> this call
>>> is this facet in a list of previous facets (or their neighborhood)
>>> encountered during this call
>>> is this intersection a piercing or glancing intersection as defined by
>>> notions of surface sense known to DagMC
>>>
>>> There is then a complex logic related to how many intersections to keep
>>> based on three quantities: two are a "window" in which the distance to
>>> distance to intersection must fall and the third is a count of how many
>>> intersections to keep.
>>>
>>> The logic for ray_intersect_triangles() includes none of this. I was
>>> contemplating an interface change to ray_intersect_triangles() that would
>>> add enough information to include the same tests, and modularizing those
>>> tests to reuse code in both places. However, (a) the interface for that
>>> would be awkward and (b) it would be imposing DagMC conventions on even more
>>> code.
>>>
>>> Instead I propose the reduce the interface of all ray_intersect_* methods to
>>> include only the following:
>>>
>>> const EntityHandle root_set: points to the root of the OBB Tree
>>> const double tolerance: for use in searching for intersections (largely
>>> unused at the moment, I think)
>>> const double ray_point[3]: starting point of ray
>>> const double unit_vector[3]: direction of ray
>>> std::pair<double*, double*> window: window to narrow search for interesting
>>> intersections
>>> std::pair<double*, double*> register_intersection(...): call back function
>>> to perform application specific filtering/disambiguation of possible
>>> intersection, returning an updated window
>>>
>>> These methods would no longer return lists of intersections, but would
>>> return them one at a time for consideration by the calling application.
>>>
>>> Since this is such a major interface change, I thought I'd solicit feedback
>>> before embarking upon it. It won't necessarily bee that much code change,
>>> but who knows how it impacts other possible users of this code???
>>>
>>> Paul
>>>
>>>
>>> --
>>> -- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ --
>>>
>>> Paul P.H. Wilson
>>> Grainger Professor of Nuclear Engineering
>>> 608-263-0807
>>> paul.wilson at wisc.edu
>>> 419 Engineering Research Bldg
>>> 1500 Engineering Dr, Madison, WI 53706
>>> calendar:http://go.wisc.edu/pphw-cal
>>>
>>> Computational Nuclear Engineering Research Group
>>> cnerg.engr.wisc.edu
>>>
>>> Faculty Director, Advanced Computing Initiative
>>> aci.wisc.edu
>>>
>>>
>
> --
> -- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ --
>
> Paul P.H. Wilson
> Grainger Professor of Nuclear Engineering
> 608-263-0807
> paul.wilson at wisc.edu
> 419 Engineering Research Bldg
> 1500 Engineering Dr, Madison, WI 53706
> calendar:http://go.wisc.edu/pphw-cal
>
> Computational Nuclear Engineering Research Group
> cnerg.engr.wisc.edu
>
> Faculty Director, Advanced Computing Initiative
> aci.wisc.edu
--
-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ --
Paul P.H. Wilson
Grainger Professor of Nuclear Engineering
608-263-0807
paul.wilson at wisc.edu
419 Engineering Research Bldg
1500 Engineering Dr, Madison, WI 53706
calendar: http://go.wisc.edu/pphw-cal
Computational Nuclear Engineering Research Group
cnerg.engr.wisc.edu
Faculty Director, Advanced Computing Initiative
aci.wisc.edu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/moab-dev/attachments/20161214/eed34e0e/attachment-0001.html>
More information about the moab-dev
mailing list