新しく発言する EXIT インデックスへ
!機械語で高速化する。TDCさんの、隕石衝突...

  !機械語で高速化する。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


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。