""" THIS SCRIPT IS NOT WORKING!
ERROR MESSAGE:

Running script facet-topo.py                                                                                                         
Traceback (most recent call last):                                                                                                   
  File "/home/me/YADE/YADE3041/bin/yade-bzr3041", line 182, in runScript                                                             
    execfile(script,globals())                                                                                                       
  File "facet-topo.py", line 14, in <module>                                                                                         
    O.step();                                                                                                                        
RuntimeError: FACET_TOPO was not enabled in Facet.hpp at compile-time. Do not use FacetTopologyAnalyzer or recompile.
"""
from __future__ import print_function


# Note: FacetTopologyAnalyzer is normally run as an initializer;
# it is only for testing sake that it is in O.engines here.
from builtins import range
O.engines=[FacetTopologyAnalyzer(projectionAxis=(1,1,1),label='topo'),]

# most simple case: no touch at all
if 1:
	O.bodies.append([
		facet([(0,0,0),(1,0,0),(0,1,0)]),
		facet([(0,0,1),(1,0,1),(0,1,1)]),
	])
	O.step();
	assert(topo['commonEdgesFound']==0)
if 1:
	O.bodies.clear()
	O.bodies.append([
		facet([(0,0,0),(1,0,0),(0,1,0)]),
		facet([(1,1,0),(1,0,0),(0,1,0)]),
	])
	O.step()
	assert(O.bodies[0].shape['edgeAdjIds'][1]==0 and O.bodies[1].shape['edgeAdjIds'][1]==1)
	assert(topo['commonEdgesFound']==1)
if 1:
	O.bodies.clear()
	O.bodies.append([
		facet([(0,0,0),(1,0,0),(0,1,0)]),
		facet([(1,1,1),(1,0,0),(0,1,0)]),
	])
	O.step()
	assert(O.bodies[0].shape['edgeAdjIds'][1]==0 and O.bodies[1].shape['edgeAdjIds'][1]==1)
	assert(topo['commonEdgesFound']==1)
	assert(abs(O.bodies[0].shape['edgeAdjHalfAngle'][1]-(-.5*atan(2/sqrt(2))))<1e-6)

if 1:
	O.bodies.clear()
	r=.5 # radius of the sphere
	nPoly=12; # try 128, it is still quite fast
	def sphPt(i,j):
		if i==0: return (0,0,-r)
		if i==nPoly/2: return (0,0,r)
		assert(i>0 and i<nPoly/2)
		assert(j>=0 and j<=nPoly)
		theta=i*2*pi/nPoly
		rr=r*sin(theta)
		phi=j*2*pi/nPoly
		return rr*cos(phi),rr*sin(phi),-r*cos(theta)
	for i in range(0,nPoly/2):
		for j in range(0,nPoly):
			if i!=0: O.bodies.append(facet([sphPt(i,j),sphPt(i,j+1),sphPt(i+1,j)]))
			if i!=nPoly/2-1: O.bodies.append(facet([sphPt(i+1,j),sphPt(i,j+1),sphPt(i+1,j+1)]))
	print('Sphere created, has',len(O.bodies),'facets')
	O.step()
	assert(topo['commonVerticesFound']==nPoly*(nPoly/2-1)+2)
	assert(topo['commonEdgesFound']==nPoly*((nPoly/2-1)+(nPoly/2-2)*2+2))
	print(topo['commonVerticesFound'],'vertices; ',topo['commonEdgesFound'],'edges')
#quit()
