DistributedProfiler.F90 Source File


This file depends on

sourcefile~~distributedprofiler.f90~~EfferentGraph sourcefile~distributedprofiler.f90 DistributedProfiler.F90 sourcefile~abstractgauge.f90 AbstractGauge.F90 sourcefile~distributedprofiler.f90->sourcefile~abstractgauge.f90 sourcefile~abstractmeter.f90 AbstractMeter.F90 sourcefile~distributedprofiler.f90->sourcefile~abstractmeter.f90 sourcefile~abstractmeternode.f90 AbstractMeterNode.F90 sourcefile~distributedprofiler.f90->sourcefile~abstractmeternode.f90 sourcefile~advancedmeter.f90 AdvancedMeter.F90 sourcefile~distributedprofiler.f90->sourcefile~advancedmeter.f90 sourcefile~baseprofiler.f90 BaseProfiler.F90 sourcefile~distributedprofiler.f90->sourcefile~baseprofiler.f90 sourcefile~distributedmeter.f90 DistributedMeter.F90 sourcefile~distributedprofiler.f90->sourcefile~distributedmeter.f90 sourcefile~meternode.f90 MeterNode.F90 sourcefile~distributedprofiler.f90->sourcefile~meternode.f90 sourcefile~mpitimergauge.f90 MpiTimerGauge.F90 sourcefile~distributedprofiler.f90->sourcefile~mpitimergauge.f90 sourcefile~abstractgauge.f90->sourcefile~abstractmeter.f90 sourcefile~errorhandling.f90 ErrorHandling.F90 sourcefile~abstractmeter.f90->sourcefile~errorhandling.f90 sourcefile~abstractmeternode.f90->sourcefile~abstractmeter.f90 sourcefile~advancedmeter.f90->sourcefile~abstractgauge.f90 sourcefile~advancedmeter.f90->sourcefile~abstractmeter.f90 sourcefile~baseprofiler.f90->sourcefile~abstractmeter.f90 sourcefile~baseprofiler.f90->sourcefile~abstractmeternode.f90 sourcefile~baseprofiler.f90->sourcefile~advancedmeter.f90 sourcefile~baseprofiler.f90->sourcefile~meternode.f90 sourcefile~baseprofiler.f90->sourcefile~errorhandling.f90 sourcefile~keywordenforcer.f90 KeywordEnforcer.F90 sourcefile~baseprofiler.f90->sourcefile~keywordenforcer.f90 sourcefile~meternodeptr.f90 MeterNodePtr.F90 sourcefile~baseprofiler.f90->sourcefile~meternodeptr.f90 sourcefile~meternodestack.f90 MeterNodeStack.F90 sourcefile~baseprofiler.f90->sourcefile~meternodestack.f90 sourcefile~distributedmeter.f90->sourcefile~abstractgauge.f90 sourcefile~distributedmeter.f90->sourcefile~abstractmeter.f90 sourcefile~distributedmeter.f90->sourcefile~advancedmeter.f90 sourcefile~distributedmeter.f90->sourcefile~errorhandling.f90 sourcefile~meternode.f90->sourcefile~abstractmeter.f90 sourcefile~meternode.f90->sourcefile~abstractmeternode.f90 sourcefile~meternodevector.f90 MeterNodeVector.F90 sourcefile~meternode.f90->sourcefile~meternodevector.f90 sourcefile~mpitimergauge.f90->sourcefile~abstractgauge.f90 sourcefile~mapl_throw.f90 MAPL_Throw.F90 sourcefile~errorhandling.f90->sourcefile~mapl_throw.f90 sourcefile~meternodeptr.f90->sourcefile~abstractmeternode.f90 sourcefile~meternodestack.f90->sourcefile~meternodeptr.f90 sourcefile~meternodevector.f90->sourcefile~abstractmeternode.f90

Files dependent on this one

