@@ -394,8 +394,8 @@ subroutine GetSFCElementsPartition(mesh, no_of_domains, no_of_elements, elements
394394 integer , intent (in ) :: no_of_elements
395395 integer , intent (inout ) :: elementsDomain(no_of_elements)
396396 logical , intent (in ) :: useWeights
397- integer , intent (in ) :: eID_Order(:)
398- integer , intent (in ) :: nElementLevel(:)
397+ integer , intent (in ) :: eID_Order(:)
398+ integer , intent (in ) :: nElementLevel(:)
399399 !- local-variables--------------------------------------------
400400 integer :: elems_per_domain(no_of_domains)
401401 integer :: biggerdomains
@@ -404,83 +404,81 @@ subroutine GetSFCElementsPartition(mesh, no_of_domains, no_of_elements, elements
404404 integer :: dof_per_domain(no_of_domains), start_index(no_of_domains+1 )
405405 logical :: needWeights = .false.
406406 integer , allocatable , target :: weights(:)
407- integer :: nLevel, i
408- integer , allocatable :: bufferDomain(:)
407+ integer :: nLevel, i
408+ integer , allocatable :: bufferDomain(:)
409409 !- -----------------------------------------------------------
410- nLevel = size (nElementLevel)
410+ nLevel = size (nElementLevel)
411411 if (useWeights) then
412- allocate (weights(no_of_elements))
413- do ielem= 1 ,no_of_elements
414- weights(ielem) = product (mesh % elements(ielem) % Nxyz + 1 )
415- end do
416- if (maxval (weights) .eq. minval (weights)) then
417- needWeights = .false.
418- deallocate (weights)
419- elseif (nLevel.gt. 1 ) then
420- needWeights = .false.
421- deallocate (weights)
422- else
423- needWeights = .true.
424- ndof = sum (weights)
425- endif
412+ allocate (weights(no_of_elements))
413+ do ielem= 1 ,no_of_elements
414+ weights(ielem) = product (mesh % elements(ielem) % Nxyz + 1 )
415+ end do
416+ if (maxval (weights) .eq. minval (weights)) then
417+ needWeights = .false.
418+ deallocate (weights)
419+ elseif (nLevel.gt. 1 ) then
420+ needWeights = .false.
421+ deallocate (weights)
422+ else
423+ needWeights = .true.
424+ ndof = sum (weights)
425+ endif
426+ end if
427+ first = 1
428+ do i= 1 ,nLevel
429+ elems_per_domain = 0
430+ elems_per_domain = nElementLevel(i) / no_of_domains
431+ biggerdomains = mod (nElementLevel(i),no_of_domains)
432+ elems_per_domain(1 :biggerdomains) = elems_per_domain(1 :biggerdomains) + 1
433+
434+ do domain = 1 , no_of_domains
435+ last = first + elems_per_domain(domain) - 1
436+ elementsDomain(first:last) = domain
437+ first = last + 1
438+ end do
439+ end do
440+ if (nLevel.gt. 1 ) then
441+ allocate (bufferDomain(mesh % no_of_elements))
442+ bufferDomain = elementsDomain
443+ do i= 1 , mesh % no_of_elements
444+ elementsDomain(eID_Order(i)) = bufferDomain(i)
445+ end do
446+ deallocate (bufferDomain)
426447 end if
427- first = 1
428- do i= 1 ,nLevel
429- elems_per_domain = 0
430- elems_per_domain = nElementLevel(i) / no_of_domains
431- biggerdomains = mod (nElementLevel(i),no_of_domains)
432- elems_per_domain(1 :biggerdomains) = elems_per_domain(1 :biggerdomains) + 1
433-
434- do domain = 1 , no_of_domains
435- last = first + elems_per_domain(domain) - 1
436- elementsDomain(first:last) = domain
437- first = last + 1
438- end do
439- end do
440- if (nLevel.gt. 1 ) then
441- allocate (bufferDomain(mesh % no_of_elements))
442- bufferDomain = elementsDomain
443- do i= 1 , mesh % no_of_elements
444- elementsDomain(eID_Order(i)) = bufferDomain(i)
445- end do
446- deallocate (bufferDomain)
447- end if
448448 if (needWeights) then
449+ max_dof = ndof / no_of_domains
450+ start_index = 1
451+ do domain = 1 , no_of_domains
452+ start_index(domain+1 ) = start_index(domain) + elems_per_domain(domain)
453+ end do
449454
450- max_dof = ndof / no_of_domains
451- start_index = 1
452- do domain = 1 , no_of_domains
453- start_index(domain+1 ) = start_index(domain) + elems_per_domain(domain)
454- end do
455-
456- do domain = 1 , no_of_domains-1
457- if (start_index(domain) .ge. start_index(domain+1 )) start_index(domain+1 ) = start_index(domain) + 1
458- dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
459- do ielem= 1 ,no_of_elements
460- if (dof_in_domain .lt. max_dof) then
461- start_index(domain+1 ) = start_index(domain+1 ) + 1
462- dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
463- if (abs (dof_in_domain- max_dof) .le. abs (dof_in_domain- max_dof+ weights(start_index(domain+1 )+ 1 ))) exit
464- else
465- start_index(domain+1 ) = start_index(domain+1 ) - 1
466- dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
467- if (abs (dof_in_domain- max_dof) .le. abs (dof_in_domain- max_dof- weights(start_index(domain+1 )- 1 ))) exit
468- end if
469- end do
470- end do
471-
472- dof_per_domain = 0
473- do domain = 1 , no_of_domains
474- dof_per_domain(domain) = sum (weights(start_index(domain):start_index(domain+1 )- 1 ))
475- end do
455+ do domain = 1 , no_of_domains-1
456+ if (start_index(domain) .ge. start_index(domain+1 )) start_index(domain+1 ) = start_index(domain) + 1
457+ dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
458+ do ielem= 1 ,no_of_elements
459+ if (dof_in_domain .lt. max_dof) then
460+ start_index(domain+1 ) = start_index(domain+1 ) + 1
461+ dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
462+ if (abs (dof_in_domain- max_dof) .le. abs (dof_in_domain- max_dof+ weights(start_index(domain+1 )+ 1 ))) exit
463+ else
464+ start_index(domain+1 ) = start_index(domain+1 ) - 1
465+ dof_in_domain = sum (weights(start_index(domain):start_index(domain+1 )))
466+ if (abs (dof_in_domain- max_dof) .le. abs (dof_in_domain- max_dof- weights(start_index(domain+1 )- 1 ))) exit
467+ end if
468+ end do
469+ end do
476470
477- do domain = 1 , no_of_domains
478- elementsDomain(start_index(domain):start_index(domain+1 )- 1 ) = domain
479- end do
471+ dof_per_domain = 0
472+ do domain = 1 , no_of_domains
473+ dof_per_domain(domain) = sum (weights(start_index(domain):start_index(domain+1 )- 1 ))
474+ end do
480475
476+ do domain = 1 , no_of_domains
477+ elementsDomain(start_index(domain):start_index(domain+1 )- 1 ) = domain
478+ end do
481479 end if
482480
483- if (allocated (weights)) deallocate (weights)
481+ if (allocated (weights)) deallocate (weights)
484482 end subroutine GetSFCElementsPartition
485483!
486484! ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 commit comments