def calibrateCluster(self, pl): partServ = ParticleService() x_list = numpy.array([cluster.getX() for cluster in pl.GET()]) y_list = numpy.array([cluster.getY() for cluster in pl.GET()]) r_list = numpy.array([cluster.getR() for cluster in pl.GET()]) for cluster in pl.GET(): x_square = (cluster.getX() - x_list)**2 y_square = (cluster.getY() - y_list)**2 distance_list = numpy.sqrt(x_square + y_square) r_ol = (numpy.array(pl.GET()))[(distance_list <= cluster.getR() + r_list)] r_ol_clear = [elm for elm in r_ol if (elm not in cluster.getContacts()) and (elm != cluster)] for interCluster in r_ol_clear: if interCluster.getN() > cluster.getN(): continue else: partServ.clusterSurfaceTouching(cluster, interCluster) for adCluster in cluster.getContacts(): if adCluster.getN() > cluster.getN(): continue else: partServ.clusterSurfaceTouching(cluster, adCluster)
def getMeanValues(self, clusterList): partServ = ParticleService() intServ = InteractionService() r = 0 d = 0 r_list = [] d_list = [] cluster_plist = [] for cluster in clusterList.GET(): # Radius r += cluster.getR() # Distance d_part = 0 if len(cluster.getContacts()) != 0: for adCluster in cluster.getContacts(): if d_part > partServ.getParticleDistance(cluster, adCluster): d_part = partServ.getParticleDistance(cluster, adCluster) else: d_part = intServ.findClosestCluster(cluster, clusterList) d += d_part # Radius List r_list.append(cluster.getR()) # Distance List d_list.append(d_part) # Cluster Parameter List cluster_plist.append(self.getClusterParameter(cluster)) return r/clusterList.clusterNumber() , d/clusterList.clusterNumber() , r_list , d_list, cluster_plist
def adatomOnCluster(self, initval, adatomList, adatomWWList, clusterList, coalescenceList, smeasure): pServ = ParticleService() x_list = numpy.array([cluster.getX() for cluster in clusterList.GET()]) y_list = numpy.array([cluster.getY() for cluster in clusterList.GET()]) r_list = numpy.array([cluster.getR() for cluster in clusterList.GET()]) for adatom in adatomList.GET(): x_square = (adatom.getX() - x_list)**2 y_square = (adatom.getY() - y_list)**2 distance_list = numpy.array(numpy.sqrt(x_square + y_square)) cluster = (numpy.array(clusterList.GET()))[distance_list <= (adatom.getR() + r_list)] if len(cluster)!=0: pServ.addAdatomtoCluster(initval, adatom, cluster, adatomList, clusterList) smeasure.adatomEvent('clusterdeposition_sputter', 1) else: pServ.AdatomOnSurface(adatom, adatomList, adatomWWList, clusterList, coalescenceList) smeasure.adatomEvent('deposition_sputter', 1)
def diffusionOverlap(self, initval, pl, clusterList, coalescenceList): pServ = ParticleService() x_list = numpy.array([cluster.getX() for cluster in clusterList.GET()]) y_list = numpy.array([cluster.getY() for cluster in clusterList.GET()]) r_list = numpy.array([cluster.getR() for cluster in clusterList.GET()]) rev_list = numpy.array([cluster.getREv() for cluster in clusterList.GET()]) for cluster in pl.GET(): x_square = (cluster.getX() - x_list)**2 y_square = (cluster.getY() - y_list)**2 distance_list = numpy.sqrt(x_square + y_square) r_ol = (numpy.array(clusterList.GET()))[(distance_list <= cluster.getR() + r_list)] rev_ol = (numpy.array(clusterList.GET()))[(distance_list <= cluster.getREv() + rev_list)] r_ol_clear = [cluster for cluster in r_ol if cluster not in pl.GET()] if len(r_ol_clear) != 0 and coalescenceList.findCluster(r_ol_clear[0])!=None: fuse=False for cluster2 in r_ol_clear: if pServ.addContact(cluster, cluster2): pServ.fuseParticleLists(coalescenceList.findCluster(cluster2), pl) fuse=True break rev_ol_clear = [cluster for cluster in rev_ol if (cluster not in pl.GET() and cluster not in r_ol_clear)] if len(rev_ol_clear) != 0 and coalescenceList.findCluster(r_ol_clear[0])!=None and fuse==False: for cluster2 in rev_ol_clear: distance = self.getParticleDistance(cluster.getX(), cluster.getY(), cluster2.getX(), cluster2.getY()) if self.checkGreatProhability(cluster.getREv(), cluster2.getREv(), cluster.getR(), cluster2.getR(), distance) >= 1: if pServ.addContact(cluster, cluster2): pServ.fuseParticleLists(coalescenceList.findCluster(cluster2),pl) else: WQS = self.getCollisionProhability(cluster2.getREv(), cluster.getREv(), cluster2.getR(), cluster.getR(), distance) rndm = random.random if rndm < WQS: if pServ.addContact(cluster, cluster2): pServ.fuseParticleLists(coalescenceList.findCluster(cluster2),pl)
def adatomWW(self, initval, adatomWWList, clusterList, coalescenceList, smeasure): pServ = ParticleService() x_list = numpy.array([cluster.getX() for cluster in clusterList.GET()]) y_list = numpy.array([cluster.getY() for cluster in clusterList.GET()]) r_list = numpy.array([cluster.getR() for cluster in clusterList.GET()]) rev_list = numpy.array([cluster.getREv() for cluster in clusterList.GET()]) for adatom in adatomWWList.GET(): x_square = (adatom.getX() - x_list)**2 y_square = (adatom.getY() - y_list)**2 distance_list = numpy.array(numpy.sqrt(x_square + y_square)) r_ol = (numpy.array(clusterList.GET()))[(distance_list <= adatom.getR() + r_list)] rev_ol = (numpy.array(clusterList.GET()))[(distance_list <= adatom.getREv() + rev_list)] ''' *** R Overlap *** ''' r_ol=numpy.delete(r_ol, numpy.where(r_ol==adatom)[0][0]) if len(r_ol) != 0: pServ.adatomClusterWW(initval, adatom, r_ol[0], adatomWWList, clusterList, coalescenceList) if r_ol[0].getN() == 1: smeasure.adatomEvent('nucleation',1) else: smeasure.adatomEvent('aggregation',1) continue ''' *** Rev Overlap for great WQS *** ''' rev_ol=numpy.delete(rev_ol, numpy.where(rev_ol==adatom)[0][0]) interaction = False if len(rev_ol) != 0: for cluster in rev_ol: distance = self.getParticleDistance(adatom.getX(), adatom.getY(), cluster.getX(), cluster.getY()) if self.checkGreatProhability(adatom.getREv(), cluster.getREv(), adatom.getR(), cluster.getR(), distance) >= 1: pServ.adatomClusterWW(initval, adatom, cluster, adatomWWList, clusterList, coalescenceList) if cluster.getN() == 1: smeasure.adatomEvent('nucleation',1) else: smeasure.adatomEvent('aggregation',1) interaction = True break ''' *** Rev Overlap for small WQS *** ''' if interaction == False: for cluster in rev_ol: distance = self.getParticleDistance(adatom.getX(), adatom.getY(), cluster.getX(), cluster.getY()) WQS = self.getCollisionProhability(adatom.getREv(), cluster.getREv(), adatom.getR(), cluster.getR(), distance) if random() < WQS: pServ.adatomClusterWW(initval, adatom, cluster, adatomWWList, clusterList, coalescenceList) if cluster.getN() == 1: smeasure.adatomEvent('nucleation',2) else: smeasure.adatomEvent('aggregation',1) interaction = True break