Skip to content

Commit

Permalink
periodicas em implementação
Browse files Browse the repository at this point in the history
  • Loading branch information
g7fernandes committed Jul 31, 2019
1 parent ff7731d commit 8cb5d0a
Showing 1 changed file with 68 additions and 175 deletions.
243 changes: 68 additions & 175 deletions lennard.f90
Original file line number Diff line number Diff line change
Expand Up @@ -747,6 +747,7 @@ subroutine comp_x(icell,jcell,malha,N,mesh,propriedade, dx_max,t,dt,ids,LT,domx,
use mpi
use matprint

character(1) :: north, south, east, west
type(prop_grupo), allocatable,dimension(:),intent(in) :: propriedade
type(container), allocatable,dimension(:,:),intent(in) :: malha
integer :: i,j,k, cell(2), status(MPI_STATUS_SIZE), count, destD,dx1,dx2,dy1,dy2
Expand All @@ -764,6 +765,11 @@ subroutine comp_x(icell,jcell,malha,N,mesh,propriedade, dx_max,t,dt,ids,LT,domx,
! IDS correspondem às celulas [N,S,E,W]
cont_db = 0
cont_int = 0

north = wall(1:1)
south = wall(2:2)
east = wall(3:3)
west = wall(4:4)
! if (id == 0) read(*,*)

! Esvazia as celulas emprestadas
Expand Down Expand Up @@ -1098,198 +1104,45 @@ subroutine comp_x(icell,jcell,malha,N,mesh,propriedade, dx_max,t,dt,ids,LT,domx,
cont_int(2) = cont_int(2) + 4
end if

! PARA O CASO PERIODICO
! CASO PERIODICO

if (cell(1) /= i .or. cell(2) /= j) then !Mudou de celula
! print*, "MUDOU"
! if (id == 0) read(*,*)
! Se a partícula chegar na fronteira do domínio que um processador
! cuida, então esta partícula é colocada na lista linkada referente
! a este célula com list_change. Além disso ela precisa ser
! transferida para o outro processo vizinho para que ele possa
! calcular sua influência no domínio.
! Se a partícula ultrapassar o domínio, então ela é transferida
! para o próximo processo e dealocada da lista com list_remove
! ! ! print*, "L FORÇA", ptr%p%F, id
if (cell(2) >= domx(2) .and. cell(2) < mesh(1)+2 ) then
if (east == 'p' .and. cell(2) == mesh(1)+2 ) then
! print*, "L 538", cell(1), cell(2),"part", ptr%p%n,"i,j", i, j
! 6 elementos
LT%lstrdb_E(cont_db(3)+1:cont_db(3)+6) = [x(1),x(2), &
LT%lstrdb_W(cont_db(4)+1:cont_db(4)+6) = [x(1)- jcell(mesh(1)+1),x(2), &
ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
! 4 elementos
! print*, "id",id,"transferindo para o leste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
LT%lstrint_E(cont_int(3)+1:cont_int(3)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! print*, "id",id,"transferindo para o leste", LT%lstrint_E, "cont", cont_int(3)
! if (cell(2) > domx(2)) then
! ! print*, 'affs'
! ! read(*,*)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_E

! ! call list_remove(previous_node)
! ! print*, 'affs'
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
cont_db(3) = cont_db(3) + 6
cont_int(3) = cont_int(3) + 4
end if
if (cell(2) <= domx(1) .and. cell(2) > 1) then
! print*, "L 554", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
! print*, "domx", domx
LT%lstrdb_W(cont_db(4)+1:cont_db(4)+6) = [x(1), x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_W(cont_int(4)+1:cont_int(4)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! print*, "id",id,"transferindo para o oeste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(2) < domx(1)) then
! ! print*, 'affs'
! ! read(*,*)
! ! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_W

! ! call list_remove(previous_node)
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
LT%lstrint_W(cont_int(4)+1:cont_int(4)+4) = [cell(1), 2,ptr%p%n,ptr%p%grupo]

cont_db(4) = cont_db(4) + 6
cont_int(4) = cont_int(4) + 4
end if
if (cell(1) >= domy(2) .and. cell(1) < mesh(2)+2) then
! print*, "L 567", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
! print*, "id",id,"transferindo para o norte", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
LT%lstrdb_N(cont_db(1)+1:cont_db(1)+6) = [x(1),x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_N(cont_int(1)+1:cont_int(1)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(1) > domy(1)) then
! ! read(*,*)
! ! print*, 'affs'
! ! call list_remove(previous_node)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_N(cont_int(1)+1:cont_int(1)+4), "cont", cont_int(1)
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
cont_db(1) = cont_db(1) + 6
cont_int(1) = cont_int(1) + 4
end if
if (cell(1) <= domy(1) .and. cell(1) > 1) then
! print*, "L 580", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
LT%lstrdb_S(cont_db(2)+1:cont_db(2)+6) = [x(1),x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_S(cont_int(2)+1:cont_int(2)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! ! print*, "L 583"
! print*, "id",id,"transferindo para o sul", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(1) < domy(1)) then
! ! read(*,*)
! ! print*, 'affs'
! ! call list_remove(previous_node)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_S(cont_int(2)+1:cont_int(2)+4), "cont", cont_int(1)
! ! node => list_next(previous_node)
! ! else
! ! !!!! ! print*, "L 590"
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! ! !!!! ! print*, "L 624"
! end if
cont_db(2) = cont_db(2) + 6
cont_int(2) = cont_int(2) + 4
end if

! CASO PERIODICO

if (west == 'p' .and. cell(2) == 1) then
! print*, "L 554", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
! print*, "domx", domx
LT%lstrdb_E(cont_db(3)+1:cont_db(3)+6) = [x(1)+ jcell(mesh(1)+1), x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_E(cont_int(3)+1:cont_int(3)+4) = [cell(1),mesh(1)+1,ptr%p%n,ptr%p%grupo]

if (cell(2) >= domx(2) .and. cell(2) > mesh(1)+2 ) then
! print*, "L 538", cell(1), cell(2),"part", ptr%p%n,"i,j", i, j
! 6 elementos
LT%lstrdb_EP(cont_db(3)+1:cont_db(3)+6) = [x(1),x(2), &
ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
! 4 elementos
! print*, "id",id,"transferindo para o leste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
LT%lstrint_EP(cont_int(3)+1:cont_int(3)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! print*, "id",id,"transferindo para o leste", LT%lstrint_E, "cont", cont_int(3)
! if (cell(2) > domx(2)) then
! ! print*, 'affs'
! ! read(*,*)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_E

! ! call list_remove(previous_node)
! ! print*, 'affs'
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
cont_db(3) = cont_db(3) + 6
cont_int(3) = cont_int(3) + 4
end if
if (cell(2) <= domx(1) .and. cell(2) > 1) then
! print*, "L 554", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
! print*, "domx", domx
LT%lstrdb_WP(cont_db(4)+1:cont_db(4)+6) = [x(1), x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_WP(cont_int(4)+1:cont_int(4)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! print*, "id",id,"transferindo para o oeste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(2) < domx(1)) then
! ! print*, 'affs'
! ! read(*,*)
! ! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_W

! ! call list_remove(previous_node)
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
cont_db(4) = cont_db(4) + 6
cont_int(4) = cont_int(4) + 4
end if
if (cell(1) >= domy(2) .and. cell(1) < mesh(2)+2) then
if (north == 'p' .and. cell(1) == mesh(2)+2) then
! print*, "L 567", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
! print*, "id",id,"transferindo para o norte", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
LT%lstrdb_NP(cont_db(1)+1:cont_db(1)+6) = [x(1),x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_NP(cont_int(1)+1:cont_int(1)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(1) > domy(1)) then
! ! read(*,*)
! ! print*, 'affs'
! ! call list_remove(previous_node)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_N(cont_int(1)+1:cont_int(1)+4), "cont", cont_int(1)
! ! node => list_next(previous_node)
! ! else
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! end if
cont_db(1) = cont_db(1) + 6
cont_int(1) = cont_int(1) + 4
end if
if (cell(1) <= domy(1) .and. cell(1) > 1) then
! print*, "L 580", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
LT%lstrdb_SP(cont_db(2)+1:cont_db(2)+6) = [x(1),x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_SP(cont_int(2)+1:cont_int(2)+4) = [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! ! print*, "L 583"
! print*, "id",id,"transferindo para o sul", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
! if (cell(1) < domy(1)) then
! ! read(*,*)
! ! print*, 'affs'
! ! call list_remove(previous_node)
! print*, "Removido", ptr%p%n, "de malha", i,j
! print*, "Irá para", LT%lstrint_S(cont_int(2)+1:cont_int(2)+4), "cont", cont_int(1)
! ! node => list_next(previous_node)
! ! else
! ! !!!! ! print*, "L 590"
! ! call list_change(previous_node,malha(cell(1),cell(2))%list)
! ! node => list_next(previous_node)
! ! !!!! ! print*, "L 624"
! end if
LT%lstrdb_S(cont_db(2)+1:cont_db(2)+6) = [x(1),x(2) - icell(mesh(2)+1), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_S(cont_int(2)+1:cont_int(2)+4) = [2,cell(2),ptr%p%n,ptr%p%grupo]

cont_db(2) = cont_db(2) + 6
cont_int(2) = cont_int(2) + 4
end if
if (south == 'p' .and. cell(1) == 1) then
! print*, "L 580", cell(1), cell(2), "part", ptr%p%n, "i,j", i, j
LT%lstrdb_N(cont_db(1)+1:cont_db(1)+6) = [x(1),icell(mesh(2)+1) + x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_N(cont_int(1)+1:cont_int(1)+4) = [mesh(2)+1,cell(2),ptr%p%n,ptr%p%grupo]

cont_db(1) = cont_db(1) + 6
cont_int(1) = cont_int(1) + 4
end if

!!! FIM DA VERIFICAÇÃO SE MUDOU DE DOMÍNIO !!!
Expand Down Expand Up @@ -1345,6 +1198,45 @@ subroutine comp_x(icell,jcell,malha,N,mesh,propriedade, dx_max,t,dt,ids,LT,domx,
cont_db(1) = cont_db(1) + 6
cont_int(1) = cont_int(1) + 4
end if

! CASO PERIODICO

if (east == 'p' .and. cell(2) == mesh(1)+1) then
!!! ! print*, "L 538", cell(1), cell(2), domy(1), domy(2), "part", ptr%p%n
! 6 elementos
LT%lstrdb_W(cont_db(4)+1:cont_db(4)+6) = [x(1)- jcell(mesh(1)+1),x(2),x(2), &
ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
! 4 elementos
LT%lstrint_W(cont_int(4)+1:cont_int(4)+4) = [cell(1),1,ptr%p%n,ptr%p%grupo]
! print*, "L id",id,"transferindo para o oeste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
cont_db(4) = cont_db(4) + 6
cont_int(4) = cont_int(4) + 4

else if (west == 'p' .and. cell(2) == 2) then
!!! ! print*, "L 554", cell(1), cell(2), domy(1), domy(2), "part", ptr%p%n
LT%lstrdb_E(cont_db(3)+1:cont_db(3)+6) = [x(1)+ jcell(mesh(1)+1),x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_E(cont_int(3)+1:cont_int(3)+4) = [cell(1),mesh(1)+2,ptr%p%n,ptr%p%grupo]
! print*, "L id",id,"transferindo para o leste", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
cont_db(3) = cont_db(3) + 6
cont_int(3) = cont_int(3) + 4
end if

if (south == 'p' .and. cell(1) == mesh(2)+1) then
!!! ! print*, "L 567", cell(1), cell(2), domy(1), domy(2), "part", ptr%p%n
LT%lstrdb_N(cont_db(2)+1:cont_db(2)+6) = [x(1),icell(mesh(2)+1) + x(2), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_N(cont_int(2)+1:cont_int(2)+4) = [1,cell(2),ptr%p%n,ptr%p%grupo]
! print*, "L id",id,"transferindo para o norte", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
cont_db(1) = cont_db(1) + 6
cont_int(1) = cont_int(1) + 4

elseif (north == 'p' .and. cell(1) == 2) then
!!! ! print*, "L 580", cell(1), cell(2), domy(1), domy(2), "part", ptr%p%n
LT%lstrdb_S(cont_db(1)+1:cont_db(1)+6) = [x(1),x(2) - icell(mesh(2)+1), ptr%p%v(1),ptr%p%v(2), ptr%p%F(1),ptr%p%F(2)]
LT%lstrint_S(cont_int(1)+1:cont_int(1)+4) = [mesh(2)+2,cell(2),ptr%p%n,ptr%p%grupo]
! print*, "L id",id,"transferindo para o sul", [cell(1),cell(2),ptr%p%n,ptr%p%grupo]
cont_db(2) = cont_db(2) + 6
cont_int(2) = cont_int(2) + 4
end if

previous_node => node
node => list_next(node)
Expand Down Expand Up @@ -1393,6 +1285,7 @@ subroutine comp_x(icell,jcell,malha,N,mesh,propriedade, dx_max,t,dt,ids,LT,domx,
previous_node => node
node => list_next(node)
end do

! Segundo transfere para as celulas do domínio caso a partícula tenha mudado de processo
if (domy(1) /= 1) i = domy(1) -1
if (domy(2) /= mesh(2)+2) i = domy(2) +1
Expand Down

0 comments on commit 8cb5d0a

Please sign in to comment.