24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 5127  |  回复: 34
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

qli0218

木虫 (小有名气)

[交流] 【其他】第一性计算数据处理经验有奖征集已有20人参与

现在做第一性原理计算越来越多,但是如何发表高层次的文章却与处理、挖掘所得数据的深度有着密切的联系。所以希望大家互帮互助,分享处理数据的经验。

大家所用软件都不一样,所以得到的数据文件也有不同,所以请大家按照以下格式回帖,写下自己处理数据的例子。

例子:
CODE:
计算软件:DMOL
处理的文件:.grd
应用软件:MATLAB
作用:按照自己的需求画二维电荷密度图
方法:读出.grd中的数据,按照自己的要求重新切面,得到切面上各个坐标的电荷密度,然后画出二维电荷密度图。也可得到电荷密度矩阵倒入origin中绘图。
程序(可选):如果有自己用得好的程序,也可以共享。


参与回帖者每人奖励5个金币,对于提供程序的回帖者奖励10个金币。

PS:感谢aylayl08版主的帮助

[ Last edited by aylayl08 on 2010-4-6 at 14:22 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)

★ ★ ★ ★ ★
qli0218(金币+10):非常感谢!! 2010-04-07 11:23
hometownlove(金币+5):学习了 2010-04-07 20:17
计算软件:abinit
应用软件:C,Gnuplot
作用:直接画一个简单能带图,方便看结果
方法:运行时提取出xxx_EIG里的值,产生一个gnuplot用的脚本,然后把图输出到一个ps文件里。
使用:
以tutorial #3里3.5的输出 t3xo_DS2_EIG为例子
gcc eig.c -lm
./a.out t3xo_DS2_EIG
输入 kptopt 的绝对值
3
然后一侧输入ndivk的几个值,每输入一个按回车
10
12
17

程序(可选):
CODE:
#include
#include
#include
#include
double **matrix (int R, int L);        //为数组M[R][L]开辟空间。
void freem (double **m, int R, int L);
double emin (double **m, int R, int L);
double emax (double **m, int R, int L);
int
main (int argc, char **argv)
{
  int knum;
  int nband;
  int i, j;
  FILE *fp;
  FILE *pt, *pd;
  double **eig;
  double ymax, ymin;
  int kptopt = 3;
  int *ndivk;
  if (argc != 2)
    {
      printf ("this program only need 2 parameters.\n");
      return -1;
    }
  printf ("please input the kptopt:\n");
  scanf ("%d", &kptopt);
  ndivk = malloc (sizeof (int) * kptopt);
  printf ("please input the ndivk:\n");
  for (i = 0; i < kptopt; i++)
    scanf ("%d", ndivk + i);
  if ((fp = fopen (argv[1], "r")) == NULL)
    {
      printf ("can't open %s.\n", argv[1]);
      return -1;
    }
  fscanf (fp, "%*[^0-9]%d%*[^\n]\n", &knum);
  fscanf (fp, "%*[^=]=%d%*[^\n]\n", &nband);
  rewind (fp);
  eig = matrix (knum, nband);
  if (NULL == eig)
    {
      printf ("can't get memory for eig.\n");
      return -1;
    }
  fscanf (fp, "%*[^\n]\n");
  for (i = 0; i < knum; i++)
    {
      fscanf (fp, "%*[^\n]\n");
      for (j = 0; j < nband; j++)
        fscanf (fp, "%lf", &eig[i][j]);
      fscanf (fp, "\n");
    }
  pd = fopen ("plot.data", "w");
  if (NULL == pd)
    {
      printf ("fail to open plot.data.\n");
      return -1;
    }

  for (i = 0; i < knum; i++)
    {
      fprintf (pd, "%4d", i + 1);
      for (j = 0; j < nband; j++)
        fprintf (pd, " %.5f", eig[i][j]);
      fprintf (pd, "\n");
    }
  fclose (fp);
  fclose (pd);
  ymax = emax (eig, knum, nband);
  ymin = emin (eig, knum, nband);
  ymax = ymax + fabs (0.2 * ymax);        //设置画图所用的Y轴坐标上下限
  ymin = ymin - fabs (0.2 * ymin);
  if ((pt = fopen ("plot", "w")) == NULL)
    {
      printf ("fail to open file 'plot'.\n");
      return -1;
    }
  fprintf (pt, "gnuplot<         set term post landscape enhanced color dashed defaultplex \"Helvetica\" 14\n\
        set output \'pic.ps\'\n\
        set key outside\n\
        set title \"Energy Band\"\n\
        set ylabel \"Energy (Ev)\"\n");
  fprintf (pt, "set yrange[%f:%f]\n", ymin, ymax);
  fprintf (pt, "set xrange[%d:%d]\n", 1, knum);
  j = 0;
  for (i = 1; i < kptopt; i++)
    {
      j = j + ndivk[i - 1];
      fprintf (pt, "set arrow from %d,%f to %d,%f\n", j + 1, ymin, j + 1, ymax);        //在特殊点处画箭头
    }
  fprintf (pt,
           " plot 'plot.data' u 1:2  w l lw 2 smooth cspline,'plot.data' u 1:2  w p  ps 0.3 ");
  for (i = 1; i < nband; i++)
    fprintf (pt,
             " ,'plot.data' u 1:%d  w l lw 2 smooth cspline,'plot.data' u 1:%d w p  ps 0.3 ",
             i + 2, i + 2);
  fprintf (pt, "\nEOF");
  fclose (pt);
  chmod ("plot", S_IRUSR | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH);
  system ("./plot");
  remove ("plot");
  remove ("plot.data");                //结束后删除中间产生的数据和gnuplot脚本.
  freem (eig, knum, nband);
  return 0;
}

