24小时热门版块排行榜    

查看: 6435  |  回复: 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 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 范进中举一文的中心思想 +6 炎黄贵胄 2026-08-22 7/350 2026-08-24 11:58 by 6543yes
[基金申请] 朋友圈看到的 +7 wangzilk 2026-08-18 9/450 2026-08-24 10:50 by cmrandy
[基金申请] 能否退出参与的面上项目解除限项 +11 koalala 2026-08-24 13/650 2026-08-24 10:49 by anjeeshine
[基金申请] 放榜前的不淡定 20+4 snowwithsea 2026-08-19 17/850 2026-08-24 10:20 by echo8914667
[基金申请] 明天应该可查了!? +4 chengyan1220 2026-08-23 4/200 2026-08-24 08:47 by gloomy6159
[基金申请] 什么时候开奖? +10 CrisMessi 2026-08-18 11/550 2026-08-24 06:50 by 开心的小狮子
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +4 process2012 2026-08-23 5/250 2026-08-23 19:58 by jurkat.1640
[基金申请] 93BebMhtakh前后11位开头都是大写 +7 且听虎啸 2026-08-17 8/400 2026-08-22 21:55 by 医学老男孩
[基金申请] 只有每年这种时候来逛逛小木虫 +24 yaoyewhu2008 2026-08-20 26/1300 2026-08-22 17:43 by kammury
[基金申请] filecode,4个jtjc了 +13 ziyangfang 2026-08-19 16/800 2026-08-22 17:08 by WH3796
[基金申请] 人气不行了 +8 fansofjerry 2026-08-21 8/400 2026-08-22 16:30 by zyqchem
[基金申请] 今天基金会出结果吗?20260819 +16 kkkl_v 2026-08-19 17/850 2026-08-22 16:12 by 阿布Abu
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +16 医学老男孩 2026-08-20 20/1000 2026-08-21 21:13 by Ldrop2023
[基金申请] 看来今天不会放榜了? +8 chengyan1220 2026-08-21 11/550 2026-08-21 17:52 by dcqxinyang
[基金申请] 我面上完蛋了 +7 且听虎啸 2026-08-20 8/400 2026-08-21 12:31 by 酷酷墨镜
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
[基金申请] 估计是周四 +3 archvillain 2026-08-18 3/150 2026-08-21 01:48 by jnhyjjm
[基金申请] 明天放榜? +5 Shxjjxjkx 2026-08-18 5/250 2026-08-18 18:14 by -大大大大大-
信息提示
请填处理意见