Add scripts and inp files.
This commit is contained in:
parent
ad937f2602
commit
e19f869a1e
390 changed files with 6580687 additions and 10 deletions
154
Unpublished/XFEM/Other/2DSimp.m
Normal file
154
Unpublished/XFEM/Other/2DSimp.m
Normal file
|
@ -0,0 +1,154 @@
|
|||
function [] = 2DSimp()
|
||||
% MATLAB based 2-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Mesh
|
||||
NumX=3;
|
||||
NumY=3;
|
||||
delX=1.;
|
||||
delY=1.;
|
||||
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);
|
||||
Element(index,4)=i+(NumX+1)*(j)+1;
|
||||
end
|
||||
end
|
||||
numElem=(NumX)*(NumY);
|
||||
% dofs per node
|
||||
ndof=1;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% initial interface position
|
||||
dpos=0.25;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes,1);
|
||||
Bound=zeros(numNodes,1);
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
for n=1:4
|
||||
crdn=Node(Element(e,n),1);
|
||||
if crdn<=dpos
|
||||
Tnew(Element(e,n))=1.;
|
||||
Bound(Element(e,n))=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.05;
|
||||
tsteps=20;
|
||||
time=0.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(4*ndof);
|
||||
Me=zeros(4*ndof);
|
||||
for icrd=1:4;
|
||||
crdnx(icrd)=Node(Element(e,icrd),1);
|
||||
crdny(icrd)=Node(Element(e,icrd),2);
|
||||
end
|
||||
% regular element - fix extra dofs
|
||||
gpos=1/sqrt(3.);
|
||||
gx(1)=-gpos;
|
||||
gx(2)=gpos;
|
||||
gx(3)=gpos;
|
||||
gx(4)=-gpos;
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=-gpos;
|
||||
hx(4)=gpos;
|
||||
% Loop Through Int Points
|
||||
for i=1:4;
|
||||
g=gx(i);
|
||||
h=hx(i);
|
||||
phi(1)=0.25*(1.-g)*(1.-h);
|
||||
phi(2)=0.25*(1.+g)*(1.-h);
|
||||
phi(3)=0.25*(1.+g)*(1.+h);
|
||||
phi(4)=0.25*(1.-g)*(1.+h);
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
phig(1)=0.25*-(1.-h);
|
||||
phig(2)=0.25*(1.-h);
|
||||
phig(3)=0.25*(1.+h);
|
||||
phig(4)=0.25*-(1.+h);
|
||||
phih(1)=0.25*-(1.-g);
|
||||
phih(2)=0.25*-(1.+g);
|
||||
phih(3)=0.25*(1.+g);
|
||||
phih(4)=0.25*(1.-g);
|
||||
rjac=zeros(2,2);
|
||||
for iter=1:4
|
||||
rjac(1,1)=rjac(1,1)+phig(iter)*crdnx(iter);
|
||||
rjac(1,2)=rjac(1,2)+phig(iter)*crdny(iter);
|
||||
rjac(2,1)=rjac(2,1)+phih(iter)*crdnx(iter);
|
||||
rjac(2,2)=rjac(2,2)+phih(iter)*crdny(iter);
|
||||
end
|
||||
djac=rjac(1,1)*rjac(2,2)-rjac(1,2)*rjac(2,1);
|
||||
rjaci(1,1)= rjac(2,2)/djac;
|
||||
rjaci(2,2)= rjac(1,1)/djac;
|
||||
rjaci(1,2)=-rjac(1,2)/djac;
|
||||
rjaci(2,1)=-rjac(2,1)/djac ;
|
||||
for iter=1:4
|
||||
phix(iter)=rjaci(1,1)*phig(iter)+rjaci(1,2)*phih(iter);
|
||||
phiy(iter)=rjaci(2,1)*phig(iter)+rjaci(2,2)*phih(iter);
|
||||
end
|
||||
we=djac;
|
||||
Ke=Ke+we*cond*(phix'*phix+phiy'*phiy);
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
% Assemble Global Matrices
|
||||
gnum(1)=Element(e,1);
|
||||
gnum(2)=Element(e,2);
|
||||
gnum(3)=Element(e,3);
|
||||
gnum(4)=Element(e,4);
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum(j),gnum(i))=K(gnum(j),gnum(i))+Ke(j,i);
|
||||
M(gnum(j),gnum(i))=M(gnum(j),gnum(i))+Me(j,i);
|
||||
end
|
||||
end
|
||||
end
|
||||
%Remove inactive DOFs(Reduce Matrices)
|
||||
RHS=M*Tnew;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i);
|
||||
jindex=0;
|
||||
for j=1:ndof*numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
StiffI=Ared^-1;
|
||||
Tnewr=(Ared^-1)*RHSred';
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
||||
stored'
|
91
Unpublished/XFEM/Other/AbInp.inp
Normal file
91
Unpublished/XFEM/Other/AbInp.inp
Normal file
|
@ -0,0 +1,91 @@
|
|||
*Heading
|
||||
** Job name: Job-1 Model name: Model-1
|
||||
** Generated by: Abaqus/CAE 6.12-1
|
||||
*Preprint, echo=NO, model=NO, history=NO, contact=NO
|
||||
**
|
||||
** PARTS
|
||||
**
|
||||
*Part, name=Part-1
|
||||
*Node
|
||||
1, 0., 0., 0.
|
||||
2, 0.2, 0., 0.
|
||||
3, 0.4, 0., 0.
|
||||
4, 0.6, 0., 0.
|
||||
5, 0.8, 0., 0.
|
||||
6, 1., 0., 0.
|
||||
7, 1.2, 0., 0.
|
||||
8, 1.4, 0., 0.
|
||||
9, 1.6, 0., 0.
|
||||
10, 1.8, 0., 0.
|
||||
11, 2., 0., 0.
|
||||
*USER ELEMENT,NODES=2,TYPE=U8008,PROP=1,COORDINATES=1,VAR=2,unsymm
|
||||
11,12
|
||||
*Element, type=U8008,ELSET=UEL
|
||||
1, 1, 2
|
||||
2, 2, 3
|
||||
3, 3, 4
|
||||
4, 4, 5
|
||||
5, 5, 6
|
||||
6, 6, 7
|
||||
7, 7, 8
|
||||
8, 8, 9
|
||||
9, 9, 10
|
||||
10, 10, 11
|
||||
*UEL Property, Elset=UEL
|
||||
1.
|
||||
*End Part
|
||||
**
|
||||
**
|
||||
** ASSEMBLY
|
||||
**
|
||||
*Assembly, name=Assembly
|
||||
**
|
||||
*Instance, name=Part-1-1, part=Part-1
|
||||
*End Instance
|
||||
**
|
||||
*Nset, nset=_PickedSet16, internal, instance=Part-1-1
|
||||
1,
|
||||
*Nset, nset=_PickedSet17, internal, instance=Part-1-1
|
||||
2,
|
||||
*Nset, nset=Set-6, instance=Part-1-1
|
||||
1,
|
||||
*End Assembly
|
||||
**
|
||||
** MATERIALS
|
||||
**
|
||||
*Material, name=Material-1
|
||||
*Conductivity
|
||||
1.,
|
||||
*Density
|
||||
1.,
|
||||
*Specific Heat
|
||||
1.,
|
||||
** ----------------------------------------------------------------
|
||||
**
|
||||
** Name: Predefined Field-1 Type: Temperature
|
||||
*Initial Conditions, type=TEMPERATURE
|
||||
_PickedSet16, 1.,0.
|
||||
** Name: Predefined Field-2 Type: Temperature
|
||||
*Initial Conditions, type=TEMPERATURE
|
||||
_PickedSet17, 0.,0.
|
||||
** STEP: Step-1
|
||||
**
|
||||
*Step, name=Step-1
|
||||
*Heat Transfer, end=PERIOD, deltmx=100.
|
||||
0.1, 1.6, 1e-09, 0.1,
|
||||
**
|
||||
** BOUNDARY CONDITIONS
|
||||
**
|
||||
** Name: BC-1 Type: Temperature
|
||||
*Boundary
|
||||
Set-6, 11, 11, 1.
|
||||
**
|
||||
** OUTPUT REQUESTS
|
||||
**
|
||||
*Restart, write, frequency=0
|
||||
**
|
||||
** FIELD OUTPUT: F-Output-1
|
||||
**
|
||||
*Output, field, variable=PRESELECT
|
||||
*Output, history, frequency=0
|
||||
*End Step
|
80
Unpublished/XFEM/Other/FESolve.m
Normal file
80
Unpublished/XFEM/Other/FESolve.m
Normal file
|
@ -0,0 +1,80 @@
|
|||
function [] = FESolve()
|
||||
% MATLAB based FE Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=1.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
spec=1.;
|
||||
cond=1.;
|
||||
% Generate Mesh
|
||||
numElem=10;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% Initialize Conditions
|
||||
Tnew=zeros(numNodes,1);
|
||||
Tnew(1)=1.;
|
||||
% Define Time Step
|
||||
dtime=.1;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps;
|
||||
time=time+dtime;
|
||||
K=zeros(numNodes,numNodes);
|
||||
M=zeros(numNodes,numNodes);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem;
|
||||
Ke=zeros(2);
|
||||
Me=zeros(2);
|
||||
gpx(1)=-1./sqrt(3.);
|
||||
gpx(2)=1./sqrt(3.);
|
||||
ajacob=abs(ndCoords(elemNodes(e,2))-ndCoords(elemNodes(e,1)))/2.;
|
||||
% Loop Through Int Points
|
||||
for i=1:2;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(2)=(1.+c)/2.;
|
||||
phic(1)=-0.5;
|
||||
phic(2)=0.5;
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
we=ajacob;
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
K(elemNodes(e,1),elemNodes(e,1))=K(elemNodes(e,1),elemNodes(e,1))+Ke(1,1);
|
||||
K(elemNodes(e,1),elemNodes(e,2))=K(elemNodes(e,1),elemNodes(e,2))+Ke(1,2);
|
||||
K(elemNodes(e,2),elemNodes(e,1))=K(elemNodes(e,2),elemNodes(e,1))+Ke(2,1);
|
||||
K(elemNodes(e,2),elemNodes(e,2))=K(elemNodes(e,2),elemNodes(e,2))+Ke(2,2);
|
||||
M(elemNodes(e,1),elemNodes(e,1))=M(elemNodes(e,1),elemNodes(e,1))+Me(1,1);
|
||||
M(elemNodes(e,1),elemNodes(e,2))=M(elemNodes(e,1),elemNodes(e,2))+Me(1,2);
|
||||
M(elemNodes(e,2),elemNodes(e,1))=M(elemNodes(e,2),elemNodes(e,1))+Me(2,1);
|
||||
M(elemNodes(e,2),elemNodes(e,2))=M(elemNodes(e,2),elemNodes(e,2))+Me(2,2);
|
||||
end
|
||||
%Apply Boundary Conditions (Reduce Matrices)
|
||||
T1=1;
|
||||
RHS=M*Tnew;
|
||||
for i=1:numNodes-1;
|
||||
for j=1:numNodes-1;
|
||||
Kred(i,j)=K(i+1,j+1);
|
||||
Mred(i,j)=M(i+1,j+1);
|
||||
end
|
||||
Subr(i)=(K(i+1,1)+M(i+1,1))*T1;
|
||||
RHSr(i)=RHS(i+1);
|
||||
end
|
||||
%Solve
|
||||
StiffI=(Mred+Kred)^-1;
|
||||
Tnewr=StiffI*(RHSr'-Subr');
|
||||
for i=1:numNodes-1;
|
||||
Tnew(i+1)=Tnewr(i);
|
||||
end
|
||||
Tnew(1)=1.;
|
||||
Tnew
|
||||
end
|
||||
|
98
Unpublished/XFEM/Other/FESolveSimp.m
Normal file
98
Unpublished/XFEM/Other/FESolveSimp.m
Normal file
|
@ -0,0 +1,98 @@
|
|||
function [] = FESolveSimp()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=10.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=10;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=1;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes,1);
|
||||
Bound=zeros(numNodes,1);
|
||||
Tnew(1)=1.;
|
||||
Bound(1)=1.;
|
||||
% Define Time Step
|
||||
dtime=0.01;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
K=zeros(numNodes,numNodes);
|
||||
M=zeros(numNodes,numNodes);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
% Loop Through Int Points
|
||||
for i=1:2;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(2)=(1.+c)/2.;
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
phic(1)=-0.5;
|
||||
phic(2)=0.5;
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
gnum=elemNodes(e,1);
|
||||
for i=1:2;
|
||||
for j=1:2;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
end
|
||||
end
|
||||
%Remove NON-ENHANCED DOFs(Reduce Matrices)
|
||||
iindex=0.;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
RHS=M*Tnew-Sub;
|
||||
% Apply Boundary Conditions
|
||||
for i=1:numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSR(iindex)=RHS(i);
|
||||
jindex=0;
|
||||
for j=1:numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
AR(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
Tnewr=(AR^-1)*RHSR';
|
||||
% Restore Matrices
|
||||
iindex=0;
|
||||
for i=1:numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
221
Unpublished/XFEM/Other/FESolveX.m
Normal file
221
Unpublished/XFEM/Other/FESolveX.m
Normal file
|
@ -0,0 +1,221 @@
|
|||
function [] = FESolveX()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=10.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=40;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=2;
|
||||
% initial interface position
|
||||
dpos=4.6;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes*2,1);
|
||||
%storage
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
if crdn1<=dpos
|
||||
Tnew(2*elemNodes(e,1)-1)=1.;
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.1;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=200.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
% Get interface velocity
|
||||
d(1)=dpos+charlen;
|
||||
d(2)=dpos+3*charlen/4;
|
||||
d(3)=dpos+charlen/4;
|
||||
d(4)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
for j=1:4
|
||||
if d(j)>=crdn1 & d(j)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(elemNodes(e,1)*2-1);
|
||||
tmp1b=Tnew(elemNodes(e,1)*2);
|
||||
tmp2a=Tnew(elemNodes(e,2)*2-1);
|
||||
tmp2b=Tnew(elemNodes(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
vel=1.*(0.5/charlen)*(2*t(1)+t(2)-t(3)-2*t(4));
|
||||
vel=0.;
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
enr=2;
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
enr=4;
|
||||
% get interface position on element
|
||||
point=(dpos-crdn1)/ajacob-1.;
|
||||
% devide element for sub integration
|
||||
len1=abs(-point-1.);
|
||||
len2=abs(1.-point);
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gpx(1)=-(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(2)=(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(3)=-(len2/2.)/sqrt(3.)+mid2;
|
||||
gpx(4)=(len2/2.)/sqrt(3.)+mid2;
|
||||
w(1)=(len1/2.);
|
||||
w(2)=(len1/2.);
|
||||
w(3)=(len2/2.);
|
||||
w(4)=(len2/2.);
|
||||
fdofs(1)=2*elemNodes(e,1);
|
||||
fdofs(2)=2*elemNodes(e,2);
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(3)=(1.+c)/2.;
|
||||
term=theta(1)*phi(1)+theta(2)*phi(3);
|
||||
if term<0
|
||||
cond=0.;
|
||||
spec=0.01;
|
||||
else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
end
|
||||
phi(2)=phi(1)*(abs(term)-abs(theta(1)));
|
||||
phi(4)=phi(3)*(abs(term)-abs(theta(2)));
|
||||
phic(1)=-0.5;
|
||||
phic(3)=0.5;
|
||||
dterm=sign(term)*(phic(1)*theta(1)+phic(3)*theta(2));
|
||||
phic(2)=phic(1)*(abs(term)-abs(theta(1)))+phi(1)*dterm;
|
||||
phic(4)=phic(3)*(abs(term)-abs(theta(2)))+phi(3)*dterm;
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
phix(3)=phic(3)/ajacob;
|
||||
phix(4)=phic(4)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==4;
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
tpos=gm(1)*Tnew(1)+gm(2)*Tnew(2)+gm(3)*Tnew(3)+gm(4)*Tnew(4);
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1*gm';
|
||||
Ke=Ke+pen;
|
||||
else
|
||||
pen=zeros(4);
|
||||
pfL=zeros(4,1);
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
gnum=2.*elemNodes(e,1)-1.;
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
pforce(gnum+i-1)=pforce(gnum+i-1)+pfL(i);
|
||||
end
|
||||
end
|
||||
%Remove inactive DOFs(Reduce Matrices)
|
||||
T1=1;
|
||||
RHS=M*Tnew;
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
check=1;
|
||||
if i==fdofs(1)|i==fdofs(2)
|
||||
check=0;
|
||||
elseif mod(i,2)~=0 & i~=1
|
||||
check=0;
|
||||
end
|
||||
if check==0
|
||||
jindex=0;
|
||||
iindex=iindex+1;
|
||||
for j=1:ndof*numNodes;
|
||||
check=1;
|
||||
if j==fdofs(1)|j==fdofs(2)
|
||||
check=0;
|
||||
elseif mod(j,2)~=0 & j~=1
|
||||
check=0;
|
||||
end
|
||||
if check==0
|
||||
jindex=jindex+1;
|
||||
Kred(iindex,jindex)=K(i,j);
|
||||
Mred(iindex,jindex)=M(i,j);
|
||||
end
|
||||
end
|
||||
Subr(iindex)=(K(i,1)+M(i,1))*T1;
|
||||
RHSr(iindex)=RHS(i);
|
||||
pforcer(iindex)=pforce(i);
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
StiffI=(Mred+Kred)^-1;
|
||||
Tnewr=StiffI*(RHSr'-Subr'+pforcer');
|
||||
iindex=0.;
|
||||
for i=1:ndof*numNodes;
|
||||
check=1;
|
||||
if i==fdofs(1)|i==fdofs(2)
|
||||
check=0;
|
||||
elseif mod(i,2)~=0 & i~=1
|
||||
check=0;
|
||||
end
|
||||
if check==0
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
else
|
||||
Tnew(i)=0.;
|
||||
end
|
||||
end
|
||||
Tnew(1)=1.;
|
||||
Tnew
|
||||
end
|
||||
stored'
|
269
Unpublished/XFEM/Other/FESolveX2D.m
Normal file
269
Unpublished/XFEM/Other/FESolveX2D.m
Normal file
|
@ -0,0 +1,269 @@
|
|||
function [] = FESolveX2D()
|
||||
% MATLAB based 2-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Mesh
|
||||
NumX=4;
|
||||
NumY=1;
|
||||
delX=1.;
|
||||
delY=1.;
|
||||
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.1;
|
||||
% 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.;
|
||||
Bound(2*Element(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.1;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=80.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
% 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)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(Element(e,1)*2-1);
|
||||
tmp1b=Tnew(Element(e,1)*2);
|
||||
tmp2a=Tnew(Element(e,2)*2-1);
|
||||
tmp2b=Tnew(Element(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
% vel=-0.1*(0.5/delX)*(2*t(1)+t(2)-t(3)-2*t(4))
|
||||
vel=0.0;
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(4*ndof);
|
||||
Me=zeros(4*ndof);
|
||||
for icrd=1:4;
|
||||
crdnx(icrd)=Node(Element(e,icrd),1);
|
||||
crdny(icrd)=Node(Element(e,icrd),2);
|
||||
theta(icrd)=abs(crdnx(icrd)-dpos)*sign(crdnx(icrd)-dpos);
|
||||
end
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
enr=8;
|
||||
% get interface position on element
|
||||
elen=abs(crdnx(2)-crdnx(1));
|
||||
frac=abs(dpos-crdnx(1))/elen;
|
||||
len1=2.*frac;
|
||||
len2=2.*(1.-frac);
|
||||
% devide element for sub integration
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gx(1)=mid1-(len1/2.)/sqrt(3.);
|
||||
gx(2)=mid1+(len1/2.)/sqrt(3.);
|
||||
gx(3)=mid1+(len1/2.)/sqrt(3.);
|
||||
gx(4)=mid1-(len1/2.)/sqrt(3.);
|
||||
gx(5)=mid2-(len2/2.)/sqrt(3.);
|
||||
gx(6)=mid2+(len2/2.)/sqrt(3.);
|
||||
gx(7)=mid2+(len2/2.)/sqrt(3.);
|
||||
gx(8)=mid2-(len2/2.)/sqrt(3.);
|
||||
gpos=1/sqrt(3.);
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=+gpos;
|
||||
hx(4)=+gpos;
|
||||
hx(5)=-gpos;
|
||||
hx(6)=-gpos;
|
||||
hx(7)=+gpos;
|
||||
hx(8)=+gpos;
|
||||
for iw=1:4
|
||||
w(iw)=frac/2.;
|
||||
w(iw+4)=(1.-frac)/2.;
|
||||
end
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
enr=4;
|
||||
gpos=1/sqrt(3.);
|
||||
gx(1)=-gpos;
|
||||
gx(2)=gpos;
|
||||
gx(3)=gpos;
|
||||
gx(4)=-gpos;
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=gpos;
|
||||
hx(4)=gpos;
|
||||
for iw=1:4
|
||||
w(iw)=1.;
|
||||
end
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
g=gx(i);
|
||||
h=hx(i);
|
||||
phi(1)=0.25*(1.-g)*(1.-h);
|
||||
phi(3)=0.25*(1.+g)*(1.-h);
|
||||
phi(5)=0.25*(1.+g)*(1.+h);
|
||||
phi(7)=0.25*(1.-g)*(1.+h);
|
||||
iLS=theta(1)*phi(1)+theta(2)*phi(3)+theta(3)*phi(5)+theta(4)*phi(7);
|
||||
if iLS<0.
|
||||
cond=0.;
|
||||
spec=0.01;
|
||||
else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
end
|
||||
for iter=1:4
|
||||
phi(2*iter)=phi(2*iter-1)*(abs(iLS)-abs(theta(iter)));
|
||||
end
|
||||
phig(1)=0.25*-(1.-h);
|
||||
phig(3)=0.25*(1.-h);
|
||||
phig(5)=0.25*(1.+h);
|
||||
phig(7)=0.25*-(1.+h);
|
||||
phih(1)=0.25*-(1.-g);
|
||||
phih(3)=0.25*-(1.+g);
|
||||
phih(5)=0.25*(1.+g);
|
||||
phih(7)=0.25*(1.-g);
|
||||
diLSg=sign(iLS)*(phig(1)*theta(1)+phig(3)*theta(2)+phig(5)*theta(3)+phig(7)*theta(4));
|
||||
diLSh=sign(iLS)*(phih(1)*theta(1)+phih(3)*theta(2)+phih(5)*theta(3)+phih(7)*theta(4));
|
||||
for iter=1:4
|
||||
phig(2*iter)=phig(2*iter-1)*(abs(iLS)-abs(theta(iter)))+phi(2*iter-1)*diLSg;
|
||||
phih(2*iter)=phih(2*iter-1)*(abs(iLS)-abs(theta(iter)))+phi(2*iter-1)*diLSh;
|
||||
end
|
||||
rjac=zeros(2,2);
|
||||
for iter=1:4
|
||||
rjac(1,1)=rjac(1,1)+phig(2*iter-1)*crdnx(iter);
|
||||
rjac(1,2)=rjac(1,2)+phig(2*iter-1)*crdny(iter);
|
||||
rjac(2,1)=rjac(2,1)+phih(2*iter-1)*crdnx(iter);
|
||||
rjac(2,2)=rjac(2,2)+phih(2*iter-1)*crdny(iter);
|
||||
end
|
||||
djac=rjac(1,1)*rjac(2,2)-rjac(1,2)*rjac(2,1);
|
||||
rjaci(1,1)= rjac(2,2)/djac;
|
||||
rjaci(2,2)= rjac(1,1)/djac;
|
||||
rjaci(1,2)=-rjac(1,2)/djac;
|
||||
rjaci(2,1)=-rjac(2,1)/djac ;
|
||||
for iter=1:8
|
||||
phix(iter)=rjaci(1,1)*phig(iter)+rjaci(1,2)*phih(iter);
|
||||
phiy(iter)=rjaci(2,1)*phig(iter)+rjaci(2,2)*phih(iter);
|
||||
end
|
||||
we=w(i)*djac;
|
||||
Ke=Ke+we*cond*(phix'*phix+phiy'*phiy);
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==8;
|
||||
xi=2.*frac-1;
|
||||
yi=0.;
|
||||
gm(1)=0.25*(1.-xi)*(1.-yi);
|
||||
gm(3)=0.25*(1.+xi)*(1.-yi);
|
||||
gm(5)=0.25*(1.+xi)*(1.+yi);
|
||||
gm(7)=0.25*(1.-xi)*(1.+yi);
|
||||
gm(2)=gm(1)*(-abs(theta(1)));
|
||||
gm(4)=gm(3)*(-abs(theta(2)));
|
||||
gm(6)=gm(5)*(-abs(theta(3)));
|
||||
gm(8)=gm(7)*(-abs(theta(4)));
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1.*gm';
|
||||
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)+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)+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 inactive DOFs(Reduce Matrices)
|
||||
RHS=M*Tnew;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i)+pforce(i);
|
||||
jindex=0;
|
||||
for j=1:ndof*numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
StiffI=Ared^-1;
|
||||
Tnewr=(Ared^-1)*RHSred';
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
||||
stored';
|
269
Unpublished/XFEM/Other/FESolveX2DLS.m
Normal file
269
Unpublished/XFEM/Other/FESolveX2DLS.m
Normal file
|
@ -0,0 +1,269 @@
|
|||
function [] = FESolveX2DLS()
|
||||
% MATLAB based 2-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Mesh
|
||||
NumX=3;
|
||||
NumY=1;
|
||||
delX=1.;
|
||||
delY=1.;
|
||||
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.1;
|
||||
% 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.;
|
||||
Bound(2*Element(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.1;
|
||||
tsteps=20;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=80.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
% 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)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(Element(e,1)*2-1);
|
||||
tmp1b=Tnew(Element(e,1)*2);
|
||||
tmp2a=Tnew(Element(e,2)*2-1);
|
||||
tmp2b=Tnew(Element(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
% vel=-0.1*(0.5/delX)*(2*t(1)+t(2)-t(3)-2*t(4))
|
||||
vel=0.0;
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(4*ndof);
|
||||
Me=zeros(4*ndof);
|
||||
for icrd=1:4;
|
||||
crdnx(icrd)=Node(Element(e,icrd),1);
|
||||
crdny(icrd)=Node(Element(e,icrd),2);
|
||||
theta(icrd)=abs(crdnx(icrd)-dpos)*sign(crdnx(icrd)-dpos);
|
||||
end
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
enr=8;
|
||||
% get interface position on element
|
||||
elen=abs(crdnx(2)-crdnx(1));
|
||||
frac=abs(dpos-crdnx(1))/elen;
|
||||
len1=2.*frac;
|
||||
len2=2.*(1.-frac);
|
||||
% devide element for sub integration
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gx(1)=mid1-(len1/2.)/sqrt(3.);
|
||||
gx(2)=mid1+(len1/2.)/sqrt(3.);
|
||||
gx(3)=mid1+(len1/2.)/sqrt(3.);
|
||||
gx(4)=mid1-(len1/2.)/sqrt(3.);
|
||||
gx(5)=mid2-(len2/2.)/sqrt(3.);
|
||||
gx(6)=mid2+(len2/2.)/sqrt(3.);
|
||||
gx(7)=mid2+(len2/2.)/sqrt(3.);
|
||||
gx(8)=mid2-(len2/2.)/sqrt(3.);
|
||||
gpos=1/sqrt(3.);
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=+gpos;
|
||||
hx(4)=+gpos;
|
||||
hx(5)=-gpos;
|
||||
hx(6)=-gpos;
|
||||
hx(7)=+gpos;
|
||||
hx(8)=+gpos;
|
||||
for iw=1:4
|
||||
w(iw)=frac/2.;
|
||||
w(iw+4)=(1.-frac)/2.;
|
||||
end
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
enr=4;
|
||||
gpos=1/sqrt(3.);
|
||||
gx(1)=-gpos;
|
||||
gx(2)=gpos;
|
||||
gx(3)=gpos;
|
||||
gx(4)=-gpos;
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=gpos;
|
||||
hx(4)=gpos;
|
||||
for iw=1:4
|
||||
w(iw)=1.;
|
||||
end
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
g=gx(i);
|
||||
h=hx(i);
|
||||
phi(1)=0.25*(1.-g)*(1.-h);
|
||||
phi(3)=0.25*(1.+g)*(1.-h);
|
||||
phi(5)=0.25*(1.+g)*(1.+h);
|
||||
phi(7)=0.25*(1.-g)*(1.+h);
|
||||
iLS=theta(1)*phi(1)+theta(2)*phi(3)+theta(3)*phi(5)+theta(4)*phi(7);
|
||||
if iLS<0.
|
||||
cond=0.;
|
||||
spec=0.01;
|
||||
else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
end
|
||||
for iter=1:4
|
||||
phi(2*iter)=phi(2*iter-1)*(abs(iLS)-abs(theta(iter)));
|
||||
end
|
||||
phig(1)=0.25*-(1.-h);
|
||||
phig(3)=0.25*(1.-h);
|
||||
phig(5)=0.25*(1.+h);
|
||||
phig(7)=0.25*-(1.+h);
|
||||
phih(1)=0.25*-(1.-g);
|
||||
phih(3)=0.25*-(1.+g);
|
||||
phih(5)=0.25*(1.+g);
|
||||
phih(7)=0.25*(1.-g);
|
||||
diLSg=sign(iLS)*(phig(1)*theta(1)+phig(3)*theta(2)+phig(5)*theta(3)+phig(7)*theta(4));
|
||||
diLSh=sign(iLS)*(phih(1)*theta(1)+phih(3)*theta(2)+phih(5)*theta(3)+phih(7)*theta(4));
|
||||
for iter=1:4
|
||||
phig(2*iter)=phig(2*iter-1)*(abs(iLS)-abs(theta(iter)))+phi(2*iter-1)*diLSg;
|
||||
phih(2*iter)=phih(2*iter-1)*(abs(iLS)-abs(theta(iter)))+phi(2*iter-1)*diLSh;
|
||||
end
|
||||
rjac=zeros(2,2);
|
||||
for iter=1:4
|
||||
rjac(1,1)=rjac(1,1)+phig(2*iter-1)*crdnx(iter);
|
||||
rjac(1,2)=rjac(1,2)+phig(2*iter-1)*crdny(iter);
|
||||
rjac(2,1)=rjac(2,1)+phih(2*iter-1)*crdnx(iter);
|
||||
rjac(2,2)=rjac(2,2)+phih(2*iter-1)*crdny(iter);
|
||||
end
|
||||
djac=rjac(1,1)*rjac(2,2)-rjac(1,2)*rjac(2,1);
|
||||
rjaci(1,1)= rjac(2,2)/djac;
|
||||
rjaci(2,2)= rjac(1,1)/djac;
|
||||
rjaci(1,2)=-rjac(1,2)/djac;
|
||||
rjaci(2,1)=-rjac(2,1)/djac ;
|
||||
for iter=1:8
|
||||
phix(iter)=rjaci(1,1)*phig(iter)+rjaci(1,2)*phih(iter);
|
||||
phiy(iter)=rjaci(2,1)*phig(iter)+rjaci(2,2)*phih(iter);
|
||||
end
|
||||
we=w(i)*djac;
|
||||
Ke=Ke+we*cond*(phix'*phix+phiy'*phiy);
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==8;
|
||||
xi=2.*frac-1;
|
||||
yi=0.;
|
||||
gm(1)=0.25*(1.-xi)*(1.-yi);
|
||||
gm(3)=0.25*(1.+xi)*(1.-yi);
|
||||
gm(5)=0.25*(1.+xi)*(1.+yi);
|
||||
gm(7)=0.25*(1.-xi)*(1.+yi);
|
||||
gm(2)=gm(1)*(-abs(theta(1)));
|
||||
gm(4)=gm(3)*(-abs(theta(2)));
|
||||
gm(6)=gm(5)*(-abs(theta(3)));
|
||||
gm(8)=gm(7)*(-abs(theta(4)));
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1.*gm';
|
||||
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)+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)+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 inactive DOFs(Reduce Matrices)
|
||||
RHS=M*Tnew;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i)+pforce(i);
|
||||
jindex=0;
|
||||
for j=1:ndof*numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
StiffI=Ared^-1;
|
||||
Tnewr=(Ared^-1)*RHSred';
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
||||
stored'
|
199
Unpublished/XFEM/Other/FESolveXT.m
Normal file
199
Unpublished/XFEM/Other/FESolveXT.m
Normal file
|
@ -0,0 +1,199 @@
|
|||
function [] = FESolveXT()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=10.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=10;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=2;
|
||||
% initial interface position
|
||||
dpos=4.6;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes*2,1);
|
||||
Bound=zeros(numNodes*2,1);
|
||||
%storage
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
for n=1:2
|
||||
crdn1=ndCoords(elemNodes(e,n));
|
||||
if crdn1<=dpos
|
||||
Tnew(2*elemNodes(e,n)-1)=1.;
|
||||
Bound(2*elemNodes(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.01;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=50.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
% Get interface velocity
|
||||
d(1)=dpos+charlen;
|
||||
d(2)=dpos+3*charlen/4;
|
||||
d(3)=dpos+charlen/4;
|
||||
d(4)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
for j=1:4
|
||||
if d(j)>=crdn1 & d(j)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(elemNodes(e,1)*2-1);
|
||||
tmp1b=Tnew(elemNodes(e,1)*2);
|
||||
tmp2a=Tnew(elemNodes(e,2)*2-1);
|
||||
tmp2b=Tnew(elemNodes(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
vel=1.*(0.5/charlen)*(2*t(1)+t(2)-t(3)-2*t(4));
|
||||
vel=0.
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
enr=2;
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
enr=4;
|
||||
% get interface position on element
|
||||
point=(dpos-crdn1)/ajacob-1.;
|
||||
% devide element for sub integration
|
||||
len1=abs(-point-1.);
|
||||
len2=abs(1.-point);
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gpx(1)=-(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(2)=(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(3)=-(len2/2.)/sqrt(3.)+mid2;
|
||||
gpx(4)=(len2/2.)/sqrt(3.)+mid2;
|
||||
w(1)=(len1/2.);
|
||||
w(2)=(len1/2.);
|
||||
w(3)=(len2/2.);
|
||||
w(4)=(len2/2.);
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(3)=(1.+c)/2.;
|
||||
term=theta(1)*phi(1)+theta(2)*phi(3);
|
||||
if term<0
|
||||
cond=0.;
|
||||
spec=0.01;
|
||||
else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
end
|
||||
phi(2)=phi(1)*(abs(term)-abs(theta(1)));
|
||||
phi(4)=phi(3)*(abs(term)-abs(theta(2)));
|
||||
phic(1)=-0.5;
|
||||
phic(3)=0.5;
|
||||
dterm=sign(term)*(phic(1)*theta(1)+phic(3)*theta(2));
|
||||
phic(2)=phic(1)*(abs(term)-abs(theta(1)))+phi(1)*dterm;
|
||||
phic(4)=phic(3)*(abs(term)-abs(theta(2)))+phi(3)*dterm;
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
phix(3)=phic(3)/ajacob;
|
||||
phix(4)=phic(4)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==4;
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
tpos=gm(1)*Tnew(1)+gm(2)*Tnew(2)+gm(3)*Tnew(3)+gm(4)*Tnew(4);
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1*gm';
|
||||
Ke=Ke+pen;
|
||||
else
|
||||
pen=zeros(4);
|
||||
pfL=zeros(4,1);
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
gnum=2.*elemNodes(e,1)-1.;
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
pforce(gnum+i-1)=pforce(gnum+i-1)+pfL(i);
|
||||
end
|
||||
end
|
||||
%Remove inactive DOFs(Reduce Matrices)
|
||||
RHS=M*Tnew;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i)+pforce(i);
|
||||
jindex=0;
|
||||
for j=1:ndof*numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
Tnewr=(Ared^-1)*RHSred';
|
||||
iindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
||||
stored'
|
269
Unpublished/XFEM/Other/FESolveXT2.m
Normal file
269
Unpublished/XFEM/Other/FESolveXT2.m
Normal file
|
@ -0,0 +1,269 @@
|
|||
function [] = FESolveXT2()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=1.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=16;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=2;
|
||||
% initial interface position
|
||||
dpos=0.4;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes*2,1);
|
||||
Bound=zeros(numNodes*2,1);
|
||||
%storage
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
for n=1:2
|
||||
crdn1=ndCoords(elemNodes(e,n));
|
||||
if crdn1<=dpos
|
||||
Tnew(2*elemNodes(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
Bound(1)=1.;
|
||||
% Define Time Step
|
||||
dtime=0.001;
|
||||
tsteps=100;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=100.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
eNodes=zeros(2*numNodes,1);
|
||||
% Get interface velocity
|
||||
d(1)=dpos+charlen;
|
||||
d(2)=dpos+3*charlen/4;
|
||||
d(3)=dpos+charlen/4;
|
||||
d(4)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
for j=1:4
|
||||
if d(j)>=crdn1 && d(j)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(elemNodes(e,1)*2-1);
|
||||
tmp1b=Tnew(elemNodes(e,1)*2);
|
||||
tmp2a=Tnew(elemNodes(e,2)*2-1);
|
||||
tmp2b=Tnew(elemNodes(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
vel=0.5*(0.5/charlen)*(2*t(1)+t(2)-t(3)-2*t(4));
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
enr=2;
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
eNodes(2*elemNodes(e,1))=1;
|
||||
eNodes(2*elemNodes(e,2))=1;
|
||||
enr=4;
|
||||
% get interface position on element
|
||||
point=(dpos-crdn1)/ajacob-1.;
|
||||
% devide element for sub integration
|
||||
len1=abs(-point-1.);
|
||||
len2=abs(1.-point);
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gpx(1)=-(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(2)=(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(3)=-(len2/2.)/sqrt(3.)+mid2;
|
||||
gpx(4)=(len2/2.)/sqrt(3.)+mid2;
|
||||
w(1)=(len1/2.);
|
||||
w(2)=(len1/2.);
|
||||
w(3)=(len2/2.);
|
||||
w(4)=(len2/2.);
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(3)=(1.+c)/2.;
|
||||
term=theta(1)*phi(1)+theta(2)*phi(3);
|
||||
% if term<0
|
||||
% cond=0.00;
|
||||
% spec=0.001;
|
||||
% else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
% end
|
||||
if enr==4
|
||||
phi(2)=phi(1)*(abs(term)-abs(theta(1)));
|
||||
phi(4)=phi(3)*(abs(term)-abs(theta(2)));
|
||||
else
|
||||
phi(2)=0.0;
|
||||
phi(4)=0.0;
|
||||
end
|
||||
phic(1)=-0.5;
|
||||
phic(3)=0.5;
|
||||
dterm=sign(term)*(phic(1)*theta(1)+phic(3)*theta(2));
|
||||
if enr==4
|
||||
phic(2)=phic(1)*(abs(term)-abs(theta(1)))+phi(1)*dterm;
|
||||
phic(4)=phic(3)*(abs(term)-abs(theta(2)))+phi(3)*dterm;
|
||||
else
|
||||
phic(2)=0.0;
|
||||
phic(4)=0.0;
|
||||
end
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
phix(3)=phic(3)/ajacob;
|
||||
phix(4)=phic(4)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
if enr==5;
|
||||
Ke(1,2)=0.;
|
||||
Me(1,2)=0.;
|
||||
Ke(2,1)=0.;
|
||||
Me(2,1)=0.;
|
||||
Ke(1,4)=0.;
|
||||
Me(1,4)=0.;
|
||||
Ke(4,1)=0.;
|
||||
Me(4,1)=0.;
|
||||
Ke(3,2)=0.;
|
||||
Me(3,2)=0.;
|
||||
Ke(2,3)=0.;
|
||||
Me(2,3)=0.;
|
||||
Ke(4,3)=0.;
|
||||
Me(4,3)=0.;
|
||||
Ke(3,4)=0.;
|
||||
Me(3,4)=0.;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==4;
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1*gm';
|
||||
Ke=Ke+pen;
|
||||
else
|
||||
pen=zeros(4);
|
||||
pfL=zeros(4,1);
|
||||
end
|
||||
Ke;
|
||||
Me;
|
||||
% Assemble Global Matrices
|
||||
gnum=2.*elemNodes(e,1)-1.;
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
pforce(gnum+i-1)=pforce(gnum+i-1)+pfL(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'
|
128
Unpublished/XFEM/Other/GetF.m
Normal file
128
Unpublished/XFEM/Other/GetF.m
Normal file
|
@ -0,0 +1,128 @@
|
|||
function [] = GetF()
|
||||
% set up grid
|
||||
gd=0.;
|
||||
numElem=4;
|
||||
eLen=0.25;
|
||||
for i=1:numElem+1
|
||||
ndCrd(i)=gd;
|
||||
gd=gd+eLen;
|
||||
end
|
||||
for i=1:numElem
|
||||
elemNod(i,1)=i;
|
||||
elemNod(i,2)=i+1;
|
||||
end
|
||||
% Initial level set
|
||||
dpos=0.1;
|
||||
for i=1:numElem+1
|
||||
lSet(i)=sign(ndCrd(i)-dpos)*abs(dpos-ndCrd(i));
|
||||
end
|
||||
lSet'
|
||||
for tstep=1:120
|
||||
% Velocity BC
|
||||
F=zeros(numElem+1,1);
|
||||
for i=1:numElem
|
||||
if sign(lSet(elemNod(i,1)))~=sign(lSet(elemNod(i,2)))
|
||||
F(elemNod(i,1))= 0.0005;
|
||||
F(elemNod(i,2))= 0.0005;
|
||||
end
|
||||
end
|
||||
% Assemble 'Stiffness' Matrices
|
||||
A=zeros(numElem+1);
|
||||
for i=1:numElem
|
||||
pos(1)=-1/sqrt(3);
|
||||
pos(2)=1/sqrt(3);
|
||||
AfL=zeros(2);
|
||||
AfLGLS=zeros(2);
|
||||
for j=1:2
|
||||
shp(1)=(1-pos(j))/2.;
|
||||
shp(2)=(1+pos(j))/2.;
|
||||
dshp(1)=-0.5;
|
||||
dshp(2)=0.5;
|
||||
rset=shp(1)*lSet(elemNod(i,1))+shp(2)*lSet(elemNod(i,2));
|
||||
dls=dshp(1)*lSet(elemNod(i,1))+dshp(2)*lSet(elemNod(i,2));
|
||||
AfL=AfL+shp'*sign(rset)*(dls*dshp);
|
||||
AfLGLS=AfLGLS+(dshp'*dls)*(0.25/abs(dls))*(dls*dshp);
|
||||
end
|
||||
for k=1:2;
|
||||
for j=1:2;
|
||||
A(elemNod(i,j),elemNod(i,k))=A(elemNod(i,j),elemNod(i,k))+AfL(j,k)+AfLGLS(j,k);
|
||||
end
|
||||
end
|
||||
end
|
||||
% Apply BCs
|
||||
RHS=zeros(numElem+1,1);
|
||||
Sub=A*F;
|
||||
iindex=0;
|
||||
for i=1:numElem+1
|
||||
if F(i)==0.
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i);
|
||||
Fred=0.;
|
||||
jindex=0;
|
||||
for j=1:numElem+1
|
||||
if F(j)==0.
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
% Solve for Fred
|
||||
Fred=(Ared^-1)*RHSred';
|
||||
% Get F
|
||||
iindex=0;
|
||||
for i=1:numElem+1
|
||||
if F(i)==0.
|
||||
iindex=iindex+1;
|
||||
F(i)=Fred(iindex);
|
||||
end
|
||||
end
|
||||
% Update level set
|
||||
mMat=zeros(numElem+1);
|
||||
mMatGLS=zeros(numElem+1);
|
||||
f1=zeros(numElem+1,1);
|
||||
f2=zeros(numElem+1,1);
|
||||
f3=zeros(numElem+1,1);
|
||||
h=0.25;
|
||||
visc=0.000;
|
||||
for i=1:numElem
|
||||
pos(1)=-1/sqrt(3);
|
||||
pos(2)=1/sqrt(3);
|
||||
mMatL=zeros(2);
|
||||
mMatGLSL=zeros(2);
|
||||
f1L=zeros(2,1);
|
||||
f2L=zeros(2,1);
|
||||
f3L=zeros(2,1);
|
||||
for j=1:2
|
||||
shp(1)=(1-pos(j))/2.;
|
||||
shp(2)=(1+pos(j))/2.;
|
||||
dshp(1)=-0.5;
|
||||
dshp(2)=0.5;
|
||||
Floc=shp(1)*F(elemNod(i,1))+shp(2)*F(elemNod(i,2));
|
||||
rset=shp(1)*lSet(elemNod(i,1))+shp(2)*lSet(elemNod(i,2));
|
||||
dls=dshp(1)*lSet(elemNod(i,1))+dshp(2)*lSet(elemNod(i,2));
|
||||
mMatL=mMatL+shp'*shp;
|
||||
mMatGLSL=mMatGLSL+((dshp'*(dls/abs(dls)))*Floc*(h/abs(Floc)))*shp;
|
||||
f1L=f1L+shp'*Floc*abs(dls);
|
||||
f2L=f2L+(dshp'*(dls/abs(dls))*Floc)*(h/abs(Floc))*Floc*abs(dls);
|
||||
vs=h*((abs(visc+Floc*abs(dls)))/(abs(Floc*dls)+h));
|
||||
f3L=f3L+vs*dshp'*dls;
|
||||
end
|
||||
for k=1:2;
|
||||
for j=1:2;
|
||||
mMat(elemNod(i,j),elemNod(i,k))=mMat(elemNod(i,j),elemNod(i,k))+mMatL(j,k);
|
||||
mMatGLS(elemNod(i,j),elemNod(i,k))=mMatGLS(elemNod(i,j),elemNod(i,k))+mMatGLSL(j,k);
|
||||
end
|
||||
f1(elemNod(i,k))=f1(elemNod(i,k))+f1L(k);
|
||||
f2(elemNod(i,k))=f2(elemNod(i,k))+f2L(k);
|
||||
f3(elemNod(i,k))=f3(elemNod(i,k))+f3L(k);
|
||||
end
|
||||
end
|
||||
dt=0.01;
|
||||
lSet=lSet-((((mMat+mMatGLS)^-1)/dt)*(f1+f2+f3))';
|
||||
lSet'
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
146
Unpublished/XFEM/Other/S2D.m
Normal file
146
Unpublished/XFEM/Other/S2D.m
Normal file
|
@ -0,0 +1,146 @@
|
|||
function [] = S2D()
|
||||
% MATLAB based 2-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Mesh
|
||||
NumX=10;
|
||||
NumY=1;
|
||||
delX=1.;
|
||||
delY=1.;
|
||||
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);
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
% initial interface position
|
||||
dpos=0.25;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes,1);
|
||||
Bound=zeros(numNodes,1);
|
||||
for e=1:numElem
|
||||
for n=1:4
|
||||
crdn=Node(Element(e,n),1);
|
||||
if crdn<=dpos
|
||||
Tnew(Element(e,n))=1.;
|
||||
Bound(Element(e,n))=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
% Define Time Step
|
||||
dtime=0.1;
|
||||
tsteps=10;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
K=zeros(numNodes,numNodes);
|
||||
M=zeros(numNodes,numNodes);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(4);
|
||||
Me=zeros(4);
|
||||
for icrd=1:4;
|
||||
crdnx(icrd)=Node(Element(e,icrd),1);
|
||||
crdny(icrd)=Node(Element(e,icrd),2);
|
||||
end
|
||||
gpos=1/sqrt(3.);
|
||||
gx(1)=-gpos;
|
||||
gx(2)=gpos;
|
||||
gx(3)=gpos;
|
||||
gx(4)=-gpos;
|
||||
hx(1)=-gpos;
|
||||
hx(2)=-gpos;
|
||||
hx(3)=gpos;
|
||||
hx(4)=gpos;
|
||||
% Loop Through Int Points
|
||||
for i=1:4;
|
||||
g=gx(i);
|
||||
h=hx(i);
|
||||
phi(1)=0.25*(1.-g)*(1.-h);
|
||||
phi(2)=0.25*(1.+g)*(1.-h);
|
||||
phi(3)=0.25*(1.+g)*(1.+h);
|
||||
phi(4)=0.25*(1.-g)*(1.+h);
|
||||
phig(1)=0.25*-(1.-h);
|
||||
phig(2)=0.25*(1.-h);
|
||||
phig(3)=0.25*(1.+h);
|
||||
phig(4)=0.25*-(1.+h);
|
||||
phih(1)=0.25*-(1.-g);
|
||||
phih(2)=0.25*-(1.+g);
|
||||
phih(3)=0.25*(1.+g);
|
||||
phih(4)=0.25*(1.-g);
|
||||
rjac=zeros(2,2);
|
||||
for iter=1:4
|
||||
rjac(1,1)=rjac(1,1)+phig(iter)*crdnx(iter);
|
||||
rjac(1,2)=rjac(1,2)+phig(iter)*crdny(iter);
|
||||
rjac(2,1)=rjac(2,1)+phih(iter)*crdnx(iter);
|
||||
rjac(2,2)=rjac(2,2)+phih(iter)*crdny(iter);
|
||||
end
|
||||
djac=rjac(1,1)*rjac(2,2)-rjac(1,2)*rjac(2,1);
|
||||
rjaci(1,1)= rjac(2,2)/djac;
|
||||
rjaci(2,2)= rjac(1,1)/djac;
|
||||
rjaci(1,2)=-rjac(1,2)/djac;
|
||||
rjaci(2,1)=-rjac(2,1)/djac ;
|
||||
for iter=1:4
|
||||
phix(iter)=rjaci(1,1)*phig(iter)+rjaci(1,2)*phih(iter);
|
||||
phiy(iter)=rjaci(2,1)*phig(iter)+rjaci(2,2)*phih(iter);
|
||||
end
|
||||
we=djac;
|
||||
Ke=Ke+we*cond*(phix'*phix+phiy'*phiy);
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
gnum(1)=Element(e,1);
|
||||
gnum(2)=Element(e,2);
|
||||
gnum(3)=Element(e,3);
|
||||
gnum(4)=Element(e,4);
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum(j),gnum(i))=K(gnum(j),gnum(i))+Ke(j,i);
|
||||
M(gnum(j),gnum(i))=M(gnum(j),gnum(i))+Me(j,i);
|
||||
end
|
||||
end
|
||||
end
|
||||
%Remove inactive DOFs(Reduce Matrices)
|
||||
RHS=M*Tnew;
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
iindex=0;
|
||||
for i=1:numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
RHSred(iindex)=RHS(i)-Sub(i);
|
||||
jindex=0;
|
||||
for j=1:numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
Ared(iindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
Tnewr=(Ared^-1)*RHSred';
|
||||
iindex=0;
|
||||
for i=1:numNodes;
|
||||
if Bound(i)==0.;
|
||||
iindex=iindex+1;
|
||||
Tnew(i)=Tnewr(iindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
270
Unpublished/XFEM/Other/XCOR1D.m
Normal file
270
Unpublished/XFEM/Other/XCOR1D.m
Normal file
|
@ -0,0 +1,270 @@
|
|||
function [] = XCOR1D()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=1.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=4;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=2;
|
||||
% initial interface position
|
||||
dpos=0.6;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes*2,1);
|
||||
Bound=zeros(numNodes*2,1);
|
||||
%storage
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
for n=1:2
|
||||
crdn1=ndCoords(elemNodes(e,n));
|
||||
if crdn1<=dpos
|
||||
Tnew(2*elemNodes(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
Bound(1)=1.;
|
||||
% Define Time Step
|
||||
dtime=0.01;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=100.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
eNodes=zeros(2*numNodes,1);
|
||||
% Get interface velocity
|
||||
d(1)=dpos+charlen;
|
||||
d(2)=dpos+3*charlen/4;
|
||||
d(3)=dpos+charlen/4;
|
||||
d(4)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
for j=1:4
|
||||
if d(j)>=crdn1 && d(j)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(elemNodes(e,1)*2-1);
|
||||
tmp1b=Tnew(elemNodes(e,1)*2);
|
||||
tmp2a=Tnew(elemNodes(e,2)*2-1);
|
||||
tmp2b=Tnew(elemNodes(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
vel=0.5*(0.5/charlen)*(2*t(1)+t(2)-t(3)-2*t(4));
|
||||
vel=0.
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
enr=2;
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
eNodes(2*elemNodes(e,1))=1;
|
||||
eNodes(2*elemNodes(e,2))=1;
|
||||
enr=4;
|
||||
% get interface position on element
|
||||
point=(dpos-crdn1)/ajacob-1.;
|
||||
% devide element for sub integration
|
||||
len1=abs(-point-1.);
|
||||
len2=abs(1.-point);
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gpx(1)=-(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(2)=(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(3)=-(len2/2.)/sqrt(3.)+mid2;
|
||||
gpx(4)=(len2/2.)/sqrt(3.)+mid2;
|
||||
w(1)=(len1/2.);
|
||||
w(2)=(len1/2.);
|
||||
w(3)=(len2/2.);
|
||||
w(4)=(len2/2.);
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(3)=(1.+c)/2.;
|
||||
term=theta(1)*phi(1)+theta(2)*phi(3);
|
||||
% if term<0
|
||||
% cond=0.00;
|
||||
% spec=0.001;
|
||||
% else
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
% end
|
||||
if enr==4
|
||||
phi(2)=phi(1)*(abs(term)-abs(theta(1)));
|
||||
phi(4)=phi(3)*(abs(term)-abs(theta(2)));
|
||||
else
|
||||
phi(2)=0.0;
|
||||
phi(4)=0.0;
|
||||
end
|
||||
phic(1)=-0.5;
|
||||
phic(3)=0.5;
|
||||
dterm=sign(term)*(phic(1)*theta(1)+phic(3)*theta(2));
|
||||
if enr==4
|
||||
phic(2)=phic(1)*(abs(term)-abs(theta(1)))+phi(1)*dterm;
|
||||
phic(4)=phic(3)*(abs(term)-abs(theta(2)))+phi(3)*dterm;
|
||||
else
|
||||
phic(2)=0.0;
|
||||
phic(4)=0.0;
|
||||
end
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
phix(3)=phic(3)/ajacob;
|
||||
phix(4)=phic(4)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
if enr==5;
|
||||
Ke(1,2)=0.;
|
||||
Me(1,2)=0.;
|
||||
Ke(2,1)=0.;
|
||||
Me(2,1)=0.;
|
||||
Ke(1,4)=0.;
|
||||
Me(1,4)=0.;
|
||||
Ke(4,1)=0.;
|
||||
Me(4,1)=0.;
|
||||
Ke(3,2)=0.;
|
||||
Me(3,2)=0.;
|
||||
Ke(2,3)=0.;
|
||||
Me(2,3)=0.;
|
||||
Ke(4,3)=0.;
|
||||
Me(4,3)=0.;
|
||||
Ke(3,4)=0.;
|
||||
Me(3,4)=0.;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==4;
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1*gm';
|
||||
Ke=Ke+pen;
|
||||
else
|
||||
pen=zeros(4);
|
||||
pfL=zeros(4,1);
|
||||
end
|
||||
Ke;
|
||||
Me;
|
||||
% Assemble Global Matrices
|
||||
gnum=2.*elemNodes(e,1)-1.;
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
pforce(gnum+i-1)=pforce(gnum+i-1)+pfL(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';
|
197
Unpublished/XFEM/Other/XCOR1Db.m
Normal file
197
Unpublished/XFEM/Other/XCOR1Db.m
Normal file
|
@ -0,0 +1,197 @@
|
|||
function [] = XCOR1Db()
|
||||
% MATLAB based 1-D XFEM Solver
|
||||
% J. Grogan (2012)
|
||||
clear all
|
||||
% Define Geometry
|
||||
len=1.;
|
||||
% Define Section Properties
|
||||
rho=1.;
|
||||
% Generate Mesh
|
||||
numElem=4;
|
||||
charlen=len/numElem;
|
||||
ndCoords=linspace(0,len,numElem+1);
|
||||
numNodes=size(ndCoords,2);
|
||||
indx=1:numElem;
|
||||
elemNodes(:,1)=indx;
|
||||
elemNodes(:,2)=indx+1;
|
||||
% dofs per node
|
||||
ndof=2;
|
||||
% initial interface position
|
||||
dpos=0.6;
|
||||
% Initial temperatures
|
||||
Tnew=zeros(numNodes*2,1);
|
||||
Bound=zeros(numNodes*2,1);
|
||||
%storage
|
||||
stored(1)=dpos;
|
||||
for e=1:numElem
|
||||
for n=1:2
|
||||
crdn1=ndCoords(elemNodes(e,n));
|
||||
if crdn1<=dpos
|
||||
Tnew(2*elemNodes(e,n)-1)=1.;
|
||||
end
|
||||
end
|
||||
end
|
||||
Bound(1)=1.;
|
||||
% Define Time Step
|
||||
dtime=0.01;
|
||||
tsteps=10;
|
||||
time=0.;
|
||||
% penalty term
|
||||
beta=100.;
|
||||
% Loop through time steps
|
||||
for ts=1:tsteps
|
||||
eNodes=zeros(2*numNodes,1);
|
||||
% Get interface velocity
|
||||
d(1)=dpos+charlen;
|
||||
d(2)=dpos+3*charlen/4;
|
||||
d(3)=dpos+charlen/4;
|
||||
d(4)=dpos;
|
||||
for e=1:numElem
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
for j=1:4
|
||||
if d(j)>=crdn1 && d(j)<crdn2
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
point=(d(j)-crdn1)/ajacob-1.;
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
tmp1a=Tnew(elemNodes(e,1)*2-1);
|
||||
tmp1b=Tnew(elemNodes(e,1)*2);
|
||||
tmp2a=Tnew(elemNodes(e,2)*2-1);
|
||||
tmp2b=Tnew(elemNodes(e,2)*2);
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
t(j)=gm(1)*tmp1a+gm(2)*tmp1b+gm(3)*tmp2a+gm(4)*tmp2b;
|
||||
end
|
||||
end
|
||||
end
|
||||
vel=0.5*(0.5/charlen)*(2*t(1)+t(2)-t(3)-2*t(4));
|
||||
vel=0.
|
||||
% Update interface position
|
||||
dpos=dpos+vel*dtime;
|
||||
stored(ts+1)=dpos;
|
||||
K=zeros(numNodes*ndof,numNodes*ndof);
|
||||
M=zeros(numNodes*ndof,numNodes*ndof);
|
||||
pforce=zeros(numNodes*ndof,1);
|
||||
% Loop Through Elements
|
||||
for e=1:numElem
|
||||
Ke=zeros(2*ndof);
|
||||
Me=zeros(2*ndof);
|
||||
crdn1=ndCoords(elemNodes(e,1));
|
||||
crdn2=ndCoords(elemNodes(e,2));
|
||||
theta(1)=abs(crdn1-dpos)*sign(crdn1-dpos);
|
||||
theta(2)=abs(crdn2-dpos)*sign(crdn2-dpos);
|
||||
enr=2;
|
||||
elen=abs(crdn2-crdn1);
|
||||
ajacob=elen/2.;
|
||||
if sign(theta(1))~=sign(theta(2))
|
||||
% enriched element
|
||||
eNodes(2*elemNodes(e,1))=1;
|
||||
eNodes(2*elemNodes(e,2))=1;
|
||||
enr=4;
|
||||
% get interface position on element
|
||||
point=(dpos-crdn1)/ajacob-1.;
|
||||
% devide element for sub integration
|
||||
len1=abs(-point-1.);
|
||||
len2=abs(1.-point);
|
||||
mid1=-1+len1/2.;
|
||||
mid2=1-len2/2.;
|
||||
gpx(1)=-(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(2)=(len1/2.)/sqrt(3.)+mid1;
|
||||
gpx(3)=-(len2/2.)/sqrt(3.)+mid2;
|
||||
gpx(4)=(len2/2.)/sqrt(3.)+mid2;
|
||||
w(1)=(len1/2.);
|
||||
w(2)=(len1/2.);
|
||||
w(3)=(len2/2.);
|
||||
w(4)=(len2/2.);
|
||||
else
|
||||
% regular element - fix extra dofs
|
||||
gpx(1)=-1/sqrt(3.);
|
||||
gpx(2)=1/sqrt(3.);
|
||||
w(1)=1.;
|
||||
w(2)=1.;
|
||||
end
|
||||
% Loop Through Int Points
|
||||
for i=1:enr;
|
||||
c=gpx(i);
|
||||
phi(1)=(1.-c)/2.;
|
||||
phi(3)=(1.+c)/2.;
|
||||
term=theta(1)*phi(1)+theta(2)*phi(3);
|
||||
cond=1.;
|
||||
spec=1.;
|
||||
phi(2)=phi(1)*(abs(term)-abs(theta(1)));
|
||||
phi(4)=phi(3)*(abs(term)-abs(theta(2)));
|
||||
phic(1)=-0.5;
|
||||
phic(3)=0.5;
|
||||
dterm=sign(term)*(phic(1)*theta(1)+phic(3)*theta(2));
|
||||
phic(2)=phic(1)*(abs(term)-abs(theta(1)))+phi(1)*dterm;
|
||||
phic(4)=phic(3)*(abs(term)-abs(theta(2)))+phi(3)*dterm;
|
||||
phix(1)=phic(1)/ajacob;
|
||||
phix(2)=phic(2)/ajacob;
|
||||
phix(3)=phic(3)/ajacob;
|
||||
phix(4)=phic(4)/ajacob;
|
||||
we=ajacob*w(i);
|
||||
Ke=Ke+we*cond*phix'*phix;
|
||||
Me=Me+(we*rho*spec*phi'*phi)/dtime;
|
||||
end
|
||||
% Add penalty term and get temp gradient on interface
|
||||
if enr==4;
|
||||
xi=point;
|
||||
gm(1)=(1.-xi)/2.;
|
||||
gm(3)=(1.+xi)/2.;
|
||||
term=theta(1)*gm(1)+theta(2)*gm(3);
|
||||
gm(2)=gm(1)*(abs(term)-abs(theta(1)));
|
||||
gm(4)=gm(3)*(abs(term)-abs(theta(2)));
|
||||
pen=beta*(gm'*gm);
|
||||
pfL=beta*1*gm';
|
||||
Ke=Ke+pen;
|
||||
else
|
||||
pen=zeros(4);
|
||||
pfL=zeros(4,1);
|
||||
end
|
||||
% Assemble Global Matrices
|
||||
gnum=2.*elemNodes(e,1)-1.;
|
||||
for i=1:4;
|
||||
for j=1:4;
|
||||
K(gnum+j-1,gnum+i-1)=K(gnum+j-1,gnum+i-1)+Ke(j,i);
|
||||
M(gnum+j-1,gnum+i-1)=M(gnum+j-1,gnum+i-1)+Me(j,i);
|
||||
end
|
||||
pforce(gnum+i-1)=pforce(gnum+i-1)+pfL(i);
|
||||
end
|
||||
end
|
||||
A=K+M;
|
||||
Sub=A*Bound;
|
||||
RHS=M*Tnew-Sub+pforce;
|
||||
% Apply Boundary Conditions
|
||||
Biindex=0.;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
Biindex=Biindex+1;
|
||||
RHSR(Biindex)=RHS(i);
|
||||
jindex=0;
|
||||
for j=1:ndof*numNodes;
|
||||
if Bound(j)==0.;
|
||||
jindex=jindex+1;
|
||||
AR(Biindex,jindex)=A(i,j);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%Solve
|
||||
Tnewr=(AR^-1)*RHSR';
|
||||
% Restore Matrices
|
||||
Biindex=0;
|
||||
for i=1:ndof*numNodes;
|
||||
if Bound(i)==0.;
|
||||
Biindex=Biindex+1;
|
||||
Tnew(i)=Tnewr(Biindex);
|
||||
end
|
||||
end
|
||||
Tnew
|
||||
end
|
||||
stored';
|
Loading…
Add table
Add a link
Reference in a new issue