独孤 发表于 2008-12-29 14:22:41

关于un上一步长数值的问题

本帖最后由 独孤 于 2009-2-23 14:29 编辑

我在求解温度场,其中材料参数是变物性的,需要根据上一个时间步长的温度来决定下一个时间步长的材料参数,下面是我的PDE文件。
我发现程序求解需要的时间是不变材料参数时候程序运行时间的N倍。这个N是PRE里面定义的材料数目。我定义了51个材料(包括15个边界),这就意味着程序运算量一下子增长了50倍。不明白这是为什么?
disp u
coor x y z
coef un
mate rou ec ek eq wb tb hz eqb 4.0d-6;1.04d-5;0.0d0;4.0d-6;1;37;0;0;
shap %1 %2
gaus %3
mass %1 rou*ec

stif
$c6 if (imate.gt.1) then
$cv   eqb=un
$c6 endif
$c6 if (fxy.gt.50) then
$cv   eqb=37
$c6 endif
$c6 if (fxy.lt.0) then
$cv   eqb=37
$c6 endif
dist =
+*ek
+*ek
+*ek

load =+【u】*(eq+4077.15*wb*(tb-eqb)+hz)

end

[ 本帖最后由 独孤 于 2008-12-29 14:23 编辑 ]

zhoulon 发表于 2008-12-29 18:51:12

原因就在于你插入了这些行的程序,因为这些程序是对每一个单元要进行循环的,你看一下e元件程序以及其调用的子程序就可以了。
$c6 if (imate.gt.1) then
$cv   eqb=un
$c6 endif
$c6 if (fxy.gt.50) then
$cv   eqb=37
$c6 endif
$c6 if (fxy.lt.0) then
$cv   eqb=37
$c6 endif
再一个你的pde里面的fxy找不到出处,好像不对,具体应该imate吧。

独孤 发表于 2008-12-31 11:54:17

因为“插入了这些行的程序”??如果我不插入这些$c6的程序行,就不用对每一个单元循环?我把PDE修改成这样,
disp u
coor x y z
coef un
mate rou ec ek eq wb tb hz eqb 4.0d-6;1.04d-5;0.0d0;4.0d-6;1;37;0;0;
shap %1 %2
gaus %3
mass %1 rou*ec

stif
dist =
+*ek
+*ek
+*ek

load =+*(eq+4077.15*wb*(tb-un)+hz)

end
我对程序运行,发现还是要循环51次(我定义了51个材料)
它的程序我看得不是太明白,有一点疑问:
我仅仅是在方程+*(eq+4077.15*wb*(tb-un)+hz)中调用了UN,也就是上一个时间步长的单元的温度而已,为什么还是要循环51次?

zhoulon 发表于 2008-12-31 12:44:17

下面是e元件程序中的一部分,你看一下就明白了,呵呵。

      numtyp = 3                  !你的肯定是51
      IF (IT.EQ.0) THEN
      open(11,file='unod',form='unformatted',status='old')
      ELSE
      open(11,file='unod',form='unformatted',status='old')
      ENDIF
      read(11) ((eu1(j,i),i=1,knode),j=1,kdgof)

C.......OPEN DIAG file
      OPEN (2,FILE=' ',FORM='UNFORMATTED',STATUS='OLD')
      READ(2) (numcol(I),I=1,NEQ1)
      READ(2) (na(I),I=1,maxa)
      CLOSE(2)

C.......OPEN ELEM0 file
      OPEN (3,FILE=' ',FORM='UNFORMATTED',STATUS='OLD')

      itime=0
1   continue
      itime=itime+1
      if (itime.gt.1) then
      write(*,*) 'Nonlinear Iteration Times ========',itime
      rewind(3)
      rewind(32)
      endif

      READ (32) ((U(J,I),J=1,KDGOF),I=1,KNODE)
cc      WRITE (*,*) 'BF ='
cc      WRITE(*,7) ((U(J,I),J=1,KDGOF),I=1,KNODE)

      DO 111 I=1,MAXA
      A(I) = 0.0
111   CONTINUE

      DO 2300 I=1,NEQ
2300    CONTINUE
      NUMEL=0
      DO 2000 ITYP=1,NUMTYP                     !这里要对材料进行循环求解 51次,所有有51个循环了
C .... READ ELEMENT NODAL CONNECTION POINTS AND MATERIAL No.
      READ (3) NUM,NNODE,
   *         ((NODE((I-1)*NNODE+J),J=1,NNODE),I=1,NUM)
