Source code for pyOptFEM.valid3D.validStiff3DP1

import numpy,sympy,time,sys
from ..FEM3D import *
from .common import *

class TestStiff3D:
  def __init__(self, cu,cv):
    x, y, z = sympy.symbols('x y z')
    self.cu=cu
    self.cv=cv
    self.u=sympy.Lambda((x,y,z),cu)
    self.v=sympy.Lambda((x,y,z),cv)
    self.fu=eval("lambda x,y,z: "+cu)
    self.fv=eval("lambda x,y,z: "+cv)
    if self.u.is_polynomial(x,y,z):
      D=sympy.polys.Poly(cu,x,y,z).as_dict()
      self.du=max(numpy.sum(list(D.keys()),axis=1))
    else:
      self.du=-1
    if self.v.is_polynomial(x,y,z):
      D=sympy.polys.Poly(cv,x,y,z).as_dict()
      self.dv=max(numpy.sum(list(D.keys()),axis=1))
    else:
      self.dv=-1
    self.I=sympy.integrate(
             sympy.integrate(
               sympy.integrate(
                 sympy.diff(self.u(x,y,z),x)*sympy.diff(self.v(x,y,z),x)+
                 sympy.diff(self.u(x,y,z),y)*sympy.diff(self.v(x,y,z),y)+
                 sympy.diff(self.u(x,y,z),z)*sympy.diff(self.v(x,y,z),z),
                 (x,0,1)),
               (y,0,1)),
             (z,0,1))
             
[docs]def validStiff3DP1(**kwargs): """ Validation of Stiffness Matrix for P1-Lagrange finite elements in 3D """ Plot=kwargs.get('plot',True) Verbose=kwargs.get('verbose',True) print('**********************************************') print('* 3D Stiff Assembling P1 validations *') print('**********************************************') Th=CubeMesh(5) qT=Th.q.T meT=Th.me.T LF=[['x + y + z','x - y - z'], ['3*x + 2*y - z - 1','2*x - 2*y + 2*z + 1'], ['3*x**2 - x*y + 2*y**2 + y*z - z**2 - 3','2*x**2 + x*y - 3*y**2 - x*z - y']] if Verbose: print('-----------------------------------------') print(' Test 1: Matrices errors and CPU times ') print('-----------------------------------------') T=numpy.zeros(3) E=numpy.zeros(2) tstart=time.time() Mbase=StiffAssembling3DP1base(Th.nq,Th.nme,Th.q,Th.me,Th.volumes) T[0]=time.time()-tstart if Verbose: print(" Matrix size : (%d,%d)" % Mbase.shape) tstart=time.time() MOptV1=StiffAssembling3DP1OptV1(Th.nq,Th.nme,Th.q,Th.me,Th.volumes) T[1]=time.time()-tstart E[0]=NormInf(Mbase-MOptV1) if Verbose: print(" Error P1base vs OptV1 : %e" % E[0]) tstart=time.time() MOptV2=StiffAssembling3DP1OptV2(Th.nq,Th.nme,qT,meT,Th.volumes) T[2]=time.time()-tstart E[1]=NormInf(Mbase-MOptV2) if Verbose: print(" Error P1base vs OptV2 : %e" % E[1]) print(" CPU times base (ref) : %3.4f (s)" % T[0]) print(" CPU times OptV1 : %3.4f (s) - Speed Up X%3.3f" % (T[1],T[0]/T[1])) print(" CPU times OptV2 : %3.4f (s) - Speed Up X%3.3f" % (T[2],T[0]/T[2])) if checkTest1(E)==1: sys.exit() if Verbose: print('-----------------------------------------------------') print(' Test 2: Validations by integration on [0,1]x[0,1] ') print('-----------------------------------------------------') deg=numpy.zeros(len(LF)) E=numpy.zeros(len(LF)) for i in range(len(LF)): test=TestStiff3D(LF[i][0],LF[i][1]) deg[i]=test.du+test.dv U=test.fu(Th.q[:,0],Th.q[:,1],Th.q[:,2]) V=test.fv(Th.q[:,0],Th.q[:,1],Th.q[:,2]) Ifem=numpy.dot(Mbase*U,V) E[i]=abs(Ifem-test.I) if Verbose: print(" function %d :\n u(x,y,z)=%s," % (i,test.cu) ) if Verbose: print(" v(x,y,z)=%s,\n -> Stiff error=%e" % (test.cv,E[i]) ) if checkTest2(deg,E)==1: sys.exit() if Verbose: print('--------------------------------') print(' Test 3: Validations by order ') print('--------------------------------') #LN=range(10,90,10) #LN=range(5,55,5) LN=4*np.arange(1,7) n=len(LN) h=numpy.zeros(n) Error=numpy.zeros(n) k=len(LF)-1 test=TestStiff3D(LF[k][0],LF[k][1]) if Verbose: print(" function %d :\n u(x,y,z)=%s,\n v(x,y,z)=%s" %(k,test.cu,test.cv)) for i in range(n): Th=CubeMesh(LN[i],version=1) tstart=time.time() M=StiffAssembling3DP1OptV2(Th.nq,Th.nme,Th.q,Th.me,Th.volumes) TT=time.time()-tstart if Verbose: print(" Matrix size : (%d,%d)" % M.shape) print(" StiffAssembling3DP1OptV2 CPU times : %3.3f(s)" % TT) U=test.fu(Th.q[0],Th.q[1],Th.q[2]) V=test.fv(Th.q[0],Th.q[1],Th.q[2]) Ifem=numpy.dot(M*U,V) h[i]=GetMaxLengthEdges(Th.q.T,Th.me.T) Error[i]=abs(Ifem-test.I) if Verbose: print(" Error : %e" % Error[i]); if checkTest3(h,Error)==1: sys.exit() if Plot: PlotTest3(h,Error,'Test 3 : Stiffness Matrix (3D/P1)')