From acd902db4ba0c72fe3c5ab99132ba95bcbd381fa Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Tue, 21 Apr 2020 13:25:33 -0400 Subject: [PATCH] working changes to bcc files --- src/elements.f90 | 27 ++++++++++++++++++++++++--- src/mode_create.f90 | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/src/elements.f90 b/src/elements.f90 index e9fc928..5240640 100644 --- a/src/elements.f90 +++ b/src/elements.f90 @@ -27,7 +27,7 @@ module elements integer :: atom_types = 0 !Variables for creating elements based on primitive cells - real(kind=dp) :: cubic_cell(3,8), fcc_cell(3,8), fcc_mat(3,3), fcc_inv(3,3) + real(kind=dp) :: cubic_cell(3,8), fcc_cell(3,8), fcc_mat(3,3), fcc_inv(3,3), bcc_cell(3,8), bcc_mat(3,3), bcc_inv(3,3) integer :: cubic_faces(4,6) !Below are lattice type arrays which provide information on the general form of the elements. @@ -86,7 +86,26 @@ module elements 0.0_dp, 0.5_dp, 0.5_dp, & 0.5_dp, 0.0_dp, 0.5_dp /), & shape(fcc_mat)) + + !Initialize the bcc primitive cell + bcc_cell = reshape((/ 0.0_dp, 0.0_dp, 0.0_dp, & + 0.5_dp, -0.5_dp, 0.5_dp, & + 1.0_dp, 0.0_dp, 1.0_dp, & + 0.5_dp, 0.5_dp, 0.5_dp, & + 0.5_dp, 0.5_dp, -0.5_dp, & + 0.0_dp, 0.0_dp, 1.0_dp, & + 0.5_dp, 0.5_dp, 1.5_dp /), & + shape(bcc_cell)) + + bcc_mat = reshape((/ 0.5_dp, 0.5_dp, -0.5_dp, & + -0.5_dp, 0.5_dp, 0.5_dp, & + 0.5_dp, 0.5_dp, 0.5_dp /), & + shape(bcc_mat)) + + + call matrix_inverse(fcc_mat,3,fcc_inv) + call matrix_inverse(bcc_mat,3,bcc_inv) max_basisnum = 0 basisnum(:) = 0 @@ -300,6 +319,8 @@ module elements select case(trim(adjustl(element_types(i)))) case('fcc') ng_node(i) = 8 + case('bcc') + ng_node(i) = 8 end select if(ng_node(i) > max_ng_node) max_ng_node = ng_node(i) @@ -345,7 +366,7 @@ module elements end select select case(trim(adjustl(type))) - case('fcc') + case('fcc','bcc') allocate(a_shape(8)) !Now loop over all the possible sites do it = 1, esize @@ -632,4 +653,4 @@ module elements end select end subroutine -end module elements \ No newline at end of file +end module elements diff --git a/src/mode_create.f90 b/src/mode_create.f90 index ffdfc05..545cea4 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -63,10 +63,17 @@ module mode_create do i = 1, 8 box_vert(:,i) = duplicate(:)*esize*lattice_space(:)*cubic_cell(:,i) + (origin(:)/lattice_parameter) end do - !Now get the rotated box vertex positions in lattice space. Should be integer units - box_lat_vert = int(matmul(fcc_inv, matmul(orient_inv, box_vert)))+1 + !Now get the rotated box vertex positions in lattice space. Should be integer units and get the new maxlen + select case(trim(adjustl(element_type))) + case('fcc') + box_lat_vert = int(matmul(fcc_inv, matmul(orient_inv, box_vert)))+1 + maxbd = maxval(matmul(orient,matmul(fcc_mat,box_lat_vert)),2) + case('bcc') + box_lat_vert = int(matmul(bcc_inv, matmul(orient_inv, box_vert)))+1 + maxbd = maxval(matmul(orient,matmul(bcc_mat,box_lat_vert)),2) + end select + !Find the new maxlen - maxbd = maxval(matmul(orient,matmul(fcc_mat,box_lat_vert)),2) do i = 1, 3 box_bd(2*i) = maxval(box_vert(i,:)) - 0.25_dp*lattice_space(i) box_bd(2*i-1) = origin(i)-0.25_dp*lattice_space(i) @@ -83,7 +90,12 @@ module mode_create box_vert(:,i) = (cubic_cell(:,i)*box_len(:) + origin(:))/lattice_parameter end do !Now get the rotated box vertex positions in lattice space. Should be integer units - box_lat_vert = int(matmul(fcc_inv, matmul(orient_inv, box_vert)))+1 + select case(trim(adjustl(element_type))) + case('fcc') + box_lat_vert = int(matmul(fcc_inv, matmul(orient_inv, box_vert)))+1 + case('bcc') + box_lat_vert = int(matmul(bcc_inv, matmul(orient_inv, box_vert)))+1 + end select !Now get the box_bd in lattice units do i = 1, 3 @@ -117,8 +129,9 @@ module mode_create !Call the build function with the correct transformation matrix select case(trim(adjustl(element_type))) case('fcc') - call build_with_rhomb(box_lat_vert, fcc_mat) + case('bcc') + call build_with_rhomb(box_lat_vert, bcc_mat) case default print *, "Element type ", trim(adjustl(element_type)), " not accepted in mode create, please specify a supported ", & "element type" @@ -270,13 +283,20 @@ module mode_create lattice_space(i) = 0.5_dp * lattice_space(i) !Check if one direction is 112 - else if ((is_equal(abs(orient(i,1)), abs(orient(i,2))).and.(is_equal(abs(orient(i,3)),2.0_dp*abs(orient(i,1))))).or.& - (is_equal(abs(orient(i,2)), abs(orient(i,3))).and.(is_equal(abs(orient(i,1)),2.0_dp*abs(orient(i,2))))).or.& - (is_equal(abs(orient(i,3)), abs(orient(i,1))).and.(is_equal(abs(orient(i,2)),2.0_dp*abs(orient(i,3))))))& - then + else if((is_equal(abs(orient(i,1)), abs(orient(i,2))).and.(is_equal(abs(orient(i,3)),2.0_dp*abs(orient(i,1))))).or.& + (is_equal(abs(orient(i,2)), abs(orient(i,3))).and.(is_equal(abs(orient(i,1)),2.0_dp*abs(orient(i,2))))).or.& + (is_equal(abs(orient(i,3)), abs(orient(i,1))).and.(is_equal(abs(orient(i,2)),2.0_dp*abs(orient(i,3))))))& + then lattice_space(i) = 0.5_dp * lattice_space(i) + end if + end do + case('bcc') + do i = 1, 3 + !Check if the direction is 111 + if((is_equal(abs(orient(i,1)),abs(orient(i,2)))).and.(is_equal(abs(orient(i,2)),abs(orient(i,3))))) then + lattice_space(i) = 0.5_dp * lattice_space(i) end if end do end select @@ -518,4 +538,4 @@ module mode_create end subroutine error_message -end module mode_create \ No newline at end of file +end module mode_create