LAMMPS源代碼(1)- 源自精小木蟲論壇華貼


關於源代碼

Ask:想看看lammps源代碼里面是如何計算原子間相互作用的,結果看來看去都沒發現哪塊是計算相互作用的,lammps的源代碼寫的很不容易看清楚啊。 從主程序main.cpp出發,里面除去MPI相關的函數,和創建一個lammps實例,剩下就一句話  lammps->input->file();   調用lammps下的input類的file函數,處理輸入文件。 這個file函數里面除去很多判斷最后就落到parse函數,對命令進行解析,然后進入execute_command函數調用相應的命令處理函數,但是這里面沒有run命令的處理函數。 以pair_style命令為例,對應的pair_style函數會將輸入的命令參數(力場名稱)和類force下的pair_style字符串比較(然而這個字符串的賦值始終沒找到),如果符合就進入相應的settings函數。然后,這個settings函數里面一般就一行判斷參數個數的語句就沒了。 求高手指點一下,lammps源代碼的結構是怎么樣的?哪個文件里面包含了原子間相互作用的計算?

Response1:用的是C++的多態技術;

Response2:比如,想看lj96勢函數的,找pair_lj98_cut.cpp,打開這個CPP文件,就能看到計算作用力的代碼;

Response3:嗯,這個應該是可以理解的,不過我想看的是lammps中怎么把計算的力結果返回到主程序的,分子動力學有個力->速度->位置->力的循環迭代,應該是在主程序中完成的吧,我想知道這個用不同勢函數計算的力結果和主程序之間的接口。

Response4:也許是在積分的函數里面調用的。積分有兩步,中間夾有求力。我自己寫程序時就是將求力的函數交給積分的函數調用的。當然,你如果只看主函數可能看不明白,這種大型程序一般會包裝好幾層才會到具體的真正做計算的函數。我還沒仔細查看lammps代 碼,以上只是我的猜測。

Response5:樓主應該是看過一些源代碼了吧,程序從main函數開始,然后是就轉到類 input, 在這個類中,完成了文件的讀取,並解析輸入命令,然后這個類中的成員函數, excute_command()就是執行每個模擬指令的,計算力的過程也是在這里完成。input類繼承了   Pointers類,其中的類指釷Force *force可以調用不同的pair_style, bond_style類,當然對應的計算作用力的程序也就在這個過程中完成了  看懂源代碼需要花一翻功夫的,我也只看粗略看了一下,希望對你有幫助

Response6:嗯,今天又看了一些代碼,發現了run函數,可能是具體的計算過程由update類下面的integrate類的run函數完成,但是這個run函數我目前看到的是虛函數,還沒發現可以實例化的代碼。然而關於主程序還是不太明白,run函數是在實例化lammps類的過程中完成調用的,但是之后才有input類下的file函數關於輸入文件的處理,但是,file函數之后就直接delete lammps,刪除實例了!這樣的話真正的運算在哪里?

LAMMPS源代碼的求助

Ask:

最近我在修改lammps中bond_harmonic的源代碼,對其中部分不是很清楚,在這里請教一下:

bond_harmonic的勢函數為E=K(r-r0)^2, 在源代碼中

rsq = delx*delx + dely*dely + delz*delz;

r = sqrt(rsq);

dr = r - r0[type]; rk = k[type] * dr;

其勢函數是這樣寫的,在這里,我不是很懂程序中[type]的意思,各位有知道的能講解一下嗎?萬分感謝!

Response1:這很好理解啊,模擬中可以定義多種類型的鍵,每一種類型的鍵都有相應的力常數k和平衡距離r0, type就表示健的種類。

Response2:

那像代碼里的ebond,fbond這些定義對應的意思可以在哪里找到...

沒法找到,lammps代碼不可能每一行都給你注釋,每個變量的具體含義只能根據變量的名字和在程序中的調用,結合注釋才能推測。像ebond, fbond都還是比較簡單的能根據名字能推測出含義的變量,也就是鍵的能量和力。如果碰到其他你看了半天代碼也推測不出來含義的變量,可以到lammps mailing list去請教別人。lammps developer guide(http://lammps.sandia.gov/doc/Developer.pdf)可以幫助你了解代碼的結構,但不會告訴你每個變量每個函數的具體含義。總之要了解代碼是要花一些時間的。

Response3:

好的,謝謝你,我已經能把代碼和勢函數對應上了,還有個疑問麻煩了,就是力的公式是怎么寫進去的,因為我不是學習分子動力學的,所以不是很清楚,了解的還不夠

 這很簡單,只要你知道了你鍵能還有受力(也就是鍵能對距離的導數取負值),直接把ebond和fbond的函數形式改掉就行了。以bond_harmonic.cpp為例,在compute()這個函數里,你可以看到以下代碼

    rsq = delx*delx + dely*dely + delz*delz;
    r = sqrt(rsq);
    dr = r - r0[type];
    rk = k[type] * dr;

    // force & energy

    if (r > 0.0) fbond = -2.0*rk/r;
    else fbond = 0.0;

    if (eflag) ebond = rk*dr;

 你需要的就是在compute()還有single()兩個函數里把fbond和ebond的函數形式改成你所需要的形式。如果你不太確定怎么改,可以參考bond_morse.cpp,也就是把harmonic bond換成morse bond,看看代碼是怎么變動的。
 另外如果你定義鍵能的參數也發生了變動(比方說你需要更多的參數來定義鍵能),同時也需要對coeff()這個函數進行修改來改變參數傳遞,具體例子參考bond_morse.cpp和bond_harmonic.cpp之間的區別,這個不難的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM