Add scripts and inp files.

This commit is contained in:
James Grogan 2024-05-13 20:50:21 +01:00
parent ad937f2602
commit e19f869a1e
390 changed files with 6580687 additions and 10 deletions

View 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

View 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

View file

@ -0,0 +1,221 @@
function [] = FESolveX()
% MATLAB based 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=5.;
% 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.05;
tsteps=20;
time=0.;
% penalty term
beta=40.;
% 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=(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
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
Mred+Kred;
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'

View file

@ -0,0 +1,238 @@
function [] = FESolveX2D()
% MATLAB based XFEM Solver
% J. Grogan (2012)
clear all
% Define Geometry
Lx=1;
Ly=1;
% Generate Mesh
numElemX=1;
numElemY=1;
numElem=numElemX*numElemY;
gapX=Lx/numElemX;
gapY=Ly/numElemY;
tmpX=0.
tmpY=0.
for i=1:numElemX+1
for j=1:numElemY+1
ndCrdX=
[ndCrds,elemNodes]=rectangularMesh(Lx,Ly,numElemX,numElemY);
xx=ndCrds(:,1);
yy=ndCrds(:,2);
drawingMesh(ndCrds,elemNodes,'Q4','k-');
numNodes=size(xx,1);
ndCrds
elemNodes
indx=1:numElem;
elemNodes(:,1)=indx;
elemNodes(:,2)=indx+1;
% dofs per node
ndof=2;
% Define Section Properties
rho=1.;
% initial interface position
dpos=5.;
% 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.05;
tsteps=20;
time=0.;
% penalty term
beta=40.;
% 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=(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
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
Mred+Kred;
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'

View file

@ -0,0 +1,228 @@
function [] = FESolveX2D()
% MATLAB based XFEM Solver
% J. Grogan (2012)
clear all
% Import Abaqus Mesh from INP File
AbaFile=fopen('AbInp.inp');
AbaContent=zeros(1,5);
while AbaContent(1:5)~='*Node'
AbaContent=fgets(AbaFile)
AbaContent
end
[ndCrds,elemNodes]=rectangularMesh(Lx,Ly,numElemX,numElemY);
xx=ndCrds(:,1);
yy=ndCrds(:,2);
drawingMesh(ndCrds,elemNodes,'Q4','k-');
numNodes=size(xx,1);
ndCrds
elemNodes
indx=1:numElem;
elemNodes(:,1)=indx;
elemNodes(:,2)=indx+1;
% dofs per node
ndof=2;
% Define Section Properties
rho=1.;
% initial interface position
dpos=5.;
% 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.05;
tsteps=20;
time=0.;
% penalty term
beta=40.;
% 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=(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
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
Mred+Kred;
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'

View file

@ -0,0 +1,95 @@
function [] = Tst()
% 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
% force vector BC
fVect=zeros(12,1);
for i=1:numElem
if sign(lSet(elemNod(i,1)))~=sign(lSet(elemNod(i,2)))
fVect(elemNod(i,1))= 1.;
fVect(elemNod(i,2))= 1.;
end
end
% solve for velocity vector
Af=zeros(numElem+1);
% Assemble 'Stiffness' Matrices
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)*(1./abs(dls))*(dls*dshp);
end
for k=1:2;
for j=1:2;
Af(elemNod(i,j),elemNod(i,k))=Af(elemNod(i,j),elemNod(i,k))+AfL(j,k)+AfLGLS(j,k);
end
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);
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=zeors(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)*fVect(elemNod(i,1))+shp(2)*fVect(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;
mMatGLS=mMatGLS+dshp'*(dls/abs(dls))*Floc*1.*shp;
f1L=f1L+shp'*Floc*abs(dls);
f2L=f2L+dshp'*(dls/abs(dls))*Floc*1.*Floc*abs(dls);
vs=1.*((abs(0.1+Floc*abs(dls)))/(abs(Floc*abs(dls))+1.));
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.1;
lSet=lSet-(((mMat+mMatGLS)^-1)/dt)*(f1+f2+f3);
lSet