שְׁאֵלָה:
כיצד פועלות חבילות תוכנה קוונטיות?
Aug
2014-09-23 05:49:50 UTC
view on stackexchange narkive permalink

אם רוצים לחשב אלקנה בגודל בינוני (עם נניח 10-15 פחמנים, בהנחה של 100 אלקטרונים, בשיטות מוגבלות המבוססות על הרטרי פוק) אנו יכולים פשוט לומר שחלק אלקטרונים-אלקטרונים יהיה 100 $ ^ 4 = 100 מיליון דולר אינטגרלים . אם נסיר את הלא ייחודיים זה יהפוך ל- $ \ frac {100M} {8} = 12.5 מיליון $ אינטגרלים. אם נעשה בדיקה מקדימה זה עשוי להגיע לכ- 6 מיליון. גם אם נלך על DFT זה יהיה סביב $ \ frac {100 ^ 3} {8} = 125,000 $.

חישבתי מערכת קטנה כמו מתאן עם רק 10 אלקטרונים (כ -400 ייחודיים / לפני אינטגרלים מוקרנים) עם קוד C ++ יעיל (מבוסס על שילוב Rys שהוא בין השיטות היעילות ביותר) וזה לקח בערך שעה. כאשר 400 מחזורים אורכים שעה אני יכול להניח ש 6 מיליון מחזורים עשויים לקחת שנים! אבל חבילות תוכנה עושות את זה רק בשניות!

השאלה שלי היא אם אני רק רוצה לעשות מתמטיקה פשוטה כמו 2 + 2 למשך 6 מיליון פעמים, זה לוקח הרבה יותר זמן ממה שהחבילות האלה עושות עם אינטגרלים כל כך מסובכים! מישהו יודע מה הטריק שלהם? האם יש להם בסיס נתונים מחושב מראש או כמה שיטות קירוב?

עדכון: יש הרבה רמזים טובים בשאלה זו ותודה לכולם על כך. שילוב של סימטריה, מציאת אינטגרלים זניחים ושימוש בשיטות אופטימיזציה עובדים בסדר. החלק היחיד ללא מענה הוא אלגוריתם למציאת המצבים הסימטריים.

אני חושב שרבים מחבילות אלה משתמשים בספריות מספריות שעברו אופטימיזציה גבוהה לאלגברה לינארית כמו LAPACK ו- BLAS. הם עשויים גם ליישם כמה טכניקות תכנות מקבילות (למשל, רב-הברגה או MPI) כדי לנצל מעבדים מרובי-ליבות.
> החלק היחיד ללא מענה הוא אלגוריתם למציאת המצבים הסימטריים || למעשה, גיימס מכבידה על המשתמש. גאוס איכשהו יכול לנחש סימטריה מבלי שזה מוזכר במפורש בקלט. זה לא קשה מאוד. ניתן לזהות בקלות D2h וחברים עבור מולקולות ליניאריות, וכל יסודות הסימטריה חייבים לעבור במרכז הגיאומטרי של המולקולה, ולהפוך אטום אחד לחוץ. מכיוון שכל פעולות הסימטריה ניתנות לייצוג בצורת מטריצה, כל אחת מהן יכולה להצביע על ביצוע מטריצה ​​כזו ולנסות לראות אם היא אכן ואלמנט של סימטריה.
אני מציע גם לחפש בגוגל מאמר "מה כל מתכנת צריך לדעת על זיכרון". זה נותן תובנות מעניינות לאופטימיזציות.
האם אתה בטוח שקוד C ++ היה יעיל כל כך? חבר'ה שאינם אנשי מקצוע בתחום המחשוב המדעי ידועים לשמצה בכך שהם טוענים טענות כוזבות לחלוטין לגבי הקודים שלהם.
@Aug עליכם לבדוק את קוד המקור של חבילות מחשוב תוכנה בחינם. [Psi4] (http://www.psicode.org/) כתוב בעיקר ב- C ++ וב- Python. [MPQC] (http://www.mpqc.org) הוא בעיקר C ++. יתכן וישנם אחרים זמינים גם כן. יכול להיות שיש גם מידע מועיל ב [מדריך Q-Chem] (http://www.q-chem.com/qchem-website/manual_4-1.html)
@Aug ביצוע Hartree-Fock עבור מתאן צריך להיות כמה שניות אם לא פחות. הקוד שבדקת אינו יעיל ביותר מסיבה זו או אחרת. אגב, שילוב Rys הוא מהיעילים ביותר אם מיושמים נכון. בכל מקרה, עבור המערכת הקטנה שלך הבחירה הטובה ביותר לא תשתנה הרבה.
ארבע תשובות:
Geoff Hutchison
2014-09-23 07:30:04 UTC
view on stackexchange narkive permalink

יש הרבה טריקים. מכיוון שאני לא מפתח, אני לא שותף לכולם, אבל יש כמה דברים פשוטים להתחיל.

  • חלק מהאינטגרלים צפויים קרוב לאפס : גם בחישובי המנהלים הראשונים הראשונים, ישנם חלקים בקוד הגוזמים אינטגרלים שללא ספק יהיו זניחים. זה חותך הרבה עבודה. קחו למשל חפיפה או אינטגרלים של קולומב בין אטומים המרוחקים מאוד זה מזה.
  • אורביטלים גאוסיים : שימוש ב אורביטלים מסוג גאוס הם מהירים להפליא, מכיוון שרוב האינטגרלים הקוונטיים יכולים להיות נגזרים כ יחסי הישנות פשוטים. כלומר, כמעט אף פעם אין צורך לבצע את האינטגרציה. ראה, למשל, אובארה וסייקה ואלגוריתם ה- PRISM האחרון מ- גיל ופופול.

אני מאמין שיש כמה קוונטים ממשיים מפתחים כאן ואולי הם יהיו מוכנים לחלוק טריקים אחרים. אבל אלה גדולים - בטלו כל אינטגרל שאינכם זקוקים לו, וממש לא לוקחים את האינטגרלים מלכתחילה. ;-)

