|
|
|
@ -11,7 +11,7 @@ module opt_group
|
|
|
|
|
integer :: group_ele_num, group_atom_num, remesh_size,normal, dim1, dim2
|
|
|
|
|
character(len=15) :: type, shape !Type indicates what element type is selected and shape is the group shape
|
|
|
|
|
real(kind=dp) :: block_bd(6), centroid(3), vertices(3,3),disp_vec(3), tip_radius, bwidth
|
|
|
|
|
logical :: displace, delete, max_remesh, refine
|
|
|
|
|
logical :: displace, delete, max_remesh, refine, group_nodes
|
|
|
|
|
|
|
|
|
|
integer, allocatable :: element_index(:), atom_index(:)
|
|
|
|
|
|
|
|
|
@ -334,6 +334,8 @@ module opt_group
|
|
|
|
|
max_remesh =.true.
|
|
|
|
|
case('delete')
|
|
|
|
|
delete=.true.
|
|
|
|
|
case('nodes')
|
|
|
|
|
group_nodes=.true.
|
|
|
|
|
case default
|
|
|
|
|
!If it isn't an available option to opt_disl then we just exit
|
|
|
|
|
exit
|
|
|
|
@ -363,29 +365,49 @@ module opt_group
|
|
|
|
|
!Check the type to see whether we need to find the elements within the group
|
|
|
|
|
select case(trim(adjustl(type)))
|
|
|
|
|
case('elements', 'both')
|
|
|
|
|
do i = 1, ele_num
|
|
|
|
|
r_center(:) = 0.0_dp
|
|
|
|
|
do inod = 1, ng_node(lat_ele(i))
|
|
|
|
|
do ibasis = 1, basisnum(lat_ele(i))
|
|
|
|
|
r_center = r_center + r_node(:,ibasis,inod,i)/(basisnum(lat_ele(i))*ng_node(lat_ele(i)))
|
|
|
|
|
if(.not.(group_nodes)) then
|
|
|
|
|
do i = 1, ele_num
|
|
|
|
|
r_center(:) = 0.0_dp
|
|
|
|
|
do inod = 1, ng_node(lat_ele(i))
|
|
|
|
|
do ibasis = 1, basisnum(lat_ele(i))
|
|
|
|
|
r_center = r_center + r_node(:,ibasis,inod,i)/(basisnum(lat_ele(i))*ng_node(lat_ele(i)))
|
|
|
|
|
end do
|
|
|
|
|
end do
|
|
|
|
|
end do
|
|
|
|
|
|
|
|
|
|
if (in_group(r_center)) then
|
|
|
|
|
group_ele_num = group_ele_num + 1
|
|
|
|
|
if(group_ele_num > size(element_index)) then
|
|
|
|
|
allocate(resize_array(size(element_index) + 1024))
|
|
|
|
|
resize_array(1:group_ele_num-1) = element_index
|
|
|
|
|
resize_array(group_ele_num:) = 0
|
|
|
|
|
call move_alloc(resize_array, element_index)
|
|
|
|
|
end if
|
|
|
|
|
if (in_group(r_center)) then
|
|
|
|
|
group_ele_num = group_ele_num + 1
|
|
|
|
|
if(group_ele_num > size(element_index)) then
|
|
|
|
|
allocate(resize_array(size(element_index) + 1024))
|
|
|
|
|
resize_array(1:group_ele_num-1) = element_index
|
|
|
|
|
resize_array(group_ele_num:) = 0
|
|
|
|
|
call move_alloc(resize_array, element_index)
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
element_index(group_ele_num) = i
|
|
|
|
|
end if
|
|
|
|
|
end do
|
|
|
|
|
element_index(group_ele_num) = i
|
|
|
|
|
end if
|
|
|
|
|
end do
|
|
|
|
|
else if(group_nodes) then
|
|
|
|
|
eleloop:do i = 1, ele_num
|
|
|
|
|
r_center(:) = 0.0_dp
|
|
|
|
|
do inod = 1, ng_node(lat_ele(i))
|
|
|
|
|
do ibasis = 1, basisnum(lat_ele(i))
|
|
|
|
|
if (in_group(r_node(:,ibasis,inod,i))) then
|
|
|
|
|
group_ele_num = group_ele_num + 1
|
|
|
|
|
if(group_ele_num > size(element_index)) then
|
|
|
|
|
allocate(resize_array(size(element_index) + 1024))
|
|
|
|
|
resize_array(1:group_ele_num-1) = element_index
|
|
|
|
|
resize_array(group_ele_num:) = 0
|
|
|
|
|
call move_alloc(resize_array, element_index)
|
|
|
|
|
end if
|
|
|
|
|
element_index(group_ele_num) = i
|
|
|
|
|
cycle eleloop
|
|
|
|
|
end if
|
|
|
|
|
end do
|
|
|
|
|
end do
|
|
|
|
|
end do eleloop
|
|
|
|
|
end if
|
|
|
|
|
end select
|
|
|
|
|
|
|
|
|
|
!Check the type to see if we need to find the atoms within the group
|
|
|
|
|
!Check the type to see if we need to find the atoms within the group
|
|
|
|
|
select case(trim(adjustl(type)))
|
|
|
|
|
case('atoms','both')
|
|
|
|
|
do i = 1, atom_num
|
|
|
|
|