Changes in src/mpi_mod.f90 [0c8c7f2:0ecc1fe] in flexpart.git


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/mpi_mod.f90

    r0c8c7f2 r0ecc1fe  
    8888! Variables for MPI processes in the 'particle' group
    8989  integer, allocatable, dimension(:) :: mp_partgroup_rank
    90   integer, allocatable, dimension(:) :: npart_per_process
    9190  integer :: mp_partgroup_comm, mp_partgroup_pid, mp_partgroup_np
    9291
     
    126125! mp_time_barrier   Measure MPI barrier time
    127126! mp_exact_numpart  Use an extra MPI communication to give the exact number of particles
    128 !                   to standard output (this does not otherwise affect the simulation)
     127!                   to standard output (this does *not* otherwise affect the simulation)
    129128  logical, parameter :: mp_dbg_mode = .false.
    130129  logical, parameter :: mp_dev_mode = .false.
     
    191190!   mp_np       number of running processes, decided at run-time
    192191!***********************************************************************
    193     use par_mod, only: maxpart, numwfmem, dep_prec, maxreceptor, maxspec
    194     use com_mod, only: mpi_mode, verbosity, creceptor0
     192    use par_mod, only: maxpart, numwfmem, dep_prec
     193    use com_mod, only: mpi_mode, verbosity
    195194
    196195    implicit none
     
    338337
    339338! Set maxpart per process
    340 ! ESO 08/2016: Increase maxpart per process, in case of unbalanced distribution
     339! eso 08/2016: Increase maxpart per process, in case of unbalanced distribution
    341340    maxpart_mpi=int(mp_maxpart_factor*real(maxpart)/real(mp_partgroup_np))
    342341    if (mp_np == 1) maxpart_mpi = maxpart
     
    366365    end if
    367366
    368 ! Allocate array for number of particles per process   
    369     allocate(npart_per_process(0:mp_partgroup_np-1))
    370 
    371 ! Write whether MPI_IN_PLACE is used or not
    372 #ifdef USE_MPIINPLACE
    373     if (lroot) write(*,*) 'Using MPI_IN_PLACE operations'
    374 #else
    375     if (lroot) allocate(creceptor0(maxreceptor,maxspec))
    376     if (lroot) write(*,*) 'Not using MPI_IN_PLACE operations'
    377 #endif
    378367    goto 101
    379368
     
    570559! invalid particles at the end of the arrays
    571560
    572 601 do i=numpart, 1, -1
     561601 do i=num_part, 1, -1
    573562      if (itra1(i).eq.-999999999) then
    574563        numpart=numpart-1
     
    609598    integer :: i,jj,nn, num_part=1,m,imin, num_trans
    610599    logical :: first_iter
    611     integer,allocatable,dimension(:) :: idx_arr
     600    integer,allocatable,dimension(:) :: numparticles_mpi, idx_arr
    612601    real,allocatable,dimension(:) :: sorted ! TODO: we don't really need this
    613602
     
    618607! All processes exchange information on number of particles
    619608!****************************************************************************
    620     allocate( idx_arr(0:mp_partgroup_np-1), sorted(0:mp_partgroup_np-1))
    621 
    622     call MPI_Allgather(numpart, 1, MPI_INTEGER, npart_per_process, &
     609    allocate(numparticles_mpi(0:mp_partgroup_np-1), &
     610         &idx_arr(0:mp_partgroup_np-1), sorted(0:mp_partgroup_np-1))
     611
     612    call MPI_Allgather(numpart, 1, MPI_INTEGER, numparticles_mpi, &
    623613         & 1, MPI_INTEGER, mp_comm_used, mp_ierr)
    624614
     
    626616! Sort from lowest to highest
    627617! Initial guess: correct order
    628     sorted(:) = npart_per_process(:)
     618    sorted(:) = numparticles_mpi(:)
    629619    do i=0, mp_partgroup_np-1
    630620      idx_arr(i) = i
    631621    end do
    632 
    633 ! Do not rebalance particles for ipout=3   
    634     if (ipout.eq.3) return
    635622
    636623! For each successive element in index array, see if a lower value exists
     
    658645    m=mp_partgroup_np-1 ! index for last sorted process (most particles)
    659646    do i=0,mp_partgroup_np/2-1
    660       num_trans = npart_per_process(idx_arr(m)) - npart_per_process(idx_arr(i))
     647      num_trans = numparticles_mpi(idx_arr(m)) - numparticles_mpi(idx_arr(i))
    661648      if (mp_partid.eq.idx_arr(m).or.mp_partid.eq.idx_arr(i)) then
    662         if ( npart_per_process(idx_arr(m)).gt.mp_min_redist.and.&
    663              & real(num_trans)/real(npart_per_process(idx_arr(m))).gt.mp_redist_fract) then
     649        if ( numparticles_mpi(idx_arr(m)).gt.mp_min_redist.and.&
     650             & real(num_trans)/real(numparticles_mpi(idx_arr(m))).gt.mp_redist_fract) then
    664651! DBG
    665           ! write(*,*) 'mp_partid, idx_arr(m), idx_arr(i), mp_min_redist, num_trans, npart_per_process', &
    666           !      &mp_partid, idx_arr(m), idx_arr(i), mp_min_redist, num_trans, npart_per_process
     652          ! write(*,*) 'mp_partid, idx_arr(m), idx_arr(i), mp_min_redist, num_trans, numparticles_mpi', &
     653          !      &mp_partid, idx_arr(m), idx_arr(i), mp_min_redist, num_trans, numparticles_mpi
    667654! DBG
    668655          call mpif_redist_part(itime, idx_arr(m), idx_arr(i), num_trans/2)
     
    672659    end do
    673660
    674     deallocate(idx_arr, sorted)
     661    deallocate(numparticles_mpi, idx_arr, sorted)
    675662
    676663  end subroutine mpif_calculate_part_redist
     
    19741961    if (readclouds) then
    19751962      j=j+1
    1976       call MPI_Irecv(ctwc(:,:,mind),d2s1*5,mp_sp,id_read,MPI_ANY_TAG,&
     1963      call MPI_Irecv(ctwc(:,:,mind),d2s1,mp_sp,id_read,MPI_ANY_TAG,&
    19771964           &MPI_COMM_WORLD,reqs(j),mp_ierr)
    19781965      if (mp_ierr /= 0) goto 600
     
    23392326      if (readclouds) then
    23402327        j=j+1
    2341         call MPI_Irecv(ctwcn(:,:,mind,k),d2s1*5,mp_sp,id_read,MPI_ANY_TAG,&
     2328        call MPI_Irecv(ctwcn(:,:,mind,k),d2s1,mp_sp,id_read,MPI_ANY_TAG,&
    23422329             &MPI_COMM_WORLD,reqs(j),mp_ierr)
    23432330        if (mp_ierr /= 0) goto 600
     
    24752462    end if
    24762463
    2477   ! Receptor concentrations   
     2464#else
     2465
     2466      call MPI_Reduce(gridunc, gridunc0, grid_size3d, mp_sp, MPI_SUM, id_root, &
     2467           & mp_comm_used, mp_ierr)
     2468      if (lroot) gridunc = gridunc0
     2469
     2470#endif
     2471
     2472    if ((WETDEP).and.(ldirect.gt.0)) then
     2473      call MPI_Reduce(wetgridunc, wetgridunc0, grid_size2d, mp_cp, MPI_SUM, id_root, &
     2474           & mp_comm_used, mp_ierr)
     2475      if (mp_ierr /= 0) goto 600
     2476    end if
     2477
     2478    if ((DRYDEP).and.(ldirect.gt.0)) then
     2479      call MPI_Reduce(drygridunc, drygridunc0, grid_size2d, mp_cp, MPI_SUM, id_root, &
     2480           & mp_comm_used, mp_ierr)
     2481      if (mp_ierr /= 0) goto 600
     2482    end if
     2483
     2484! Receptor concentrations   
    24782485    if (lroot) then
    24792486      call MPI_Reduce(MPI_IN_PLACE,creceptor,rcpt_size,mp_sp,MPI_SUM,id_root, &
     
    24842491           & mp_comm_used,mp_ierr)
    24852492    end if
    2486 
    2487 #else
    2488 
    2489       call MPI_Reduce(gridunc, gridunc0, grid_size3d, mp_sp, MPI_SUM, id_root, &
    2490            & mp_comm_used, mp_ierr)
    2491       if (mp_ierr /= 0) goto 600
    2492       if (lroot) gridunc = gridunc0
    2493 
    2494       call MPI_Reduce(creceptor, creceptor0,rcpt_size,mp_sp,MPI_SUM,id_root, &
    2495            & mp_comm_used,mp_ierr)
    2496       if (mp_ierr /= 0) goto 600
    2497       if (lroot) creceptor = creceptor0
    2498 
    2499 #endif
    2500 
    2501     if ((WETDEP).and.(ldirect.gt.0)) then
    2502       call MPI_Reduce(wetgridunc, wetgridunc0, grid_size2d, mp_cp, MPI_SUM, id_root, &
    2503            & mp_comm_used, mp_ierr)
    2504       if (mp_ierr /= 0) goto 600
    2505     end if
    2506 
    2507     if ((DRYDEP).and.(ldirect.gt.0)) then
    2508       call MPI_Reduce(drygridunc, drygridunc0, grid_size2d, mp_cp, MPI_SUM, id_root, &
    2509            & mp_comm_used, mp_ierr)
    2510       if (mp_ierr /= 0) goto 600
    2511     end if
    2512 
    25132493
    25142494    if (mp_measure_time) call mpif_mtime('commtime',1)
     
    27202700      end if
    27212701
    2722    case ('readwind')
    2723      if (imode.eq.0) then
    2724        call cpu_time(mp_readwind_time_beg)
    2725        mp_readwind_wtime_beg = mpi_wtime()
    2726      else
    2727        call cpu_time(mp_readwind_time_end)
    2728        mp_readwind_wtime_end = mpi_wtime()
    2729 
    2730        mp_readwind_time_total = mp_readwind_time_total + &
    2731             &(mp_readwind_time_end - mp_readwind_time_beg)
    2732        mp_readwind_wtime_total = mp_readwind_wtime_total + &
    2733             &(mp_readwind_wtime_end - mp_readwind_wtime_beg)
    2734      end if
     2702    case ('readwind')
     2703      if (imode.eq.0) then
     2704        call cpu_time(mp_readwind_time_beg)
     2705        mp_readwind_wtime_beg = mpi_wtime()
     2706      else
     2707        call cpu_time(mp_readwind_time_end)
     2708        mp_readwind_wtime_end = mpi_wtime()
     2709
     2710        mp_readwind_time_total = mp_readwind_time_total + &
     2711             &(mp_readwind_time_end - mp_readwind_time_beg)
     2712        mp_readwind_wtime_total = mp_readwind_wtime_total + &
     2713             &(mp_readwind_wtime_end - mp_readwind_wtime_beg)
     2714      end if
    27352715
    27362716    case ('commtime')
     
    28082788          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL CPU TIME FOR GETFIELDS:',&
    28092789               & mp_getfields_time_total
    2810 !          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL WALL TIME FOR READWIND:',&
    2811 !               & mp_readwind_wtime_total
    2812 !          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL CPU TIME FOR READWIND:',&
    2813 !               & mp_readwind_time_total
     2790          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL WALL TIME FOR READWIND:',&
     2791               & mp_readwind_wtime_total
     2792          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL CPU TIME FOR READWIND:',&
     2793               & mp_readwind_time_total
    28142794          write(*,FMT='(A60,TR1,F9.2)') 'TOTAL WALL TIME FOR FILE IO:',&
    28152795               & mp_io_wtime_total
Note: See TracChangeset for help on using the changeset viewer.
hosted by ZAMG