def testShapefunctions( ): poly = g.Mesh( 3 ) n0 = poly.createNode( 0.0, 0.0, 0.0 ) n1 = poly.createNode( 1.0, 0.0, 0.0 ) n2 = poly.createNode( 0.0, 1.0, 0.0 ) n3 = poly.createNode( 0.0, 0.0, 0.5 ) poly.createTetrahedron( n0, n1, n2, n3 ) prism = poly.createP2Mesh() u = g.RVector( prism.nodeCount(), 0.0 ) u[ 5 ] = 1.0 prism.addExportData( "u", u ) #n3 = poly.createNode( 1.0, 1.0, 0.0 ) #poly.createTriangle( n0, n1, n3 ) #prism = g.createMesh3D( poly, g.asvector( np.linspace( 0, -1, 2 ) ) ) #prism.exportVTK( "prism" ) #mesh2 = g.createMesh2D( g.asvector( np.linspace( 0, 1, 10 ) ), #g.asvector( np.linspace( 0, 1, 10 ) ) ) #mesh2 = mesh2.createH2Mesh() #g.interpolate( prism, mesh2 ) #ax = g.viewer.showMesh( mesh2, mesh2.exportData('u'), filled = True, showLater = True ) mesh3 = g.createMesh3D( g.asvector( np.linspace( 0, 1, 11 ) ), g.asvector( np.linspace( 0, 1, 11 ) ), g.asvector( np.linspace( 0, 1, 11 ) ) ) grads = g.stdVectorRVector3( ) c = prism.cell( 0 ) uc = g.RVector( mesh3.nodeCount() ) for n in mesh3.nodes(): p = c.shape().xyz( n.pos() ) if not c.shape().isInside( p ): grads.append( g.RVector3( 0.0, 0.0, 0.0 ) ) uc[ n.id() ] = 0.0 continue uc[ n.id() ] = c.pot( p, u ) print uc[ n.id() ] gr = c.grad( p, u ) grads.append( gr ) g.interpolate( prism, mesh3 ) mesh3.addExportData( 'ua', uc ) mesh3.exportVTK( "prismHex", grads ) P.show()
def test3d(): ''' ''' # test1. mesh = pg.Mesh(3) mesh.importSTL('sphere.stl') mesh.scale(pg.RVector3(4.0, 4.0, 4.0)) mesh.translate(pg.RVector3(0.0, 0.0, -5.0)) print(mesh) mesh.exportVTK('sphere.vtk') alpha = 24 v = 8.2 epsilon = 1e-12 gamma = (100 * epsilon)**(1. / v) d = alpha / (gamma * np.sqrt(2)) d = 0 p = pg.RVector3(d, d, 0.0) x = np.arange(-15, 15, 1.) spnts = pg.stdVectorRVector3() for i in x: spnts.append(pg.RVector3(i, 0.0)) gz = pg.RVector(len(x), 0.0) for i, p in enumerate(spnts): for face in mesh.boundaries(): Z = 0 norm = face.norm() # cos( n, z ) for j in range(face.nodeCount()): A = face.node(j) B = face.node((j + 1) % face.nodeCount()) Z += lineIntegralZ3D(A.pos() - p, B.pos() - p, norm) gz[i] += Z gz = gz * 2000 * 6.67384e-11 * 1e5 gAna = analyticalSphere(spnts, radius=2.0, pos=pg.RVector3(0.0, 0.0, -5.0), dDensity=2000) ax1, ax2 = getaxes() ax1.plot(x, gAna, '-x', label='Analytical Sphere') ax1.plot(x, gz, label='polyhedral') ax1.legend() ax2.set_xlim([x[0], x[-1]]) ax2.grid()
def testShapefunctions(): poly = g.Mesh(3) n0 = poly.createNode(0.0, 0.0, 0.0) n1 = poly.createNode(1.0, 0.0, 0.0) n2 = poly.createNode(0.0, 1.0, 0.0) n3 = poly.createNode(0.0, 0.0, 0.5) poly.createTetrahedron(n0, n1, n2, n3) prism = poly.createP2Mesh() u = g.RVector(prism.nodeCount(), 0.0) u[5] = 1.0 prism.addExportData("u", u) #n3 = poly.createNode( 1.0, 1.0, 0.0 ) #poly.createTriangle( n0, n1, n3 ) #prism = g.createMesh3D( poly, g.asvector( np.linspace( 0, -1, 2 ) ) ) #prism.exportVTK( "prism" ) #mesh2 = g.createMesh2D( g.asvector( np.linspace( 0, 1, 10 ) ), #g.asvector( np.linspace( 0, 1, 10 ) ) ) #mesh2 = mesh2.createH2Mesh() #g.interpolate( prism, mesh2 ) #ax = g.viewer.showMesh( mesh2, mesh2.exportData('u'), filled = True, showLater = True ) mesh3 = g.createMesh3D(g.asvector(np.linspace(0, 1, 11)), g.asvector(np.linspace(0, 1, 11)), g.asvector(np.linspace(0, 1, 11))) grads = g.stdVectorRVector3() c = prism.cell(0) uc = g.RVector(mesh3.nodeCount()) for n in mesh3.nodes(): p = c.shape().xyz(n.pos()) if not c.shape().isInside(p): grads.append(g.RVector3(0.0, 0.0, 0.0)) uc[n.id()] = 0.0 continue uc[n.id()] = c.pot(p, u) print uc[n.id()] gr = c.grad(p, u) grads.append(gr) g.interpolate(prism, mesh3) mesh3.addExportData('ua', uc) mesh3.exportVTK("prismHex", grads) P.show()
def test3d(): ''' ''' # test1. mesh = g.Mesh( 3 ) mesh.importSTL( 'sphere.stl' ) mesh.scale( g.RVector3( 4.0, 4.0, 4.0 ) ) mesh.translate( g.RVector3( 0.0, 0.0, -5.0 ) ) print mesh mesh.exportVTK('sphere.vtk' ) alpha = 24 v = 8.2 epsilon = 1e-12 gamma = ( 100 * epsilon )** 1./v d = alpha / ( gamma * np.sqrt( 2 ) ) d = 0 p = g.RVector3( d, d, 0.0 ) x = P.arange( -15, 15, 1. ); spnts = g.stdVectorRVector3() for i in x: spnts.append( g.RVector3( i, 0.000 ) ) gz = g.RVector( len(x), 0.0 ) for i, p in enumerate( spnts ): for face in mesh.boundaries(): Z = 0 norm = face.norm() # cos( n, z ) for j in range( face.nodeCount( ) ): A = face.node( j ) B = face.node( (j+1)%face.nodeCount( ) ) Z += lineIntegralZ3D( A.pos() -p , B.pos() -p, norm ) gz[ i ] += Z gz = gz * 2000 * 6.67384e-11 * 1e5 gAna = analyticalSphere( spnts, radius = 2.0, pos = g.RVector3( 0.0, 0.0, -5.0 ), dDensity = 2000 ) ax1, ax2 = getaxes() ax1.plot( x, gAna, '-x', label = 'Analytical Sphere' ) ax1.plot( x, gz, label = 'polyhedral' ) ax1.legend() ax2.set_xlim( [ x[0], x[-1] ] ) ax2.grid()
H8_6 = E2_2R * E2_1S * E2_2T H8_7 = E2_2R * E2_2S * E2_2T H8_8 = E2_1R * E2_2S * E2_2T P15_6 = T3_3 * E2_2T * (2. * (T3_3 + E2_2T) + -3.) P15_7 = T6_4 * E2_1T P15_8 = T6_5 * E2_1T P15_9 = T6_6 * E2_1T P15_10 = T6_4 * E2_2T P15_11 = T6_5 * E2_2T P15_12 = T6_6 * E2_2T P15_13 = T3_1 * E3_3T P15_14 = T3_2 * E3_3T P15_15 = T3_3 * E3_3T pnts = g.stdVectorRVector3() # quad pnts.append(g.RVector3(0.0, 0.0)) pnts.append(g.RVector3(1.0, 0.0)) pnts.append(g.RVector3(1.0, 1.0)) pnts.append(g.RVector3(0.0, 1.0)) pnts.append(g.RVector3(0.5, 0.5)) #pnts.append(g.RVector3(0.5, 0.0)) #pnts.append(g.RVector3(1.0, 0.5)) #pnts.append(g.RVector3(0.5, 1.0)) #pnts.append(g.RVector3(0.0, 0.5)) ## tri #pnts.append(g.RVector3(0.0, 0.0)) #pnts.append(g.RVector3(1.0, 0.0))
def test2d(): mesh = pg.Mesh("mesh/world2d.bms") print (mesh) xMin = mesh.boundingBox().min()[0] yMax = mesh.boundingBox().max()[0] x = np.arange(xMin, yMax, 1.0) mesh.createNeighbourInfos() rho = pg.RVector(len(mesh.cellAttributes()), 1.0) * 2000.0 rho.setVal(0.0, pg.find(mesh.cellAttributes() == 1.0)) swatch = pg.Stopwatch(True) pnts = [] spnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) spnts.append(pg.RVector3(i, 0.0001)) # gzC, GC = calcGCells(pnts, mesh, rho, 1) gzC = pg.calcGCells(spnts, mesh, rho, 1) print ("calcGCells", swatch.duration(True)) # gzB, GB = calcGBounds(pnts, mesh, rho) # gzB = pg.calcGBounds(spnts, mesh, rho) # print("calcGBounds", swatch.duration(True)) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(0.0, -5.0), dDensity=2000) gAna2 = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(5.0, -5.0), dDensity=2000) gAna = gAna + gAna2 ax1.plot(x, gAna, "-x", label="analytical") ax1.plot(x, gZ_Mesh, label="WonBevis1987-mesh") print (gAna / gZ_Mesh) # rho=GB[0]/mesh.cellSizes() drawModel(ax2, mesh, rho) for i in (0, 1): drawSelectedMeshBoundaries(ax2, mesh.findBoundaryByMarker(i), color=(1.0, 1.0, 1.0, 1.0), linewidth=0.3) # sphere polygone radius = 2.0 depth = 5.0 poly1 = pg.stdVectorRVector3() poly2 = pg.stdVectorRVector3() nSegment = 124 for i in range(nSegment): xp = np.sin((i + 1) * (2.0 * np.pi) / nSegment) yp = np.cos((i + 1) * (2.0 * np.pi) / nSegment) poly1.append(pg.RVector3(xp * radius, yp * radius - depth)) poly2.append(pg.RVector3(xp * radius + 5.0, yp * radius - depth)) gZ_Poly = calcPolydgdz(spnts, poly1, 2000) gZ_Poly += calcPolydgdz(spnts, poly2, 2000) ax1.plot(x, gZ_Poly, label="WonBevis1987-Poly") ax2.plot(pg.x(poly1), pg.y(poly1), color="red") ax2.plot(pg.x(poly2), pg.y(poly2), color="red") ax2.plot(pg.x(spnts), pg.y(spnts), marker="x", color="black") # test some special case for i, p in enumerate(poly1): poly1[i] = pg.RVector3(poly1[i] - pg.RVector3(5.0, -6.0)) ax2.plot(pg.x(poly1), pg.y(poly1), color="green") gz = calcPolydgdz(spnts, poly1, 2000) ax1.plot(x, gz, label="Special Case", color="green") ax1.set_ylabel("dg/dz [mGal]") ax2.set_ylabel("Tiefe [m]") ax1.legend() ax2.set_xlim([x[0], x[-1]]) ax2.grid()
A = mesh.createNode(pg.RVector3(-1.0, -1.0)) B = mesh.createNode(pg.RVector3(-2.0, -1.0)) C = mesh.createNode(pg.RVector3(-2.0, -2.0)) D = mesh.createNode(pg.RVector3(-1.0, -2.0)) mesh.createTriangle(A, B, C) # mesh.createQuadrangle(A, B, C, D) mesh.scale(pg.RVector3(3.0, 3.0)) # mesh.createTriangle(A, B, D) print mesh.cellSizes() x = np.arange(-10, 10, 1.0) rho = pg.RVector(len(mesh.cellAttributes()), 1.0) * 2000.0 print (rho) pnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) gzNum = [] gzNum.append(pg.calcGCells(pnts, mesh, rho, 0)[0]) # plt.plot(x, gzNum[0], label=str(0)) for i in range(1, 10): gzNum.append(pg.calcGCells(pnts, mesh, rho, i)[0]) err = pg.abs(gzNum[i] / gzNum[0] - 1.0) * 100.0 plt.semilogy(x, err, label=str(i))
def test2d(): mesh = g.Mesh( 'mesh/world2d.bms' ) print mesh xMin = mesh.boundingBox( ).min()[0] yMax = mesh.boundingBox( ).max()[0] x = P.arange( xMin, yMax, 1. ); mesh.createNeighbourInfos() rho = g.RVector( len( mesh.cellAttributes() ), 1. ) * 2000.0 rho.setVal( 0.0, g.find( mesh.cellAttributes() == 1.0 ) ) swatch = g.Stopwatch( True ) pnts = [] spnts = g.stdVectorRVector3() for i in x: pnts.append( g.RVector3( i, 0.0001 ) ) spnts.append( g.RVector3( i, 0.0001 ) ) #gzC, GC = calcGCells( pnts, mesh, rho, 1 ) gzC = g.calcGCells( spnts , mesh, rho, 1 ) print "calcGCells", swatch.duration( True ) #gzB, GB = calcGBounds( pnts, mesh, rho ) gzB = g.calcGBounds( spnts , mesh, rho ) print "calcGBounds", swatch.duration( True ) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D( spnts, radius = 2.0, pos = g.RVector3( 0.0, -5.0 ), dDensity = 2000 ) gAna2 = analyticalCircle2D( spnts, radius = 2.0, pos = g.RVector3( 5.0, -5.0 ), dDensity = 2000 ) gAna = gAna + gAna2 ax1.plot( x, gAna, '-x', label= 'Analytisch' ) ax1.plot( x, gZ_Mesh, label= 'WonBevis1987-mesh' ) print gAna / gZ_Mesh #rho=GB[0]/mesh.cellSizes() gci = drawModel( ax2, mesh, rho ) drawSelectedMeshBoundaries( ax2, mesh.findBoundaryByMarker( 0 ) , color = ( 1.0, 1.0, 1.0, 1.0 ) , linewidth = 0.3 ) drawSelectedMeshBoundaries( ax2, mesh.findBoundaryByMarker( 1 ) , color = ( 1.0, 1.0, 1.0, 1.0 ) , linewidth = 0.3 ) # sphere polygone radius = 2. depth = 5. poly1 = g.stdVectorRVector3() poly2 = g.stdVectorRVector3() nSegment=124 for i in range( nSegment ): xp = np.sin( (i+1) * ( 2. * np.pi ) / nSegment ) yp = np.cos( (i+1) * ( 2. * np.pi ) / nSegment ) poly1.append( g.RVector3( xp * radius, yp * radius - depth ) ) poly2.append( g.RVector3( xp * radius + 5., yp * radius - depth ) ) gZ_Poly = calcPolydgdz( spnts, poly1, 2000 ) gZ_Poly += calcPolydgdz( spnts, poly2, 2000 ) ax1.plot( x, gZ_Poly, label= 'WonBevis1987-Poly' ) ax2.plot( g.x( poly1 ), g.y( poly1 ), color = 'red' ) ax2.plot( g.x( poly2 ), g.y( poly2 ), color = 'red' ) ax2.plot( g.x( spnts ), g.y( spnts ), marker = 'x', color = 'black' ) # test some special case for i, p in enumerate( poly1 ): poly1[i] = g.RVector3( poly1[i] - g.RVector3( 5.0, -6. ) ) ax2.plot( g.x( poly1 ), g.y( poly1 ), color = 'green' ) gz = calcPolydgdz( spnts, poly1, 2000 ) ax1.plot( x, gz, label= 'Special Case', color = 'green' ) ax1.set_ylabel( 'dg/dz [mGal]' ) ax2.set_ylabel( 'Tiefe [m]' ) ax1.legend() ax2.set_xlim( [ x[0], x[-1] ] ) ax2.grid()
A = mesh.createNode( g.RVector3( -1., -1. ) ) B = mesh.createNode( g.RVector3( -2., -1. ) ) C = mesh.createNode( g.RVector3( -2., -2. ) ) D = mesh.createNode( g.RVector3( -1., -2. ) ) mesh.createTriangle( A, B, C) #mesh.createQuadrangle( A, B, C, D) mesh.scale( g.RVector3( 3., 3. ) ) #mesh.createTriangle( A, B, D) print mesh.cellSizes() x = np.arange( -10, 10, 1. ); rho = g.RVector( len( mesh.cellAttributes() ), 1. ) * 2000.0 print rho pnts = g.stdVectorRVector3() for i in x: pnts.append( g.RVector3( i, 0.0001 ) ) gzNum = [] gzNum.append( g.calcGCells( pnts, mesh, rho, 0 )[0] ) #P.plot(x, gzNum[0], label = str(0) ) for i in range( 1, 10 ): gzNum.append( g.calcGCells( pnts, mesh, rho, i )[0] ) err = g.abs(gzNum[i]/gzNum[0]-1.)*100. P.semilogy(x, err, label = str(i) )
def drawShapes( ax, mesh, u ): #ax.set_aspect( 'equal' ) N = 11 mesh3 = g.createMesh3D( g.asvector( np.linspace( 0, 1, N ) ), g.asvector( np.linspace( 0, 1, N ) ), g.asvector( np.linspace( 0, 1, N ) ) ) uc = g.RVector( mesh3.nodeCount( ) ) grads = g.stdVectorRVector3( ) pnts = g.stdVectorRVector3( ) c = mesh.cell( 0 ) imax=g.find( u == max( u ) )[0] N = c.createShapeFunctions()[ imax ] print imax, N # print imax, c.shape().createShapeFunctions()[imax] for i in range( c.nodeCount() ): print c.rst( i ), N( c.rst( i ) ) # draw nodes for i in range( c.nodeCount() ): col = 'black' if i == imax: col = 'red' #ax.plot( [c.node( i ).pos()[0], c.node( i ).pos()[0] ], #[c.node( i ).pos()[1], c.node( i ).pos()[1] ], #[c.node( i ).pos()[2], c.node( i ).pos()[2] ], #'.', markersize = 15, linewidth=0, color=col ) newNode = [] for i in range( mesh3.nodeCount( ) ): p = c.shape().xyz( mesh3.node( i ).pos() ) newNode.append( p ) #ax.plot( p[0], p[1], '.', zorder=10, color='black', markersize = 1 ) if not c.shape().isInside( p ): uc[ i ] = -99.0 grads.append( g.RVector3( 0.0, 0.0 ) ) continue uc[ i ] = c.pot( p, u ) gr = c.grad( p, u ).normalise() grads.append( gr ) #ax.plot( [ p[ 0 ], p[ 0 ] + gr[ 0 ]*0.1 ], #[ p[ 1 ], p[ 1 ] + gr[ 1 ]*0.1 ], #[ p[ 2 ], p[ 2 ] + gr[ 2 ]*0.1 ], '-', color='black' ) #pnts.append( p ) #print len(pnts) #Z = np.ma.masked_where( uc == -99., uc ) ##ax.plot( g.x(pnts), g.y(pnts), g.z(pnts), '.' ) for i, n in enumerate( mesh3.nodes() ): n.setPos( newNode[ i ] ) mesh3.addExportData( 'u', uc.setVal( 0.0, g.find( uc == -99 ) ) ) name = 'cell' + str( c.nodeCount() ) + '-' + str( imax ) print "write ", name mesh3.exportVTK( name, grads )
def test2d(): mesh = pg.Mesh('mesh/world2d.bms') print(mesh) xMin = mesh.boundingBox().min()[0] yMax = mesh.boundingBox().max()[0] x = np.arange(xMin, yMax, 1.) mesh.createNeighbourInfos() rho = pg.RVector(len(mesh.cellAttributes()), 1.) * 2000.0 rho.setVal(0.0, pg.find(mesh.cellAttributes() == 1.0)) swatch = pg.Stopwatch(True) pnts = [] spnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) spnts.append(pg.RVector3(i, 0.0001)) # gzC, GC = calcGCells(pnts, mesh, rho, 1) gzC = pg.calcGCells(spnts, mesh, rho, 1) print("calcGCells", swatch.duration(True)) # gzB, GB = calcGBounds(pnts, mesh, rho) # gzB = pg.calcGBounds(spnts, mesh, rho) # print("calcGBounds", swatch.duration(True)) gZ_Mesh = gzC ax1, ax2 = getaxes() # sphere analytical solution gAna = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(0.0, -5.0), dDensity=2000) gAna2 = analyticalCircle2D(spnts, radius=2.0, pos=pg.RVector3(5.0, -5.0), dDensity=2000) gAna = gAna + gAna2 ax1.plot(x, gAna, '-x', label='analytical') ax1.plot(x, gZ_Mesh, label='WonBevis1987-mesh') print(gAna / gZ_Mesh) # rho=GB[0]/mesh.cellSizes() drawModel(ax2, mesh, rho) for i in (0, 1): drawSelectedMeshBoundaries(ax2, mesh.findBoundaryByMarker(i), color=(1.0, 1.0, 1.0, 1.0), linewidth=0.3) # sphere polygone radius = 2. depth = 5. poly1 = pg.stdVectorRVector3() poly2 = pg.stdVectorRVector3() nSegment = 124 for i in range(nSegment): xp = np.sin((i + 1) * (2. * np.pi) / nSegment) yp = np.cos((i + 1) * (2. * np.pi) / nSegment) poly1.append(pg.RVector3(xp * radius, yp * radius - depth)) poly2.append(pg.RVector3(xp * radius + 5., yp * radius - depth)) gZ_Poly = calcPolydgdz(spnts, poly1, 2000) gZ_Poly += calcPolydgdz(spnts, poly2, 2000) ax1.plot(x, gZ_Poly, label='WonBevis1987-Poly') ax2.plot(pg.x(poly1), pg.y(poly1), color='red') ax2.plot(pg.x(poly2), pg.y(poly2), color='red') ax2.plot(pg.x(spnts), pg.y(spnts), marker='x', color='black') # test some special case for i, p in enumerate(poly1): poly1[i] = pg.RVector3(poly1[i] - pg.RVector3(5.0, -6.)) ax2.plot(pg.x(poly1), pg.y(poly1), color='green') gz = calcPolydgdz(spnts, poly1, 2000) ax1.plot(x, gz, label='Special Case', color='green') ax1.set_ylabel('dg/dz [mGal]') ax2.set_ylabel('Tiefe [m]') ax1.legend() ax2.set_xlim([x[0], x[-1]]) ax2.grid()
A = mesh.createNode(pg.RVector3(-1., -1.)) B = mesh.createNode(pg.RVector3(-2., -1.)) C = mesh.createNode(pg.RVector3(-2., -2.)) D = mesh.createNode(pg.RVector3(-1., -2.)) mesh.createTriangle(A, B, C) # mesh.createQuadrangle(A, B, C, D) mesh.scale(pg.RVector3(3., 3.)) # mesh.createTriangle(A, B, D) print mesh.cellSizes() x = np.arange(-10, 10, 1.) rho = pg.RVector(len(mesh.cellAttributes()), 1.) * 2000.0 print(rho) pnts = pg.stdVectorRVector3() for i in x: pnts.append(pg.RVector3(i, 0.0001)) gzNum = [] gzNum.append(pg.calcGCells(pnts, mesh, rho, 0)[0]) # plt.plot(x, gzNum[0], label=str(0)) for i in range(1, 10): gzNum.append(pg.calcGCells(pnts, mesh, rho, i)[0]) err = pg.abs(gzNum[i] / gzNum[0] - 1.) * 100. plt.semilogy(x, err, label=str(i))