Advertisement
Guest User

Calculate Riemann curvature and Ricci tensor from the metric

a guest
Oct 14th, 2015
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.76 KB | None | 0 0
  1. import sympy as sym
  2. class Riemann:
  3.     """
  4.    Used for defining a Riemann curvature tensor or Ricci tensor
  5.    for a given metric between cartesian coordinates and another
  6.    orthognal coordinate system.
  7.    """
  8.     def __init__(self,g,coords_sys="coordinate_system2",dim=3):
  9.         """
  10.        Contructor __init__ initializes the object for a given
  11.        metric g (symbolic matrix). The metric must be defined
  12.        with sympy variables u and v for the orthoganl basis in
  13.        the Cartesian coordinate system.
  14.  
  15.        g          : metric defined as nxn Sympy.Matrix object
  16.        coords_sys : descriptive information about the coordinate system
  17.                     besides Cartesian coordinates
  18.        dim        : only in R^2 or R^3
  19.        """
  20.         from sympy.diffgeom import Manifold, Patch
  21.         self.dim = dim
  22.         self.g = g
  23.         self.manifold = Manifold("M",dim)
  24.         self.patch = Patch("P",self.manifold)
  25.         self._set_coordinates(coords_sys)
  26.         self.metric = self._metric_to_twoform(g)
  27.         print self.metric
  28.        
  29.  
  30.     def _set_coordinates(self,coord_sys):
  31.         from sympy.diffgeom import CoordSystem
  32.         patch = self.patch
  33.         if self.dim==4:
  34.             cartesian = CoordSystem("cartesian",patch, ["x", "y", "z", "t"])
  35.             x, y, z, t = cartesian.coord_functions()
  36.             system2 = CoordSystem(coord_sys, patch, ["u", "v", "w","t"])
  37.             u, v, w, t = system2.coord_functions()
  38.             self.w = w
  39.             self.t = t
  40.            
  41.  
  42.         if self.dim==3:  
  43.             cartesian = CoordSystem("cartesian",patch, ["x", "y", "z"])
  44.             x, y, z = cartesian.coord_functions()
  45.             system2 = CoordSystem(coord_sys, patch, ["u", "v", "w"])
  46.             u, v, w = system2.coord_functions()
  47.             self.w = w
  48.            
  49.         if self.dim==2:
  50.             cartesian = CoordSystem("cartesian",patch, ["x", "y"])
  51.             x, y = cartesian.coord_functions()
  52.             system2 = CoordSystem(coord_sys, patch, ["u", "v"])
  53.             u, v = system2.coord_functions()
  54.            
  55.         self.u, self.v = u, v        
  56.         self.system2 = system2
  57.    
  58.     def _metric_to_twoform(self,g_):
  59.         dim = self.dim
  60.         system2 = self.system2
  61.         diff_forms = system2.base_oneforms()
  62.         u, v = self.u, self.v
  63.         if dim >= 3:
  64.             w = self.w
  65.         if dim == 4:
  66.             t = self.t
  67.  
  68.         from sympy import cos, log, exp, cosh, sin, sinh, Matrix
  69.         from sympy.abc import *
  70.         g = Matrix(dim*[dim*[0]])
  71.         # re-evaluate the metric for (u,v,w,t if 4D) which are Basescalar objects
  72.         for i in range(dim):
  73.             for j in range(dim):
  74.                 expr = str(g_[i,j])
  75.                 g[i,j] = eval(expr)
  76.        
  77.         from sympy.diffgeom import TensorProduct
  78.         metric_diff_form = sum([TensorProduct(di, dj)*g[i, j]
  79.                                for i, di in enumerate(diff_forms)
  80.                                for j, dj in enumerate(diff_forms)])
  81.        
  82.         return metric_diff_form
  83.  
  84.     def _tuple_to_list(self,t):
  85.         return list(map(self._tuple_to_list, t)) if isinstance(t, (list, tuple)) else t
  86.  
  87.     def _symplify_expr(self,expr): # this is a costly stage for complex expressions
  88.             expr = sym.trigsimp(expr)
  89.             expr = sym.simplify(expr)
  90.             return expr
  91.  
  92.     def Christoffel_tensor(self,form="simplified"):
  93.         """
  94.        Method determines the Riemann-Christoffel tensor
  95.        for a given metric(which must be in two-form).
  96.        
  97.        form : default value - "simplified"
  98.        If desired, a simplified form is returned.
  99.  
  100.        The returned value is a SymPy Matrix.
  101.        """
  102.         from sympy.diffgeom import metric_to_Riemann_components
  103.         metric = self.metric
  104.         R = metric_to_Riemann_components(metric)
  105.         simpR = self._tuple_to_list(R)
  106.         dim = self.dim
  107.         if form=="simplified":
  108.             print 'Performing simplifications on each component....'
  109.             for m in range(dim):
  110.                 for i in range(dim):
  111.                     for j in range(dim):
  112.                         for k in range(dim):
  113.                             expr = str(R[m][i][j][k])
  114.                             expr = self._symplify_expr(expr)
  115.                             simpR[m][i][j][k] = expr
  116.         return sym.Matrix(simpR)
  117.  
  118.     def Ricci_tensor(self,form="simplified"):
  119.         """
  120.        Method determines the Ricci curvature tensor for
  121.        a given metric(which must be in two-form).
  122.        
  123.        form : default value - "simplified"
  124.        If desired, a simplified form is returned.
  125.  
  126.        The returned value is a SymPy Matrix.
  127.        """
  128.         from sympy.diffgeom import metric_to_Ricci_components
  129.         metric = self.metric
  130.         RR = metric_to_Ricci_components(metric)
  131.         simpRR = self._tuple_to_list(RR)
  132.         dim = self.dim
  133.         if form=="simplified":
  134.             print 'Performing simplifications on each component....'
  135.             for m in range(dim):
  136.                 for i in range(dim):
  137.                     expr = str(RR[m][i])
  138.                     expr = self._symplify_expr(expr)
  139.                     simpRR[m][i] = expr
  140.         simpRR = sym.Matrix(simpRR)
  141.         self.Ricci = simpRR        
  142.         return sym.Matrix(simpRR)
  143.  
  144.     def scalar_curvature(self):
  145.         """
  146.        Method performs scalar contraction on the Ricci tensor.
  147.        """
  148.         try:
  149.             Ricci = self.Ricci
  150.             g = self.g
  151.             scalar_curv = sym.simplify((g**-1)*Ricci)
  152.             scalar_curv = sym.trace(scalar_curv)
  153.         except AttributeError:
  154.             print "Ricci tensor must be determined first."
  155.             return None
  156.         return scalar_curv
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement