[MOAB-dev] Question about iMesh and Fortran 90/2003

Tim Tautges tautges at mcs.anl.gov
Fri Nov 15 14:14:14 CST 2013


Hi Chris,
   Using the id associated with handles in C++ MOAB is dicey, since there aren't any guarantees that integer space is 
contiguous, and in parallel that gives local ids but not global ones.  The quick answer to your question is that you may 
want to use an integer tag and number your vertices yourself, then use the handle array you get back as connectivity as 
input to the function to get that integer tag data for those vertices.

Secondly, I just this morning committed another example that shows how to use iMesh from F90 that may help.  It's not 
exactly what you're doing, but it may show some more things about accessing MOAB through ISO_C_BINDING.  It's on my 
to-do list to document F90+iMesh/MOAB better.

I'll also look over your code in a minute, but wanted to get this answer out quickly.

- tim

On 11/14/2013 08:20 PM, Chris Eldred wrote:
> Hey Moab-Dev,
>
> I am trying to write a Fortran code that uses iMesh to call MOAB, and
> I keep running into errors. What I would like to be able to do it is
> to convert an adjacency returned by iMesh_getEntAdj from type(c_ptr)
> to integers. In MOAB using C++ this seems to be trivial (use id =
> id_from_handle(HANDLE) . It would also be useful to have the dual of
> this operator (handle = handle_from_id(ID) ). I can't seem to get it
> to work in Fortran however. My code is:
>
> subroutine get_adjacency(entity, entity_requested, adjacencyptr, adjacency_size)
> implicit none
>
> integer(kind=c_int) :: alloc, adjacency_size
> integer(kind=c_int) :: entity_requested
> integer(kind=c_int), pointer, dimension(:) :: adjacency
> type(c_ptr) :: entity
> type(c_ptr) :: adjacencyptr_C
> type(c_ptr), pointer, dimension(:) :: adjacencyptr
>
> alloc = 0
> call iMesh_getEntAdj( mesh, entity, entity_requested, adjacencyptr_C,
> alloc, adjacency_size, ierr)
> CHECK("Couldn't get adjacencies")
> call C_F_POINTER(adjacencyptr_C, adjacencyptr, [alloc])
> adjacency = transfer(adjacencyptr,adjacency,adjacency_size)
>
> end subroutine get_adjacency
>
> I have tried using the transfer function, but that produces memory
> (segmentation fault) errors. Everything before this line works fine. I
> am using the Fortran 2003 modules (iMesh_iso.F03) from
> https://redmine.scorec.rpi.edu/anonsvn/itaps/software/trunk/interfaces/iMesh/examples/FindAdjacency/.
> I've also looked through the iBase and iMesh documentation, but there
> is very little information there about using Fortran instead of C/C++.
> I am not very familiar with mixed C/Fortran programming, so it is
> entirely possible that I just don't understand what is going on.
>
> Thanks,
> Chris Eldred
>

-- 
================================================================
"You will keep in perfect peace him whose mind is
   steadfast, because he trusts in you."               Isaiah 26:3

              Tim Tautges            Argonne National Laboratory
          (tautges at mcs.anl.gov)      (telecommuting from UW-Madison)
  phone (gvoice): (608) 354-1459      1500 Engineering Dr.
             fax: (608) 263-4499      Madison, WI 53706



More information about the moab-dev mailing list