unit Fil_XYZ_MY_lev; interface{-------------------------------------------------------------} const Nx=50; {net nodes amount on X axe} Ny=50; {net nodes amount on Y axe} Nk=50; Mx=Nx+1; My=Ny+1; Mk=Nk+1; sdStop=19e-4; {stop value for relative deviation} rlc=12; {real output digits amount} STau=0.9; {value for relaxation parameter} gamma1=1e-5; {--epidermis--} gamma2=0.1; {--Sosochk.sloi--} gamma3=5; {--vascular--} gamma4=0.01; {--setchat.sloi--} gamma5=5; {--nervous cells--} gamma6=0.1; {--subcutaneus fat--} gamma7=1; {--muscle--} gamma8=1; {--pora--} type U_Matrix = array[1..Mx,1..My,1..Mk] of single; GammaArray = array[1..Mx,1..My,1..Mk] of single; var tau : double; {relaxation parameter} num : integer; u, u1 : U_Matrix; {auxillary parameters while computing} upredict: double; gamma : GammaArray; {deviation sum control parameters} sd, sad, sadMax: double; procedure SetParameters; procedure Compute; { procedure Current; } implementation{--------------------------------------------------------} procedure SetParameters; var i, j, k : word; begin {----------------------Set parameters----------------------} tau:=STau; {deviation sum control parameters} sd:=1e+9; sadMax:=Mx*My*Mk; for i:=1 to Mx do for j:=1 to My do for k:=1 to Mk do begin {----------------------gamma----------------------} gamma[i,j,k]:=gamma7; if ((k>=41)and(k<=42))or((k>=8)and(k<10)) then gamma[i,j,k]:=gamma5; if ((k>=36)and(k<38))or((k>=17)and(k<21)) then gamma[i,j,k]:=gamma3; if (k>25)and(k<35) then gamma[i,j,k]:=gamma6; if ((k>=35)and(k<36))or((k>=38)and(k<41))or((k>42)and(k<=43)) then gamma[i,j,k]:=gamma4; if (k>43)and(k<48) then gamma[i,j,k]:=gamma2; if (k>=48) then gamma[i,j,k]:=gamma1; if ((((i-25)*(i-25)+(j-25)*(j-25))<=100)and((k>=44)and(k<47)))or ((j<15)and((k>=45)and(k<46)))or((j>35)and((k>=45)and(k<46))) then gamma[i,j,k]:=gamma3; {pora} if ((((i-22)*(i-22)+(j-27)*(j-27))<=1)and(k>32)or (((i-22)*(i-22)+(j-27)*(j-27)+(k-30)*(k-30))<=4))or ((((i-7)*(i-7)+(j-7)*(j-7))<=1)and(k>32)or (((i-7)*(i-7)+(j-7)*(j-7)+(k-30)*(k-30))<=4))or ((((i-35)*(i-35)+(j-9)*(j-9))<=1)and(k>32)or (((i-35)*(i-35)+(j-9)*(j-9)+(k-30)*(k-30))<=4))or ((((i-43)*(i-43)+(j-39)*(j-39))<=1)and(k>32)or (((i-43)*(i-43)+(j-39)*(j-39)+(k-30)*(k-30))<=4)) then gamma[i,j,k]:=gamma8; {rufini} if ((((i-14)*(i-14)+(j-15)*(j-15))<=1)and(k=35))or ((((i-25)*(i-25)+(j-33)*(j-33))<=1)and(k=35))or ((((i-6)*(i-6)+(j-33)*(j-33))<=1)and(k=35))or ((((i-32)*(i-32)+(j-14)*(j-14))<=1)and(k=35))or ((((i-45)*(i-45)+(j-29)*(j-29))<=1)and(k=35)) then gamma[i,j,k]:=gamma5; {meisnera i merkelya} if ((((i-11)*(i-11)+(j-41)*(j-41)+(k-47)*(k-47))<=1))or ((((i-15)*(i-15)+(j-21)*(j-21)+(k-47)*(k-47))<=1))or ((((i-18)*(i-18)+(j-30)*(j-30)+(k-47)*(k-47))<=1))or ((((i-21)*(i-21)+(j-19)*(j-19)+(k-47)*(k-47))<=1))or ((((i-29)*(i-29)+(j-27)*(j-27)+(k-47)*(k-47))<=1))or ((((i-33)*(i-33)+(j-33)*(j-33)+(k-47)*(k-47))<=1))or ((((i-35)*(i-35)+(j-21)*(j-21)+(k-47)*(k-47))<=1)) then gamma[i,j,k]:=gamma5; {pachini} if ((((i-7)*(i-7)+(j-25)*(j-25))<=9)and((k>30)and(k<=40)))or ((((i-27)*(i-27)+(j-16)*(j-16))<=9)and((k>30)and(k<=40)))or ((((i-35)*(i-35)+(j-41)*(j-41))<=9)and((k>30)and(k<=40)))or ((((i-44)*(i-44)+(j-19)*(j-19))<=9)and((k>30)and(k<=40))) then gamma[i,j,k]:=gamma5; end; end;{----------------------Set parameters----------------------} procedure FreeBoundary; var i, j, k : integer; delta:single; begin {-----------------------FreeBoundary----------------------} for i:=1 to Mx do for j:=1 to My do begin u1[i,j,1]:=-0.7; u1[i,j,Mk]:=-0.8; end; delta:=abs(u1[1,1,1]-u1[1,1,Mk])/Nk; for i:=1 to Mx do for k:=1 to Mk do begin u1[i,1,k]:=-0.7-delta*(k-1); u1[i,My,k]:=-0.7-delta*(k-1); end; for j:=1 to My do for k:=1 to Mk do begin u1[1,j,k]:=-0.7-delta*(k-1); u1[Mx,j,k]:=-0.7-delta*(k-1); end; end;{------------------------FreeBoundary----------------------} {Procedure Current; var Ji, C, Cd, Cur : single; i, j, k : integer; begin{--------------------Current Computing-------------------} { Cd:=0; for i:=1 to Mr do for j:=1 to Mz do for k:=1 to Mk do begin C:=0; if ((((i-20)*(i-20)+(j-20)*(j-20))>=225)and(k>115)and(k<=125)and(i>=7)and(i<17)and(j<20)and(((i-20)*(i-20)+(j-20)*(j-20))<=256)) then begin Ji:=gamma[i+1,j+1,k]*(u[i+3,j+3,k]-u[i,j,k])/(3*0.5e-3); if Ji > 0 then C:=C+Ji; end; Cd:=Cd+C; end; Cur:=Cd*pi*sqr(5e-3)/4; write(Cd,Cur,1/Cur); readln; Cd:=0; for i:=1 to Mr do for j:=1 to Mz do for k:=1 to Mk do begin C:=0; if ((((i-21)*(i-21)+(j-21)*(j-21))>=225)and(k>40)and(k<60)and(((i-21)*(i-21)+(j-21)*(j-21))<=256)) then begin if (i<=21)and(j<=21) then Ji:=gamma1*(u[i+3,j+3,k]-u[i,j,k])/(3*0.5e-3) else if (i>21)and(j<=21) then Ji:=gamma1*(u[i-3,j+3,k]-u[i,j,k])/(3*0.5e-3) else if (i<=21)and(j>21) then Ji:=gamma1*(u[i+3,j-3,k]-u[i,j,k])/(3*0.5e-3) else if (i>21)and(j>21) then Ji:=gamma1*(u[i-3,j-3,k]-u[i,j,k])/(3*0.5e-3); if Ji < 0 then C:=C+Ji; end; Cd:=Cd+C; end; Cur:=Cd*pi*75e-4*1e-2; write(Cd,Cur,1/Cur); readln; end;{---------------------Current Computing--------------------} procedure Compute; var IterNum, i, j, k : integer; begin IterNum:=0; {---------------------computation itself---------------------} while {IterNum<800} sd>sdStop do begin {-----main loop-----} sad:=0; for i:=2 to Mx{-1} do {-----inner points scanning-----} for j:=2 to My{-1} do for k:=2 to Mk{-1} do begin if gamma[i,j,k]<>gamma[i-1,j,k] then upredict:=( gamma[i-1,j,k] * U[i-1,j,k] + gamma[i,j,k] * U[i+1,j,k] ) / ( gamma[i-1,j,k] + gamma[i,j,k] ) else if gamma[i+1,j,k]<>gamma[i,j,k] then upredict:=( gamma[i,j,k] * U[i-1,j,k] + gamma[i+1,j,k] * U[i+1,j,k] ) / ( gamma[i+1,j,k] + gamma[i,j,k] ) else if gamma[i,j,k]<>gamma[i,j-1,k] then upredict:=( gamma[i,j-1,k] * U[i,j-1,k] + gamma[i,j,k] * U[i,j+1,k] ) / ( gamma[i,j-1,k] + gamma[i,j,k] ) else if gamma[i,j+1,k]<>gamma[i,j,k] then upredict:=( gamma[i,j,k] * U[i,j-1,k] + gamma[i,j+1,k] * U[i,j+1,k] ) / ( gamma[i,j+1,k] + gamma[i,j,k] ) else if gamma[i,j,k]<>gamma[i,j,k-1] then upredict:=( gamma[i,j,k-1] * U[i,j,k-1] + gamma[i,j,k] * U[i,j,k+1] ) / ( gamma[i,j,k-1] + gamma[i,j,k] ) else if gamma[i,j,k+1]<>gamma[i,j,k] then upredict:=( gamma[i,j,k] * U[i,j,k-1] + gamma[i,j,k+1] * U[i,j,k+1] ) / ( gamma[i,j,k+1] + gamma[i,j,k] ) else { if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i-1,j-1,k] * U[i-1,j-1,k] + gamma[i,j,k] * U[i+1,j+1,k] ) / ( gamma[i-1,j-1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i-1,j,k-1] * U[i,j,k-1] + gamma[i,j,k] * U[i+1,j,k+1] ) / ( gamma[i-1,j,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k-1])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i,j-1,k-1] * U[i,j-1,k-1] + gamma[i,j,k] * U[i,j+1,k+1] ) / ( gamma[i,j-1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i,j,k] * U[i-1,j-1,k] + gamma[i+1,j+1,k] * U[i+1,j+1,k] ) / ( gamma[i+1,j+1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i,j,k] * U[i,j,k-1] + gamma[i+1,j,k+1] * U[i+1,j,k+1] ) / ( gamma[i+1,j,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k+1])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i,j,k] * U[i,j-1,k-1] + gamma[i,j+1,k+1] * U[i,j+1,k+1] ) / ( gamma[i,j+1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i-1,j-1,k-1] * U[i-1,j-1,k-1] + gamma[i,j,k] * U[i+1,j+1,k+1] ) / ( gamma[i-1,j-1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i,j,k] * U[i-1,j-1,k-1] + gamma[i+1,j+1,k+1] * U[i+1,j+1,k+1] ) / ( gamma[i+1,j+1,k+1] + gamma[i,j,k] ) } if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i-1,j-1,k] * U[i-1,j-1,k] + gamma[i,j,k] * U[i+1,j+1,k] ) / ( gamma[i-1,j-1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i-1,j+1,k] * U[i-1,j+1,k] + gamma[i,j,k] * U[i+1,j-1,k] ) / ( gamma[i-1,j+1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i+1,j+1,k] * U[i+1,j+1,k] + gamma[i,j,k] * U[i-1,j-1,k] ) / ( gamma[i+1,j+1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i+1,j-1,k] * U[i+1,j-1,k] + gamma[i,j,k] * U[i-1,j+1,k] ) / ( gamma[i+1,j-1,k] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i-1,j,k-1] * U[i-1,j,k-1] + gamma[i,j,k] * U[i+1,j,k+1] ) / ( gamma[i-1,j,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i-1,j,k+1] * U[i-1,j+1,k+1] + gamma[i,j,k] * U[i+1,j,k-1] ) / ( gamma[i-1,j,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i+1,j,k+1] * U[i+1,j,k+1] + gamma[i,j,k] * U[i-1,j,k-1] ) / ( gamma[i+1,j,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i+1,j,k-1] * U[i+1,j,k-1] + gamma[i,j,k] * U[i-1,j,k+1] ) / ( gamma[i+1,j,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k-1])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i,j-1,k-1] * U[i,j-1,k-1] + gamma[i,j,k] * U[i,j+1,k+1] ) / ( gamma[i,j-1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k-1])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i,j+1,k-1] * U[i,j+1,k-1] + gamma[i,j,k] * U[i,j-1,k+1] ) / ( gamma[i,j+1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k+1])and(gamma[i,j,k]<>gamma[i,j+1,k]) then upredict:=( gamma[i,j,k] * U[i,j-1,k-1] + gamma[i,j+1,k+1] * U[i,j+1,k+1] ) / ( gamma[i,j+1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i,j,k+1])and(gamma[i,j,k]<>gamma[i,j-1,k]) then upredict:=( gamma[i,j,k] * U[i,j+1,k-1] + gamma[i,j-1,k+1] * U[i,j-1,k+1] ) / ( gamma[i,j-1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i-1,j-1,k-1] * U[i-1,j-1,k-1] + gamma[i,j,k] * U[i+1,j+1,k+1] ) / ( gamma[i-1,j-1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i,j,k] * U[i-1,j-1,k-1] + gamma[i+1,j+1,k+1] * U[i+1,j+1,k+1] ) / ( gamma[i+1,j+1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i-1,j-1,k+1] * U[i-1,j-1,k+1] + gamma[i,j,k] * U[i+1,j+1,k-1] ) / ( gamma[i-1,j-1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i,j,k] * U[i-1,j+1,k-1] + gamma[i+1,j-1,k+1] * U[i+1,j-1,k+1] ) / ( gamma[i+1,j-1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j-1,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i+1,j-1,k-1] * U[i+1,j-1,k-1] + gamma[i,j,k] * U[i-1,j+1,k+1] ) / ( gamma[i+1,j-1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i,j,k] * U[i+1,j-1,k+1] + gamma[i-1,j+1,k-1] * U[i-1,j+1,k-1] ) / ( gamma[i-1,j+1,k-1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i-1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k])and(gamma[i,j,k]<>gamma[i,j,k+1]) then upredict:=( gamma[i-1,j+1,k+1] * U[i-1,j+1,k+1] + gamma[i,j,k] * U[i+1,j-1,k-1] ) / ( gamma[i-1,j+1,k+1] + gamma[i,j,k] ) else if (gamma[i,j,k]<>gamma[i+1,j,k])and(gamma[i,j,k]<>gamma[i,j+1,k])and(gamma[i,j,k]<>gamma[i,j,k-1]) then upredict:=( gamma[i,j,k] * U[i-1,j-1,k+1] + gamma[i+1,j+1,k-1] * U[i+1,j-1,k+1] ) / ( gamma[i+1,j+1,k-1] + gamma[i,j,k] ) else upredict:= ( U[i+1,j,k] + U[i-1,j,k] + U[i,j+1,k] + U[i,j-1,k] + U[i,j,k+1] + U[i,j,k-1] ) / 6; u1[i,j,k]:=tau*upredict+(1-tau)*u[i,j,k]; sad:=sad+abs(upredict-u[i,j,k]); end; FreeBoundary; sd:=sad/sadMax; IterNum:=IterNum+1; u:=u1; writeln('sd=',sd:rlc,' iter=',iternum); end; {-----main loop-----} readln; end;{---------------------------Compute--------------------------- } Begin End.