moab
|
00001 ! FindAdjacency: Interacting with iMesh 00002 ! 00003 ! This program shows how to get more information about a mesh, by 00004 ! getting connectivity two different ways (as connectivity and as 00005 ! adjacent 0-dimensional entities). 00006 00007 ! Usage: FindAdjacency 00008 #define CHECK(a) \ 00009 if (ierr .ne. 0) print *, a 00010 00011 program findadjacency 00012 implicit none 00013 #include "iMesh_f.h" 00014 00015 ! declarations 00016 iMesh_Instance mesh 00017 IBASE_HANDLE_T rpents, rpverts, rpallverts, ipoffsets 00018 integer ioffsets 00019 IBASE_HANDLE_T ents, verts, allverts, verths 00020 pointer (rpents, ents(0:*)) 00021 pointer (rpverts, verts(0:*)) 00022 pointer (rpallverts, allverts(0:*)) 00023 pointer (ipoffsets, ioffsets(0:*)) 00024 ! for all vertices in one call 00025 iBase_EntityHandle verth 00026 pointer (verths, verth(0:*)) 00027 integer ierr, ents_alloc, ents_size 00028 integer iverts_alloc, iverts_size 00029 integer allverts_alloc, allverts_size 00030 integer offsets_alloc, offsets_size, coords_alloc, coords_size 00031 iBase_EntitySetHandle root_set 00032 integer vert_uses, i, num_ents 00033 real*8 coords 00034 pointer (pcoord, coords(0:*)) 00035 ! 00036 iBase_EntitySetHandle :: sethand 00037 00038 ! create the Mesh instance 00039 call iMesh_newMesh("", mesh, ierr) 00040 CHECK("Problems instantiating interface.") 00041 00042 ! load the mesh 00043 call iMesh_getRootSet(%VAL(mesh), root_set, ierr) 00044 CHECK("Problems getting root set") 00045 00046 call iMesh_load(%VAL(mesh), %VAL(root_set), & 00047 "../../MeshFiles/unittest/125hex.g", "", ierr) 00048 CHECK("Load failed") 00049 00050 ! get all 3d elements 00051 ents_alloc = 0 00052 call iMesh_getEntities(%VAL(mesh), %VAL(root_set), %VAL(iBase_REGION), & 00053 %VAL(iMesh_ALL_TOPOLOGIES), rpents, ents_alloc, ents_size, & 00054 ierr) 00055 CHECK("Couldn't get entities") 00056 00057 vert_uses = 0 00058 00059 ! iterate through them; 00060 do i = 0, ents_size-1 00061 ! get connectivity 00062 iverts_alloc = 0 00063 call iMesh_getEntAdj(%VAL(mesh), %VAL(ents(i)), & 00064 %VAL(iBase_VERTEX), & 00065 rpverts, iverts_alloc, iverts_size, & 00066 ierr) 00067 CHECK("Failure in getEntAdj") 00068 ! sum number of vertex uses 00069 00070 vert_uses = vert_uses + iverts_size 00071 00072 if (iverts_size .ne. 0) call iMesh_freeMemory(%VAL(mesh), rpverts) 00073 end do 00074 00075 ! now get adjacencies in one big block 00076 allverts_alloc = 0 00077 offsets_alloc = 0 00078 call iMesh_getEntArrAdj(%VAL(mesh), %VAL(rpents), & 00079 %VAL(ents_size), %VAL(iBase_VERTEX), rpallverts, & 00080 allverts_alloc, allverts_size, ipoffsets, offsets_alloc, & 00081 offsets_size, ierr) 00082 CHECK("Failure in getEntArrAdj") 00083 00084 if (allverts_size .ne. 0) call iMesh_freeMemory(%VAL(mesh), rpallverts); 00085 if (offsets_size .ne. 0) call iMesh_freeMemory(%VAL(mesh), ipoffsets); 00086 if (ents_size .ne. 0) call iMesh_freeMemory(%VAL(mesh), rpents); 00087 00088 ! compare results of two calling methods 00089 if (allverts_size .ne. vert_uses) then 00090 write(*,'("Sizes didn''t agree!")') 00091 else 00092 write(*, *)"Sizes did agree: ", vert_uses 00093 endif 00094 ! get all vertices , and then their coordinates 00095 ents_alloc = 0 00096 call iMesh_getEntities(%VAL(mesh), %VAL(root_set), %VAL(iBase_VERTEX), & 00097 %VAL(iMesh_ALL_TOPOLOGIES), verths, ents_alloc, ents_size, & 00098 ierr) 00099 write (*, *) "number of vertices: " , ents_size 00100 print *, "few vertex handles: ", (verth(i), i=0,ents_size/10) 00101 00102 ! set creation 00103 call iMesh_createEntSet(%VAL(mesh), %VAL(1), & 00104 sethand,ierr) 00105 write(0,*) "createset",ierr,sethand 00106 00107 ! we should have 00108 call iMesh_addEntArrToSet(%VAL(mesh),verth,%VAL(ents_size), & 00109 %VAL(sethand),ierr) 00110 write(0,*) "add Ent Arr to Set",ierr,sethand 00111 00112 call iMesh_getNumOfType(%VAL(mesh), %VAL(sethand), & 00113 %VAL(iBase_VERTEX), num_ents, ierr) 00114 write(0,*) "num verts retrieved from set", num_ents 00115 00116 ents_alloc = 0; 00117 call iMesh_getVtxArrCoords(%VAL(mesh), verth, %VAL(ents_size), & 00118 %VAL(iBase_INTERLEAVED), pcoord, ents_alloc , ents_size, ierr) 00119 ! 00120 write(*, *) "num coords: ", ents_size, " few coords: ", (coords(i), i=0, ents_size/100) 00121 00122 call iMesh_freeMemory(%VAL(mesh), verths); 00123 call iMesh_freeMemory(%VAL(mesh), pcoord); 00124 00125 call iMesh_dtor(%VAL(mesh), ierr) 00126 CHECK("Failed to destroy interface") 00127 00128 end program findadjacency