double **
matrix (int R, int L)
{
  double **M;
  int i;
  if ((M = malloc (sizeof (double *) * R)) == NULL)
    {
      printf ("can't get memory1.\n");
      return NULL;
    }
  for (i = 0; i < R; i++)
    {
      M[i] = calloc (sizeof (double), L);
      if (NULL == M[i])
        {
          printf ("can't get memory2.\n");
          return NULL;
        }
    }
  return M;
}

void
freem (double **m, int R, int L)
{
  int i;
  for (i = 0; i < R; i++)
    free ( m[i] );
  free (m);
}

double
emax (double **m, int R, int L)
{
  int i, j;
  double max;
  max = m[0][0];
  for (i = 0; i < R; i++)
    for (j = 0; j < L; j++)
      max = (max > m[i][j]) ? max : m[i][j];
  return max;
}

double
emin (double **m, int R, int L)
{
  int i, j;
  double min;
  min = m[0][0];
  for (i = 0; i < R; i++)
    for (j = 0; j < L; j++)
      min = (min < m[i][j]) ? min : m[i][j];
  return min;
}

引用回帖:
Originally posted by qli0218 at 2010-04-06 14:11:26:
[box=white]现在做第一性原理计算越来越多,但是如何发表高层次的文章却与处理、挖掘所得数据的深度有着密切的联系。所以希望大家互帮互助,分享处理数据的经验。

大家所用软件都不一样, ...

[ Last edited by tjyl on 2010-4-7 at 10:23 ]
12楼2010-04-07 10:14:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 35 个回答

gavinliu7390

木虫 (著名写手)

叶落鹰飞

支持一下!
真理是一点点接近的!
2楼2010-04-06 14:31:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

christian

木虫 (正式写手)

支持一下哈!!!那样估计有点难!呵呵!
你出生的时候,你哭着,周围的人笑着;你逝去的时候,你笑着,而周围的人在哭
5楼2010-04-06 17:01:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

goldenfisher

金虫 (著名写手)

qli0218(金币+5):谢谢参与!非常好! 2010-04-06 18:23
我来说一个,紧跟版主脚步:

计算软件:pwscf
处理的文件:.xsf
应用软件:xcrysden
作用:原子构型图、电荷密度、自旋密度的三维图等
方法:原子构型可以直接在xscrysden中画出。对其它参数,首先利用pwscf计算scf得到体系电荷分布,再经过自带的处理程序得到xsf格式的文件,然后导入xcrysden,选择合适的参数,画出电荷密度的三维分布。现在来说,三维分布更直观,更有意义。
6楼2010-04-06 17:36:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复(可上传附件)
信息提示
请填处理意见