關於源代碼
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:
沒法找到,lammps代碼不可能每一行都給你注釋,每個變量的具體含義只能根據變量的名字和在程序中的調用,結合注釋才能推測。像ebond, fbond都還是比較簡單的能根據名字能推測出含義的變量,也就是鍵的能量和力。如果碰到其他你看了半天代碼也推測不出來含義的變量,可以到lammps mailing list去請教別人。lammps developer guide(http://lammps.sandia.gov/doc/Developer.pdf)可以幫助你了解代碼的結構,但不會告訴你每個變量每個函數的具體含義。總之要了解代碼是要花一些時間的。
Response3:
這很簡單,只要你知道了你鍵能還有受力(也就是鍵能對距離的導數取負值),直接把ebond和fbond的函數形式改掉就行了。以bond_harmonic.cpp為例,在compute()這個函數里,你可以看到以下代碼
你需要的就是在compute()還有single()兩個函數里把fbond和ebond的函數形式改成你所需要的形式。如果你不太確定怎么改,可以參考bond_morse.cpp,也就是把harmonic bond換成morse bond,看看代碼是怎么變動的。
另外如果你定義鍵能的參數也發生了變動(比方說你需要更多的參數來定義鍵能),同時也需要對coeff()這個函數進行修改來改變參數傳遞,具體例子參考bond_morse.cpp和bond_harmonic.cpp之間的區別,這個不難的