資源簡介
程序亮點
1. VASP使用PAW方法或超軟贗勢,因此基組尺寸非常小,描述體材料一般需要每原子不超過100個平面波,大多數情況下甚至每原子50個平面波就能得到可靠結果。
2. 在平面波程序中,某些部分代碼的執行是三次標度。在VASP中,三次標度部分的前因子足可忽略,導致關于體系尺寸的高效標度。因此可以在實空間求解勢的非局域貢獻,并使正交化的次數最少。當體系具有大約2000個電子能帶時,三次標度部分與其它部分可比,因此VASP可用于直到4000個價電子的體系。
3. VASP使用傳統的自洽場循環計算電子基態。這一方案與數值方法組合會實現有效、穩定、快速的Kohn-Sham方程自洽求解方案。程序使用的迭代矩陣對角化方案(RMM-DISS和分塊Davidson)可能是目前最快的方案。
4. VASP包含全功能的對稱性代碼,可以自動確定任意構型的對稱性。
5. 對稱性代碼還用于設定Monkhorst-Pack特殊點,可以有效計算體材料和對稱的團簇。Brillouin區的積分使用模糊方法或四面體方法。四面體方法可以用Blöchl校正去掉線性四面體方法的二次誤差,實現更快的k點收斂速度。
代碼片段和文件信息
/*
?*?Some?functions?callable?from?fortran?to?use?shared?memory
?*?wv?2011
?*?shmem?stuff?from?Willem?Vermin?SARA
?*/
#include?
#include?
#include?
#include?
#include?
#include?
/*
?*?get?a?shared?memory?segment
?*?input:?size?(fortran?integer*8)
?*?output:?shmem?id
?*/
void?getshmem_(size_t?*size?int*id)
{
??key_t?key;
??int?shmflg;
??int?shmid;
??key?=?IPC_PRIVATE;
??shmflg?=?IPC_CREAT?|?IPC_EXCL?|?0600?|?SHM_NORESERVE?;
??shmid?=?shmget(key?*size?shmflg);
??if?(shmid?==?-1)
??{
????fprintf(stderr“%s?in?%s:?cannot?create?shared?segment?%ld?\n“__FUNCTION____FILE__*size);
????perror(0);
????exit(1);
??}
??*id?=?shmid;
}
void?getshmem_error_(size_t?*size?int*id)
{
??key_t?key;
??int?shmflg;
??int?shmid;
??key?=?IPC_PRIVATE;
??shmflg?=?IPC_CREAT?|?IPC_EXCL?|?0600?|?SHM_NORESERVE?;
??shmid?=?shmget(key?*size?shmflg);
??*id?=?shmid;
}
/*
?*?attach?shared?memory?to?a?pointer
?*?input:?shhmid:?shared?memory?id
?*?output:?address?(fortran?integer*8)
?*/
void?attachshmem_(int?*shmid?void?**address)
{
??void?*shmaddr*r;
??int?shmflg;
??shmflg?=?0;
??shmaddr?=?0;
??r?=?shmat(*shmid?shmaddr?shmflg);
??if?(r?==?(void*)?-1)
??{
????fprintf(stderr“%s?in?%s:?cannot?get?address?of?shared?segment\n“__FUNCTION____FILE__);
????perror(0);
????exit(1);
??}
??*address?=?r;
}
/*
?*?detach?shared?memory?from?pointer
?*?input:?address?(fortran?integer*8)
?*/
void?detachshmem_(void?**address)
{
??int?r;
??r?=?shmdt(*address);
??if?(r?==?-1)
??{
????fprintf(stderr“%s?in?%s:%d:?cannot?detach?shared?segment\n“__FUNCTION____FILE____LINE__);
????perror(0);
????exit(1);
??}
}
/*
?*?destroy?shared?memory
?*?input:?shmid:?shared?memory?id
?*/
void?destroyshmem_(int?*shmid)
{
??struct?shmid_ds?buf;
??int?r?=?shmctl(*shmidIPC_RMID&buf);
??if?(r?==?-1)
??{
????fprintf(stderr“%s?in?%s:%d:?cannot?destroy?shared?segment\n“__FUNCTION____FILE____LINE__);
????perror(0);
????exit(1);
??}
}
/*
?*?get?a?set?of?semaphores
?*?input:?size?
?*?output:?semaphores?id
?*/
void?getsem_(int?*size?int*id)
{
??key_t?key;
??int?semflg;
??int?semid;
??int?mysize;
??int?i?rc;
??short??sarray[(*size)+1];
??key?=?IPC_PRIVATE;
??semflg?=?IPC_CREAT?|?IPC_EXCL?|?0600;
??semflg?=?IPC_CREAT?|?0600;
??mysize=(*size)+1?;
??/*?here?I?have?an?odd?problem:?using?*size+1?instead?of?mysize?
?????sometimes?failed
?????very?odd?some?cross?C-Fortran?problem?no?idea??????????*/
??semid?=?semget(key?mysize?semflg);
??if?(semid?==?-1)
??{
????perror(0);
????fprintf(stderr“%s?in?%s:?cannot?create?semaphores?\n“__FUNCTION____FILE__);
????fprintf(stderr“requested?size?was?%d\n“?mysize);
????exit(1);
??}
??/*????????‘1‘?--??The?shared?memory?segment?is?being?used.???????*/
??/*????????‘0‘?--??The?shared?memory?segment?is?freed.????????????*/
??/*?the?very?first?sempaphore?can?be??used?to?loc?all?others?
?????currently?this?is?not?entirely?thread?save?and?might?fail?if?no?barrier
?????is?used?before?this?lock?since?we?do?not
評論
共有 條評論