Page 1 of 1

Temperature distribution in a square plate (final) version4

Posted: Sat Mar 08, 2014 9:21 pm
by Henko
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.

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

Re: Temperature distribution in a square plate (final) versi

Posted: Sat Mar 08, 2014 9:26 pm
by Henko
It's not easy to produce one program for both series (iPhone and iPad), as the ratios between width and height differs, and also because the objects like switch and slider are almost of the same size. They cannot be sized by the programmer like with the buttons ore input fields.