예제 #1
0
def simulatie(n=5, m=10):  # deze functie diende oorspronkelijk enkel als test
    """
	Deze functie doet een simulatie van een gegeven hoeveelheid conformaties van het gegeven aantal atomen.
	
	:param int n: Het aantal atomen dat gebruikt wordt. (default 5)
	:param int m: Het aantal conformaties dat gesimuleerd moet worden. (default 10)
	"""
    coordinatenLaagsteE = 0
    nummerRunLaagsteE = 0
    LaagsteE = math.inf
    totalePot = 0
    gemiddelde = 0
    potentialenlijst = list()
    for i in range(m):  #LJ pot berekenen voor elke configuratie en evalueren
        #print("Bezig met het simuleren van run", i+1, "van", m)
        run = atomen.Atomen(n)
        pot = f901.ljpotalleatomen(run.getCoordinaten(), n)
        totalePot = totalePot + pot
        gemiddelde = totalePot / (i + 1)
        potentialenlijst.append(pot)
        if pot < LaagsteE:
            coordinatenLaagsteE = run.getCoordinaten()
            nummerRunLaagsteE = i
            LaagsteE = pot
    print(" ")
    print("----------RESULTATEN----------")
    print("Run", nummerRunLaagsteE + 1, "van", m,
          "had de laagste totale Lennard Jones Potentiaal, namelijk:",
          LaagsteE)
    #print("De Coordinaten van de atomen van deze run zijn:", coordinatenLaagsteE)
    print("De gemiddelde potentiaal:", gemiddelde)
    print("De standaardafwijking is:", stdev(potentialenlijst))
