Beispiel #1
0
def Torus_PUBEM(xsec_refinements=0,circum_refinements=1,r=0.5,R=1.0,element_type='Serendipity'):
    
    if element_type!= 'Standard' and element_type!='Serendipity':
        raise "element_type must be Standard or Serendipity"
    mesh = Torus_Bezier(xsec_refinements,circum_refinements,r,R)
    
    elements=[]
    for e in mesh.eList:
        p1=e.vals(0,0)
        p2=e.vals(1,1)
        #theta2limits = [np.arcsin(p1[2]/r),np.arcsin(p2[2]/r)]
        theta2limits = np.array([np.arctan2(p1[2],np.sqrt(p1[0]**2+p1[1]**2)-R),np.arctan2(p2[2],np.sqrt(p2[0]**2+p2[1]**2)-R)]).reshape(-1,)
        #theta1limits = [np.arctan2(p1[1],p1[0]),np.arctan2(p2[1],p2[0])]
        p1 /= R+r*np.cos(theta2limits[0])
        p2 /= R+r*np.cos(theta2limits[1])
        theta1limits = np.array([np.arctan2(p1[1],p1[0]),np.arctan2(p2[1],p2[0])]).reshape(-1,)
        if theta2limits[0]<0 and theta2limits[1]>0: theta2limits[0]+=2*np.pi
        if theta1limits[1]<0 and theta1limits[0]>0: theta1limits[1]+=2*np.pi
        if element_type=='Standard': elements.append(Lagrange.TorusSegment_Standard(R,r,theta1limits,theta2limits))
        else: elements.append(Lagrange.TorusSegment_Serendipity(R,r,theta1limits,theta2limits))
    
    mesh = Lagrange.Mesh([Lagrange.Domain(elements)])

    mesh.dList[0].edges = 32*(1+xsec_refinements)*(1+circum_refinements)
    mesh.dList[0].corners = 16*(1+xsec_refinements)*(1+circum_refinements)
    mesh.dList[0].extraordinary_points = 0
        
    return mesh
Beispiel #2
0
def Capsule_Quadratic(radius=1.0,straight_length_factor=1,E_per_segment=1):
    """Length of straight is length of arc multiplied by straight_length_factor
    Number of elements in arc is E_per_segment
    Number of elements in straight is E_per_segment*straight_length_factor
    NOTE: straight_length_factor must be integer > 0
    """
    capsule = Capsule_Exact(radius,straight_length_factor,E_per_segment)
    return Lagrange.Mesh([Lagrange.Domain([Lagrange.QuadraticElement(e.P) for e in capsule.eList])])
Beispiel #3
0
def FiveCylinders_Exact(num_elements,a=1,r=3):
    theta = np.linspace(0,2*np.pi,5,endpoint=False)
    cx = r*np.cos(theta)
    cy = r*np.sin(theta)    
    theta = np.linspace(2*np.pi,0,num_elements+1)
    cylinders = [Lagrange.Domain([Lagrange.CircularArc(cx[j],cy[j],theta[i],theta[i+1],a) 
                        for i in xrange(num_elements)]) for j in xrange(5)]
    return Lagrange.Mesh(cylinders)
Beispiel #4
0
 def transform(x,y,z):
     xx = x**2
     yy = y**2
     zz = z**2
     xbar = x*np.sqrt(1 - yy/2 - zz/2 + yy*zz/3)
     ybar = y*np.sqrt(1 - xx/2 - zz/2 + xx*zz/3)
     zbar = z*np.sqrt(1 - xx/2 - yy/2 + xx*yy/3)
     return Lagrange.SerendipityQuadraticElement(np.vstack([xbar,ybar,zbar]))
Beispiel #5
0
def Torus_Quad(xsec_refinements=0,circum_refinements=1,r=0.5,R=1.0,element_type='Standard'):
    
    if element_type!= 'Standard' and element_type!='Serendipity':
        raise "element_type must be Standard or Serendipity"
    mesh = Torus_Bezier(xsec_refinements,circum_refinements,r,R)
    
    xi1=np.array([0,0.5,1,1,1,0.5,0,0])
    xi2=np.array([0,0,0,0.5,1,1,1,0.5])
    if element_type=='Standard':
        xi1=np.append(xi1,0.5)
        xi2=np.append(xi2,0.5) 
        
    
    if element_type=='Standard': elements=[Lagrange.StandardQuadraticElement(e.vals(xi1,xi2)) for e in mesh.eList]
    else: elements=[Lagrange.SerendipityQuadraticElement(e.vals(xi1,xi2)) for e in mesh.eList]

    mesh = Lagrange.Mesh([Lagrange.Domain(elements)])

    mesh.dList[0].edges = 32*(1+xsec_refinements)*(1+circum_refinements)
    mesh.dList[0].corners = 16*(1+xsec_refinements)*(1+circum_refinements)
    mesh.dList[0].extraordinary_points = 0
        
    return mesh
