• 大小: 2.17MB
    文件类型: .xz
    金币: 1
    下载: 0 次
    发布日期: 2023-11-15
  • 语言: ASP
  • 标签: 超算  源码  BEEF  工具  VASP  

资源简介

VASP+BEEF
beef-vdW全称为Bayesian error estimation functional with van der Waals correlation, 是DTU在2012年做出来的一个新泛函,目前和Quantum Espresso,VASP,GPAW均有接口。具体的编译过程可以参考SUNCAT - Software和 BEEF Functional Software。
把beef编译到VASP里,首先要编译libbeef
1 编译和安装BEEF
$ cd libbeef
$ chmod +x configure
$ ./configure CC=mpicc --prefix=/opt/software/beef
$ make
$ make install
2 修改VASP makefile.include
makefile.include需要稍作修改(CPP_OPTIONS里添加-Dlibbeeef,LLIBS里添加-Lpathtolibbeef -lbeef)
CPP_OPTIONS= -DMPI -DHOST=\"IFC91_ompi\" -DIFC \
-DCACHE_SIZE=4000 -DPGF90 -Davoidalloc \
-DMPI_BLOCK=8000 -DscaLAPACK -Duse_collective \
-DnoAugXCmeta -Duse_bse_te \
-Duse_shmem -Dtbdyn -Dlibbeef
......
BEEF = -L/opt/software/beef/lib -lbeef
......
LLIBS = $(SCALAPACK) $(LAPACK) $(BLAS) $(BEEF)
......
3 编译VASP
$ make

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 

#define nbuf 65536

static inline double sq(double x) {return x*x;}

void fileerror(const char *filename FILE *file)
{
    fclose(file);
    fprintf(stderr “error reading file %s\n“ filename);
    exit(4);
}

void openerror(const char *filename)
{
    fprintf(stderr “error opening file %s\n“ filename);
    exit(3);
}

FILE *openandfindlastbeefens(const char *filename char *buf)
{
    FILE *f;
    unsigned long int ulastu;
    
    f = fopen(filename “r“);
    if(!f) openerror(filename);
    
    u = 1;
    while(fgets(bufnbuff) && !strstr(buf“BEEFens“)) u++;
    if(!strstr(buf“ensemble energies“)) fileerror(filename f);

    do {
lastu = u;
u++;
while(fgets(bufnbuff) && !strstr(buf“BEEFens“)) u++;
    } while(strstr(buf“ensemble energies“));
    
    if(fseek(f0SEEK_SET)) fileerror(filename f);
    
    for(u=0;u    
    return f;
}


int main(int argc char **argv)
{
    char buf[nbuf];
    double *samples;
    FILE *dftout;
    double de;
    int nsamples;

    if(argc < 3)
    {
fprintf(stderr “usage: %s factor1 outputfile1 ... factorN outputfileN\n“ argv[0]);
return 1;
    }

    dftout = openandfindlastbeefens(argv[2] buf);
    nsamples = strtol(strstr(buf“BEEFens“)+7 NULL 10);

    samples = (double *) malloc(nsamples*sizeof(double));
    if(!samples)
    {
fclose(dftout);
fputs(“not enough memory for ensemble energies\n“ stderr);
return 2;
    }

    d = strtod(argv[1] NULL);
    for(int j=0;j    {
if(!fgets(bufnbufdftout)) fileerror(argv[2] dftout);
samples[j] = d*strtod(buf NULL);
    }
    fclose(dftout);
    for(int i=3;i    {
d = strtod(argv[i] NULL);
dftout = openandfindlastbeefens(argv[i+1] buf);
for(int j=0;j {
    if(!fgets(bufnbufdftout)) fileerror(argv[i+1] dftout);
    samples[j] += d*strtod(buf NULL);
}
fclose(dftout);
    }

    d = samples[0];
    for(int i=1;i    d /= (double) nsamples;
    e = sq(samples[0]-d);
    for(int i=1;i    free(samples);

    printf(“%.5g standard deviation\n“ sqrt(e/nsamples));

    return 0;
}

评论

共有 条评论