Esempio n. 1
0
	def get_available_modules( self ):
		"""Get all available modules: modules that are found but not loaded"""
		modules = [ key for key in self.modules.keys() if key not in self.loaded_modules ]
		modules.sort()
		return modules
Esempio n. 2
0
def main_routine(wf_total,
                 wf_per_pl,
                 cells_per_pl,
                 cond_dir,
                 second_dir,
                 wannier_functions,
                 atom_number,
                 atomic_coordinates,
                 matrix,
                 angle,
                 delta):

  # first we separate the left-most principal layer, the conductor region
  # and the right-most principal layer
  PL1       = wannier_functions[:wf_per_pl]
  conductor = wannier_functions[wf_per_pl:-wf_per_pl]
  PL4       = wannier_functions[-wf_per_pl:]

  # now we compute the unit vector for the axis of rotation
  point_A = barycenter(PL1)
  point_B = barycenter(PL4)
  unit_vector = (1.0/numpy.linalg.norm(point_B-point_A))*(point_B-point_A)
  if cond_dir=='x':
    reference = numpy.array([1.0,0.0,0.0])
  elif cond_dir=='y':
    reference = numpy.array([0.0,1.0,0.0])
  else:
    reference = numpy.array([0.0,0.0,1.0])
  if numpy.dot(unit_vector,reference)<=0.95:
    print ""
    print " Warning in rotate_conductor :"
    print " The  computed  unit  vector for the axis of"
    print " rotation seems to be off from the reference"
    print " unit vector : %s" %(cond_dir)
    print " The dot product of unit vector with %s is : %3.2f" %(cond_dir,numpy.dot(unit_vector,reference))
    print ""
    user_answer = ""
    while user_answer not in ["yes", "no"]:
      user_answer = str(raw_input(" is this OK ? ('yes' or 'no') "))
    if user_answer=='no':
      print " Exiting the program..."
      print ""
      sys.exit(1)

  # we search the groups of WF with similar centres. To do this
  # a group is identified by the index of the first WF in the group
  # and the group size
  gp_dict = {}
  gp_bool = numpy.zeros(len(conductor),dtype='bool')
  for i in xrange(len(conductor)):
    if gp_bool[i]==False:
      gp_bool[i] = True
      gp_size    = 1
      # for each wf we search for similar centres just around that wf
      for j in xrange(max(i-10,0),min(i+11,len(conductor))):
        if gp_bool[j]==False:
          if same_center(conductor[i],conductor[j]):
            gp_bool[j] = True
            gp_size   += 1
      # if gp_size is at least 2 we add this group to the dictionnary
      if gp_size >= 2:
        gp_dict[conductor[i].index] = gp_size

  # now we need to remove the redondant WF from the conductor
  not_to_add = []
  for wf in conductor:
    if wf.index in gp_dict.keys():
      for j in xrange(1,gp_dict[wf.index]):
        not_to_add.append(wf.index+j)
  reduced_conductor = []
  for wf in conductor:
    if wf.index not in not_to_add:
      reduced_conductor.append(wf)

  # with the reduced_conductor list, we can rotate the centers
  reduced_rotated_conductor = rotate_wf(reduced_conductor,angle,unit_vector,point_A)

  # we then sort the rotated Wannier Functions
  sorted_reduced_conductor = sort(reduced_rotated_conductor,
                                  cond_dir,
                                  second_dir,
                                  delta)

  # we re-insert the WF with similar centers
  sorted_conductor = []
  for wf in sorted_reduced_conductor:
    if wf.index not in gp_dict.keys():
      sorted_conductor.append(wf)
    else:
      sorted_conductor.append(wf)
      for j in xrange(1,gp_dict[wf.index]):
        new_wf = wannier_function()
        pos_in_list = wf.index+j-conductor[0].index
        new_wf.setindex(conductor[pos_in_list].index)
        new_wf.setx(wf.x)
        new_wf.sety(wf.y)
        new_wf.setz(wf.z)
        new_wf.setonsite(conductor[pos_in_list].onsite)
        sorted_conductor.append(new_wf)

  # we now find the mapping between the original order of WF
  # and the final order after sorting
  final_order = []
  reference   = conductor[0].index
  for wf in sorted_conductor:
    final_order.append(wf.index-reference)

  # now we can reconstruct the matrix
  final_matrix = numpy.zeros((matrix.shape[0],matrix.shape[1]),dtype='float')
  for i in xrange(matrix.shape[0]):
    for j in xrange(matrix.shape[1]):
      final_matrix[i,j] = matrix[final_order[i],final_order[j]]
  write_htC('rotated_matrix_htC.dat',final_matrix)

  # at last we re-generate the *_tran_info.dat file
  final_wf_list = PL1 + sorted_conductor + PL4
  final_atomic_coordinates = rotate_atoms(atomic_coordinates,angle,unit_vector,point_A)
  write_tran_info(wf_total,
                  wf_per_pl,
                  cells_per_pl,
                  cond_dir,
                  second_dir,
                  final_wf_list,
                  atom_number,
                  final_atomic_coordinates)

  return