!機械語で高速化する。TDCさんの、隕石衝突後の熱伝導シュミレーション SECOND 2007/01/27 03:09:39 └!<続く> SECOND 2007/01/27 03:10:41
!機械語で高速化する。TDCさんの、隕石衝突後の熱伝導シュミレーション SECOND 2007/01/27 03:09:39 ツリーへ
!機械語で高速化する。TDCさんの、隕石衝突後の熱伝導シュミレーション |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/01/27 03:09:39 | |
!機械語で高速化する。TDCさんの、隕石衝突後の熱伝導シュミレーション
! TDC 2006/09/02 23:04:00 page-80 !速度のネックは、この部分にあるため、これを主に機械語化します。 !SUB CALC1 ! FOR J=1 TO depth-1 ! LET 冲emp=T(0,J-1)-T(0,J) ! 境界面の温度差を計算 ! LET 價=(d*1)*冲emp*60*60 ! 1m 1時間に移動するエネルギー ! LET T(0,J)=價/J_BOX+T(0,J) ! LET T(0,J-1)=-價/J_BOX+T(0,J-1) ! NEXT J !END SUB !配列 T() を T$ なる長い文字列に変換しましたが、 !配列 T() の先頭をポインターとして、直接DLLに渡す方法はないでしょうか? !機械語部分のソースリスト、実行ファイルなどは、ココにまとめておきました。 ! http://homepage2.nifty.com/neutro/asm/nasm_al.htm !---------- !放射の速度は、怪しい面もありますが、所要時間や結果の照合のため、 !そのまま使用します。 !500MHz Pentium3、古くて遅いパソコンでも、7~10分で、雨降りまで行けます。 !1.7GHz Pentium4、約3分で雨降り、16分で終了。 OPTION ARITHMETIC NATIVE OPTION BASE 0 SET TEXT FONT "MS ゴシック",10 !標準文字サイズ SET TEXT BACKGROUND "OPAQUE" ! plot text with background color 0 LET WID=200 LET depth=500 SET WINDOW -1,WID,-depth,depth LET K273=273 !----------機械語にデータ-を渡す為 T() 配列代わりのT$ 文字列を作る。 OPTION CHARACTER byte !地中の温度の初期値: 0~1m未満=4000℃、1m~501m未満=40℃ LET T$= packDBL$(4000+K273) & REPEAT$(packDBL$(40+K273),depth) ! 8bytes /float ! 数値=T(j)、として読む場合の関数 FUNCTION T(j) LET T=unpackDBL(T$(j*8+1:j*8+8)) END FUNCTION ! T(j)=数値、として書く場合は、T$(j*8+1:j*8+8)=packDBL$( 数値 ) !----------コンクリートの体積比熱(≒1.92倍)を参考にした仮の値 LET d= 1.5 ! 土の熱伝導率 J/(sec・m・K) 温度差が1℃の時、1mの厚さを1秒に流れる熱量 LET J_BOX= 1.9*(4.18*10^6) ! 土の熱容量 J/(m3・K) LET d36B= d*3600/J_BOX !----------放射の速度は、シュテファン・ボルツマンの法則 ! M=σ・T^4(watt/u) σ:5.67×10^-8(watt/udeg4) T:絶対温度 LET σ=5.67*10^(-8) ! (watt/udeg4) LET σ_JBOX=σ/J_BOX LET 定数$= packDBL$(d36B) & packDBL$(σ_JBOX) !---- PRINT "隕石が衝突!!" SET AREA COLOR 6 !黄 DRAW disk WITH SCALE(depth*0.7)*SHIFT(WID/2,0) SET AREA COLOR 4 !赤 DRAW disk WITH SCALE(depth/2)*SHIFT(WID/2,0) PRINT "地表を4000℃に設定で描画" CALL DRAWING WAIT DELAY 1 !---- PRINT "本計算開始!!" !PRINT TIM;"時間経過" CALL calc(T$,depth,定数$) !---- CLEAR SET TEXT COLOR 4 !赤 PLOT TEXT ,AT 0,depth*0.9 :"■熱伝導シュミレーション■ 〜巨大隕石衝突後〜" PLOT TEXT ,AT 0,depth*0.57 :" 土の熱伝導率(仮): "&STR$(d)&"W/(m・deg)" PLOT TEXT ,AT 0,depth*0.5 :" 土の熱容量(仮): "&STR$(J_BOX/1000)&"kJ/(m3・deg)" !<続く> |
└!<続く> SECOND 2007/01/27 03:10:41 ツリーへ
Re: !機械語で高速化する。TDCさんの、隕石衝突後の熱伝導シュミレーション |
返事を書く ノートメニュー |
SECOND <cszcthjjdj> 2007/01/27 03:10:41 | |
!<続く>
!---- PLOT TEXT ,AT WID*0.8,depth*0.2 :"■〜400℃" SET TEXT COLOR 6 !黄 PLOT TEXT ,AT WID*0.8,depth*0.15 :"■400〜100℃" SET TEXT COLOR 3 !緑 PLOT TEXT ,AT WID*0.8,depth*0.1 :"■100〜50℃" SET TEXT COLOR 2 !青 PLOT TEXT ,AT WID*0.8,depth*0.05 :"■50℃以下" !---- DO CALL calc(T$, depth, 定数$) ! 機械語 IF FP(TIM/1000)=0 THEN CALL TEXT1 !文字表示モジュール LOOP UNTIL TIM>=24*365.25 !8766 beep CALL calc1000(T$, depth, 定数$, 1000-MOD(TIM,1000)) ! 機械語 CALL TEXT1 !文字表示モジュール DO CALL calc1000(T$, depth, 定数$, 1000) ! 機械語 CALL TEXT1 !文字表示モジュール LOOP UNTIL T(0)=<50+K273 CALL TEXT1 !文字表示モジュール PRINT "終了!!" SUB TEXT1 !PRINT TIM;"時間経過" SET TEXT COLOR 4 !赤 PLOT TEXT ,AT 0,depth*0.8 :" 隕石衝突後 "&STR$(TIM)&"時間(= "&STR$(ROUND(TIM/24/365.25,2))&"年)経過 " IF TIM>24*365.25 THEN SET TEXT COLOR 2 !青 PLOT TEXT ,AT 0,depth*0.2 :"◆地球が冷える・・・熱放射式 W = σ・T^4" ELSEIF TIM<24*365.25 THEN PLOT TEXT ,AT 0,depth*0.2 :" 地球は岩石蒸気で覆われる・・・ 約1年間" END IF SET TEXT COLOR 4 !赤 PLOT TEXT ,AT 0,depth*0.05 :"地表面 温度 "&STR$(ROUND(T(1)-K273,2))&"℃ " CALL DRAWING SET TEXT COLOR 1 !黒 PLOT TEXT ,AT WID*0.45,-depth*0.0 :"深さ:"&STR$(depth*0)&"m" PLOT TEXT ,AT WID*0.45,-depth*0.5 :"深さ:"&STR$(depth*0.5)&"m" PLOT TEXT ,AT WID*0.45,-depth :"深さ:"&STR$(depth)&"m" IF T(0)<100+K273 THEN SET TEXT COLOR 2 !青 PLOT TEXT ,AT 0,depth*0.12 :" そして、雨も降りはじめた・・・ " !stop END IF END SUB SUB DRAWING FOR J=0 TO depth IF T(J)<=50+K273 THEN SET LINE COLOR 2 !青 ELSEIF T(J)<=100+K273 THEN SET LINE COLOR 3 !緑 ELSEIF T(J)<=400+K273 THEN SET LINE COLOR 6 !黄 ELSE SET LINE COLOR 4 !赤 >400℃ END IF PLOT LINES:0,-J;WID,-J NEXT J END SUB !---- 機械語 計算内容1 !LET T(1)=T(0) ! 地表0~1m未満の 4000℃ を1~2m未満に copy !FOR J=2 TO depth ! LET 價= ( T(J-1)-T(J) )*d36B ! 1m 1時間に移動するエネルギー ! LET T(J)=T(J)+價 ! LET T(J-1)=T(J-1)-價 !NEXT J SUB calc(T$, depth, 定数$) ASSIGN "float.dll","temp00" LET TIM=TIM+1 END SUB !---- 機械語 計算内容2 !FOR t=1 TO count !LET T(0)=T(0)-T(0)^4 *σ_JBOX ! 熱放射式 シュテファン・ボルツマン !FOR J=1 TO depth ! LET 價= ( T(J-1)-T(J) )*d36B ! 1m 1時間に移動するエネルギー ! LET T(J)=T(J)+價 ! LET T(J-1)=T(J-1)-價 !NEXT J !NEXT t SUB calc1000(T$, depth, 定数$, count) ASSIGN "float.dll","temp1000" LET TIM=TIM+count END SUB END |