24小时热门版块排行榜    

CyRhmU.jpeg
查看: 5115  |  回复: 34
支持
11楼2010-04-07 07:13:03
已阅   回复此楼   关注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的回帖

tjyl

金虫 (正式写手)

★ ★ ★ ★ ★ ★ ★
aylayl08(金币+5):非常感谢,第一个提供程序的,鼓励一下 2010-04-07 13:07
hometownlove(金币+2):谢谢交流 2010-04-07 20:18
前面的代码里freem函数贴出来后显示的有问题。
CODE:
void freem (double **m, int R, int L)
{
  int i;
  for (i = 0; i < R; i++)
    free ( m[i]);
  free (m);
}


如果能带数量多,就加
unset key\n\
CODE:
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\
        unset key\n\
        set ylabel \"Energy (Ev)\"\n");

引用回帖:
Originally posted by tjyl at 2010-04-07 10:14:18:
计算软件:abinit
应用软件:C,Gnuplot
作用:直接画一个简单能带图,方便看结果
方法:运行时提取出xxx_EIG里的值,产生一个gnuplot用的脚本,然后把图输出到一个ps文件里。
使用:
以tutorial #3里3.5的输 ...

[ Last edited by tjyl on 2010-4-7 at 10:51 ]
13楼2010-04-07 10:18:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

锐利的碎片

木虫 (正式写手)

star watcher

其实scilab处理数据很方便,主要是可以进行很多分析工作。语法和matlab十分接近。直接下载可执行版加上环境变量就可以用了。当然freemat也很好。

[ Last edited by 锐利的碎片 on 2010-4-7 at 10:54 ]
14楼2010-04-07 10:53:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tjyl

金虫 (正式写手)

octave用法和matlab基本一样的。
引用回帖:
Originally posted by 锐利的碎片 at 2010-04-07 10:53:06:
其实scilab处理数据很方便,主要是可以进行很多分析工作。语法和matlab十分接近。直接下载可执行版加上环境变量就可以用了。当然freemat也很好。

[ Last edited by 锐利的碎片 on 2010-4-7 at 10:54 ]

15楼2010-04-07 11:36:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
16楼2010-04-07 11:40:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

锐利的碎片

木虫 (正式写手)

star watcher

引用回帖:
Originally posted by tjyl at 2010-04-07 11:36:36:
octave用法和matlab基本一样的。

单纯功能而言,scilab要比octave好。要长得像freemat的帮助直接抄的matlab。
17楼2010-04-07 11:49:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
18楼2010-04-07 12:52:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

manin8769

金虫 (小有名气)

19楼2010-04-07 14:30:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

faith2007

银虫 (小有名气)

占个沙发
20楼2010-04-07 20:07:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 qli0218 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见