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
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)