function [] = FESolveX2D() % MATLAB based 2-D XFEM Solver % J. Grogan (2012) clear all % Define Mesh NumX=4; NumY=1; delX=0.25; delY=0.25; for j=1:NumY+1 for i=1:NumX+1 index=i+(NumX+1)*(j-1); Node(index,1)=single((i-1.))*delX; Node(index,2)=single((j-1.))*delY; end end numNodes=(NumX+1)*(NumY+1); for j=1:NumY for i=1:NumX index=i+NumX*(j-1); Element(index,1)=i+(NumX+1)*(j-1); Element(index,2)=i+(NumX+1)*(j-1)+1; Element(index,3)=i+(NumX+1)*(j)+1; Element(index,4)=i+(NumX+1)*(j); end end numElem=(NumX)*(NumY); % dofs per node ndof=2; % Define Section Properties rho=1.; % initial interface position dpos=0.6; % Initial temperatures Tnew=zeros(numNodes*2,1); Bound=zeros(numNodes*2,1); stored(1)=dpos; for e=1:numElem for n=1:4 crdn=Node(Element(e,n),1); if crdn<=dpos Tnew(2*Element(e,n)-1)=1.; end if crdn<0.01 Bound(2*Element(e,n)-1)=1.; end end end % Define Time Step dtime=0.01; tsteps=10; time=0.; % penalty term Penalty=50.; % Loop through time steps for ts=1:tsteps eNodes=zeros(2*numNodes,1); % Get interface velocity d(1)=dpos+delX; d(2)=dpos+3*delX/4; d(3)=dpos+delX/4; d(4)=dpos; for e=1:numElem crdn1=Node(Element(e,1),1); crdn2=Node(Element(e,2),1); for j=1:4 if d(j)>=crdn1 && d(j)1; count=0; if sign(theta(1))~=sign(theta(2)) count=count+1; f=abs(theta(1))/(abs(theta(1))+abs(theta(2))); xi(count)=f*(crdnx(2)-crdnx(1))+crdnx(1); yi(count)=f*(crdny(2)-crdny(1))+crdny(1); gi(count)=(2.*xi(count)-(crdnx(1)+crdnx(2)))/(-crdnx(1)+crdnx(2)); hi(count)=-1.; end if sign(theta(2))~=sign(theta(3)) count=count+1; f=abs(theta(2))/(abs(theta(2))+abs(theta(3))); xi(count)=f*(crdnx(3)-crdnx(2))+crdnx(2); yi(count)=f*(crdny(3)-crdny(2))+crdny(2); gi(count)=1.; hi(count)=(2.*yi(count)-(crdny(2)+crdny(3)))/(-crdny(2)+crdny(3)); end if sign(theta(3))~=sign(theta(4)) count=count+1; f=abs(theta(3))/(abs(theta(3))+abs(theta(4))); xi(count)=f*(crdnx(4)-crdnx(3))+crdnx(3); yi(count)=f*(crdny(4)-crdny(3))+crdny(3); gi(count)=(2.*xi(count)-(crdnx(4)+crdnx(3)))/(-crdnx(4)+crdnx(3)); hi(count)=1.; end if sign(theta(1))~=sign(theta(4)) count=count+1; f=abs(theta(1))/(abs(theta(1))+abs(theta(4))); xi(count)=f*(crdnx(4)-crdnx(1))+crdnx(1); yi(count)=f*(crdny(4)-crdny(1))+crdny(1); gi(count)=-1.; hi(count)=(2.*yi(count)-(crdny(1)+crdny(4)))/(-crdny(4)+crdny(1)); end c=zeros(2,1); c=(c+1.); for i=1:2; G(i,1)=0.25*(1.-gi(i))*(1.-hi(i)); G(i,3)=0.25*(1.+gi(i))*(1.-hi(i)); G(i,5)=0.25*(1.+gi(i))*(1.+hi(i)); G(i,7)=0.25*(1.-gi(i))*(1.+hi(i)); G(i,2)=-G(i,1)*abs(theta(1)); G(i,4)=-G(i,3)*abs(theta(2)); G(i,6)=-G(i,5)*abs(theta(3)); G(i,8)=-G(i,7)*abs(theta(4)); end pen=Penalty*(G'*G); pfL=Penalty*G'*c; Ke=Ke+pen; else pen=zeros(8); pfL=zeros(8,1); end % Assemble Global Matrices gnum(1)=2*Element(e,1)-1; gnum(2)=2*Element(e,2)-1; gnum(3)=2*Element(e,3)-1; gnum(4)=2*Element(e,4)-1; for i=1:4; for j=1:4; K(gnum(j),gnum(i))=K(gnum(j),gnum(i))+Ke(2*j-1,2*i-1); K(gnum(j)+1,gnum(i))=K(gnum(j)+1,gnum(i))+Ke(2*j,2*i-1); K(gnum(j),gnum(i)+1)=K(gnum(j),gnum(i)+1)+Ke(2*j-1,2*i); K(gnum(j)+1,gnum(i)+1)=K(gnum(j)+1,gnum(i)+1)+Ke(2*j,2*i); M(gnum(j),gnum(i))=M(gnum(j),gnum(i))+Me(2*j-1,2*i-1); M(gnum(j)+1,gnum(i))=M(gnum(j)+1,gnum(i))+Me(2*j,2*i-1); M(gnum(j),gnum(i)+1)=M(gnum(j),gnum(i)+1)+Me(2*j-1,2*i); M(gnum(j)+1,gnum(i)+1)=M(gnum(j)+1,gnum(i)+1)+Me(2*j,2*i); end end for i=1:4; pforce(gnum(i))=pforce(gnum(i))+pfL(2*i-1); pforce(gnum(i)+1)=pforce(gnum(i)+1)+pfL(2*i); end end %Remove NON-ENHANCED DOFs(Reduce Matrices) iindex=0.; for i=1:ndof*numNodes; check=0; % if mod(i,2)==0 && eNodes(i)~=1 % check=1; % end if check==0 iindex=iindex+1; TR1(iindex)=Tnew(i); BR1(iindex)=Bound(i); pforceR1(iindex)=pforce(i); jindex=0; for j=1:ndof*numNodes; check=0; % if mod(j,2)==0 && eNodes(j)~=1 % check=1; % end if check==0 jindex=jindex+1; MR1(iindex,jindex)=M(i,j); KR1(iindex,jindex)=K(i,j); end end end end AR1=KR1+MR1; SubR1=AR1*BR1'; RHSR1=MR1*TR1'-SubR1+pforceR1'; % Apply Boundary Conditions Biindex=0.; for i=1:iindex; if BR1(i)==0.; Biindex=Biindex+1; RHSR2(Biindex)=RHSR1(i); jindex=0; for j=1:iindex; check=0; if BR1(j)==0.; jindex=jindex+1; AR2(Biindex,jindex)=AR1(i,j); end end end end %Solve Tnewr=(AR2^-1)*RHSR2'; % Restore Matrices Biindex=0; for i=1:iindex; if BR1(i)==0.; Biindex=Biindex+1; TR1(i)=Tnewr(Biindex); end end iindex=0; for i=1:ndof*numNodes; check=0; % if mod(i,2)==0 && eNodes(i)~=1 % check=1; % end if check==0 iindex=iindex+1; Tnew(i)=TR1(iindex); end end Tnew end stored';