9 #define ERROR(rval) if (0 .ne. rval) call exit(1)
16 #include "moab/MOABConfig.h"
28 integer numv, nume, nvpere
33 ibase_entityhandle,
pointer :: ents(:), verts(:)
34 ibase_entitysethandle root_set, root_set2, new_set
35 TYPE(c_ptr) :: vertsptr, entsptr
37 real*8 coords(0:3*numv-1)
38 integer iconn(0:4*nume-1), gids(0:numv-1)
41 integer lgids(0:numv-1), lconn(0:4*nume-1)
42 real*8 lcoords(0:3*numv-1)
43 integer lnumv, lvids(0:numv-1), gvids(0:numv-1)
45 integer ic, ie, iv, istart, iend, ierr, indv, lnume, rank, sz
49 imeshp_partitionhandle imeshp, imeshp2
50 imeshp_parthandle part, part2
51 ibase_handle_t mpi_comm_c
58 -1., -1., -1, 1., -1., -1., 1., 1., -1., -1., 1., -1., &
59 -1., -1., 1, 1., -1., 1., 1., 1., 1., -1., 1., 1. /
71 data ltp / imesh_quadrilateral /
80 call mpi_comm_size(mpi_comm_world, sz, ierr)
81 call mpi_comm_rank(mpi_comm_world, rank, ierr)
86 iend = istart + lnume - 1
87 if (rank .eq. sz-1)
then
89 lnume = iend - istart + 1
101 indv = iconn(lvpe*ie + iv)
102 if (lvids(indv) .eq. -1)
then
105 lcoords(3*lnumv+ic) = coords(3*indv+ic)
108 gvids(lnumv) = 1+indv
110 lconn(lvpe*(ie-istart)+iv) = lvids(indv)
119 call create_mesh(imesh, imeshp, part, mpi_comm_world, lnumv, lnume, gvids, lvpe, ltp, lcoords, lconn, &
120 vertsptr, entsptr, ierr)
122 call c_f_pointer(vertsptr, verts, [lnumv])
123 call c_f_pointer(entsptr, ents, [lnume])
126 call imeshp_saveall(%VAL(imesh), %VAL(imeshp), %VAL(part),
"test2.h5m",
" moab:PARALLEL=WRITE_PART ", ierr)
128 call imesh_getrootset(%VAL(imesh), root_set, ierr)
130 call imeshp_getnumoftypeall(%VAL(imesh), %VAL(imeshp), %VAL(root_set), %VAL(ibase_vertex), iv, ierr)
132 call imeshp_getnumoftypeall(%VAL(imesh), %VAL(imeshp), %VAL(root_set), %VAL(ibase_face), ie, ierr)
136 call imesh_newmesh(
"MOAB", imesh2, ierr)
138 call imesh_getrootset(%VAL(imesh2), root_set2, ierr)
140 call imeshp_getcommunicator(%VAL(imesh2), mpi_comm_world, mpi_comm_c, ierr)
142 call imeshp_createpartitionall(%VAL(imesh2), %VAL(mpi_comm_c), imeshp2, ierr)
144 call imeshp_createpart(%VAL(imesh2), %VAL(imeshp2), part2, ierr)
149 call imesh_createentset(%VAL(imesh2), %VAL(0), new_set, ierr)
151 call imeshp_loadall( %VAL(imesh2), %VAL(imeshp2), %VAL(new_set),
"test2.h5m", &
152 " moab:PARALLEL=READ_PART moab:PARALLEL_RESOLVE_SHARED_ENTS moab:PARTITION=PARALLEL_PARTITION ", &
156 call imeshp_getnumoftypeall(%VAL(imesh2), %VAL(imeshp2), %VAL(root_set2), %VAL(ibase_vertex), iv2, ierr)
158 call imeshp_getnumoftypeall(%VAL(imesh2), %VAL(imeshp2), %VAL(root_set2), %VAL(ibase_face), ie2, ierr)
161 if ( (iv.ne.iv2 ) .or. (ie.ne.ie2) )
then
162 write(0, *)
"inconsistent number of elements and vertices"
163 write(0, *)
" saved: " , iv, ie,
" loaded: " , iv2, ie2
167 call imesh_dtor(%VAL(imesh), ierr);
169 call imesh_dtor(%VAL(imesh2), ierr);
172 call mpi_finalize(ierr)
178 imesh, imeshp, part, &
180 comm, numv, nume, vgids, nvpe, tp, posn, iconn, &
182 vertsPtr, entsPtr, ierr)
196 # include "iMeshP_f.h"
199 # include "iMesh_f.h"
204 TYPE(c_ptr) :: vertsPtr, entsPtr
205 integer numv, nume, nvpe, vgids(0:*), iconn(0:*), ierr, tp
208 imeshp_partitionhandle imeshp
213 integer comm_sz, comm_rank, numa, numo, iv, ie
214 TYPE(c_ptr) :: statsPtr
215 integer,
allocatable,
target :: stats(:)
218 ibase_entityhandle,
pointer :: verts(:), ents(:)
219 ibase_entityhandle,
allocatable :: conn(:)
220 ibase_entitysethandle root_set
221 ibase_entitysethandle file_set
223 ibase_handle_t mpi_comm_c
224 TYPE(c_ptr) :: partsPtr
225 imeshp_parthandle,
pointer :: parts(:)
226 imeshp_parthandle part
227 integer partsa, partso
228 character (len=10) filename
231 if (imesh .eq. 0)
then
232 call imesh_newmesh(
"MOAB", imesh, ierr)
236 if (imeshp .eq. 0)
then
237 call imeshp_getcommunicator(%VAL(imesh), mpi_comm_world, mpi_comm_c, ierr)
239 call imeshp_createpartitionall(%VAL(imesh), %VAL(mpi_comm_c), imeshp, ierr)
241 call imeshp_createpart(%VAL(imesh), %VAL(imeshp), part, ierr)
245 call imeshp_getlocalparts(%VAL(imesh), %VAL(imeshp), partsptr, partsa, partso, ierr)
247 call c_f_pointer(partsptr, parts, [partso])
250 call mpi_comm_rank(comm, comm_rank, ierr)
252 call mpi_comm_size(comm, comm_sz, ierr)
257 call imesh_createvtxarr(%VAL(imesh), %VAL(numv), %VAL(ibase_interleaved), posn, %VAL(3*numv), &
258 vertsptr, numa, numo, ierr)
262 allocate (conn(0:nvpe*nume-1))
263 call c_f_pointer(vertsptr, verts, [numv])
264 do i = 0, nvpe*nume-1
265 conn(i) = verts(1+iconn(i))
269 allocate(stats(0:nume-1))
270 statsptr = c_loc(stats(0))
271 call imesh_createentarr(%VAL(imesh), %VAL(tp), conn, %VAL(nvpe*nume), &
272 entsptr, numa, numo, statsptr, numa, numo, ierr)
279 call c_f_pointer(entsptr, ents, [numo])
280 call imesh_addentarrtoset(%VAL(imesh), ents, %VAL(numo), %VAL(part), ierr)
283 call imesh_gettaghandle(%VAL(imesh),
"GLOBAL_ID", tagh, ierr, %VAL(9))
284 if (ibase_success .ne. ierr)
then
286 call imesh_createtag(%VAL(imesh),
"GLOBAL_ID", %VAL(ibase_integer), tagh, ierr)
289 call imesh_setintarrdata(%VAL(imesh), verts, %VAL(numv), %VAL(tagh), vgids, %VAL(numv), ierr)
292 call imeshp_syncmeshall(%VAL(imesh), %VAL(imeshp), ierr)
295 call imeshp_createghostentsall(%VAL(imesh), %VAL(imeshp), %VAL(2), %VAL(1), %VAL(1), %VAL(0), ierr)
298 call imesh_freememory(%VAL(imesh), vertsptr);
299 call imesh_freememory(%VAL(imesh), entsptr);