2 % a jm/mkim version of propagate
\r
3 % follows Osher-Fedkiw and Mitchell toolbox
\r
7 %xs=15; % domain size
\r
10 %m=121 % domain mesh
\r
16 speed=2 % wind speed
\r
21 normal_spread_c=1 % speed = r + wind^e * c
\r
27 case {'circlespin','c'}
\r
30 case {'gostraight','g'}
\r
33 case {'physical','p'}
\r
48 normal_spread_c=0.185060861
\r
49 normal_spread_e=1.310758329
\r
52 case {'windmill','w'}
\r
57 case {'spinstardemo','s'},
\r
58 % same as spinStarDemo('low',1)
\r
63 % normal propagation speed
\r
71 case {'o','only growth'}
\r
78 phi=zeros(m,n); % allocate level function
\r
86 case {'straight','s'}
\r
87 vx=speed*cos(alpha)*ones(m,n);
\r
88 vy=speed*sin(alpha)*ones(m,n);
\r
89 case {'circular','c'}
\r
90 [xx,yy]=ndgrid(x-xs/2,y-ys/2);
\r
91 rotation=-0.75 * pi;
\r
104 [xx,yy]=ndgrid(x-xs/2,y-ys/2);
\r
105 [ theta, rad ] = cart2pol(xx, yy);
\r
106 phi = rad - scale * (cos(points * theta) + shift);
\r
107 case {'circle','c'}
\r
108 c=[0.8*xs,0.5*ys]; % center
\r
109 d=3*max(dx,dy); % radius
\r
112 % phi(i,j)=sign(norm([i*dx,j*dy]-c)-d);
\r
113 phi(i,j)=(norm([i*dx,j*dy]-c)-d);
\r
116 case {'widmill','w'}
\r
118 phi(floor(m*0.20):ceil(m*0.45),floor(n*0.49):ceil(n*0.51))=-1;
\r
119 phi(floor(m*0.55):ceil(m*0.80),floor(n*0.49):ceil(n*0.51))=-1;
\r
120 phi(floor(m*0.49):ceil(m*0.51),floor(n*0.20):ceil(n*0.45))=-1;
\r
121 phi(floor(m*0.49):ceil(m*0.51),floor(n*0.55):ceil(n*0.80))=-1;
\r
123 error('no ignition')
\r
127 %r=ones(m,n).*r + 0.04*sqrt(vx.*vx+vy.*vy); % shrinkage correction
\r
128 r=ones(m,n).*r; % make sure it is array
\r
137 % % call the fortran implementation
\r
139 [data3]=prop_test_f(data3,tNow,tNext,...
\r
140 normal_spread_c,normal_spread_e,vx,vy,r,dx,dy);
\r
143 %[ux,uy]=get_advection(phi,r,vx,vy,dx,dy);
\r
144 %vis_wind(ux,uy,dx,dy)
\r
146 [dummy,data2]=prop_ls_cir(data2,tNow,tNext,vx,vy,r,dx,dy,@spread_rate);
\r
148 %[tNow,data2]=prop_ls(data2,tNow,tNext,ux,uy,0,dx,dy);
\r
149 if dofort & domat,
\r
150 err_fort=norm(data3(:)-data2(:))
\r
152 i,warning('large difference between matlab and fortran')
\r
157 vis(data3,vx,vy,dx,dy,tNow);
\r
159 vis(data2,vx,vy,dx,dy,tNow);
\r
163 %err_fort=norm(data3(:)-data2(:))
\r
164 % call the toolbox routines
\r
165 % for that need to be in toolboxls/Examples/OsherFedkiw
\r
167 data = normal_advection(phi,time0,time1,vx,vy,r,dx,dy,'low');
\r
169 err_toolbox=norm(data(:)-data2(:))
\r
174 %-------------------------------------------
\r
176 function vis(u,vx,vy,dx,dy,tNow)
\r
187 set(h,'edgecolor','none')
\r
190 contour3(y,x,u,[0 0],'k')
\r
195 contour(y,x,u,[0 0],'k')
\r
197 vis_wind(vx,vy,dx,dy)
\r
201 disp('no visualization selected, set vis=type to 2d or 3d')
\r
204 title(sprintf('t=%g',tNow));
\r
206 pause(0.3); % for ctrl-c
\r
210 function [phi_out]=prop_test_f(phi,ts,te,c,e,vx,vy,r,dx,dy)
\r
212 if any(any(isnan(phi))), error('phi NaN'), end
\r
214 fid = fopen('prop_test_in.txt','wt');
\r
215 fprintf(fid,fmt,m,n,ts,te,c,e,r,dx,dy);
\r
216 fprintf(fid,fmt,phi,vx,vy);
\r
218 ! prop_test_prog.exe
\r
219 fid = fopen('prop_test_out.txt','rt');
\r
221 error('cannot open prop_test_out.txt')
\r
223 [in,c]=fscanf(fid,'%g');
\r
226 fprintf('read %g terms should have %g\n',c,m*n+1)
\r
227 error('bad number of terms in output file')
\r
230 phi_out=reshape(in(1:c),size(phi));
\r
231 if any(any(isnan(phi_out))), error('phi_out NaN'), end
\r
234 function speed=spread_rate(r,vx,vy,nvx,nvy,scale);
\r
235 speed = r + max(vx.*nvx + vy.*nvy,0);
\r