Added right hand rule check to orientation in mode_create
This commit is contained in:
parent
9702ec85e9
commit
1b82d98a4f
@ -169,6 +169,7 @@ module mode_create
|
||||
integer :: ori_pos, i, j, arglen, stat
|
||||
character(len=100) :: textholder
|
||||
character(len=8) :: orient_string
|
||||
logical :: isortho, isrighthanded
|
||||
|
||||
|
||||
!Pull out all required positional arguments
|
||||
@ -224,8 +225,6 @@ module mode_create
|
||||
! end do
|
||||
end do
|
||||
|
||||
|
||||
|
||||
!If the duplicate command is passed then we extract the information on the new bounds.
|
||||
case('duplicate')
|
||||
if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create"
|
||||
@ -286,6 +285,13 @@ module mode_create
|
||||
end select
|
||||
!Now normalize the orientation matrix
|
||||
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
|
||||
lattice_types = 1
|
||||
|
@ -21,8 +21,6 @@ module opt_delete
|
||||
|
||||
call parse_delete(arg_pos)
|
||||
|
||||
print *, atom_num
|
||||
|
||||
if (rc_off > 0.0_dp) call delete_overlap
|
||||
end subroutine run_delete
|
||||
|
||||
@ -66,10 +64,6 @@ module opt_delete
|
||||
|
||||
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
|
||||
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
|
||||
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
|
Loading…
x
Reference in New Issue
Block a user