Beispiel #6
0
def Capsule_Exact(radius=1.0,straight_length_factor=1,E_per_segment=1):
    """Length of straight is length of arc multiplied by straight_length_factor
    Number of elements in arc is E_per_segment
    Number of elements in straight is E_per_segment*straight_length_factor
    NOTE: straight_length_factor must be integer > 0
    """
    temp = 0.5*radius*np.pi*straight_length_factor
    temp = np.linspace(-temp,temp,E_per_segment*straight_length_factor+1)
    lines1 = [Lagrange.Line([temp[i],radius],[temp[i+1],radius]) for i in xrange(E_per_segment*straight_length_factor)]    
    temp = np.linspace(0.5*np.pi,-0.5*np.pi,E_per_segment+1)
    arcs1 = [Lagrange.CircularArc(0.5*radius*np.pi*straight_length_factor,0,temp[i],temp[i+1],1) for i in xrange(E_per_segment)]    
    temp = 0.5*radius*np.pi*straight_length_factor
    temp = np.linspace(temp,-temp,E_per_segment*straight_length_factor+1)
    lines2 = [Lagrange.Line([temp[i],-radius],[temp[i+1],-radius]) for i in xrange(E_per_segment*straight_length_factor)]    
    temp = np.linspace(1.5*np.pi,0.5*np.pi,E_per_segment+1)
    arcs2 = [Lagrange.CircularArc(-0.5*radius*np.pi*straight_length_factor,0,temp[i],temp[i+1],1) for i in xrange(E_per_segment)]    
    elements = lines1,arcs1,lines2,arcs2
    elements = [element for section in elements for element in section]
    return Lagrange.Mesh([Lagrange.Domain(elements)])
Beispiel #7
0
def Sphere_CubeToSerendipityLagrangeQuad(N):

    def transform(x,y,z):
        xx = x**2
        yy = y**2
        zz = z**2
        xbar = x*np.sqrt(1 - yy/2 - zz/2 + yy*zz/3)
        ybar = y*np.sqrt(1 - xx/2 - zz/2 + xx*zz/3)
        zbar = z*np.sqrt(1 - xx/2 - yy/2 + xx*yy/3)
        return Lagrange.SerendipityQuadraticElement(np.vstack([xbar,ybar,zbar]))
    def get_coordinates(i,j,xis,etas):
        xi = np.hstack([xis[2*j:2*j+2],xis[2*j+2],xis[2*j+2],xis[2*j+2:2*j:-1],xis[2*j],xis[2*j]])
        eta = np.hstack([etas[2*i],etas[2*i],etas[2*i:2*i+2],etas[2*i+2],etas[2*i+2],etas[2*i+2:2*i:-1]])
        return xi,eta
    ones = np.ones(8,)
    element_list=[]
    xis = np.linspace(1,-1,2*N+1)
    etas = np.linspace(-1,1,2*N+1)
    # x=+1 side
    for i in xrange(N):
        for j in xrange(N):
            x = ones
            y,z = get_coordinates(i,j,xis,etas)
            element_list.append(transform(x,y,z))
    # y=+1 side
    for i in xrange(N):
        for j in xrange(N):
            y = ones
            x,z = get_coordinates(i,j,xis,etas)
            x=-x
            element_list.append(transform(x,y,z))
    # x=-1 side
    for i in xrange(N):
        for j in xrange(N):
            x = -ones
            y,z = get_coordinates(i,j,xis,etas)
            y=-y
            element_list.append(transform(x,y,z))
    # y=-1 side
    for i in xrange(N):
        for j in xrange(N):
            y = -ones
            x,z = get_coordinates(i,j,xis,etas)
            element_list.append(transform(x,y,z))
    # z=+1 side
    for i in xrange(N):
        for j in xrange(N):
            z = ones
            x,y = get_coordinates(i,j,xis,etas)
            x=-x ; y=-y
            element_list.append(transform(x,y,z))
    # z=-1 side
    for i in xrange(N):
        for j in xrange(N):
            z = -ones
            x,y = get_coordinates(i,j,xis,etas)
            x=-x
            element_list.append(transform(x,y,z))
    mesh = Lagrange.Mesh([Lagrange.Domain(element_list)])
    # For determining points created using NxN grid on each element
    mesh.dList[0].edges = mesh.numElements * 2
    mesh.dList[0].corners = 6*N**2 + 2
    mesh.dList[0].extraordinary_points = 8
    return mesh