cc      WRITE(*,*) 'NUM =',NUM,' NNODE =',NNODE
cc      WRITE(*,*) 'NODE ='
cc      WRITE(*,6) ((NODE((I-1)*NNODE+J),J=1,NNODE),I=1,NUM)
      NNE = NNODE
      nne = nne-1
      K=0
      DO 115 J=1,NNE
      JNOD = NODE(J)
      DO 115 L=1,KDGOF
      IF (NODVAR(L,JNOD).NE.0) K=K+1
115   CONTINUE
      WRITE(*,*) 'K =',K
........
为节省篇幅,以下略

独孤 发表于 2008-12-31 13:26:58

版主太强悍了! 啥都不说了,Happy New Year!

独孤 发表于 2009-2-13 10:53:13

不知道有没有办法不让程序进行51次循环?能否通过修改版主提出的那段代码来实现?

祝大家牛年吉祥!

独孤 发表于 2009-2-13 13:16:17

好奇怪,我的numtyp = 2,不是51

这是为什么?

原帖由 zhoulon 于 2008-12-31 12:44 发表 http://forum.simwe.com/images/common/back.gif
下面是e元件程序中的一部分,你看一下就明白了,呵呵。

      numtyp = 3                  !你的肯定是51
      IF (IT.EQ.0) THEN
      open(11,file='unod',form='unformatted',status='old')
      ELSE
...

seeksilence 发表于 2009-2-13 13:34:43

numtyp是单元类型数,=2是对的

原帖由 独孤 于 2009-2-13 13:16 发表 http://forum.simwe.com/images/common/back.gif
好奇怪,我的numtyp = 2,不是51

这是为什么?

独孤 发表于 2009-2-13 13:48:00

请问能否实现不让程序因为材料数目的缘故而迭代循环N次?


原帖由 独孤 于 2009-2-13 13:16 发表 http://forum.simwe.com/images/common/back.gif
好奇怪,我的numtyp = 2,不是51

这是为什么?

zhoulon 发表于 2009-2-13 13:50:35

我上面说错了,numtyp是单元类型数目,你的程序应该有一种体单元,一种面单元,所以这个值是2了。
具体参数在e元件程序里面的prmt数组里面,你自己看一下吧。

seeksilence 发表于 2009-2-13 22:11:23

除了fxy 应该是imate之外,可能别的东东有问题,非线性问题收敛的迭代步数跟算法有关

原帖由 独孤 于 2009-2-13 13:48 发表 http://forum.simwe.com/images/common/back.gif
请问能否实现不让程序因为材料数目的缘故而迭代循环N次?


独孤 发表于 2009-2-14 08:29:56

本帖最后由 独孤 于 2009-2-14 08:33 编辑

seeksilence 说的是对的。从bat文件的循环上面能够发现:
Par.dat文件内容:
starta disp0 id0 nv disp0 bfd time0 time coor0 unod para.io elem0 sys diag
if exist stop del stop
:1
bft disp0 time coor0 nv bfdt stop
IF EXIST END DEL END
:2
epara disp0 sys time nv coor0 bfd diag elem0 f displace end
IF NOT EXIST END GOTO 2                   ----- 这个判断语句是进行N次迭代(在此例中是51次)的原因
call post.bat
if not exist stop goto 1

Par.gcn文件内容如下:
defi
a npar &

STARTsin a
if exist stop del stop
:1
bft
IF EXIST END DEL END
:2
SOLVsin a
IF NOT EXIST END GOTO 2
post a
if not exist stop goto 1
请问大侠,是不是我的算法选择有问题?

PS:
par.pde 文件的内容经过修改为:
disp u
coor x y z
coef un
mate rc ek eq wb tb hz 1085;0.42;600;0.001;37;0;
shap %1 %2
gaus %3
mass %1 rc

stif
dist =
+*ek
+*ek
+*ek

load =+*(eq+3901.85*wb*(tb-un)+hz)

end

独孤 发表于 2009-2-14 09:04:18

本案例求解对象是温度场,没有任何耦合,仅仅存在非线性的特点。请问能否推荐下运算速度快的求解器?

重要的是,我能否通过修改.gcn文件中的求解器来一个一个地做试验选定最好的求解器?不知道这个思路是否可行!

祝情人节快乐!

seeksilence 发表于 2009-2-15 22:55:43

给的材料参数是否合理? (rc ek 1085;0.42;)
先别管快不快,分析下结果合不合理,结果不对再快也没意义

zhoulon 发表于 2009-2-16 08:31:03

有个getsolv命令可以修改求解器的。
页: [1]
查看完整版本: 关于un上一步长数值的问题