作者nestea911399 (卡进无底洞)
看板Fortran
标题[问题]请问如何作次数未知的加法?
时间Tue Dec 9 15:32:49 2008
以下是程式码
CALL JUMP(DSMAX(MAT),DS) ! Determines segment length.
CALL STEP(DS,DSEF,NCROSS) ! Moves particle to end of step.
WRITE(17,*) N,MIN(DS,DSEF) ! 决定把DS 跟 DSEF的最小值写入档案
但是现在有一个问题是, 我想把每一颗粒子的总距离加起来,即是
第一颗的总距离,及第二颗的总距离
例如
1 1.451336171889607E-007
1 1.625982843357572E-007
1 7.786647901384987E-008
1 6.001349813026089E-008
1 2.501697761188227E-008
2 1.989400815159079E-008
2 3.863321521894446E-008
2 2.358943701411900E-008
可是在N=1时 有5个小距离
N=2 有3个小距离
在程式里要如何知道每一次所有的小距离,然後相加起来
得到各别的N总距离
谢谢
N=0 ! Shower counter.
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C ------------------------ Shower simulation starts here.
C
101 CONTINUE
N=N+1.0D0
C
C ********** Set the initial state of the primary particle.
C
KPAR=KPARP
X=X0
Y=Y0
Z=Z0
E=E0
CALL GCONE(U,V,W) ! Initial direction.
C
C **** Check if the trajectory intersects the material system.
C
CALL LOCATE
IF(MAT.EQ.0) THEN
CALL STEP(1.0D30,DSEF,NCROSS)
IF(MAT.EQ.0) THEN ! The particle does not enter the system.
PRIM(1)=PRIM(1)+1.0D0
GO TO 105
ENDIF
ENDIF
C
C ************ Primary particle counters.
C
ILB(1)=1 ! Identifies primary particles.
ILB(2)=0
ILB(3)=0
ILB(4)=0
ILB(5)=0
DO IC=1,7
COL(IC)=0.0D0 ! Numbers of events.
ENDDO
DO I=1,NBOD
EDEP(I)=0.0D0 ! Energy deposited in each body.
ENDDO
C ---------------------------------------------------------------------
C ------------------------ Track simulation begins here.
C COMMON/TRACK/E,X,Y,Z,U,V,W,WGHT,KPAR,IBODY,MAT,ILB(5)
CALL CLEANS ! Cleans the secondary stack.
102 CONTINUE
CALL START ! Starts simulation in current medium.
C
103 CONTINUE
CALL JUMP(DSMAX(MAT),DS) ! Determines segment length.
CALL STEP(DS,DSEF,NCROSS) ! Moves particle to end of step.
WRITE(17,*) N,MIN(DS,DSEF)
DS0=DS0+MIN(DS,DSEF)
WRITE(36,*) N,DS0
! DDSS=DDSS+MIN(DS,DSEF)
C
IF(MAT.EQ.0) THEN ! The particle has left the material system.
IEXIT=1 ! Labels emerging particles.
GO TO 104 ! Exit.
ENDIF
C
IF(NCROSS.GT.0) GO TO 102 ! The particle crossed an interface.
C
CALL KNOCK(DE,ICOL) ! Simulates the interaction event.
COL(ICOL)=COL(ICOL)+1.0D0 ! The interaction is counted.
EDEP(IBODY)=EDEP(IBODY)+DE ! Deposited energy counter.
IF(E.LT.EABS(KPAR,mat)) THEN ! The particle has been absorbed.
IEXIT=2 ! Labels absorbed particles.
GO TO 104 ! Exit.
ENDIF
GO TO 103
C ------------------------ The simulation of the track ends here.
C ---------------------------------------------------------------------
104 CONTINUE
C
C ************ Increment particle counters.
C
IF(ILB(1).EQ.1) THEN
PRIM(IEXIT)=PRIM(IEXIT)+1.0D0
DO KC=1,6
AVNI(KC,IEXIT)=AVNI(KC,IEXIT)+COL(KC)
AVNI2(KC,IEXIT)=AVNI2(KC,IEXIT)+COL(KC)**2
ENDDO
ELSE
SEC(KPAR,IEXIT)=SEC(KPAR,IEXIT)+1.0D0
C
C ------------------------ The simulation of the shower ends here.
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
C **** Energies deposited in different bodies.
C
DO KB=1,NBOD
EDEPT(KB)=EDEPT(KB)+EDEP(KB)
VEDEPT(KB)=VEDEPT(KB)+EDEP(KB)**2
ENDDO
C **** Deposited energy distributions in selected bodies or groups of
C bodies (specific of each geometry).
C In this case, EDEP(1,*) = Energy in body 1.
EDISTR=EDEP(1)
IF(EDISTR.GT.1.0D0) THEN
ICH=1.0D0+EDISTR/DEBIN
ICH=MIN(NCHD,ICH)
EDEPD(1,ICH)=EDEPD(1,ICH)+1.0D0
ENDIF
C
105 CONTINUE
C
C ---- End the simulation after the alloted time or after completing
C DSIMS showers.
CALL TIMER(TSEC)
IF(TSEC.LT.TSECA.AND.N.LT.NTOT) GO TO 101
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.106.110
1F:→ noway501:DS2=DS2+DS 12/09 17:40
2F:→ noway501:我觉得你还是把CODE写完整一点出来 CALL放在DO loap里吗? 12/09 17:42
※ 编辑: nestea911399 来自: 140.114.106.110 (12/09 18:21)
3F:推 meteorology:N代表的意思是颗还是粒? 12/09 18:22
4F:→ nestea911399:是代表粒子颗数,谢谢 12/09 18:23
5F:→ nestea911399:我的问题是不知道每一个颗的DS会有几个,谢谢 12/09 18:26
6F:推 meteorology:例如的结果是编号17的档案结果吗? 12/09 18:27
7F:→ nestea911399:对,那是我简化的,原本有40或50几个,只是不能确定N=1 12/09 18:32
8F:→ nestea911399:有几个,N=2时又有几个? 12/09 18:32
9F:→ nestea911399:然後只纪录加到最後一个的总DS,再把总DS写在档案里 12/09 18:33
10F:推 meteorology:这样的话能不能把JUMP的SUB. 贴出来看一下 12/09 18:38
11F:→ meteorology:你试着在WRITE前面加上判断式判断N=1时 sum=sum+1 12/09 18:41
12F:→ nestea911399:不好意思.可是我现在就没办法知道N=1的DS有几个因为 12/09 19:06
13F:→ nestea911399:每次累加的结果都会写进档案,我只要最後的总DS 12/09 19:08
14F:推 meteorology:所以其实你的问题是希望他不要每次累加都输出 12/09 19:16
15F:→ meteorology:而是只要他累加过後的结果? 12/09 19:16
16F:→ nestea911399:恩...因为我没办法知道他每一次会有几个DS出现 12/09 21:15
17F:推 meteorology:我的想法是想办法将N=1要转成2前 做输出 12/10 00:23
18F:→ meteorology:所以可以放在N=N+1DO 这行下面 打上 12/10 00:25
19F:→ meteorology:WRITE(17,*) N-1,MIN(DS,DSEF) 12/10 00:25
20F:推 meteorology:看到整个都花了XDDDDDDDD 12/10 00:32
21F:→ nestea911399:谢谢,那请问第一颗怎麽办 12/10 00:34
22F:→ nestea911399:不行捏,因为要是把WRITE放在N=N+1DO下面DS会等於零 12/10 00:44
23F:推 meteorology:那放在104 continue下呢? 试试看 n不用-1 12/10 02:29
24F:推 snowanimal:简单 你读完第一行之後再回去读第一行就好啦 12/10 10:12
25F:→ nestea911399:请问你的第一行是指哪里? 12/10 12:54
26F:→ snowanimal:资料的第一行 12/10 23:25
27F:推 meteorology:我想雪大的说法应该是档案输出後 去读每个N的第一行 12/11 00:00
28F:→ snowanimal:读进资料後 弄两个变数 一个当计数器 一个当作判定式 12/11 11:06