sourcefile~~distributedprofiler.f90~~AfferentGraph sourcefile~distributedprofiler.f90 DistributedProfiler.F90 sourcefile~globalprofilers.f90 GlobalProfilers.F90 sourcefile~globalprofilers.f90->sourcefile~distributedprofiler.f90 sourcefile~stubprofiler.f90 StubProfiler.F90 sourcefile~globalprofilers.f90->sourcefile~stubprofiler.f90 sourcefile~mapl_profiler.f90~2 MAPL_Profiler.F90 sourcefile~mapl_profiler.f90~2->sourcefile~distributedprofiler.f90 sourcefile~mapl_profiler.f90~2->sourcefile~globalprofilers.f90 sourcefile~stubprofiler.f90->sourcefile~distributedprofiler.f90 sourcefile~abstractserver.f90 AbstractServer.F90 sourcefile~abstractserver.f90->sourcefile~mapl_profiler.f90~2 sourcefile~applicationsupport.f90 ApplicationSupport.F90 sourcefile~applicationsupport.f90->sourcefile~mapl_profiler.f90~2 sourcefile~base_base_implementation.f90 Base_Base_implementation.F90 sourcefile~base_base_implementation.f90->sourcefile~mapl_profiler.f90~2 sourcefile~demo.f90 demo.F90 sourcefile~demo.f90->sourcefile~mapl_profiler.f90~2 sourcefile~extdatadrivergridcomp.f90 ExtDataDriverGridComp.F90 sourcefile~extdatadrivergridcomp.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mapl.f90 MAPL.F90 sourcefile~mapl.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mapl_bundleio_test.f90 mapl_bundleio_test.F90 sourcefile~mapl_bundleio_test.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mapl_capgridcomp.f90 MAPL_CapGridComp.F90 sourcefile~mapl_capgridcomp.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mapl_generic.f90~2 MAPL_Generic.F90 sourcefile~mapl_generic.f90~2->sourcefile~mapl_profiler.f90~2 sourcefile~mapl_nuopcwrappermod.f90 MAPL_NUOPCWrapperMod.F90 sourcefile~mapl_nuopcwrappermod.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mapl_verticalmethods.f90 MAPL_VerticalMethods.F90 sourcefile~mapl_verticalmethods.f90->sourcefile~mapl_profiler.f90~2 sourcefile~maplframework.f90 MaplFramework.F90 sourcefile~maplframework.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mpi_demo.f90 mpi_demo.F90 sourcefile~mpi_demo.f90->sourcefile~mapl_profiler.f90~2 sourcefile~mpiserver.f90 MpiServer.F90 sourcefile~mpiserver.f90->sourcefile~mapl_profiler.f90~2 sourcefile~multigroupserver.f90 MultiGroupServer.F90 sourcefile~multigroupserver.f90->sourcefile~mapl_profiler.f90~2 sourcefile~regrid_util.f90 Regrid_Util.F90 sourcefile~regrid_util.f90->sourcefile~mapl_profiler.f90~2 sourcefile~serverthread.f90 ServerThread.F90 sourcefile~serverthread.f90->sourcefile~mapl_profiler.f90~2 sourcefile~test_advancedmeter.pf test_AdvancedMeter.pf sourcefile~test_advancedmeter.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_column.pf test_Column.pf sourcefile~test_column.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_distributedmeter.pf test_DistributedMeter.pf sourcefile~test_distributedmeter.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_exclusivecolumn.pf test_ExclusiveColumn.pf sourcefile~test_exclusivecolumn.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_meternode.pf test_MeterNode.pf sourcefile~test_meternode.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_meternodeiterator.pf test_MeterNodeIterator.pf sourcefile~test_meternodeiterator.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_namecolumn.pf test_NameColumn.pf sourcefile~test_namecolumn.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_percentagecolumn.pf test_PercentageColumn.pf sourcefile~test_percentagecolumn.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_profilereporter.pf test_ProfileReporter.pf sourcefile~test_profilereporter.pf->sourcefile~mapl_profiler.f90~2 sourcefile~test_timeprofiler.pf test_TimeProfiler.pf sourcefile~test_timeprofiler.pf->sourcefile~mapl_profiler.f90~2

Source Code

module MAPL_DistributedProfiler
   use MAPL_AbstractMeter
   use MAPL_AbstractGauge
   use MAPL_AbstractMeterNode
   use MAPL_MeterNode
   use MAPL_BaseProfiler
   use Mapl_DistributedMeter

   use MAPL_AdvancedMeter
   use MAPL_MpiTimerGauge
   implicit none
   private

   public :: DistributedProfiler

   type, extends(BaseProfiler) :: DistributedProfiler
      private
      class(AbstractGauge), allocatable :: gauge
      integer :: comm = -1
   contains
      procedure :: make_meter
      procedure :: reduce
      procedure :: copy
   end type DistributedProfiler

   interface DistributedProfiler
      module procedure :: new_DistributedProfiler
   end interface DistributedProfiler
      

contains


   function new_DistributedProfiler(name, gauge, comm, comm_world) result(distributed_profiler)
      type(DistributedProfiler), target :: distributed_profiler
      character(*), intent(in) :: name
      class(AbstractGauge), intent(in) :: gauge
      integer, intent(in) :: comm
      integer, optional, intent(in) :: comm_world

      distributed_profiler%gauge = gauge
      distributed_profiler%comm = comm
      
      call distributed_profiler%set_comm_world(comm_world = comm_world)
      call distributed_profiler%set_node(MeterNode(name, distributed_profiler%make_meter()))
!      call distributed_profiler%start()
      
   end function new_DistributedProfiler


   function make_meter(this) result(meter)
      class(AbstractMeter), allocatable :: meter
      class(DistributedProfiler), intent(in) :: this

      meter = DistributedMeter(this%gauge)

   end function make_meter


   subroutine reduce(this)
      class(DistributedProfiler), target, intent(inout) :: this

      class(AbstractMeterNodeIterator), target, allocatable :: iter
      class(AbstractMeterNode), pointer :: root, node
      class(AbstractMeter), pointer :: m

      root => this%get_root_node()
      iter = root%begin()
      do while (iter /= root%end())
         node => iter%get()
         m => iter%get_meter()
         
         select type (m)
         class is (DistributedMeter)
            call m%reduce(this%comm, node%get_exclusive())
         class default
            print*,'error - wrong type (other)'
         end select
         
         call iter%next()
      end do
      
   end subroutine reduce

   subroutine copy(new, old)
      class(DistributedProfiler), target, intent(inout) :: new
      class(BaseProfiler), target, intent(in) :: old

      call new%copy_profiler(old)
      select type (old)
      class is (DistributedProfiler)
         new%gauge = old%gauge
         new%comm = old%comm
      end select

   end subroutine copy

end module MAPL_DistributedProfiler