Temperature distribution in a square plate (final) version4
Posted: Sat Mar 08, 2014 9:21 pm
Added in this version:
1. Switching on/off the numbers
2. Reset function
3. Stable iteration
The program can still be run on either iPhones and iPads.
1. Switching on/off the numbers
2. Reset function
3. Stable iteration
The program can still be run on either iPhones and iPads.
Code: Select all
' Temperature distribution in a thin, square plate (version 4)
' The plate is isolated on both sides, heat can only
' escape along the edges. Heat sources warm up the plate
' in one or more points; these points may be toggled on/off by
' tapping on the plate.
' The number of rows and columns must be entered upon startup.
' The strength of the heat sources can be regulated by the slider.
' The other slider sets the thermal conductivity, which is a material
' property. The temperature distribution is shown in colors and in
' numbers.
' The "outside" temperature along the edges is fixed on 0 degrees.
' programmed by "Henko", march 2014
'
input "mesh size : ": nb ! nb=max(nb,7) ! nb1=nb+1
graphics ! graphics clear .8,.8,.8
fill color .8,.8,.8 ! draw color 0,0,0
sw=screen_width() ! b=floor((sw-20)/nb) ! st=floor((sw-b*nb)/2)
dim to(nb+2,nb+2),q(nb1,nb1),in(nb1,nb1)
q_in=75 ! labda=0.125 ! ctar=.5 ! cnew=.5 ! cv=1 ! tmax=300
for i=0 to nb1
to(0,i)=0 ! to(nb1,i)=0 ! to(i,0)=0 ! to(i,nb1)=0
next i
rad=(sw-2*st)/52 ! sp=5*rad ! stu=2*st+b*nb
if sw<500 then draw font size 12
for i=0 to 10
t=i/10 ! t_color(t) ! fill circle st+rad+sp*i,stu+rad size rad
draw text n2a$(i*tmax/10,3,0) at sp*i,stu+2.5*rad
next i
if sw<500 then draw font size 12 else draw font size 16
ht=stu+5*rad
slider "heat" value .5 at st,stu+6*rad hsize sw-2*st-100
draw text "heat" at sw/2-75,ht
draw text "zero" at st,ht ! draw text "max" at sw-st-125,ht
draw text "numbers" at sw-st-70,ht
draw text "on/off" at sw-st-66,ht+12
switch "numbers" state 1 at sw-72,ht+26
if sw<500 then fac=13 else fac=10 ! ht=stu+(fac-1)*rad
slider "cond" value .5 at st,stu+fac*rad hsize sw-2*st-100
draw text "conductivity" at sw/2-80,ht
draw text "zero" at st,ht ! draw text "max" at sw-st-125,ht
button "reset" title "reset" at sw-75,ht+18 size 60,30
init_mesh(20,.5) ! in(nb/2+1,nb/2+1)=1
draw color .3,.3,.3
loop:
disp(to)
for i=1 to nb ! for j=1 to nb
q(i,j) += labda*(to(i-1,j)+to(i+1,j)+to(i,j-1)+to(i,j+1)-4*to(i,j))
q(i,j) += q_in*in(i,j)
next j ! next i
for i=1 to nb ! for j=1 to nb ! to(i,j)=q(i,j)/cv ! next j ! next i
if slider_changed("heat") then q_in=150*slider_value("heat")
if slider_changed("cond") then cnew=slider_value("cond")
ctar=.7*ctar+.3*cnew ! labda=0.25*ctar
get touch 0 as xt,yt
if xt>0 and xt>st and xt<sw-st and yt>st and yt<sw-st then
x=floor((xt-st)/b)+1 ! y=floor((yt-st)/b)+1 ! in(x,y)=1-in(x,y)
end if
if button_pressed("reset") then init_mesh(1,0)
goto loop
end
def init_mesh(tt,sl)
for i=1 to .nb ! for j=1 to .nb
.to(i,j)=tt ! .q(i,j)=tt*cv ! .in(i,j)=0
next j ! next i
.ctar=sl ! .cnew=sl ! .q_in=150*sl
slider "heat" set value sl ! slider "cond" set value sl
end def
def t_color(t)
if t<0 then t=0 ! if t>1 then t=1
if t<0.2 then
r=0 ! g=0 ! b=5*t
else
if t<0.7 then
r=2*(t-0.2) ! g=0 ! b=2*(0.7-t)
else
if t<0.9 then
r=1 ! g=5*(t-0.7) ! b=0
else
r=1 ! g=1 ! b=10*(t-0.9)
end if
end if
end if
fill color r,g,b
end def
def disp (t(,))
graphics lock
if .sw<500 then draw font size 10 else draw font size 16
for i=1 to .nb ! for j=1 to .nb
x=.st+.b*(i-1) ! y=.st+.b*(j-1)
t_color(t(i,j)/.tmax)! fill rect x,y to x+.b,y+.b
if .nb<20 and switch_state("numbers") then draw text int(t(i,j)) at x+.b/5,y+.b/4
next j ! next i
slen=.st+.nb*.b
for s=.st to slen step .b
draw line .st,s to slen,s ! draw line s,.st to s,slen
next s
graphics unlock
end def
def n2a$(num,lang,dec)
b$=" "
fac=10^dec
num$=floor(fac*num+.5)/fac
tot=lang-len(num$)
if tot<1 then tot=1
a$=substr$(b$,1,tot) & num$
n2a$=a$
end def