def simulatie(n=20, m=10):
    """
	Deze functie doet een simulatie van een gegeven hoeveelheid conformaties van het gegeven aantal atomen.
	
	:param int n: Het aantal atomen dat gebruikt wordt.
	:param int m: Het aantal conformaties dat gesimuleerd moet worden.
	"""
    with Stopwatch(message="v0: Python"):
        coordinatenLaagsteE = 0
        nummerRunLaagsteE = 0
        LaagsteE = math.inf
        totalePot = 0
        gemiddelde = 0
        potentialenlijst = list()
        for i in range(m):
            #print("Bezig met het simuleren van run", i+1, "van", m)
            run = atomen.Atomen(n)
            pot = run.berekenLJPot()
            totalePot = totalePot + pot
            gemiddelde = totalePot / (i + 1)
            potentialenlijst.append(pot)
            if pot < LaagsteE:
                coordinatenLaagsteE = run.getCoordinaten()
                nummerRunLaagsteE = i
                LaagsteE = pot
    print(" ")
    print("----------RESULTATEN----------")
    print("Run", nummerRunLaagsteE + 1, "van", m,
          "had de laagste totale Lennard Jones Potentiaal, namelijk:",
          LaagsteE)
    #print("De Coordinaten van de atomen van deze run zijn:", coordinatenLaagsteE)
    print("De gemiddelde potentiaal:", gemiddelde)
    print("De standaardafwijking is:", stdev(potentialenlijst))
    """montecarlo_v1.simulatie(n, m)
def test_afstand():
    test = atomen.Atomen(5)
    atoom1 = test.getCoordinate(1)
    atoom2 = test.getCoordinate(2)
    expected = math.sqrt(
        math.pow((atoom1[0] - atoom2[0]), 2) +
        math.pow((atoom1[1] - atoom2[1]), 2) +
        math.pow((atoom1[2] - atoom2[2]), 2))
    afstand = test.afstandTweeAtomen(1, 2)
    assert afstand == expected
def test_bereken_LJ_Pot():
    test = atomen.Atomen(4)
    atoom1 = test.getCoordinate(0)
    atoom2 = test.getCoordinate(1)
    atoom3 = test.getCoordinate(2)
    atoom4 = test.getCoordinate(3)
    r12 = test.afstandTweeAtomen(0, 1)
    r13 = test.afstandTweeAtomen(0, 2)
    r14 = test.afstandTweeAtomen(0, 3)
    r23 = test.afstandTweeAtomen(1, 2)
    r24 = test.afstandTweeAtomen(1, 3)
    r34 = test.afstandTweeAtomen(2, 3)
    pot12 = 1 / math.pow(r12, 12) - 1 / math.pow(r12, 6)
    pot13 = 1 / math.pow(r13, 12) - 1 / math.pow(r13, 6)
    pot14 = 1 / math.pow(r14, 12) - 1 / math.pow(r14, 6)
    pot23 = 1 / math.pow(r23, 12) - 1 / math.pow(r23, 6)
    pot24 = 1 / math.pow(r24, 12) - 1 / math.pow(r24, 6)
    pot34 = 1 / math.pow(r34, 12) - 1 / math.pow(r34, 6)
    expected = round(pot12 + pot13 + pot14 + pot23 + pot24 + pot34, 5)
    pot = round(test.berekenLJPot(), 5)
    assert pot == expected
예제 #5
0
def simulatie(n=20, m=10):
    """
	Deze functie doet een simulatie van een gegeven hoeveelheid conformaties van het gegeven aantal atomen.
	
	:param int n: Het aantal atomen dat gebruikt wordt.
	:param int m: Het aantal conformaties dat gesimuleerd moet worden.
	"""
    with Stopwatch(message="v1: Python en Fortran"):
        coordinatenLaagsteE = 0
        nummerRunLaagsteE = 0
        LaagsteE = math.inf
        totalePot = 0
        gemiddelde = 0
        potentialenlijst = list()
        for i in range(m):
            #print("Bezig met het simuleren van run", i+1, "van", m)
            run = atomen.Atomen(n)
            pot = f901.ljpotalleatomen(run.getCoordinaten(), n)
            if pot >= 1.7976931348623157e+300:
                #als afstand = 0, geeft Fortran een heel hoog getal terug. Dit wordt beschouwd als oneindig.
                pot = math.inf
            totalePot = totalePot + pot
            gemiddelde = totalePot / (i + 1)
            potentialenlijst.append(pot)
            if pot < LaagsteE:
                coordinatenLaagsteE = run.getCoordinaten()
                nummerRunLaagsteE = i
                LaagsteE = pot
    print(" ")
    print("----------RESULTATEN----------")
    print("Run", nummerRunLaagsteE + 1, "van", m,
          "had de laagste totale Lennard Jones Potentiaal, namelijk:",
          LaagsteE)
    #print("De Coordinaten van de atomen van deze run zijn:", coordinatenLaagsteE)
    print("De gemiddelde potentiaal:", gemiddelde)
    print("De standaardafwijking is:", stdev(potentialenlijst))
def test_afstand_zelfde_atoom():
    test = atomen.Atomen(2)
    atoom = test.getCoordinate(1)
    expected = 0
    afstand = test.afstandTweeAtomen(0, 0)
    assert afstand == expected
def simulatie(n=20, m=10):
	"""
	Deze functie doet een simulatie van een gegeven hoeveelheid conformaties van het gegeven aantal atomen. Dit is ook de eerste versie die parallel kan lopen over meerdere cores.
	
	:param int n: Het aantal atomen dat gebruikt wordt.
	:param int m: Het aantal conformaties dat gesimuleerd moet worden.
	"""
	stopwatch = Stopwatch()
	stopwatch.start()
		
	comm = MPI.COMM_WORLD
	size = comm.Get_size()	#aantal cores
	rank = comm.Get_rank()	#huidige core
	
	perrank = m // size	#het aanstal stappen per core (moet geheel getal zijn)
	comm.Barrier()
	
	coordinatenLaagsteE = 0
	nummerRunLaagsteE = 0
	laagsteE = float("inf")
	totalePot = 0
	gemiddelde = 0
	potentialenlijst = list()
	potkwadraat = 0 #nodig voor berekening stdev
	
	for i in range(1+rank*perrank, 1+(rank+1)*perrank):	#de lus itereren
		run = atomen.Atomen(n)	#nieuwe lijst atomen genereren
		pot = f901.ljpotalleatomen(run.getCoordinaten(), n)	#berekeningen uitvoeren
		
		totalePot = totalePot + pot
		potentialenlijst.append(pot)
		potkwadraat = potkwadraat + pot * pot
		if pot < laagsteE:
			coordinatenLaagsteE = run.getCoordinaten()
			nummerRunLaagsteE = i
			laagsteE = pot
			
	comm.Barrier()
	
	#vanaf nu zoeken naar de optimale configuratie:
	optimaleCoordinaten = comm.gather(coordinatenLaagsteE, root = 0)
	laagsteE = comm.gather(laagsteE, root = 0)
	totalePot = comm.gather(totalePot, root = 0)
	potentialen = comm.gather(potentialenlijst, root = 0)
	potkwadraat = comm.gather(potkwadraat, root = 0)
	stopwatch.stop()
	
	if rank == 0:
		#dictionary = {laagsteE[i]: optimaleCoordinaten[i] for i in range(len(laagsteE))}
		#laagsteEnergie = str(min(dictionary))
		#laagsteEnergie = str(dictionary)
		#optimaleCoordinaten = dictionary[laagsteEnergie]
		laagsteEnergie = min(laagsteE)
		
		print(" ")
		print("----------RESULTATEN----------")
		print("v3: parallellisatie:", stopwatch)
		#print(laagsteE)
		#print(potentialen)
		print("De laagste energie bedraagt:", laagsteEnergie)
		gemiddelde = sum(totalePot) / (size * (m // size))
		print("De gemiddelde energie bedraagt:", gemiddelde)
		standaardafwijking = np.sqrt(sum(potkwadraat) / (size * (m // size) - 1) - (gemiddelde * gemiddelde))
		print("De standaardafwijking bedraagt:", standaardafwijking)
		print(size)