Beispiel #8
0
def Cylinder_Exact(num_elements,radius=1.0):
    theta = np.linspace(2*np.pi,0,num_elements+1)
    elements = [Lagrange.CircularArc(0,0,theta[i],theta[i+1],radius) for i in xrange(num_elements)]
    cylinder = Lagrange.Domain(elements)
    return Lagrange.Mesh([cylinder])
Beispiel #9
0
def CapsAndCyl_Quadratic(elements_per_semicircular_arc=1,elements_per_line=1):
    mesh = CapsAndCyl_Exact(elements_per_semicircular_arc,elements_per_line)
    return Lagrange.Mesh([Lagrange.Domain([Lagrange.QuadraticElement(e.P) for e in d.eList]) for d in mesh.dList])
Beispiel #10
0
def CapsAndCyl_Exact(elements_per_semicircular_arc=1,elements_per_line=1):
    # Cylinder
    cylE = 2*elements_per_semicircular_arc
    theta = np.linspace(2*np.pi,0,cylE+1)
    cylinder = Lagrange.Domain([Lagrange.CircularArc(1,0,theta[i],theta[i+1],1) for i in xrange(cylE)])
    
    # Capsule 1
    arcE = elements_per_semicircular_arc
    linE = elements_per_line

    x = np.linspace(-np.sqrt(2)-1,-1,linE+1)
    y = np.linspace(2,np.sqrt(2)+2,linE+1)
    lines1=[Lagrange.Line([x[i],y[i]],[x[i+1],y[i+1]]) for i in xrange(linE)]
    
    theta=np.linspace(0.75*np.pi,-0.25*np.pi,arcE+1)
    arcs1 = [Lagrange.CircularArc(1/np.sqrt(2)-1,1/np.sqrt(2)+2,theta[i],theta[i+1],1) for i in xrange(arcE)]
    
    x = np.linspace(np.sqrt(2)-1,-1,linE+1)
    y = np.linspace(2,-np.sqrt(2)+2,linE+1)
    lines2=[Lagrange.Line([x[i],y[i]],[x[i+1],y[i+1]]) for i in xrange(linE)]
    
    theta=np.linspace(1.75*np.pi,0.75*np.pi,arcE+1)
    arcs2 = [Lagrange.CircularArc(-1/np.sqrt(2)-1,-1/np.sqrt(2)+2,theta[i],theta[i+1],1) for i in xrange(arcE)]
    
    elements = lines1,arcs1,lines2,arcs2
    capsule1 = Lagrange.Domain([element for section in elements for element in section])
    
    # Capsule 2
    
    x = np.linspace(-1,np.sqrt(2)-1,linE+1)
    y = np.linspace(np.sqrt(2)-2,-2,linE+1)
    lines1=[Lagrange.Line([x[i],y[i]],[x[i+1],y[i+1]]) for i in xrange(linE)]
    
    theta=np.linspace(0.25*np.pi,-0.75*np.pi,arcE+1)
    arcs1 = [Lagrange.CircularArc(1/np.sqrt(2)-1,-1/np.sqrt(2)-2,theta[i],theta[i+1],1) for i in xrange(arcE)]
    
    x = np.linspace(-1,-np.sqrt(2)-1,linE+1)
    y = np.linspace(-np.sqrt(2)-2,-2,linE+1)
    lines2=[Lagrange.Line([x[i],y[i]],[x[i+1],y[i+1]]) for i in xrange(linE)]
    
    theta=np.linspace(1.25*np.pi,0.25*np.pi,arcE+1)
    arcs2 = [Lagrange.CircularArc(-1/np.sqrt(2)-1,1/np.sqrt(2)-2,theta[i],theta[i+1],1) for i in xrange(arcE)]
    
    elements = lines1,arcs1,lines2,arcs2
    capsule2 = Lagrange.Domain([element for section in elements for element in section])
    
    return Lagrange.Mesh([cylinder,capsule1,capsule2])
Beispiel #11
0
def Cylinder_Quadratic(num_elements,radius=1.0):
    theta = np.linspace(2*np.pi,0,num=2*num_elements+1)
    x,y=np.vstack([radius*np.cos(theta),radius*np.sin(theta)])
    elements = [Lagrange.QuadraticElement(np.vstack([x[2*i:2*i+3],y[2*i:2*i+3]])) for i in xrange(num_elements)]
    cylinder = Lagrange.Domain(elements)
    return Lagrange.Mesh([cylinder])
Beispiel #12
0
def FiveCylinders_Quadratic(num_elements,a=1.0,r=3.0): 
    mesh = FiveCylinders_Exact(num_elements,a,r)
    return Lagrange.Mesh([Lagrange.Domain([Lagrange.QuadraticElement(e.P) for e in d.eList]) for d in mesh.dList])