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, &
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)
logical, allocatable :: lat_points(:,:,:)
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))
do i = 1, 3
bd_in_lat(2*i-1) = minval(group_in_lat(i,:))
bd_in_lat(2*i) = maxval(group_in_lat(i,:))
bd_in_lat(2*i-1) = nint(minval(group_in_lat(i,:)))
bd_in_lat(2*i) = nint(maxval(group_in_lat(i,:)))
end do
end select
@ -306,8 +306,11 @@ module opt_group
!Now place all group atoms and group interpolated atoms into lat_points
do i = 1, group_atom_num
r_lat = r_atom(:,atom_index(i))/remesh_lat_pam
r_lat = matmul(fcc_inv,matmul(ori_inv,r_lat))
r = r_atom(:,atom_index(i))/remesh_lat_pam
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.
!This is primarily a debugging statement
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(3) = bd_in_lat(6) - bd_in_lat(5) + 10
do iz = 1, bd_in_array(3)
do iy = 1, bd_in_array(2)
do ix = 1, bd_in_array(1)
zloop: do iz = 1, bd_in_array(3)
yloop: do iy = 1, bd_in_array(2)
xloop: do ix = 1, bd_in_array(1)
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
do inod = 1, 8
vlat = ele(:,inod) + (/ix, iy, iz /)
@ -369,12 +382,26 @@ module opt_group
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 subroutine remesh_group
subroutine delete_group

Loading…
Cancel
Save