#cf 'Contenu des fichiers' à propos de 'reference'
defreference(tabC,res1,c,ec,fr):
#res=256
k,ll,mm,nn=tabC.shape
mesh=UnitSquareMesh(res1,res1,"left/right")
classLocalC(UserExpression):
def__init__(self,Cij,mesh):
self.Cij=Cij
self.Nx,self.Ny,a,b=Cij.shape
asserta==3andb==3,"Wrong shape"
self.mesh=mesh
UserExpression.__init__(self)
defeval_cell(self,value,x,ufc_cell):
p=Cell(mesh,ufc_cell.index).midpoint()
i,j=int(p[0]*(self.Nx)),int(p[1]*(self.Ny))
value[:]=self.Cij[j,i,:,:].flatten()
defvalue_shape(self):
return(3,3)
#Ici on crée, à partir du tableau des tenseurs d'élasticité correspondant au domaine dont on veut calculer le Chom, un tableau Cv représentant le même Cn mais adapté à une résolution plus fine 'res'
# Cv = np.array([[np.zeros((3,3)) for i in range(res)] for j in range(res)])
# for i0 in range(k):
# for j0 in range(k):
# for i in range(int(i0*res/k),int((i0+1)*res/k)):
# for j in range (int(j0*res/k),int((j0+1)*res/k)):
# Cv[i,j]=tabC[i0,j0]
# plt.imshow(tabC[:,:,0,0])
# plt.show()
# plt.close()
# plt.imshow(Cv[:,:,0,0])
# plt.show()
# plt.close()
#Cvar est la transformation du tableau Cv en une fonction définie sur 'mesh'
Cvar=LocalC(tabC,mesh)
#Avar= LocalC(tA,mesh)
# class used to define the periodic boundary map
classPeriodicBoundary(SubDomain):
def__init__(self,vertices,tolerance=DOLFIN_EPS):
""" vertices stores the coordinates of the 4 unit cell corners"""
SubDomain.__init__(self,tolerance)
self.tol=tolerance
self.vv=vertices
self.a1=self.vv[1,:]-self.vv[0,:]# first vector generating periodicity
self.a2=self.vv[3,:]-self.vv[0,:]# second vector generating periodicity
# check if UC vertices form indeed a parallelogram
ifnear(x[0],self.vv[2,0],self.tol)andnear(x[1],self.vv[2,1],self.tol):# if on top-right corner
y[0]=x[0]-(self.a1[0]+self.a2[0])
y[1]=x[1]-(self.a1[1]+self.a2[1])
elifnear(x[0],self.vv[1,0]+x[1]*self.a2[0]/self.vv[2,1],self.tol):# if on right boundary
y[0]=x[0]-self.a1[0]
y[1]=x[1]-self.a1[1]
else:# should be on top boundary
y[0]=x[0]-self.a2[0]
y[1]=x[1]-self.a2[1]
#la fonction reference_problem prend en argument C, donnant le tenseur d'élasticité en un point de 'mesh', et renvoie le Chom du domaine. k étant le nombre de phases différentes sur le domaine, qui correspond à la taille du tableau Cn pris en argument par la fonction 'reference'