MOAB: Mesh Oriented datABase  (version 5.4.1)
advection.F90
Go to the documentation of this file.
00001 ! advection: do a one time step transport, using c binding module
00002 !            example of how to do it in parallel in fortran
00003 ! This program shows how to load in parallel in moab from Fortran90, and how
00004 !   to call the transport wrapper. It is a fortran equivalent of intx_imesh
00005 !   driver
00006 !
00007 ! Usage: advection
00008 
00009 #define CHECK(a)   if (ierr .ne. 0) print *, a
00010 program advection
00011 
00012   use ISO_C_BINDING
00013   implicit none
00014 
00015 #include "moab/MOABConfig.h"
00016 #ifdef MOAB_HAVE_MPI
00017 #  include "mpif.h"
00018 #  include "iMeshP_f.h"
00019 #else
00020 #  include "iMesh_f.h"
00021 #endif
00022 
00023 ! extern void update_tracer( iMesh_Instance instance,  iBase_EntitySetHandle * opEulerSet, int * ierr);
00024   INTERFACE
00025    SUBROUTINE update_tracer ( instance , opEulerSet, ierr) bind(C)
00026      use ISO_C_BINDING
00027      implicit none
00028      iMesh_Instance, INTENT(IN) , VALUE :: instance
00029      iBase_EntitySetHandle, INTENT(IN), VALUE :: opEulerSet
00030      integer(c_int) , INTENT (OUT) :: ierr
00031    END SUBROUTINE update_tracer
00032   END INTERFACE
00033 
00034   ! declarations
00035   ! imesh is the instance handle
00036   iMesh_Instance imesh
00037 
00038   ! cells will be storing 2d cells
00039   TYPE(C_PTR) cells_ptr
00040   iBase_EntityHandle, pointer :: cells(:)
00041   INTEGER ents_alloc,  ents_size
00042 
00043   iBase_EntitySetHandle root_set
00044   iBase_EntitySetHandle opEulerSet
00045   CHARACTER (LEN=200) options
00046   CHARACTER (LEN=200) filename
00047   CHARACTER (LEN=200) optionswrite
00048   CHARACTER (LEN=200) outname
00049   ! TYPE(C_PTR) :: vertsPtr, entsPtr
00050 
00051   integer rank, sz, ierr
00052   integer lenopt, lenname
00053   integer isList
00054 
00055 #ifdef MOAB_HAVE_MPI
00056   ! local variables for parallel runs
00057   iMeshP_PartitionHandle imeshp
00058   IBASE_HANDLE_T mpi_comm_c
00059 #endif
00060 
00061   ! init the parallel partition
00062   call MPI_INIT(ierr)
00063   CHECK("fail to initialize MPI")
00064   call MPI_COMM_SIZE(MPI_COMM_WORLD, sz, ierr)
00065   CHECK("fail to get MPI size")
00066   call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
00067   CHECK("fail to get MPI rank")
00068 
00069   ! now load the mesh; this also initializes parallel sharing
00070   imesh = 0
00071   imeshp = 0
00072   call iMesh_newMesh("MOAB", imesh, ierr)
00073   CHECK("fail to initialize imesh")
00074 
00075   call iMesh_getRootSet(%VAL(imesh), root_set, ierr)
00076   CHECK("fail to get root set")
00077 
00078   call iMeshP_getCommunicator(%VAL(imesh), MPI_COMM_WORLD, mpi_comm_c, ierr)
00079 
00080   call iMeshP_createPartitionAll(%VAL(imesh), %VAL(mpi_comm_c), imeshp, ierr)
00081   CHECK("fail to create parallel partition ")
00082   options = " moab:PARALLEL=READ_PART moab:PARTITION=PARALLEL_PARTITION" // &
00083             " moab:PARALLEL_RESOLVE_SHARED_ENTS moab:PARTITION_DISTRIBUTE "
00084 !            " moab:PARALLEL=READ_PART moab:PARTITION=PARALLEL_PARTITION " &
00085 !              " moab:PARALLEL_RESOLVE_SHARED_ENTS moab:PARTITION_DISTRIBUTE ", & ! options
00086   if (0 .eq. rank) then
00087     print *, "load in parallel file HN16DP.h5m"
00088   endif
00089   lenname = 11;
00090   lenopt = 123
00091   filename = "HN16DP.h5m"
00092   call iMeshP_loadAll(%VAL(imesh), &
00093               %VAL(imeshp), &
00094               %VAL(root_set), &
00095               filename, & ! filename
00096               options, & !options
00097               ierr, &
00098               %VAL(lenname), & ! strlen(filename),
00099               %VAL(lenopt) )  !119) !strlen(options));
00100   CHECK("fail to load mesh in parallel ")
00101 
00102   isList = 0
00103   call iMesh_createEntSet(%VAL(imesh), %VAL(isList), opEulerSet, ierr)
00104   CHECK("fail to create euler set ")
00105 
00106   ents_alloc = 0
00107   ents_size = 0
00108 
00109   call iMesh_getEntities(%VAL(imesh),%VAL(root_set), &
00110    %VAL(iBase_FACE), &
00111    %VAL(iMesh_ALL_TOPOLOGIES), cells_ptr, &
00112       ents_alloc, ents_size, ierr);
00113   CHECK("fail to get 2d entities ")
00114 
00115   call c_f_pointer(cells_ptr, cells, [ents_size])
00116 
00117   call iMesh_addEntArrToSet(%VAL(imesh), cells, %VAL(ents_size), &
00118       %VAL(opEulerSet), ierr)
00119 
00120   call update_tracer(imesh, opEulerSet, ierr)
00121   CHECK("fail to update tracer ")
00122 
00123   outname = "outF.h5m";
00124   optionswrite = " moab:PARALLEL=WRITE_PART " ;
00125   lenname = 8
00126   lenopt = 27
00127   call iMeshP_saveAll( %VAL(imesh), &
00128               %VAL(imeshp), &
00129                %VAL(opEulerSet), &
00130                outname, &
00131                optionswrite, &
00132                ierr, &
00133                %VAL(lenname), &  ! strlen(filename),
00134                %VAL(lenopt) )   !119) !strlen(options));
00135   CHECK(" can't save ")
00136 
00137   if (0==rank) then
00138     print *, "Done"
00139   endif
00140 
00141   call MPI_FINALIZE(ierr)
00142   stop
00143 end program advection
00144 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines