Newer
Older
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# B.CTCT: Time-Dependent Density Functional Theory\n",
"\n",
"Die überwiegende Mehrheit quantenchemischer Methoden beschäftigt sich mit dem elektronischen Grundzustand. Angeregte Zustände sind aber für die Berechnung von elektronischen Spektren und die Interpretation photochemischer Prozesse außerordentlich wichtig. Eine verbreitete und relativ verlässliche Methode für die Vorhersage von elektronischen Übergängen ist TDDFT. Mittels TDDFT können die Energien und Intensitäten elektronische Übergänge berechnet werden, die Rechnungen basieren dabei auf der Elektronendichte des Grundzustands. Es werden also nicht wirklich angeregten Zustände berechnet.\n",
"\n",
"Wie häufig bei der Verwendung von Dichtefunktionaltheorie ist die quantitative Vorhersage elektronischer Übergänge schwierig. Es ist üblich, dass die Übergangsenergien verschoben sind; diese Verschiebung ist aber innerhalb einer Rechnung in der Regel systematisch. Ebenfalls können wie üblich Trends untersucht werden, d.h. ähnliche Systeme liefern ähnlich gute Ergebnisse.\n",
"\n",
"Wir werden uns mit einer einfachen Reihe beschäftigen: lineare Polyene mit n Doppelbindungen, mit n von 2 bis 5. In der Übung beigefügt sind optimierte Strukturen der Verbindungen, sodass Sie direkt die TDDFT-Rechnungen ausführen können."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import plotly.graph_objects as go\n",
"import subprocess as sub\n",
"import support"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"xyz = support.XYZ.from_xyz_file(\"polyene-3-opt.xyz\")\n",
"xyz.get_molecular_viewer().show()"
"metadata": {},
"source": [
"Die einzelnen Rechnungen per Hand vorzubereiten und auszuführen wäre eine unnötig aufwändige und fehleranfällige Aufgabe, verwenden Sie deshalb die Schleife in der nächsten Zelle, um die _input files_ zu schreiben.\n",
"\n",
"📝 Führen Sie die nächste Zelle aus und prüfen Sie in ihrem Ordner, ob die _input files_ korrekt erstellt wurden. Führen Sie dann die übernächste Zelle aus, um die Rechnungen zu starten."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ns = [2,3,4,5]\n",
"for n in ns:\n",
" with open(f\"polyene-{n}-tddft.inp\", \"w\") as f:\n",
" f.write(f\"\"\"\n",
"! UKS BP def2-SVP\n",
"%tddft nroots 25 end\n",
"\n",
"* xyzfile 0 1 polyene-{n}-opt.xyz \n",
"\"\"\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for n in ns:\n",
" print(f\"Running polyene-{n}-tddft.inp\")\n",
" sub.run(f\"orca polyene-{n}-tddft.inp > polyene-{n}-tddft.out\", shell=True)"
"metadata": {},
"source": [
"📝 Öffnen Sie eines der _output files_. Gegen Ende der Datei finden Sie die berechneten elektronischen Übergänge mit ihrer Intensität (_fosc_, Oszillatorstärke):\n",
"<pre style=\"color:#0F0F0F; background-color:#F0F0F0; padding: 1em;\">\n",
"-----------------------------------------------------------------------------\n",
" ABSORPTION SPECTRUM VIA TRANSITION ELECTRIC DIPOLE MOMENTS\n",
"-----------------------------------------------------------------------------\n",
"State Energy Wavelength fosc T2 TX TY TZ \n",
" (cm-1) (nm) (au**2) (au) (au) (au) \n",
"-----------------------------------------------------------------------------\n",
" 1 32438.4 308.3 0.000000000 0.00000 0.00000 0.00000 0.00000\n",
" 2 36047.7 277.4 0.000000000 0.00000 0.00000 0.00000 0.00000\n",
" 3 36550.0 273.6 0.000000000 0.00000 0.00000 -0.00000 0.00000\n",
"</pre>\n",
"Ein Stück darüber sind die Orbitale gezeigt, zwischen denen die jeweiligen Übergänge stattfinden:\n",
"<pre style=\"color:#0F0F0F; background-color:#F0F0F0; padding: 1em;\">\n",
"STATE 1: E= 0.147800 au 4.022 eV 32438.4 cm**-1 <S**2> = 2.000000\n",
" 23a -> 25a : 0.176683 (c= 0.42033655)\n",
" 24a -> 26a : 0.316259 (c= 0.56236953)\n",
" 23b -> 25b : 0.176683 (c= -0.42033655)\n",
" 24b -> 26b : 0.316259 (c= -0.56236953)\n",
"</pre>\n",
"Welche Übergänge sind die intensivsten? Welche Orbitale sind beteiligt?"
"metadata": {},
"source": [
"📝 Plotten Sie das Linienspektrum mithilfe der nächsten Zelle. Sie müssen nichts ändern, die Daten werden direkt aus den _output files_ entnommen. Entspricht der gefundene Trend ihren Erwartungen?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fig = go.Figure(layout=go.Layout(\n",
" title=\"TDDFT Spectra\",\n",
" xaxis_title=\"Wavelength / nm\",\n",
" yaxis_title=\"Oscillator Strength\"))\n",
"\n",
"for n in ns:\n",
" spectrum = support.Spectrum.from_tddft_output(f\"polyene-{n}-tddft.out\")\n",
" wavelengths, intensities = spectrum.get_line_spectrum(\"nm\")\n",
" # Fügt die Nummern hinzu\n",
" fig.add_trace(go.Scatter(\n",
" x=spectrum.get_energies_as(\"nm\"),\n",
" y=spectrum.intensities,\n",
" text=spectrum.indices,\n",
" mode='text',\n",
" name=f\"{n}-Polyen\"\n",
" ))\n",
" # Fügt die Linien hinzu\n",
" fig.add_trace(go.Scatter(\n",
" x=wavelengths,\n",
" y=intensities,\n",
" mode='lines',\n",
" name=f\"{n}-Polyen\"\n",
" ))\n",
"\n",
"fig.show()"
]
},
{
"metadata": {},
"source": [
"Für die Deutung photochemischer Prozesse ist es sehr wichtig, herauszufinden, zwischen welchen Orbitalen elektronische Übergänge stattfinden. Da von niemandem erwartet werden kann, Orbitalkoeffizienten mental in eine elektronendichte zu übersetzen, werden Orbitale dreidimensional dargestellt.\n",
"📝 Sehen Sie sich für ein beliebiges Molekül aus der Reihe den intensivsten Übergang im _output file_ an. Welche Orbitale sind beteiligt? Geben Sie die gefundenen Orbitalnummern in die Liste `mos` in der nächsten Zelle ein und starten Sie sie.\n",
"\n",
"Hinweis: der Wert unter `threshold` gibt an, bei welchem Funktionswert die Orbitaloberfläche abgeschnitten wird. Je nach Orbital müssen Sie diesen Wert etwas anpassen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mos = [20, 21]\n",
"threshold = 5*10**-2\n",
"for mo in mos:\n",
" xyz = support.XYZ.from_xyz_file(\"polyene-4-opt.xyz\")\n",
" xyz.make_mesh_from_gbw(\"polyene-4-tddft.gbw\", mo, mode=\"mo\", threshold=threshold, verbose=False, dynamic_threshold=True)\n",
" xyz.make_mesh_from_gbw(\"polyene-4-tddft.gbw\", mo, mode=\"mo\", threshold=-threshold, verbose=False, dynamic_threshold=True)\n",
" xyz.viewer.update_layout(title_text=f\"Rendered molecular orbital {mo}\")\n",
" xyz.viewer.show()"
"metadata": {},
"source": [
"Eine kompakte Art, die unterschiedliche Dichte in Grund- und angeregtem Zustand darzustellen ist über die Differenzdichte. Hier werden die Elektronendichten von Grnd- und angeregtem Zustand voneinander abgezogen, sodass in einer dreidimensionalen Darstellung sichtbar ist, \"von wo nach wo\" der elektronische Übergang erfolgt. Üblicherweise wird der negative Teil (also der Elektronendichteverlust) rot dargestellt, und der positive blau.\n",
"\n",
"📝 Suchen Sie sich im Spektrum der Reihe einen Übergang aus und benutzen Sie die nächste Zelle, um die dazugehörige Differenzdichte als 3D-Darstellung zu erhalten. Geben Sie die Übergänge, die Sie visualisieren wollen, in der Variable `transitions` ein.\n",
"\n",
"Das Erstellen einer Differenzdichte kann etwas Zeit in Anspruch nehmen."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"transitions = [23]\n",
"threshold = 5*10**-4\n",
"for transition in transitions:\n",
" xyz = support.XYZ.from_xyz_file(\"polyene-3-opt.xyz\")\n",
" xyz.make_mesh_from_gbw(\"polyene-3-tddft.gbw\", transition, mode=\"diffdens\", threshold=threshold, verbose=True, dynamic_threshold=True)\n",
" xyz.make_mesh_from_gbw(\"polyene-3-tddft.gbw\", transition, mode=\"diffdens\", threshold=-threshold, verbose=True, dynamic_threshold=True)\n",
" xyz.viewer.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}