Added right hand rule check to orientation in mode_create

master
Alex Selimov 5 years ago
parent 9702ec85e9
commit 1b82d98a4f

@ -169,6 +169,7 @@ module mode_create
integer :: ori_pos, i, j, arglen, stat integer :: ori_pos, i, j, arglen, stat
character(len=100) :: textholder character(len=100) :: textholder
character(len=8) :: orient_string character(len=8) :: orient_string
logical :: isortho, isrighthanded
!Pull out all required positional arguments !Pull out all required positional arguments
@ -224,8 +225,6 @@ module mode_create
! end do ! end do
end do end do
!If the duplicate command is passed then we extract the information on the new bounds. !If the duplicate command is passed then we extract the information on the new bounds.
case('duplicate') case('duplicate')
if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create" if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create"
@ -286,6 +285,13 @@ module mode_create
end select end select
!Now normalize the orientation matrix !Now normalize the orientation matrix
orient = matrix_normal(orient,3) orient = matrix_normal(orient,3)
!Now check these to make sure they are right handed and orthogonal
call check_right_ortho(orient, isortho, isrighthanded)
if (.not.isortho) then
stop "Directions in orient are not orthogonal"
else if (.not.isrighthanded) then
stop "Directions in orient are not righthanded"
end if
!Set lattice_num to 1 and add the lattice_parameter to the elements module lattice paramter variable !Set lattice_num to 1 and add the lattice_parameter to the elements module lattice paramter variable
lattice_types = 1 lattice_types = 1

@ -21,8 +21,6 @@ module opt_delete
call parse_delete(arg_pos) call parse_delete(arg_pos)
print *, atom_num
if (rc_off > 0.0_dp) call delete_overlap if (rc_off > 0.0_dp) call delete_overlap
end subroutine run_delete end subroutine run_delete
@ -66,10 +64,6 @@ module opt_delete
allocate(which_cell(3,atom_num)) allocate(which_cell(3,atom_num))
print *, atom_num
print *, for_delete(atom_num)
print *, which_cell(1,1)
!First pass the atom list and atom num to the algorithm which builds the cell list !First pass the atom list and atom num to the algorithm which builds the cell list
call build_cell_list(atom_num, r_atom, rc_off, cell_num, num_in_cell, cell_list, which_cell) call build_cell_list(atom_num, r_atom, rc_off, cell_num, num_in_cell, cell_list, which_cell)

@ -358,4 +358,48 @@ module subroutines
return return
end subroutine build_cell_list end subroutine build_cell_list
subroutine check_right_ortho(ori, isortho, isrighthanded)
!This subroutine checks whether provided orientations in the form:
! | x1 x2 x3 |
! | y1 y2 y3 |
! | z1 z2 z3 |
!are right handed
real(kind=dp), dimension(3,3), intent(in) :: ori
logical, intent(out) :: isortho, isrighthanded
integer :: i, j
real(kind=dp) :: v(3), v_k(3)
!Initialize variables
isortho = .true.
isrighthanded=.true.
do i = 1, 3
do j = i+1, 3
if(abs(dot_product(ori(i,:), ori(j,:))) > lim_zero) then
isortho = .false.
end if
!Check if they are righthanded
if (j == i+1) then
v(:) = cross_product(ori(i,:), ori(j,:))
v_k(:) = v(:) - ori(mod(j, 3)+1,:)
else if ((i==1).and.(j==3)) then
v(:) = cross_product(ori(j,:),ori(i,:))
v_k(:) = v(:) - ori(i+1, :)
end if
if(norm2(v_k) > 10.0_dp**(-8.0_dp)) then
isrighthanded=.false.
end if
end do
end do
return
end subroutine check_right_ortho
end module subroutines end module subroutines
Loading…
Cancel
Save