回 帖 发 新 帖 刷新版面

主题:臭石头雪球请进!我还是没有解决!所以我打算先简化问题!

臭石头雪球您好:
我之前曾经有过一个关于数据读取的问题,您给了我一个代码(http://bbs.pfan.cn/post-395159.html),通用性很强,非常感谢!
现在我想让代码更加通用一些。

代码将读取将下列数据

$GLOBLE
NAME = ‘cylinder‘,
$END


$BCINP


NBC= 6,

IBTYP( 1)= 5, IBDIR( 1)= 2,
JBCS( 1)= 1, JBCE( 1)= 31
KBCS( 1)= 1, KBCE( 1)= 1
LBCS( 1)= 1, LBCE( 1)= 3

IBTYP( 2)= 5, IBDIR( 2)= 2,
JBCS( 2)= 31, JBCE( 2)= 61
KBCS( 2)= 1, KBCE( 2)= 1
LBCS( 2)= 1, LBCE( 2)= 3

IBTYP( 3)= 31, IBDIR( 3)= -3,
JBCS( 3)= 1, JBCE( 3)= 31
KBCS( 3)= 1, KBCE( 3)= 31
LBCS( 3)= 3, LBCE( 3)= 3

IBTYP( 4)= 31, IBDIR( 4)= -3,
JBCS( 4)= 31, JBCE( 4)= 61
KBCS( 4)= 1, KBCE( 4)= 31
LBCS( 4)= 3, LBCE( 4)= 3

IBTYP( 5)= 5, IBDIR( 5)= -2,
JBCS( 5)= 1, JBCE( 5)= 31
KBCS( 5)= 31, KBCE( 5)= 31
LBCS( 5)= 1, LBCE( 5)= 3

IBTYP( 6)= 5, IBDIR( 6)= -2,
JBCS( 6)= 31, JBCE( 6)= 61
KBCS( 6)= 31, KBCE( 6)= 31
LBCS( 6)= 1, LBCE( 6)= 3

$END

$GLOBLE
NAME = ‘box‘,
$END

$BCINP

NBC= 5,

IBTYP( 1)= 40, IBDIR( 1)= -1,
JBCS( 1)= 51, JBCE( 1)= 51
KBCS( 1)= 1, KBCE( 1)= 51
LBCS( 1)= 1, LBCE( 1)= 3

IBTYP( 2)= 31, IBDIR( 2)= -3,
JBCS( 2)= 1, JBCE( 2)= 51
KBCS( 2)= 1, KBCE( 2)= 51
LBCS( 2)= 3, LBCE( 2)= 3

IBTYP( 3)= 40, IBDIR( 3)= 2,
JBCS( 3)= 1, JBCE( 3)= 51
KBCS( 3)= 1, KBCE( 3)= 1
LBCS( 3)= 1, LBCE( 3)= 3

IBTYP( 4)= 40, IBDIR( 4)= -2,
JBCS( 4)= 1, JBCE( 4)= 51
KBCS( 4)= 51, KBCE( 4)= 51
LBCS( 4)= 1, LBCE( 4)= 3

IBTYP( 5)= 40, IBDIR( 5)= 1,
JBCS( 5)= 1, JBCE( 5)= 1
KBCS( 5)= 1, KBCE( 5)= 51
LBCS( 5)= 1, LBCE( 5)= 3

$END

然后写成:
$BCINP
ISPARTOF = 'cylinder',
IBTYP = 5, 5, 31, 31, 5, 5,
IBDIR = 2, 2, -3, -3, -2, -2,
JBCS = 1, 31, 1, 31, 1, 31,
JBCE = 31, 61, 31, 61, 31, 61,
KBCS = 1, 1, 1, 1, 31, 31,
KBCE = 1, 1, 31, 31, 31, 31,
LBCS = 1, 1, 3, 3, 1, 1,
LBCE = 3, 3, 3, 3, 3, 3,
$END

$BCINP
ISPARTOF = 'box',
IBTYP = 40, 31, 40, 40, 40,
IBDIR = -1, -3, 2, -2, 1,
JBCS = 51, 1, 1, 1, 1,
JBCE = 51, 51, 51, 51, 1,
KBCS = 1, 1, 1, 51, 1,
KBCE = 51, 51, 1, 51, 51,
LBCS = 1, 3, 1, 1, 1,
LBCE = 3, 3, 3, 3, 3,
$END

怎么实现?因为数据可能有很多块,所以想写一个更通用的代码!





回复列表 (共7个回复)

沙发

期待您的指导!

板凳

我没看出来以前的代码为何不能用在你的例子上。

应该是可以不修改直接用的。明确一点好吗?

描述一下在什么情况下,以前的代码有何局限?

3 楼

原来的代码对每个块的信息都可以读取并记录。现在有多块数据,我想把代码变得更通用化。
假如说数据有N个块,每个块有不同的mesh name,那么怎样实现一次性把所有数据读入,并输出呢?
也就是说原来数据的读取存储用的是一维数组,而现在可能要用N维数组来实现。

4 楼

这又涉及到很多问题了。

第一,你所谓的块,在文件里如何区分?

每一个
$GLOBLE
 NAME = ‘name‘,
 $END

就代表一个块的开始吗?

第二,
$GLOBLE
这里一定只有 NAME = XXX 吗?会不会有其他的信息?
 $END

第三,
块结束时,一定有 $END 吗?

这三个问题的答案会影响这个工作的复杂程度,尤其是第一个。

实际上,我觉得你自己就能稍加修改实现。好好理解一下我的代码。

思路就是:先调用一个定位函数,用来定位块。定位函数在文件里一直读,直到读到 $GLOBLE NAME = 对应的。
然后调用我以前的代码,稍微改一下,去掉一开始的 Rewind,循环判断由遇到文件尾部结束,改为遇到 $END 结束。

5 楼

第一,每个块的开始都是一样的。都以
 $GLOBLE
 NAME = ‘name‘,
 $END
开始。
第二,
$GLOBLE
这里一定只有 NAME = XXX 。不会有其他的信息。
 $END
第三,
块结束时,一定有 $END 。

6 楼

实际上,
我没有实现循环判断由遇到文件尾部结束,改为遇到 $END 结束,这一步~~
我打算把问题简化为:只读取下面的数据并进行写入

 $BCINP

  NBC= 4,

  IBTYP(  1)=   31, IBDIR(  1)=    3,
   JBCS(  1)=    1,  JBCE(  1)=   31
   KBCS(  1)=    1,  KBCE(  1)=   31
   LBCS(  1)=    1,  LBCE(  1)=    1

  IBTYP(  2)=   31, IBDIR(  2)=    3,
   JBCS(  2)=   31,  JBCE(  2)=   61
   KBCS(  2)=    1,  KBCE(  2)=   31
   LBCS(  2)=    1,  LBCE(  2)=    1

  IBTYP(  3)=    5, IBDIR(  3)=    2,
   JBCS(  3)=    1,  JBCE(  3)=   31
   KBCS(  3)=    1,  KBCE(  3)=    1
   LBCS(  3)=    1,  LBCE(  3)=    3

  IBTYP(  4)=    5, IBDIR(  4)=    2,
   JBCS(  4)=   31,  JBCE(  4)=   61
   KBCS(  4)=    1,  KBCE(  4)=    1
   LBCS(  4)=    1,  LBCE(  4)=    3

 $END

 $BCINP

  NBC=  5,

  IBTYP(  1)=   31, IBDIR(  1)=    3,
   JBCS(  1)=    1,  JBCE(  1)=   51
   KBCS(  1)=    1,  KBCE(  1)=   51
   LBCS(  1)=    1,  LBCE(  1)=    1

  IBTYP(  2)=   40, IBDIR(  2)=   -1,
   JBCS(  2)=   51,  JBCE(  2)=   51
   KBCS(  2)=    1,  KBCE(  2)=   51
   LBCS(  2)=    1,  LBCE(  2)=    3

  IBTYP(  3)=   41, IBDIR(  3)=    2,
   JBCS(  3)=    1,  JBCE(  3)=   51
   KBCS(  3)=    1,  KBCE(  3)=    1
   LBCS(  3)=    1,  LBCE(  3)=    3

  IBTYP(  4)=   30, IBDIR(  4)=   -2,
   JBCS(  4)=    1,  JBCE(  4)=   51
   KBCS(  4)=   51,  KBCE(  4)=   51
   LBCS(  4)=    1,  LBCE(  4)=    3

  IBTYP(  5)=   40, IBDIR(  5)=    1,
   JBCS(  5)=    1,  JBCE(  5)=    1
   KBCS(  5)=    1,  KBCE(  5)=   51
   LBCS(  5)=    1,  LBCE(  5)=    3

 $END

但是没有实现循环判断由遇到文件尾部结束,改为遇到 $END 结束,这一步~~

7 楼

我觉得这样需要一个二位数组A[ij]来完成。
i:用来标记块
j:用来记录每项的数据

但是在读取了块的数目后,将块数据作为i传递给二位数组的时候,遇到了问题~~
求教!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册