24小时热门版块排行榜    

查看: 5485  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 化学工程321分求调剂 +7 大米饭! 2026-03-15 7/350 2026-03-16 10:25 by 了了了了。。
[考研] 0856求调剂 +3 刘梦微 2026-03-15 3/150 2026-03-16 10:00 by houyaoxu
[考研] 一志愿985,本科211,0817化学工程与技术319求调剂 +4 Liwangman 2026-03-15 4/200 2026-03-16 08:01 by wang_dand
[考研] 0703化学调剂,求各位老师收留 +7 秋有木北 2026-03-14 7/350 2026-03-15 17:30 by 小物理化学
[考研] 274求调剂 +4 时间点 2026-03-13 4/200 2026-03-15 15:29 by Rambo13
[考研] 085601材料工程315分求调剂 +3 yang_0104 2026-03-15 3/150 2026-03-15 10:58 by peike
[考研] 268求调剂 +5 一定有学上- 2026-03-14 6/300 2026-03-14 22:20 by 运气yunqi
[考研] 304求调剂 +5 小熊joy 2026-03-14 5/250 2026-03-14 21:07 by peike
[考研] 331求调剂(0703有机化学 +5 ZY-05 2026-03-13 6/300 2026-03-14 10:51 by Jy?
[考研] 0703求调剂 +7 jtyq001 2026-03-10 7/350 2026-03-14 01:06 by JourneyLucky
[考研] 一志愿安徽大学材料工程专硕313分,求调剂的学校 +8 Yu先生 2026-03-10 10/500 2026-03-14 01:04 by JourneyLucky
[考研] 308求调剂 +5 是Lupa啊 2026-03-11 5/250 2026-03-13 22:13 by JourneyLucky
[考研] 求调剂(材料与化工327) +4 爱吃香菜啦 2026-03-11 4/200 2026-03-13 22:11 by JourneyLucky
[考研] 290求调剂 +9 ADT 2026-03-11 9/450 2026-03-13 21:55 by JourneyLucky
[考研] 工科调剂 +4 Jiang191123! 2026-03-11 4/200 2026-03-13 15:15 by Miko19
[考研] 求调剂 +3 程雨杭 2026-03-12 3/150 2026-03-13 15:06 by JourneyLucky
[考研] 一志愿山大07化学 332分 四六级已过 本科山东双非 求调剂! +3 不想理你 2026-03-12 3/150 2026-03-13 14:18 by JourneyLucky
[考研] 070303一志愿西北大学学硕310找调剂 +3 d如愿上岸 2026-03-12 5/250 2026-03-13 10:56 by houyaoxu
[考研] 纺织、生物、化学、材料相关专业招生了 +4 耶耶业 2026-03-09 7/350 2026-03-12 19:05 by Equinoxhua
[考研] 290求调剂 +3 柯淮然 2026-03-10 8/400 2026-03-11 13:48 by 柯淮然
信息提示
请填处理意见