[問題] 跑迴圈

看板Fortran作者 (卡進無底洞)時間16年前 (2008/12/15 15:49), 編輯推噓10(10031)
留言41則, 5人參與, 最新討論串1/1
PARAMETER (RC=3.0D-4, RN=2.0D-4) 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 RY=RC*RAND(1.0D0)**(1.0/3.0) IF(RY.LT.2.0D-4) GO TO 101 PTHETA=ACOS(2*RAND(1.0D0)-1) PPHI=2*PI*RAND(1.0D0) X=RY*SIN(PTHETA)*COS(PPHI) Y=RY*SIN(PTHETA)*SIN(PPHI) Z=RY*COS(PTHETA) 請問我現在假設有一個球的模型,而每一個亂數得到的座標會是空間上的一點 我現在是想點數均勻分布在大球跟小球之間 所以我假設IF(RY.LT.2.0D-4) GO TO 101,若是RY小於小球的半徑就重新跑 但是有個問題是跑完了就會由下一個接下去 例如 1符合但2不符合就從3開始 但是2就沒辦法記錄到就變成只有兩個結果, 有辦法解決這個問題嗎 謝謝大家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.106.110

12/15 16:32, , 1F
把N=N+1移到IF下一行... 問問題之前你有沒有想過@@
12/15 16:32, 1F

12/15 16:37, , 2F
N=N+1不能移到下面,因為下面還有整個迴圈像上ㄧ篇那
12/15 16:37, 2F

12/15 16:39, , 3F
要是移到下面KPAR就沒辦法紀錄粒子數
12/15 16:39, 3F

12/15 16:52, , 4F
所以你是想要RY小於小球的半徑也要輸出嗎?
12/15 16:52, 4F

12/15 16:55, , 5F
可以想像只要把點分布在甜甜圈就中間空心的不要
12/15 16:55, 5F

12/15 16:56, , 6F
可是就你的例如感覺在空心部份你是要粒子數資料
12/15 16:56, 6F

12/15 17:01, , 7F
就是當RY小於R時我不要執行,RY大於RN才執行
12/15 17:01, 7F

12/15 17:04, , 8F
像我的寫法好像可以達到我的目的但是有些粒就紀錄不
12/15 17:04, 8F

12/15 17:05, , 9F
到,因為若RY<R時,N就會再+1就變成第三顆繼續執行
12/15 17:05, 9F

12/15 17:12, , 10F
恩那你就在if下先把你要的粒子write到檔案 再GOTO
12/15 17:12, 10F

12/15 17:12, , 11F
到101
12/15 17:12, 11F

12/15 17:14, , 12F
可是那是亂數產生我沒辦法知道哪一次要紀錄,我只能把
12/15 17:14, 12F

12/15 17:14, , 13F
不要的丟掉
12/15 17:14, 13F

12/15 17:15, , 14F
那必須看你要的變數是什麼了~
12/15 17:15, 14F

12/15 17:20, , 15F
因為每個人專業不同 所以這些輸出可能跟理論有關
12/15 17:20, 15F

12/15 17:20, , 16F
建議你先去翻翻理論~或許就可以知道要的是什麼~
12/15 17:20, 16F

12/15 18:31, , 17F
你不PO出完整的程式碼 或是完整的do block 很難回答
12/15 18:31, 17F

12/15 18:32, , 18F
感覺就是if處裡一下就能解決的問題
12/15 18:32, 18F

12/15 18:33, , 19F
你還是問實驗室學長姐比較快...
12/15 18:33, 19F

12/15 18:38, , 20F
完整CODE在上ㄧ篇已經有了,不好意思,我只是想問說,如
12/15 18:38, 20F

12/15 18:39, , 21F
何讓每一顆粒子都是在小球以外出現,謝謝
12/15 18:39, 21F

12/15 23:24, , 22F
你不是因為沒有辦法看到半徑小於小球的數據?
12/15 23:24, 22F

12/15 23:25, , 23F
如果是這樣你原本的程式不是就可以了?
12/15 23:25, 23F

12/15 23:28, , 24F
因為你已經做了大於小球的資料輸出
12/15 23:28, 24F

12/16 15:31, , 25F
可是因為是亂數產生有可能會有小於RN的情況發生,所以
12/16 15:31, 25F

12/16 15:32, , 26F
若是用我的方法當小於RN就重新跑那會有沒記錄到的情
12/16 15:32, 26F

12/16 15:33, , 27F
況,謝謝
12/16 15:33, 27F

12/16 15:37, , 28F
你亂數產生是產生RY嗎?
12/16 15:37, 28F

12/16 15:49, , 29F
12/16 15:49, 29F

12/16 16:20, , 30F
你的問題有點亂~因為這樣看下來的確小於RN的半徑就
12/16 16:20, 30F

12/16 16:21, , 31F
會不見 如果你要小於RN的也要列出來 有兩個辦法
12/16 16:21, 31F

12/16 16:22, , 32F
一個是把IF去掉 讓迴圈跑完 並且輸出RY的值 從中挑
12/16 16:22, 32F

12/16 16:23, , 33F
選大於RN的RY的結果
12/16 16:23, 33F

12/16 16:24, , 34F
另外就是在程式中小於RN的值做另外的檔案輸出
12/16 16:24, 34F

12/18 12:57, , 35F
code若不是自己寫的,建議你不要看程式碼,再重寫一次
12/18 12:57, 35F

12/18 13:06, , 36F
ps.僅是個人建議,無惡意
12/18 13:06, 36F

12/18 18:51, , 37F
幫原po說一下~~這支程式是上萬行~XDD
12/18 18:51, 37F

12/18 23:18, , 38F
謝謝M大幫我說明謝謝大家
12/18 23:18, 38F

12/18 23:19, , 39F
那我的推荐是 把每個獨立的地方都儘量拆成subroutine
12/18 23:19, 39F

12/18 23:19, , 40F
或許很蠢 不過釐清問題很方便
12/18 23:19, 40F

12/19 13:23, , 41F
樓上 這不蠢阿 這是好方法!y
12/19 13:23, 41F
文章代碼(AID): #19HWlq5v (Fortran)
文章代碼(AID): #19HWlq5v (Fortran)