כן, ישנם טריקים מספריים (באמצעות BLAS, LAPACK וכו ') ושימוש בעיבוד רב ליבות. אך למעשה מדובר באופטימיזציות קלות יותר.

עדכון

הבנתי ששכחתי לדבר על התכנסות של השדה העקבי לעצמו שגם הוא מותאם. ישנן אסטרטגיות התכנסות שונות, ובמיוחד DIIS, המסייעות בהקצאת מקדמי מסלול ההליכה הסופיים וצפיפות האלקטרונים.

כן אני מסכים לחלוטין עם היעילות של דחייה של אינטגרלים זניחים במיוחד במולקולות גדולות יותר שכן יהיו יותר אפס חפיפות. השתמשתי ב- Obara-Saika לצורך אינטגרלים חופפים ואנרגיה קינטית. גיליתי שאיטרציה של Rys מהירה יותר עבור אינטגרלים אלקטרוניים. אבל לא הצלחתי למצוא נוסחה מוגדרת לבחירת דחיית האינטגרלים (אני מכיר רק את "אי השוויון של שוורץ" אבל זה לא כל כך יעיל). האם אתה מכיר קריטריונים יעילים לדחיית בחירה? אני חושב שהתשובה לשאלה זו עשויה להיות קריטריונים כאלה.
זה לא יכול להיות הפורום הטוב ביותר לשאלתך. אני יכול לנסות http://ccl.net/ איפה יש יותר אנשים לפיתוח שיטות.
הייתי מוסיף שפעמים רבות תוכלו לנצל סימטריה של קבוצות נקודות מולקולריות. אפילו רק קיום של אלמנט סימטריה אחד יכול להפחית את האחסון ב -2 והעבודה ב- 4. D2h, שיש לו סדר שמונה, יכול להפחית את העבודה ב -64!
@jjgoings אני חושב שהסימטריה הזו נשמעת ממש מבטיחה אבל כל כך קשה למצוא מצבים סימטריים (זאת אומרת בקידוד) מכיוון ש -4 אינטגרלים יכולים להגיע מכל אטומים שונים אבל להיות סימטריים עדיין. במקרה שאתה מכיר אלגוריתם אמין ליישום הסימטריה הזו?
>> כן, ישנם טריקים מספריים (באמצעות BLAS, LAPACK וכו ') ושימוש בעיבוד רב ליבות. אך מדובר למעשה באופטימיזציות קלות. || אני .. לא הייתי אומר זאת. שימוש בריצות מרובות ליבות ומקבילות עשוי להפחית את זמן העבודה בסדרי גודל, אם כי הקבלה כוללת תקורה משמעותית. כמו כן, חלק מהחבילות כוללות תמיכה ב- GPGPU.
permeakra
2014-09-28 13:40:49 UTC
view on stackexchange narkive permalink

כדי להפחית עוד יותר את דרישת האחסון, ניתן לחשב את האינטגרלים באופן מיידי וליישם אסטרטגיות מטמון שונות. עבור כמה שיטות אחסון כל האינטגרלים הוא בלתי אפשרי בעליל.

jjgoings
2014-09-29 22:49:55 UTC
view on stackexchange narkive permalink

דבר ראשון, הייתי בודק את הקוד שלך: אין סיבה ש -400 אינטגרלים ייחודיים ייקחו שעה, אפילו עם היישום הכי נאיבי. אתה מחשב בקצב של אינטגרל כל עשר שניות. אמנם אני מסכים עם כל ההערות המצביעות על הגברת ההקבלה, אך אני חושב שקוד סקלר יעיל חשוב יותר. מדוע להגדיל קוד לא יעיל? בהתחשב ב- GPUs זו חיה שלמה אחרת, ומהבעיות שהחברים שלי הביעו בניסיון לתכנת אותם הייתי ממליץ להימנע מהם בינתיים.

הדבר הטוב ביותר שאתה יכול לעשות הוא לנצל סימטריה מולקולרית. . אם כי ראש: זה לא יתקן הכל, מכיוון שמולקולות מעניינות רבות חסרות סימטריה. אבל לגבי מתאן, כמו שניסית, זה אמור לעזור לטון. כמובן, זה לא פשוט כמו לחפש אלגוריתם כלשהו, ​​כי בהתאם לתוכנית שלך אתה צריך לסובב את כיווני הגרעין כדי להיות סימטרי, או לפתח שגרות לזיהוי סימטריה של קבוצות נקודות וכו '. עם זאת, יש - - ככל הידוע לי --- שתי דרכים עיקריות לניצול סימטריה של קבוצות נקודות עבור אינטגרלים. הראשון הוא ליצור פונקציות בסיס המותאמות לסימטריה, כך שמערכת הבסיס שלך היא סימטרית, כלומר פונקציית הגל שלך / אינטגרלים / מטריצת Fock / מה שיהיה גם סימטרי. ארני דוידסון עשה זאת בשנות השבעים. התייחסות מעט יותר מודרנית של הלגייקר וטיילור ניתנת כאן. הדרכת המבנה האלקטרוני של דניאל קרופורד בוחנת זאת גם (זה כתוב היטב --- מבוא נהדר).

הדרך האחרת בה אתה יכול לעשות את זה, ואני מאמין שזה פופולרי יותר, היא ליצור אינטגרלים ייחודיים לסימטריה ואז לבנות מטריצת Fock חלקית רק כדי לטפל בסימטריה מאוחר יותר. אם אתה רואה משהו כמו "יצירת רשימה קטנה" בפלט של תוכנית המבנה האלקטרוני המועדפת עליך, זה כנראה מה שהיא עושה. שיטה זו מאפשרת סינון אינטגרלי בצורה יעילה יותר, אני מאמין. Dupuis ו- King עשו זאת בסוף שנות השבעים, בהתבסס על עבודות קודמות של Dacre ו- Elder. אלה הפניות הסטנדרטיות שתמצאו. יכול להיות שיש כמה עבודות אחרונות שאני לא מודע לה. הבעיה של סימטריה קבוצתית נקודתית נפתרה ביעילות בשנת 1980.

כמובן, למולקולות מעניינות רבות אין סימטריה לנצל, ולכן סימטריה לא תתקן את כל הבעיות שלך. השוויון של שוורץ מטופל היטב ב תיאוריית המבנה האלקטרוני המולקולרי (למעשה, רוב תורת המבנה האלקטרוני זוכה להתייחסות באותו ספר ורוד ומקסים). אם לא בדקת זאת, אנא עשה זאת. אני חושב שזה יענה על רבות משאלותיך לגבי אופן הפעולה של קודים מודרניים.

אני לא רוצה לחזור על התשובות האחרות (ג'וף נתן לך גם את המאמרים שהצעתי), אז אסיים עם שתי הפניות פחות שקולות. ראשית, יש ספר מדהים (אך זעיר!) שנקרא מחשוב מקביל בכימיה קוונטית המציג את היסודות לקוד יעיל כולל הערכה אינטגרלית. זה לא קשה מדי לקרוא, ומצאתי שהעבודה על MP2 המקומית די מעניינת. לעתים קרובות אני מופתע שיותר אנשים לא שמעו על זה. המקום האחר בו הייתי בודק הוא חבילת LibInt של אד ואלייב. הוא מתכנת די מוכשר, והוא משמש בחבילות מודרניות רבות כמו Psi ו- MPQC ו- ORCA, שלא לדבר על חינם להורדה ולשימוש בחינם. חלק מהעמיתים לעבודה שלי שיחקו עם זה בקוד מבנה אלקטרוני "תוצרת בית" משלהם, ומדברים עליו מאוד. המדריך למשתמש הוא די מועיל בהבנת הערכה אינטגרלית. הוא כתב גם כמה תרגילים והדרכות, שעשויים להיות לך שימושיים.

תודה על ההצעות הטובות. כתבתי כמה "קודים תוצרת בית" כדי למצוא את הסימטריה (זה לא יעיל במיוחד מכיוון שהוא לא יכול למצוא סימטריות חתומות / סימטריות מישור וגם די איטי) אבל אני לא יכול להגיד כמה מהר כל החישוב עכשיו (אולי פי 10 יותר מהר) ! הופתעתי ועכשיו אני יודע שהקסם העיקרי הוא הסימטריה והדחייה האינטגרלית הזניחה. אעמוד במקורות המוצעים ואפרסם את התוצאות כאן.
Osman Mamun
2014-09-30 21:44:29 UTC
view on stackexchange narkive permalink

יש כאן שני דברים:

  1. בעיה בכימיה קוונטית
  2. בעיית אופטימיזציה

כימיה קוונטית או משוואת שרודינגר מפושטת באמצעות DFT וכמה טכניקות אחרות:

א) ECP או פוטנציאל ליבה יעיל ופסאודו פוטנציאליים: במקום לפתור עבור כל האלקטרונים רק אלקטרוני הקליפה החיצוניים נפתרים ואלקטרוני הליבה נחשבים באמצעות אינטגרלים מחושבים מראש
ב) קירוב: רזולוציה של זהות, היא מתייחסת לשני מונחי אלקטרונים כתוצר של פונקציית מסלול של חלקיקים בודדים ובכך מפחיתה מאוד את עלות החישוב

וכאמור לעיל יש שימוש בכמה טכניקות טובות אחרות להתמודד עם החלק בכימיה קוונטית.

בעיית אופטימיזציה: באופטימיזציה בדרך כלל נגזרת שנייה (מטריצה ​​הסית) משמשת למציאת מינימום או מקסימום אך בקוד כימיה חישובית רק נגזרת או ג'קובי היא בשימוש, ולכן הוא רגיש מאוד לנחש ראשוני ולהגדרת חישוב.

חישוב הסיאן הוא הפעולה היקרה ביותר של קוד כימיה חישובית, או שמשמשים בסינית משוערת או שלא משתמשים בהסית בסוגי בעיית אופטימיזציה מסוג זה. אם ברצונך לוודא שקיבלת את הגיאומטריה הנכונה תוכל לחשב את הסיאן עם הגיאומטריה המותאמת שלך ולמיצוב הגיאומטריה כל התדרים צריכים להיות חיוביים ולמצב מעבר רק תדר אחד צריך להיות שלילי, אך תמצא כי כדי לעמוד בדרישה זו הוא תובעני ביותר.

יתר על כן כדי להפחית את עלות החישוב אנו יכולים להחיל תנאי גבול תקופתי. זה מאפשר לנו לפתור את הבעיה עבור תא יחידה מינימלי שאינו חוזר על עצמו (Kpoints בלתי מורידים). מציאת הסימטריה היא גם חלק מכריע מבעיות מסוג זה.

אנרגיה מנותקת משמשת להפחתת מספר מערכות הבסיס שנחשבות. וגם לטכניקות אופטימיזציה יש השפעה רבה על עלות החישוב, ייתכן שתשתמש באלגוריתם מהיר אך אגרסיבי, אך ייתכן שלא יצליח למצוא את המינימום או המקסימום.

תוכלו לקרוא VASP או TURBOMOLE ידני (זמין באופן חופשי ברשת), שם תוכלו למצוא כמה טכניקות טובות להפחתת עלות החישוב. ומעל לכל כפי שהוא מוזכר לעיל יישום יעיל של הקבלה יכול לעזור להפחית את עלות החישוב באופן דרמטי. שיטה פוטנציאלית נוספת זו היא שימוש ב- GPU, אך הוא עדיין בשלב הראשוני.



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...