First version that doesn't crash, incorrectly places elements and atoms

master
Alex Selimov 5 years ago
parent 20755270a4
commit c698c31ede

@ -263,7 +263,7 @@ module opt_group
integer :: i, j, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & integer :: i, j, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, &
current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3) current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3)
real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), & real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), r(3), &
r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8)
logical, allocatable :: lat_points(:,:,:) logical, allocatable :: lat_points(:,:,:)
character(len=100) :: remesh_ele_type character(len=100) :: remesh_ele_type
@ -295,8 +295,8 @@ module opt_group
group_in_lat = matmul(fcc_inv, matmul(ori_inv, group_in_lat/remesh_lat_pam)) group_in_lat = matmul(fcc_inv, matmul(ori_inv, group_in_lat/remesh_lat_pam))
do i = 1, 3 do i = 1, 3
bd_in_lat(2*i-1) = minval(group_in_lat(i,:)) bd_in_lat(2*i-1) = nint(minval(group_in_lat(i,:)))
bd_in_lat(2*i) = maxval(group_in_lat(i,:)) bd_in_lat(2*i) = nint(maxval(group_in_lat(i,:)))
end do end do
end select end select
@ -306,8 +306,11 @@ module opt_group
!Now place all group atoms and group interpolated atoms into lat_points !Now place all group atoms and group interpolated atoms into lat_points
do i = 1, group_atom_num do i = 1, group_atom_num
r_lat = r_atom(:,atom_index(i))/remesh_lat_pam r = r_atom(:,atom_index(i))/remesh_lat_pam
r_lat = matmul(fcc_inv,matmul(ori_inv,r_lat)) r = matmul(fcc_inv,matmul(ori_inv,r))
do j = 1, 3
r_lat(j) = nint(r(j))
end do
!Do a check to make sure the code is working and that lattice points aren't being written on top of each other. !Do a check to make sure the code is working and that lattice points aren't being written on top of each other.
!This is primarily a debugging statement !This is primarily a debugging statement
if((r_lat(1)==13).and.(r_lat(2)==13).and.(r_lat(3)==-13)) then if((r_lat(1)==13).and.(r_lat(2)==13).and.(r_lat(3)==-13)) then
@ -349,10 +352,20 @@ module opt_group
bd_in_array(2) = bd_in_lat(4) - bd_in_lat(3) + 10 bd_in_array(2) = bd_in_lat(4) - bd_in_lat(3) + 10
bd_in_array(3) = bd_in_lat(6) - bd_in_lat(5) + 10 bd_in_array(3) = bd_in_lat(6) - bd_in_lat(5) + 10
do iz = 1, bd_in_array(3) zloop: do iz = 1, bd_in_array(3)
do iy = 1, bd_in_array(2) yloop: do iy = 1, bd_in_array(2)
do ix = 1, bd_in_array(1) xloop: do ix = 1, bd_in_array(1)
if (lat_points(ix, iy,iz)) then if (lat_points(ix, iy,iz)) then
!Check to see if the element overshoots the bound
if (iz+remesh_size-1 > bd_in_array(3)) then
exit zloop
else if (iy+remesh_size-1 > bd_in_array(2)) then
cycle zloop
else if (ix+remesh_size-1 > bd_in_array(1)) then
cycle yloop
end if
if (all(lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1))) then if (all(lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1))) then
do inod = 1, 8 do inod = 1, 8
vlat = ele(:,inod) + (/ix, iy, iz /) vlat = ele(:,inod) + (/ix, iy, iz /)
@ -369,12 +382,26 @@ module opt_group
end if end if
end if end if
end do xloop
end do yloop
end do zloop
!Now we have to add any leftover lattice points as atoms
do iz = 1, bd_in_array(3)
do iy=1, bd_in_array(2)
do ix = 1, bd_in_array(1)
if(lat_points(ix,iy,iz)) then
vlat = (/ ix, iy, iz /)
do i = 1, 3
vlat = vlat + bd_in_lat(2*i-1)-5
end do
r = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam
call add_atom(remesh_type, sbox_atom(atom_index(1)), r)
end if
end do end do
end do end do
end do end do
end subroutine remesh_group end subroutine remesh_group
subroutine delete_group subroutine delete_group

Loading…
Cancel
Save