From f97c9998790b6ccdea0c4bc41bf7384beaf57d56 Mon Sep 17 00:00:00 2001 From: Barak Shoshany Date: Sun, 9 May 2021 14:15:26 -0400 Subject: [PATCH] Updated to v1.4 --- LICENSE.txt | 42 +- OGRe.m | 4716 +++++++++++++++++++------------------ OGRe_Documentation.nb | 5103 +++++++++++++++++++--------------------- OGRe_Documentation.pdf | Bin 459824 -> 453821 bytes README.md | 318 +-- 5 files changed, 5047 insertions(+), 5132 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 1eeadcc..118ef11 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2021 Barak Shoshany - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2021 Barak Shoshany + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OGRe.m b/OGRe.m index c3d5a17..d70dd90 100644 --- a/OGRe.m +++ b/OGRe.m @@ -1,2329 +1,2387 @@ -(* ::Package:: *) - - -(* OGRe: An (O)bject-Oriented (G)eneral (Re)lativity Package for Mathematica *) -(* By Barak Shoshany (baraksh@gmail.com) (baraksh.com) *) -(* https://github.com/bshoshany/OGRe *) - - -BeginPackage["OGRe`"]; - - -(* Check if the package has already been loaded, in case Get was used instead of Needs. *) -If[ - ValueQ[OGRe`Private`AlreadyLoaded], -(* Then *) - (* Unprotect and clear all symbols, so they can be redefined. Useful for debugging, or to reload the package after updating. *) - Unprotect["OGRe`*"]; - Unprotect["OGRe`Private`*"]; - (* Keep the tensor objects and settings created so far during the session, so they don't get deleted when the package is reloaded. *) - OGReTemp`TensorData = OGRe`Private`TensorData; - ClearAll["OGRe`*"]; - ClearAll["OGRe`Private`*"]; - OGRe`Private`TensorData = OGReTemp`TensorData; - Remove["OGReTemp`*"]; - OGRe`Private`AlreadyLoaded = True, -(* Else *) - OGRe`Private`AlreadyLoaded = True; - (* Initialize the symbol TensorData, which is used to store the data for the tensor objects, as well as user settings. This is done only on first load. *) - OGRe`Private`TensorData = Association[]; -]; - - -(* A dirty trick to make the package's public modules globally visible without defining their usage messages in advance. I prefer to define each usage message at the same time as the module itself, so it can also serve as documentation for the code. *) -Null[{ - TAddCoordTransformation, - TCalc, - TChangeDefaultCoords, - TChangeDefaultIndices, - TChangeID, - TChangeSymbol, - TCheckForUpdates, - TChristoffel, - TCovariantD, - TDelete, - TDocs, - TEinsteinTensor, - TExport, - TExportAll, - TGetComponents, - TImport, - TImportAll, - TIndexLetters, - TInfo, - TInitializeSymbols, - TList, - TNewCoordinates, - TNewMetric, - TNewTensor, - TParallelize, - TPartialD, - TRicciScalar, - TRicciTensor, - TRiemannTensor, - TShow, - TSimplify, - TSimplifyAssumptions -}]; - - -Begin["`Private`"]; (* OGRe`Private` *) - - -(* DO NOT change the format of the next line. It is used by TCheckForUpdates to detect the version of this file. Changing it will break the automatic update mechanism. Only change the version number and date. *) -OGReVersion = "v1.3 (May 6, 2021)"; - - -(* The raw URL of this file on GitHub. *) -OGReURL = "https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m"; - - -(* This module creates a clickable button that looks and behaves like a hyperlink. *) -CreateButton[label_, action_] := Button[ - MouseAppearance[Mouseover[ - Style[label, "Hyperlink"], - Style[label, "HyperlinkActive"] - ], "LinkHand"], - action, - Appearance -> "Frameless", - BaseStyle -> "Hyperlink" -]; -Attributes[CreateButton] = HoldRest; - - -(* This module prints an expression in an uneditable cell with the label OGRe. *) -OGRePrint[expression_] := CellPrint[ExpressionCell[expression, "Output", Editable -> False, CellLabel -> "OGRe:", CellLabelStyle -> Directive["CellLabel", Smaller, Blue]]]; -OGRePrint[expressions__] := OGRePrint[Row[{expressions}]]; - - -(* Print a welcome message at startup. *) -OGRePrint[Column[{ - Style[Row[{"OGRe: An ", Style["O", Underlined], "bject-Oriented ", Style["G", Underlined], "eneral ", Style["Re", Underlined], "lativity Package for Mathematica"}], Bold, Larger], - Style[Row[{"By Barak Shoshany (", Hyperlink["baraksh@gmail.com", "mailto:baraksh@gmail.com"], ") (", Hyperlink["baraksh.com", "https://baraksh.com/"], ")"}], Bold], - Style[Row[{OGReVersion}], Bold], - Style[Row[{"GitHub repository: ", Hyperlink["https://github.com/bshoshany/OGRe"]}], Bold], - Row[{"\[Bullet] To check if a new version is available, type ", Style["TCheckForUpdates[]", "Input"], " or ", CreateButton["click here.", TCheckForUpdates[]]}], - Row[{"\[Bullet] To view the full documentation for the package, type ", Style["TDocs[]", "Input"], " or ", CreateButton["click here.", TDocs[]]}], - Row[{"\[Bullet] To list all available modules, type ", Style["?OGRe`*", "Input"], " or ", CreateButton["click here.", OGRePrint[Information["OGRe`*"]]]}], - Row[{"\[Bullet] To get help on a particular module, type ", Style["?", "Input"], " followed by the module name."}], - Row[{"\[Bullet] To enable the new parallelization feature, type ", Style["TParallelize[True]", "Input"], " or ", CreateButton["click here.", TParallelize[True]]}] -}]]; - - -(* A special key in TensorData, Options, is used to store information about the current session, for the purpose of exporting and importing between sessions using TExportAll and TImportAll. Since this key is not a string, it cannot be accidentally overwritten by a tensor definition. *) -DefaultIndexLetters = "\[Mu]\[Nu]\[Rho]\[Sigma]\[Kappa]\[Lambda]\[Alpha]\[Beta]\[Gamma]\[Delta]\[CurlyEpsilon]\[Zeta]\[Epsilon]\[Theta]\[Iota]\[Xi]\[Pi]\[Tau]\[Phi]\[Chi]\[Psi]\[Omega]"; -PopulateOptions[] := Module[ - { - useIndexLetters, - useParallelize, - useSimplifyAssumptions - }, - If[ - !KeyExistsQ[TensorData, Options], - (* Then *) - (* If the Options key doesn't exist, which can happen when the package first loads or when importing from an old version of OGRe, create it with the default values. *) - TensorData[Options] = Association[ - "OGReVersion" -> OGReVersion, - "IndexLetters" -> DefaultIndexLetters, - "Parallelize" -> False, - "SimplifyAssumptions" -> Association[ - "AssumeReal" -> True, - "User" -> None - ] - ], - (* Else *) - (* If the Options key does exist, populate it with the imported values, but substitute the default values if any keys are missing, which can happen when importing from a different version of OGRe. *) - useIndexLetters = Lookup[TensorData[Options], "IndexLetters", DefaultIndexLetters]; - useParallelize = Lookup[TensorData[Options], "Parallelize", False]; - If[ - KeyExistsQ[TensorData[Options], "SimplifyAssumptions"], - (* Then *) - useSimplifyAssumptions = Association[ - "AssumeReal" -> Lookup[TensorData[Options]["SimplifyAssumptions"], "AssumeReal", True], - "User" -> Lookup[TensorData[Options]["SimplifyAssumptions"], "User", None] - ], - (* Else *) - useSimplifyAssumptions = Association[ - "AssumeReal" -> True, - "User" -> None - ] - ]; - TensorData[Options] = Association[ - "OGReVersion" -> OGReVersion, - "IndexLetters" -> useIndexLetters, - "Parallelize" -> useParallelize, - "SimplifyAssumptions" -> useSimplifyAssumptions - ]; - ]; -]; -PopulateOptions[]; - - -(* Create a nicely-formatted usage message. *) -CreateUsageMessage[f_, args_List, msg_String, additional_List : {}] := Module[ - { - allArgs = Join[args, additional] - }, - Evaluate[f::usage] = ToString[TextCell[Row[{ - ToString[f], - "[", - Splice[(Style[#, Bold] &)/@ Riffle[args, ", "]], - "] ", - Splice[StringSplit[msg, "`"] /. (ToString[#] -> Style[allArgs[[#]], Bold] & /@ Range[1, Length[allArgs]])] - }]], - StandardForm - ]; -]; - - -(* =================================================== - Public modules (accessible to the user) start here. - =================================================== *) - -CreateUsageMessage[TAddCoordTransformation, {sourceID, targetID, rules}, "adds a transformation from the coordinate system `1` to the coordinate system `2`. -The argument `3` must be a list of transformation rules. For example, {x \[Rule] r Sin[\[Theta]] Cos[\[Phi]], y \[Rule] r Sin[\[Theta]] Sin[\[Phi]], z \[Rule] r Cos[\[Theta]]} is a transformation from Cartesian to spherical coordinates."]; -TAddCoordTransformation::ErrorRulesForm = "The transformation rules must be a list of rules of the form x \[Rule] y."; -TAddCoordTransformation::ErrorDifferentCoords = "The source and target coordinate systems must be different."; -TAddCoordTransformation::ErrorNotSameDim = "The source and target coordinate systems must be of the same dimension."; -TAddCoordTransformation[sourceID_String, targetID_String, rules_List] := Module[ - { - allJacobians, - ChristoffelJacobian, - dim, - i, - inverseJacobian, - j, - jacobian, - k, - newCoordSymbols, - oldCoordSymbols - }, - (* Check that the tensor object sourceID exists. *) - CheckIfTensorExists[sourceID]; - (* Check that the rules are of the correct form. *) - If[ - !AllTrue[rules, MatchQ[#, _->_] &], - (* Then *) - Message[TAddCoordTransformation::ErrorRulesForm]; - Abort[]; - ]; - (* Check that both tensor objects represents coordinate systems. *) - CheckIfCoordinates[sourceID]; - CheckIfCoordinates[targetID]; - (* Check that the source and target coordinate systems are different. *) - If[ - sourceID === targetID, - (* Then *) - Message[TAddCoordTransformation::ErrorDifferentCoords]; - Abort[]; - ]; - (* Check that the source and target coordinate systems are of the same dimension. *) - If[ - Length[TensorData[sourceID]["Components"][{{1}, sourceID}]] != Length[TensorData[targetID]["Components"][{{1}, targetID}]], - (* Then *) - Message[TAddCoordTransformation::ErrorNotSameDim]; - Abort[]; - ]; - (* Add the transformation to the CoordTransformations key of the source object, or create it if it doesn't already exist. *) - If[ - KeyExistsQ[TensorData[sourceID], "CoordTransformations"] && AssociationQ[TensorData[sourceID]["CoordTransformations"]], - (* Then *) - ChangeTensorKey[sourceID, "CoordTransformations", Append[TensorData[sourceID]["CoordTransformations"], targetID -> rules]], - (* Else *) - ChangeTensorKey[sourceID, "CoordTransformations", Association[targetID -> rules]]; - ]; - (* Calculate the Jacobian, inverse Jacobian, and the "Christoffel Jacobian", i.e. the extra second-derivative term in the coordinate transformation of the Christoffel symbols, and store them in the tensor object of the source coordinates, to be used later whenever a coordinate transformation is performed. *) - oldCoordSymbols = TensorData[sourceID]["Components"][{{1}, sourceID}]; - newCoordSymbols = TensorData[targetID]["Components"][{{1}, targetID}]; - dim = Length[oldCoordSymbols]; - jacobian = TensorSimplify[Table[ - D[oldCoordSymbols[[i]] /. rules, newCoordSymbols[[j]]], - {i, 1, dim}, - {j, 1, dim} - ]]; - inverseJacobian = TensorSimplify[Inverse[jacobian]]; - ChristoffelJacobian = TensorSimplify[Table[ - D[ - oldCoordSymbols[[i]] /. rules, - newCoordSymbols[[j]], - newCoordSymbols[[k]] - ], - {i, 1, dim}, - {j, 1, dim}, - {k, 1, dim} - ]]; - allJacobians = Association[ - "Jacobian" -> jacobian, - "InverseJacobian" -> inverseJacobian, - "ChristoffelJacobian" -> ChristoffelJacobian - ]; - (* Add all three Jacobians to the Jacobians key of the source object, or create it if it doesn't already exist. *) - If[ - KeyExistsQ[TensorData[sourceID], "Jacobians"] && AssociationQ[TensorData[sourceID]["Jacobians"]], - (* Then *) - ChangeTensorKey[sourceID, "Jacobians", Append[TensorData[sourceID]["Jacobians"], targetID -> allJacobians]], - (* Else *) - ChangeTensorKey[sourceID, "Jacobians", Association[targetID -> allJacobians]]; - ]; - Return[sourceID]; -]; - - -DefaultResultID = "Result"; -DefaultSymbol = "\[DottedSquare]"; -CreateUsageMessage[TCalc, {LHSTensorID[LHSIndices], RHSExpression, symbol}, "calculates a tensor formula. -`2` may include any number of tensors in the format `4`[`5`], where `4` is a tensor object and `5` is a string representing the order of indices, along with any combination of the following operations: -\[Bullet] Addition: For example, \"A\"[\"\[Mu]\[Nu]\"] + \"B\"[\"\[Mu]\[Nu]\"]. -\[Bullet] Contraction: For example, \"A\"[\"\[Mu]\[Lambda]\"] . \"B\"[\"\[Lambda]\[Nu]\"]. -\[Bullet] Multiplication by scalar: For example, 2 * \"A\"[\"\[Mu]\[Nu]\"]. -`6` specifies the ID of the tensor object in which to store the result. If omitted, the ID \"" <> DefaultResultID <> "\" will be used. -`7` specifies the order of indices of the resulting tensor. The indices must be a permutation of the free indices of `2`. If omitted, the indices will be in the same order as they appear in `2`. If `6` is omitted, then `7` must be omitted as well. -`3` specifies the symbol to use for the result. If omitted, the placeholder symbol " <> DefaultSymbol <> " will be used.", {ID, indices, LHSTensorID, LHSIndices}]; -TCalc::ErrorIndices = "The LHS index specification \"`1`\" and the RHS index specification \"`2`\" must be the same up to permutation."; -TCalc::ErrorResult = "Invalid tensor expression obtained: `1`. Please check that the tensor expression you entered contains only tensor references of the form \"ID\"[\"indices\"] combined using addition, contraction (dot product), or multiplication by scalar." -TCalc[RHSExpression_, symbol_String : DefaultSymbol] := TCalc[DefaultResultID[""], RHSExpression, symbol]; -TCalc[LHSTensorID_String, RHSExpression_, symbol_String : DefaultSymbol] := TCalc[LHSTensorID[""], RHSExpression, symbol]; -TCalc[LHSTensorID_String[LHSIndices_String], RHSExpression_, symbol_String : DefaultSymbol] := Module[ - { - allVars, - components, - leafCount, - LHSVars, - newComponents, - newIndices, - progress, - result, - resultID, - resultIndices, - RHSVars, - rules, - useCoords, - useIndices - }, - (* Record the initial leaf count of the expression to be calculated. It will be used to advance the progress bar, since the leaf count decreases with (almost) every operation. *) - leafCount = LeafCount[RHSExpression]; - (* Define the rules for computing tensor formulas. *) - rules = { - (* Trace *) - ID_String[indices_String /; !DuplicateFreeQ[Characters[indices]]] :> - TensorTrace[ID[indices]], - (* Tensor addition *) - firstID_String[firstIndices_String] + secondID_String[secondIndices_String] :> - AddTensors[TensorTrace[firstID[firstIndices]], TensorTrace[secondID[secondIndices]]], - (* Multiplication of tensor by scalar *) - scalar_ * ID_String[indices_String] :> - TensorByScalar[TensorTrace[ID[indices]], scalar], - (* Contraction of tensors *) - firstID_String[firstIndices_String] . secondID_String[secondIndices_String] :> - ContractTensors[TensorTrace[firstID[firstIndices]], TensorTrace[secondID[secondIndices]]], - (* Partial derivative *) - TPartialD[derivativeIndex_String] . tensorID_String[tensorIndices_String] :> - DivOrGrad[derivativeIndex, TensorTrace[tensorID[tensorIndices]]], - (* Covariant derivative *) - TCovariantD[derivativeIndex_String] . tensorID_String[tensorIndices_String] :> - CovariantDivOrGrad[derivativeIndex, TensorTrace[tensorID[tensorIndices]]] - }; - (* Print a dynamic progress indicator. *) - progress = 0; - PrintTemporary["Calculation progress: ", ProgressIndicator[Dynamic[progress], {0, 1}]]; - (* Repeatedly replace tensor operations with their results until we reach a fixed point. Note that we use NestWhile instead of ReplaceRepeated here so that we can report progress to the user. *) - result = NestWhile[( - result = ReplaceAll[#, rules]; - progress = 1 - LeafCount[result] / leafCount; - result - ) &, RHSExpression, UnsameQ, 2]; - progress = 1; - (* Check that the result is valid, i.e. of the form "tensorID"["indices"]. *) - If[ - !MatchQ[result, _String[_String]], - (* Then *) - Message[TCalc::ErrorResult, result]; - (* Clear the temporary tensors that were created for the purpose of the calculation. *) - ClearTemp[]; - Abort[]; - ]; - resultID = result[[0]]; - resultIndices = result[[1]]; - (* Get the indices, coordinates, and components of the result. *) - useIndices = TensorData[resultID]["DefaultIndices"]; - useCoords = TensorData[resultID]["DefaultCoords"]; - components = TensorData[resultID]["Components"][{useIndices, useCoords}]; - (* Simplify the components. *) - components = TensorSimplify[components]; - If[ - LHSIndices === "", - (* Then *) - (* Either a scalar, or no rearranging of indices is desired. Store the result directly in a new tensor object. *) - SetTensorID[LHSTensorID, Association[ - "Components" -> Association[{useIndices, useCoords} -> components], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> useIndices, - "Metric" -> TensorData[resultID]["Metric"], - "Role" -> "Calculated", - "Symbol" -> symbol - ]], - (* Else *) - (* Check that the LHS and RHS index specifications are the same up to permutation. *) - If[ - Sort[Characters[LHSIndices]] != Sort[Characters[resultIndices]], - (* Then *) - Message[TCalc::ErrorIndices, LHSIndices, resultIndices]; - (* Clear the temporary tensors that were created for the purpose of the calculation. *) - ClearTemp[]; - Abort[]; - ]; - (* Collect the variables to be used for rearranging the indices. Both LHSVars and RHSVars will be the same set of variables, but potentially in a different order. *) - allVars = Association[]; - Scan[(allVars[#] = Unique["var"]) &, Characters[LHSIndices]]; - LHSVars = allVars[#]& /@ Characters[LHSIndices]; - RHSVars = allVars[#]& /@ Characters[resultIndices]; - (* Rearrange the components and indices to allow for a LHS with a different index order than the RHS. *) - newComponents = Table[ - components[[Sequence @@ RHSVars]], - Evaluate[Sequence @@ ({#, 1, Length[components]} & /@ LHSVars)] - ]; - newIndices = Table[ - useIndices[[StringPosition[resultIndices, Characters[LHSIndices][[n]]][[1, 1]]]], - {n, 1, StringLength[LHSIndices]} - ]; - (* Store the result in a new tensor object. *) - SetTensorID[LHSTensorID, Association[ - "Components" -> Association[{newIndices, useCoords} -> newComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> newIndices, - "Metric" -> TensorData[resultID]["Metric"], - "Role" -> "Calculated", - "Symbol" -> symbol - ]]; - ]; - (* Print the explicit formula we calculated, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) - (* OGRePrint["Calculated: ", TensorData[resultID]["Symbol"]]; *) - (* Clear the temporary tensors that were created for the purpose of the calculation. *) - ClearTemp[]; - Return[LHSTensorID]; -]; - - -CreateUsageMessage[TChangeDefaultCoords, {tensorID, coordinatesID}, "changes the default coordinate system of the tensor object `1` to `2`."]; -TChangeDefaultCoords::ErrorCoordTensor = "Cannot change the default coordinate system for a tensor object representing a coordinate system." -TChangeDefaultCoords[tensorID_String, coordinatesID_String] := ( - (* Check that the tensor objects sourceID and coordinatesID exist. *) - CheckIfTensorExists[tensorID]; - CheckIfTensorExists[coordinatesID]; - (* Check that the tensor object tensorID does not itself represents a coordinate system. *) - If[ - TensorData[tensorID]["Role"] === "Coordinates", - (* Then *) - Message[TChangeDefaultCoords::ErrorCoordTensor]; - Abort[]; - ]; - (* Check that the tensor object coordinatesID represents a coordinate system. *) - CheckIfCoordinates[coordinatesID]; - (* Add a representation to the tensor in the new coordinate system with the default indices, if it doesn't already exist. *) - AddRepresentation[tensorID, TensorData[tensorID]["DefaultIndices"], coordinatesID]; - (* Change the DefaultCoords key. *) - ChangeTensorKey[tensorID, "DefaultCoords", coordinatesID]; - Return[tensorID]; -); - - -CreateUsageMessage[TChangeDefaultIndices, {ID, indices}, "changes the default index configuration of the tensor object `1` to `2`. -`2` is a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index."]; -TChangeDefaultIndices::ErrorCoords = "Cannot change the default index configuration for a tensor object representing a coordinate system." -TChangeDefaultIndices::ErrorMetric = "Cannot change the default index configuration for a tensor object representing a metric." -TChangeDefaultIndices::ErrorChristoffel = "Cannot change the default index configuration for a tensor object representing a Levi-Civita connection (Christoffel symbols)." -TChangeDefaultIndices[ID_String, indices_List] := ( - (* Check that the tensor object ID exists. *) - CheckIfTensorExists[ID]; - (* Check that the tensor object does not represent a coordinate system. *) - If[ - TensorData[ID]["Role"] === "Coordinates", - (* Then *) - Message[TChangeDefaultIndices::ErrorCoords]; - Abort[]; - ]; - (* Check that the tensor object does not represent a metric. *) - If[ - TensorData[ID]["Role"] === "Metric", - (* Then *) - Message[TChangeDefaultIndices::ErrorMetric]; - Abort[]; - ]; - (* Check that the tensor object does not represent a connection. *) - If[ - TensorData[ID]["Role"] === "Christoffel", - (* Then *) - Message[TChangeDefaultIndices::ErrorChristoffel]; - Abort[]; - ]; - (* Check that the list of indices is of the correct form. *) - CheckIndicesForm[indices]; - (* Add a representation to the tensor with the new indices in the default coordinate system, if it doesn't already exist. *) - AddRepresentation[ID, indices, TensorData[ID]["DefaultCoords"]]; - (* Change the DefaultIndices key. *) - ChangeTensorKey[ID, "DefaultIndices", indices]; - Return[ID]; -); - - -CreateUsageMessage[TChangeID, {oldID, newID}, "changes the ID of the tensor object `1` to `2`. -If the tensor is a metric or a coordinate system, all currently defined tensors will be scanned, and any references to `1` will be replaced with `2`. If a tensor with the ID `2` already exists, it will be overwritten."]; -TChangeID[oldID_String, newID_String] := ( - (* Check that the tensor object oldID exists. *) - CheckIfTensorExists[oldID]; - (* Copy the old tensor data to the new ID and then remove the old ID. *) - SetTensorID[newID, TensorData[oldID]]; - RemoveTensorID[oldID]; - (* If the tensor is a metric, replace all references to it. *) - If[ - this["Role"] === "Metric", - (* Then *) - Scan[ - If[TensorData[#]["Metric"] === oldID, ChangeTensorKey[#, "Metric", newID]] &, - Keys[TensorData] - ]; - ]; - (* If the tensor is a coordinate system, replace all references to it. *) - If[ - this["Role"] === "Coordinates", - (* Then *) - Scan[ - ChangeCoordinateID[#, oldID, newID] &, - Keys[TensorData] - ]; - ]; - Return[newID]; -); - - -CreateUsageMessage[TChangeSymbol, {ID, symbol}, "changes the symbol of the tensor object `1` to `2`."]; -TChangeSymbol[ID_String, symbol_String] := ( - CheckIfTensorExists[ID]; - ChangeTensorKey[ID, "Symbol", symbol]; - Return[ID]; -); - - -CreateUsageMessage[TCheckForUpdates, {}, "checks the GitHub repository for new versions of this package. If a new version is available, the user will be given the option to download or install it."]; -TCheckForUpdates[] := Module[ - { - errorMessage, - newVersion, - remoteFile, - toPrint, - versionLookup - }, - errorMessage = Row[{"Error: Failed to check for updates. Please visit ", Hyperlink["https://github.com/bshoshany/OGRe"], " to check manually."}]; - OGRePrint["Checking GitHub repository for updates..."]; - remoteFile = Quiet[Import[OGReURL, "Text"]]; - If[ - remoteFile === $Failed, - (* Then *) - OGRePrint[errorMessage]; - Abort[]; - ]; - versionLookup = StringCases[remoteFile, Shortest["OGReVersion = \"" ~~ __ ~~ "\";"]]; - If[ - Length[versionLookup] == 1, - (* Then *) - newVersion = StringTake[versionLookup[[1]], {16, StringLength[versionLookup[[1]]] - 2}]; - If[ - newVersion === OGReVersion, - (* Then *) - OGRePrint["You have the latest version of the package."], - (* Else *) - toPrint = {Row[{"A new version of the package is available: ", Style[newVersion, Bold]}]}; - AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ - "Visit GitHub repository.", - SystemOpen["https://github.com/bshoshany/OGRe"] - ]}]]; - AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ - "Reload new version directly from GitHub without downloading it.", - Get[OGReURL] - ]}]]; - (* If the notebook is an Untitled notebook, meaning it is not an actual file in the file system, then NotebookDirectory[] will return $Failed and issue the error message NotebookDirectory::nosv. Otherwise, show an option to download the notebook to the current notebook directory. *) - Off[NotebookDirectory::nosv]; - If[ - NotebookDirectory[] =!= $Failed, - (* Then *) - AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ - "Download new version to " <> FileNameJoin[{NotebookDirectory[], "OGRe.m"}] <> " and reload the package.", - URLDownload[OGReURL, FileNameJoin[{NotebookDirectory[], "OGRe.m"}]]; OGRePrint["Downloaded! Reloading..."]; Get[FileNameJoin[{NotebookDirectory[], "OGRe.m"}]] - ]}]]; - ] - On[NotebookDirectory::nosv]; - AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ - "Install new version to " <> FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}] <> " and reload the package.", - URLDownload[OGReURL, FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]; OGRePrint["Installed! Reloading..."]; Get[FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]] - ]}]]; - OGRePrint[Column[toPrint]]; - ], - (* Else *) - OGRePrint[errorMessage]; - ]; -]; - - -CreateUsageMessage[TChristoffel, {metricID}, "calculates the Christoffel symbols (the coefficients of the Levi-Civita connection) from the metric `1` and stores the result in a new tensor object with ID \"`1`Christoffel\". -Note that the connection is not a tensor, and does not transform like a tensor when changing coordinates. \"`1`Christoffel\" will be a special tensor object which transforms according to the appropriate rules. Therefore, one should only calculate the Christoffel symbols using this module. A manual calculation with TCalc[ ] will result in a tensor object with the wrong transformation rules."]; -TChristoffel::ErrorNotMetric = "The Christoffel symbols can only be calculated from a tensor object representing a metric."; -TChristoffel[metricID_String] := Module[ - { - christoffelID, - inverseMetricID = NewTempID[] - }, - (* Check that metricID is indeed a metric. *) - If[ - TensorData[metricID]["Role"] =!= "Metric", - (* Then *) - Message[TChristoffel::ErrorNotMetric]; - Abort[]; - ]; - (* Create a temporary tensor for the inverse metric, with two upper indices as its default configuration, to force the Christoffel symbols to have the correct index configuration. We do this to increase performance, since if we don't, then we'll have to raise the first index later, which is a costly operation. *) - SetTensorID[inverseMetricID, Association[ - "Components" -> TensorData[metricID]["Components"], - "DefaultCoords" -> TensorData[metricID]["DefaultCoords"], - "DefaultIndices" -> {1, 1}, - "Metric" -> TensorData[metricID]["Metric"], - "Role" -> "Temporary", - "Symbol" -> Superscript[TensorData[metricID]["Symbol"], "\[Lambda]\[Sigma]"] - ]]; - (* Calculate the Christoffel symbols, and give the tensor object the correct ID and symbol. *) - christoffelID = TCalc[ - (metricID <> "Christoffel")["\[Lambda]\[Mu]\[Nu]"], - 1/2 inverseMetricID["\[Lambda]\[Sigma]"] . ( - TPartialD["\[Mu]"] . metricID["\[Nu]\[Sigma]"] + - TPartialD["\[Nu]"] . metricID["\[Sigma]\[Mu]"] - - TPartialD["\[Sigma]"] . metricID["\[Mu]\[Nu]"] - ), - "\[CapitalGamma]" - ]; - (* Set the role of the tensor to Christoffel, so that OGRe will know to transform it as a connection and not as a tensor. *) - ChangeTensorKey[christoffelID, "Role", "Christoffel"]; - Return[christoffelID]; -]; - - -CreateUsageMessage[TDelete, {ID}, "deletes the tensor object `1`. -WARNING: The tensor data will be lost forever and cannot be recovered. -If the tensor is a metric or coordinate system, it cannot be deleted unless all tensors referring to it have been deleted first."]; -TDelete::ErrorMetric = "The metric \"`1`\" cannot be deleted, as it has been used to define the tensor \"`2`\". To delete the metric, first delete \"`2`\" and any other tensors defined using this metric."; -TDelete::ErrorCoords = "The coordinate system \"`1`\" cannot be deleted, as it is the default coordinate system of the tensor \"`2`\". To delete the coordinate system, first change the default coordinate system of \"`2`\" and any other relevant tensors."; -TDelete[ID_String] := ( - (* Check that the tensor object ID exists. *) - CheckIfTensorExists[ID]; - (* If this tensor represents a metric, check that no tensors are defined using this metric. *) - If[ - TensorData[ID]["Role"] === "Metric", - (* Then *) - Scan[ - If[ - TensorData[#]["Metric"] === ID && # =!= ID, - (* Then *) - Message[TDelete::ErrorMetric, ID, #]; - Abort[]; - ] &, - Keys[TensorData] - ]; - ]; - (* If this tensor represents a coordinate system, check that no tensors are using it as their default coordinate system. *) - If[ - TensorData[ID]["Role"] === "Coordinates", - (* Then *) - Scan[ - If[ - TensorData[#]["DefaultCoords"] === ID && # =!= ID, - (* Then *) - Message[TDelete::ErrorCoords, ID, #]; - Abort[]; - ] &, - Keys[TensorData] - ]; - ]; - RemoveTensorID[ID]; -); - - -CreateUsageMessage[TDocs, {}, " opens the Mathematica notebook OGRe_Documentation.nb from the GitHub repository, which contains the full documentation for the package."]; -TDocs[] := ( - If[ - NotebookOpen["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe_Documentation.nb"] === $Failed, - (* Then *) - OGRePrint[Row[{"Error: Failed to load the documentation. Please visit ", Hyperlink["https://github.com/bshoshany/OGRe"], " to download it manually."}]], - (* Else *) - OGRePrint["Successfully loaded the documentation from GitHub."]; - ] -); - - -CreateUsageMessage[TEinsteinTensor, {metricID}, "calculates the Einstein tensor from the metric `1` and stores the result in a new tensor object with ID \"`1`Einstein\". -If a tensor with ID \"`1`RicciTensor\" exists, it will be assumed to be the Ricci tensor of the metric, and will be used in the calculation. Otherwise, \"`1`RicciTensor\" will be created using TRicciTensor[ ]."]; -TEinsteinTensor::ErrorNotMetric = "The Einstein tensor can only be calculated from a tensor object representing a metric."; -TEinsteinTensor[metricID_String] := Module[ - { - EinsteinID - }, - (* Check that metricID is indeed a metric. *) - If[ - TensorData[metricID]["Role"] =!= "Metric", - (* Then *) - Message[TEinsteinTensor::ErrorNotMetric]; - Abort[]; - ]; - (* If the Ricci tensor was not already calculated, calculate it now. *) - If[ - !KeyExistsQ[TensorData, metricID <> "RicciTensor"], - (* Then *) - TRicciTensor[metricID]; - ]; - (* Calculate the Einstein tensor, and give the tensor object the correct ID and symbol. *) - EinsteinID = TCalc[ - (metricID <> "Einstein")["\[Mu]\[Nu]"], - (metricID <> "RicciTensor")["\[Mu]\[Nu]"] - 1/2 metricID["\[Mu]\[Nu]"] . (metricID <> "RicciTensor")["\[Rho]\[Rho]"], - "G" - ]; - (* Set the role of the tensor to Einstein for future reference. *) - ChangeTensorKey[EinsteinID, "Role", "Einstein"]; - Return[EinsteinID]; -]; - - -CreateUsageMessage[TExport, {ID}, "exports the raw tensor data for the tensor object `1` as an Association."]; -TExport[ID_String] := ( - CheckIfTensorExists[ID]; - Return[Association[ - ID -> Append[TensorData[ID], "OGReVersion" -> OGReVersion] - ]]; -); - - -CreateUsageMessage[TExportAll, {filename}, "exports the raw tensor data for all tensors defined in the current session as an Association. -`1` is optional. If specified, the data is exported to a file with this name. If a full path is not given, the file will be created in the current working directory, as given by Directory[ ]. This directory can be changed using SetDirectory[ ]. Note that the file will be overwritten if it already exists."]; -TExportAll[] := TensorData; -TExportAll[filename_String] := Module[ - { - stream - }, - stream = OpenWrite[filename]; - Write[stream, TensorData]; - Close[stream]; - OGRePrint["Exported all tensor data to ", filename, "."]; -]; - - -CreateUsageMessage[TGetComponents, {ID, indices, coordinatesID}, "extracts the components of the tensor object `1` with the index configuration `2` and in the coordinate system `3` as a regular Mathematica List. -`2` should be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. -The index configuration and/or coordinate system cannot be omitted; there are no default values. This is to ensure that the user always knows which representation is being extracted."]; -TGetComponents::ErrorRank = "The number of indices must match the rank of the tensor."; -TGetComponents[ID_String, indices_List, coordinatesID_String] := ( - (* Check that the tensor object ID exists. *) - CheckIfTensorExists[ID]; - (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) - CheckIfTensorExists[coordinatesID]; - CheckIfCoordinates[coordinatesID]; - (* Check that the list of indices is of the correct form. *) - CheckIndicesForm[indices]; - (* Check that the number of indices matches the rank of the tensor. *) - If[ - Length[indices] != Length[TensorData[ID]["DefaultIndices"]], - (* Then *) - Message[TGetComponents::ErrorRank]; - Abort[]; - ]; - (* Return the components of the tensor in the desired representation. They will be calculated if the representation is not yet stored in the tensor object. *) - Return[AddRepresentation[ID, indices, coordinatesID]]; -); - - -CreateUsageMessage[TImport, {data}, "imports a tensor that has been exported using TExport[ ]. -WARNING: -1. The data is assumed to not have been manually modified by the user, so it is NOT checked for errors or inconsistencies. Importing tensor data that has been manually modified may cause errors or unexpected results, and should be avoided. -2. The ID of the tensor will be taken from the name of the (single) key of the Association being imported. If a tensor with the same ID already exists, it will be overwritten."]; -TImport[data_Association] := ( - If[ - !KeyExistsQ[data[[1]], "OGReVersion"] || data[[1]]["OGReVersion"] != OGReVersion, - (* Then *) - OGRePrint["Warning: The imported tensor was created in a different version of OGRe. Compatibility issues may occur."]; - ] - SetTensorID[Keys[data][[1]], KeyDrop[Values[data][[1]], "OGReVersion"]]; - Return[Keys[data][[1]]]; -); - - -CreateUsageMessage[TImportAll, {source}, "imports tensor data that has been exported using TExportAll[ ]. -If `1` is an Association, imports the data directly. -If `1` is a file name, imports the data from that file. If a full path is not given, the file should be located in the current working directory, as given by Directory[ ]. This directory can be changed using SetDirectory[ ]. -WARNING: -1. The data is assumed to not have been manually modified by the user, so it is NOT checked for errors or inconsistencies. Importing tensor data that has been manually modified may cause errors or unexpected results, and should be avoided. -2. This will irreversibly delete ALL of the tensors already defined in the current session."]; -TImportAll::ErrorFile = "The file `1` does not exist."; -TImportAll[data_Association] := ImportTensorData[data]; -TImportAll[filename_String] := Module[ - { - data, - stream - }, - If[ - !FileExistsQ[filename], - (* Then *) - Message[TImportAll::ErrorFile, filename]; - Abort[]; - ]; - stream = OpenRead[filename]; - data = Read[stream]; - ImportTensorData[data]; - Close[stream]; - OGRePrint["Imported all tensor data from ", filename, "."]; -]; - - -CreateUsageMessage[TIndexLetters, {letters}, "changes the letters to be used when displaying indices. -If `1` is omitted, shows the index letters currently in use. -If `1` is set to Automatic, resets the index letters to the default (lowercase Greek letters)."]; -TIndexLetters[] := TensorData[Options]["IndexLetters"]; -TIndexLetters[letters_String] := ( - Unprotect[TensorData]; - TensorData[Options]["IndexLetters"] = letters; - Protect[TensorData]; -); -TIndexLetters[Automatic] := TIndexLetters[DefaultIndexLetters]; - - -CreateUsageMessage[TInfo, {ID}, "displays information about the tensor object `1`, including its symbol, role, associated metric, and default coordinates and indices, in human-readable form. -If `1` represents a coordinate system, displays a list of all tensors using it as their default coordinate system. -If `1` represents a metric, displays a list of all tensors using it as their associated metric."]; -TInfo[ID_String] := Module[ - { - info - }, - (* Check that the tensor object ID exists. *) - CheckIfTensorExists[ID]; - (* Display information about the object. *) - info = {Row[{Style["ID: ", Bold], ID}]}; - AppendTo[info, Row[{Style["Symbol: ", Bold], TensorData[ID]["Symbol"]}]]; - AppendTo[info, Row[{Style["Role: ", Bold], TensorData[ID]["Role"]}]]; - If[TensorData[ID]["Role"] =!= "Coordinates" && TensorData[ID]["Role"] =!= "Metric", AppendTo[info, Row[{Style["Metric: ", Bold], TensorData[ID]["Metric"]}]]]; - If[TensorData[ID]["Role"] =!= "Coordinates", AppendTo[info, Row[{Style["Default Coordinates: ", Bold], TensorData[ID]["DefaultCoords"]}]]]; - AppendTo[info, Row[{Style["Default Indices: ", Bold], TensorData[ID]["DefaultIndices"]}]]; - If[TensorData[ID]["Role"] === "Coordinates", AppendTo[info, Row[{Style["Default Coordinates For: ", Bold], Row[Select[Keys[TensorData], TensorData[#]["DefaultCoords"] === ID && # =!= ID &], ", "]}]]]; - If[TensorData[ID]["Role"] === "Metric", AppendTo[info, Row[{Style["Tensors Using This Metric: ", Bold], Row[Select[Keys[TensorData], TensorData[#]["Metric"] === ID && # =!= ID &], ", "]}]]]; - OGRePrint[Column[info]]; -]; - - -CreateUsageMessage[TInitializeSymbols, {symbol1, symbol2, "..."}, "clears any definitions previously used for the given symbols and protects them against future changes. -Useful for making sure coordinate variables, constants, and abstract functions used in tensors do not accidentally change their definitions and break the code."]; -TInitializeSymbols[symbols__] := ( - Unprotect[symbols]; - ClearAll[symbols]; - Protect[symbols]; -); -Attributes[TInitializeSymbols] = HoldAll; - - -CreateUsageMessage[TList, {ID, indices, coordinatesID, function}, "lists the unique, non-zero components of the tensor object `1` with the index configuration `2` and in the coordinate system `3`. -`2` should be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. -If the index configuration and/or coordinate system are omitted, the default ones will be used. -`4` is an optional function to map to each of the tensor's elements before they are displayed. Typically this would be ReplaceAll[rules] to apply the rules to the elements, but any function can be used."]; -TList[ID_String, indices_List : {"_UseDefault_"}, coordinatesID_String : "_UseDefault_", function_ : Identity] /; (!ListQ[function] && !StringQ[function]) := ShowList[ID, indices, coordinatesID, "List", function]; - - -CreateUsageMessage[TNewCoordinates, {coordinatesID, symbols}, "creates a new tensor object representing a coordinate system. -`1` is a string that will be used to identify the new object, and must be unique. If a tensor object with the same ID already exists, it will be overwritten. -`2` are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be cleared and protected against future changes using TInitializeSymbols[ ]."]; -TNewCoordinates::ErrorEmptyList = "The coordinate symbols cannot be an empty list. At least one coordinate symbol must be specified."; -TNewCoordinates[coordinatesID_String, coordinates_List?VectorQ] := ( - (* Check that the coordinates are not an empty list. *) - If[coordinates == {}, Message[TNewCoordinates::ErrorEmptyList]; Abort[]]; - (* Clear any definitions previously used for the coordinate symbols and protect them against future changes. *) - TInitializeSymbols @@ Unevaluated[coordinates]; - (* Create a new tensor object for the coordinates with the desired ID. *) - SetTensorID[coordinatesID, Association[ - "Components" -> Association[{{1}, coordinatesID} -> coordinates], - "DefaultCoords" -> coordinatesID, - "DefaultIndices" -> {1}, - "Role" -> "Coordinates", - "Symbol" -> "x" - ]]; - Return[coordinatesID]; -); -Attributes[TNewCoordinates] = HoldRest; - - -CreateUsageMessage[TNewMetric, {metricID, coordinatesID, components, symbol}, "creates a new tensor object representing a metric. -`1` is a string that will be used to identify the new object, and must be unique. If a tensor object with the same ID already exists, it will be overwritten. -`2` is the unique ID of a tensor object representing a coordinate system, created using TNewCoordinates[ ]. -`3` is a square matrix representing the metric with two lower indices in that coordinate system. -`4` will be used to represent the metric in formulas. If not given, \"g\" will be used."]; -TNewMetric::ErrorIncorrectDim = "The metric components must have the same dimension as the coordinates."; -TNewMetric::ErrorNotInvertible = "The metric must be invertible."; -TNewMetric::ErrorNotSymmetric = "The metric must be symmetric."; -TNewMetric::ErrorNotSquare = "The components of the metric must be a square matrix."; -TNewMetric[metricID_String, coordinatesID_String, components_List, symbol_String : "g"] := Module[ - { - dim = Length[components], - inverse, - simplified - }, - (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) - CheckIfTensorExists[coordinatesID]; - CheckIfCoordinates[coordinatesID]; - (* Simplify the components. *) - simplified = TensorSimplify[components]; - (* Check that the matrix is square. *) - If[ - !SquareMatrixQ[simplified], - (* Then *) - Message[TNewMetric::ErrorNotSquare]; - Abort[]; - ] - (* Check that the metric components have the same dimension as the coordinates. *) - If[ - dim != Length[TensorData[coordinatesID]["Components"][{{1}, coordinatesID}]], - (* Then *) - Message[TNewMetric::ErrorIncorrectDim]; - Abort[]; - ]; - (* Check that the matrix is symmetric. *) - If[ - !SymmetricMatrixQ[simplified], - (* Then *) - Message[TNewMetric::ErrorNotSymmetric]; - Abort[]; - ]; - (* Invert the components, and return an error if the matrix is singular or cannot be inverted for any reason. *) - inverse = Quiet[Check[Inverse[simplified], "Error"]]; - If[ - inverse === "Error", - (* Then *) - Message[TNewMetric::ErrorNotInvertible]; - Abort[]; - ]; - inverse = TensorSimplify[inverse]; - (* Create a new tensor object for the metric with the desired ID. The components of the matrix in every possible index configuration will be calculated in advance in the default coordinate system, to improve performance. *) - SetTensorID[metricID, Association[ - "Components" -> Association[ - {{-1, -1}, coordinatesID} -> simplified, - {{+1, +1}, coordinatesID} -> inverse, - {{+1, -1}, coordinatesID} -> IdentityMatrix[dim], - {{-1, +1}, coordinatesID} -> IdentityMatrix[dim] - ], - "DefaultCoords" -> coordinatesID, - "DefaultIndices" -> {-1, -1}, - "Metric" -> metricID, - "Role" -> "Metric", - "Symbol" -> symbol - ]]; - Return[metricID]; -]; - - -CreateUsageMessage[TNewTensor, {tensorID, metricID, coordinatesID, indices, components, symbol}, "creates a new tensor object. -`1` is a string that will be used to identify the new object, and must be unique. If a tensor object with the same ID already exists, it will be overwritten. -`2` is the unique ID of a tensor object representing a metric, created using TNewMetric[ ]. The metric will be used to raise and lower indices for the new tensor. -`3` is the unique ID of a tensor object representing a coordinate system, created using TNewCoordinates[ ]. This coordinate system will be used to specify the components of the new tensor. If omitted, the default coordinate system of the metric `2` will be used instead. -`4` is a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. -`5` is a list specifying the representation of the tensor with the index configuration `4` and in the coordinate system `3`. -`6` will be used to represent the tensor in formulas. If not given, the placeholder " <> DefaultSymbol <> " will be used."]; -TNewTensor::ErrorDimension = "The components must have the same dimension as the coordinate system."; -TNewTensor::ErrorRank = "The number of indices must match the rank of the components."; -TNewTensor[tensorID_String, metricID_String, coordinatesID_String : "_UseDefault_", indices_List, components_List, symbol_String : DefaultSymbol] := Module[ - { - useCoords - }, - (* Check that the tensor object metricID exists and represents a metric. *) - CheckIfTensorExists[metricID]; - CheckIfMetric[metricID]; - (* Check that the list of indices is of the correct form. *) - CheckIndicesForm[indices]; - (* Determine which coordinate system the components for the new tensor are given in. *) - If[ - coordinatesID === "_UseDefault_", - (* Then *) - useCoords = TensorData[metricID]["DefaultCoords"], - (* Else *) - (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) - CheckIfTensorExists[coordinatesID]; - CheckIfCoordinates[coordinatesID]; - useCoords = coordinatesID - ]; - (* Validate the input. This is done differently depending on whether the tensor is a scalar or not. *) - If[ - Length[components] * ArrayDepth[components] != 1, - (* Then *) - (* Not a scalar. Check that the dimension of the given components matches the dimension of the coordinates being used. *) - If[ - Length[components] != Length[TensorData[useCoords]["Components"][{{1}, useCoords}]], - (* Then *) - Message[TNewTensor::ErrorDimension]; - Abort[]; - ]; - (* Check that the rank of the given components matches the number of given indices. *) - If[ - Length[indices] != ArrayDepth[components], - (* Then *) - Message[TNewTensor::ErrorRank]; - Abort[]; - ], - (* Else *) - (* Is a scalar. Check that the number of indices for the scalar is zero. *) - If[ - Length[indices] != 0, - (* Then *) - Message[TNewTensor::ErrorRank]; - Abort[]; - ]; - ]; - (* Create a new tensor object for the tensor with the desired ID. *) - SetTensorID[tensorID, Association[ - "Components" -> Association[{indices, useCoords} -> TensorSimplify[components]], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> indices, - "Metric" -> metricID, - "Role" -> "Tensor", - "Symbol" -> symbol - ]]; - Return[tensorID]; -]; - - -CreateUsageMessage[TParallelize, {"True/False"}, "enables or disable the parallelization of tensor simplifications. The default value is `2`. If simplifications take less than a few seconds, then you should leave parallelization off, as it has a small overhead and may actually impede performance. However, if simplifications are taking more than a few seconds, then it is highly recommended to enable parallelization for a significant performance boost.", {"False"}]; -TParallelize[par_] := ( - Unprotect[TensorData]; - TensorData[Options]["Parallelize"] = par; - Protect[TensorData]; - If[ - par, - (* Then *) - OGRePrint["Parallelization enabled."]; - (* Launch the kernels for parallelization if they have not been launched yet, or if fewer than the maximum available number of kernels have been launched. Better do it now than cause a delay later. *) - If[ - $KernelCount < $ConfiguredKernels[[1, 1]], - (* Then *) - LaunchKernels[$ConfiguredKernels[[1, 1]] - $KernelCount]; - OGRePrint[$KernelCount, " parallel kernels launched. CPU has ", $ProcessorCount, " cores."]; - ], - (* Else *) - OGRePrint["Parallelization disabled."]; - ]; -); - - -CreateUsageMessage[TRicciScalar, {metricID}, "calculates the Ricci scalar from the metric `1` and stores the result in a new tensor object with ID \"`1`RicciScalar\". -If a tensor with ID \"`1`RicciTensor\" exists, it will be assumed to be the Ricci tensor of the metric, and will be used in the calculation. Otherwise, \"`1`RicciTensor\" will be created using TRicciTensor[ ]."]; -TRicciScalar::ErrorNotMetric = "The Ricci scalar can only be calculated from a tensor object representing a metric."; -TRicciScalar[metricID_String] := Module[ - { - RicciScalarID - }, - (* Check that metricID is indeed a metric. *) - If[ - TensorData[metricID]["Role"] =!= "Metric", - (* Then *) - Message[TRicciScalar::ErrorNotMetric]; - Abort[]; - ]; - (* If the Ricci tensor was not already calculated, calculate it now. *) - If[ - !KeyExistsQ[TensorData, metricID <> "RicciTensor"], - (* Then *) - TRicciTensor[metricID]; - ]; - (* Calculate the Ricci scalar, and give the tensor object the correct ID and symbol. *) - RicciScalarID = TCalc[ - (metricID <> "RicciScalar")[""], - (metricID <> "RicciTensor")["\[Mu]\[Mu]"], - "R" - ]; - (* Set the role of the tensor to Ricci Scalar for future reference. *) - ChangeTensorKey[RicciScalarID, "Role", "Ricci Scalar"]; - Return[RicciScalarID]; -]; - - -CreateUsageMessage[TRicciTensor, {metricID}, "calculates the Ricci tensor from the metric `1` and stores the result in a new tensor object with ID \"`1`RicciTensor\". -If a tensor with ID \"`1`Riemann\" exists, it will be assumed to be the Riemann tensor of the metric, and will be used in the calculation. Otherwise, \"`1`Riemann\" will be created using TRiemannTensor[ ]."]; -TRicciTensor::ErrorNotMetric = "The Ricci tensor can only be calculated from a tensor object representing a metric."; -TRicciTensor[metricID_String] := Module[ - { - RicciTensorID - }, - (* Check that metricID is indeed a metric. *) - If[ - TensorData[metricID]["Role"] =!= "Metric", - (* Then *) - Message[TRicciTensor::ErrorNotMetric]; - Abort[]; - ]; - (* If the Riemann tensor was not already calculated, calculate it now. *) - If[ - !KeyExistsQ[TensorData, metricID <> "Riemann"], - (* Then *) - TRiemannTensor[metricID]; - ]; - (* Calculate the Ricci tensor, and give the tensor object the correct ID and symbol. *) - RicciTensorID = TCalc[ - (metricID <> "RicciTensor")["\[Mu]\[Nu]"], - (metricID <> "Riemann")["\[Lambda]\[Mu]\[Lambda]\[Nu]"], - "R" - ]; - (* Set the role of the tensor to Ricci Tensor for future reference. *) - ChangeTensorKey[RicciTensorID, "Role", "Ricci Tensor"]; - Return[RicciTensorID]; -]; - - -CreateUsageMessage[TRiemannTensor, {metricID}, "calculates the Riemann tensor from the metric `1` and stores the result in a new tensor object with ID \"`1`Riemann\". -If a tensor with ID \"`1`Christoffel\" exists, it will be assumed to be the Christoffel symbols of the metric, and will be used in the calculation. Otherwise, \"`1`Christoffel\" will be created using TChristoffel[ ]."]; -TRiemannTensor::ErrorNotMetric = "The Riemann tensor can only be calculated from a tensor object representing a metric."; -TRiemannTensor[metricID_String] := Module[ - { - RiemannID - }, - (* Check that metricID is indeed a metric. *) - If[ - TensorData[metricID]["Role"] =!= "Metric", - (* Then *) - Message[TRiemannTensor::ErrorNotMetric]; - Abort[]; - ]; - (* If the Christoffel symbols were not already calculated, calculate them now. *) - If[ - !KeyExistsQ[TensorData, metricID <> "Christoffel"], - (* Then *) - TChristoffel[metricID]; - ]; - (* Calculate the Riemann tensor, and give the tensor object the correct ID, symbol, and default index configuration. *) - RiemannID = TChangeDefaultIndices[ - TCalc[ - (metricID <> "Riemann")["\[Rho]\[Sigma]\[Mu]\[Nu]"], - TPartialD["\[Mu]"] . (metricID <> "Christoffel")["\[Rho]\[Nu]\[Sigma]"] - - TPartialD["\[Nu]"] . (metricID <> "Christoffel")["\[Rho]\[Mu]\[Sigma]"] + - (metricID <> "Christoffel")["\[Rho]\[Mu]\[Lambda]"] . (metricID <> "Christoffel")["\[Lambda]\[Nu]\[Sigma]"] - - (metricID <> "Christoffel")["\[Rho]\[Nu]\[Lambda]"] . (metricID <> "Christoffel")["\[Lambda]\[Mu]\[Sigma]"], - "R" - ], - {1,-1,-1,-1} - ]; - (* Set the role of the tensor to Riemann for future reference. *) - ChangeTensorKey[RiemannID, "Role", "Riemann"]; - Return[RiemannID]; -]; - - -CreateUsageMessage[TShow, {ID, indices, coordinatesID, function}, "shows the components of the tensor object `1` with the index configuration `2` and in the coordinate system `3`, in vector or matrix form when applicable. -`2` should be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. -If the index configuration and/or coordinate system are omitted, the default ones will be used. -`4` is an optional function to map to each of the tensor's elements before they are displayed. Typically this would be ReplaceAll[rules] to apply the rules to the elements, but any function can be used."]; -TShow[ID_String, indices_List : {"_UseDefault_"}, coordinatesID_String : "_UseDefault_", function_ : Identity] /; (!ListQ[function] && !StringQ[function]) := ShowList[ID, indices, coordinatesID, "Show", function]; - - -CreateUsageMessage[TSimplify, {ID}, "simplifies all previously-calculated representations of the tensor object `1` based on the user-defined simplification assumptions set using TSimplifyAssumptions[ ]. To be used if the assumptions have changed after the components have already been calculated."]; -TSimplify[ID_String] := ( - CheckIfTensorExists[ID]; - ChangeTensorKey[ID, "Components", TensorSimplify /@ TensorData[ID]["Components"]]; - Return[ID]; -); - - -CreateUsageMessage[TSimplifyAssumptions, {assumptions}, "adds assumptions to be used when simplifying expressions. The new assumptions will be appended to any previously added assumptions. -If `1` is omitted, displays the currently used assumptions instead. -Use TSimplifyAssumptions[None] to clear all previously added assumptions. -By default, OGRe automatically assumes all variable are real, by adding the assumption Element[_, Reals] when simplifying expressions. To disable this assumption, use TSimplifyAssumptions[!Reals]. To re-enable it later, use TSimplifyAssumptions[Reals]. -The output of this module is always an Association indicating whether variables are assumed to be real and listing the user-defined assumptions."]; -TSimplifyAssumptions[] := TensorData[Options]["SimplifyAssumptions"]; -TSimplifyAssumptions[assumptions_] := ( - Unprotect[TensorData]; - Switch[ - assumptions, - None, TensorData[Options]["SimplifyAssumptions"]["User"] = None, - Reals, TensorData[Options]["SimplifyAssumptions"]["AssumeReal"] = True, - !Reals, TensorData[Options]["SimplifyAssumptions"]["AssumeReal"] = False, - _, If[ - TensorData[Options]["SimplifyAssumptions"]["User"] === None, - (* Then *) - TensorData[Options]["SimplifyAssumptions"]["User"] = {assumptions}, - (* Else *) - If[ - !MemberQ[TensorData[Options]["SimplifyAssumptions"]["User"], assumptions], - (* Then *) - AppendTo[TensorData[Options]["SimplifyAssumptions"]["User"], assumptions]; - ]; - ]; - ]; - Protect[TensorData]; - Return[TensorData[Options]["SimplifyAssumptions"]]; -); -Attributes[TSimplifyAssumptions] = HoldAll; - - -(* =================================================== *) -(* Private modules (for internal use only) start here. *) -(* =================================================== *) - - -(* Add a new representation with a specific index configuration and coordinate system to a tensor object, if it does not already exist. Returns the components of the representation in any case. *) -AddRepresentation::ErrorCoordinatesCoord = "Cannot transform coordinates for a tensor object representing a coordinate system."; -AddRepresentation::ErrorCoordinatesIndex = "Cannot lower index for a tensor object representing a coordinate system."; -AddRepresentation[ID_String, indices_List, coordinatesID_String] := Module[ - { - defCoords = TensorData[ID]["DefaultCoords"], - defIndices = TensorData[ID]["DefaultIndices"], - i, - oldIndices - }, - (* If the representation has already been calculated, simply return the components. *) - If[ - KeyExistsQ[TensorData[ID]["Components"], {indices, coordinatesID}], - (* Then *) - Return[TensorData[ID]["Components"][{indices, coordinatesID}]] - ]; - (* Check that we are not trying to represent a coordinate tensor in a different coordinate system. *) - If[ - TensorData[ID]["Role"] === "Coordinates" && coordinatesID =!= ID, - (* Then *) - Message[AddRepresentation::ErrorCoordinatesCoord]; - Abort[]; - ]; - (* Check that we are not trying to represent a coordinate tensor with a lower index. *) - If[ - TensorData[ID]["Role"] === "Coordinates" && indices != {1}, - (* Then *) - Message[AddRepresentation::ErrorCoordinatesIndex]; - Abort[]; - ]; - (* Transform the tensor to different coordinates if required. We do this first because the Christoffel symbols have a special transformation rule, so we first transform the coordinates using a fixed rule that works only for the default {1, -1, -1} index configuration, and then raise or lower indices if necessary. *) - TransformCoordinates[ID, defIndices, defCoords, coordinatesID]; - (* Raise or lower indices if required, one by one. We only need to do this if the tensor is not a metric, since metric tensors already have their components pre-calculated with all possible index configurations. *) - If[ - TensorData[ID]["Role"] =!= "Metric", - (* Then *) - oldIndices = defIndices; - Do[ - oldIndices = RaiseLower[ID, coordinatesID, oldIndices, i, indices[[i]]], - {i, 1, Length[defIndices]} - ]; - ]; - (* Return the new components. *) - Return[TensorData[ID]["Components"][{indices, coordinatesID}]]; -]; - - -(* Add two tensor objects. *) -AddTensors::ErrorCoords = "The tensor \"`1`\" cannot be added to another tensor, as it represents a coordinate system."; -AddTensors::ErrorIndicesSame = "The tensors \"`1`\"[\"`2`\"] and \"`3`\"[\"`4`\"] cannot be added, as their index specifications must be the same up to permutation." -AddTensors::ErrorMetricsMatch = "The tensors \"`1`\" and \"`2`\" cannot be added, as they are associated with different metrics, \"`3`\" and \"`4`\" respectively."; -AddTensors::ErrorRanksMatch = "The tensors \"`1`\" and \"`2`\" cannot be added, as they have different ranks."; -AddTensors[firstID_String[firstIndices_String], secondID_String[secondIndices_String]] := Module[ - { - allVars, - firstComponents, - firstVars, - i, - newID, - newSymbol, - secondComponents, - secondVars, - sumComponents, - useCoords, - useIndices, - useSecondIndices - }, - (* Check that both tensors exist. *) - CheckIfTensorExists[firstID]; - CheckIfTensorExists[secondID]; - (* Check that neither of the tensors is a coordinate system. *) - Scan[ - If[ - TensorData[#]["Role"] === "Coordinates", - (* Then *) - Message[AddTensors::ErrorCoords, #]; - Abort[]; - ] &, - {firstID, secondID} - ]; - (* Check that both tensors are associated with the same metric. *) - If[ - TensorData[firstID]["Metric"] =!= TensorData[secondID]["Metric"], - (* Then *) - Message[AddTensors::ErrorMetricsMatch, firstID, secondID, TensorData[firstID]["Metric"], TensorData[secondID]["Metric"]]; - Abort[]; - ]; - (* Check that both tensors have the same rank. *) - If[ - Length[TensorData[firstID]["DefaultIndices"]] =!= Length[TensorData[secondID]["DefaultIndices"]], - (* Then *) - Message[AddTensors::ErrorRanksMatch, firstID, secondID]; - Abort[]; - ]; - (* Check that the index strings match the ranks of the tensors. *) - CheckIndicesRank[firstIndices, firstID]; - CheckIndicesRank[secondIndices, secondID]; - (* Check that the index strings of both tensors are the same up to permutation. *) - If[ - Sort[Characters[firstIndices]] != Sort[Characters[secondIndices]], - (* Then *) - Message[AddTensors::ErrorIndicesSame, firstID, firstIndices, secondID, secondIndices]; - Abort[]; - ]; - (* The components that will be added are the ones corresponding to the default representation of the first tensor. *) - useIndices = TensorData[firstID]["DefaultIndices"]; - useCoords = TensorData[firstID]["DefaultCoords"]; - firstComponents = TensorData[firstID]["Components"][{useIndices, useCoords}]; - (* The index configuration for the second tensor will be rearranged to correctly calculate expressions like T^a_b + T_b^a. *) - useSecondIndices = Table[ - useIndices[[StringPosition[firstIndices, Characters[secondIndices][[i]]][[1, 1]]]], - {i, 1, StringLength[firstIndices]} - ]; - (* Add the appropriate index configuration to the second tensor if it does not already exist. *) - secondComponents = AddRepresentation[secondID, useSecondIndices, useCoords]; - (* Collect the variables to be used in the addition. Both firstVars and secondVars will be the same set of variables, but potentially in a different order. *) - allVars = Association[]; - Scan[(allVars[#] = Unique["var"]) &, Characters[firstIndices]]; - firstVars = allVars[#]& /@ Characters[firstIndices]; - secondVars = allVars[#]& /@ Characters[secondIndices]; - (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) - newSymbol = Row[{ - If[ - TensorData[firstID]["Role"] === "Temporary", - (* Then *) - TensorData[firstID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[firstID]["Symbol"], - IndicesToLetters[-1, useIndices, firstIndices], - IndicesToLetters[+1, useIndices, firstIndices] - ] - ], - " + ", - If[ - TensorData[secondID]["Role"] === "Temporary", - (* Then *) - TensorData[secondID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[secondID]["Symbol"], - IndicesToLetters[-1, useSecondIndices, secondIndices], - IndicesToLetters[+1, useSecondIndices, secondIndices] - ] - ] - }]; - (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) - (* PrintTemporary["Adding ", newSymbol, "..."]; *) - (* Add the two tensors by summing over their components using the appropriate variables. *) - sumComponents = Table[ - firstComponents[[Sequence @@ firstVars]] + secondComponents[[Sequence @@ secondVars]], - Evaluate[Sequence @@ ({#, 1, Length[firstComponents]} & /@ firstVars)] - ]; - (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) - newID = NewTempID[]; - SetTensorID[newID, Association[ - "Components" -> Association[{useIndices, useCoords} -> sumComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> useIndices, - "Metric" -> TensorData[firstID]["Metric"], - "Role" -> "Temporary", - "Symbol" -> Row[{"(", newSymbol, ")"}] - ]]; - Return[newID[firstIndices]]; -]; - - -(* Go over the component definitions of a given tensor and change every reference to a coordinate system to a different name. Note that this also means changing the reference in the default coordinate system of a tensor and in any coordinate transformation rules. Used by TChangeID. *) -ChangeCoordinateID[tensorID_String, oldCoordsID_String, newCoordsID_String] := Module[ - { - newComponents = Association[], - oldComponents = TensorData[tensorID]["Components"], - transf - }, - (* For each key of the old components, if oldCoordsID is the coordinate system, convert it to newCoordsID. *) - Scan[ - If[ - #[[2]] === oldCoordsID, - (* Then *) - newComponents[{#[[1]], newCoordsID}] = oldComponents[#], - (* Else *) - newComponents[#] = oldComponents[#]; - ] &, - Keys[oldComponents] - ]; - (* Store the new components. *) - ChangeTensorKey[tensorID, "Components", newComponents]; - (* If the default coordinate system is oldCoordsID, change it to newCoordsID. *) - If[ - TensorData[tensorID]["DefaultCoords"] === oldCoordsID, - (* Then *) - ChangeTensorKey[tensorID, "DefaultCoords", newCoordsID]; - ]; - (* If the tensor object is itself a coordinate system, change oldCoordsID to newCoordsID in any coordinate transformations stored inside it. *) - If[ - TensorData[tensorID]["Role"] === "Coordinates" && KeyExistsQ[TensorData[tensorID], "CoordTransformations"], - (* Then *) - transf = TensorData[tensorID]["CoordTransformations"]; - If[ - KeyExistsQ[transf, oldCoordsID], - (* Then *) - transf[newCoordsID] = transf[oldCoordsID]; - KeyDropFrom[transf, oldCoordsID]; - ChangeTensorKey[tensorID, "CoordTransformations", transf]; - ] - ]; -]; - - -(* Change a particular key for the tensor object with the given ID. *) -ChangeTensorKey[ID_String, key_String, value_] := ( - Unprotect[TensorData]; - TensorData[ID][key] = value; - Protect[TensorData]; -); - - -(* Check if the tensor with the given ID represents a coordinate system. *) -CheckIfCoordinates::ErrorNotCoordinates = "The tensor \"`1`\" does not represent a coordinate system."; -CheckIfCoordinates[ID_String] := If[ - TensorData[ID]["Role"] =!= "Coordinates", -(* Then *) - Message[CheckIfCoordinates::ErrorNotCoordinates, ID]; - Abort[]; -]; - - -(* Check if the tensor with the given ID represents a metric. *) -CheckIfMetric::ErrorNotMetric = "The tensor \"`1`\" does not represent a metric."; -CheckIfMetric[ID_String] := If[ - TensorData[ID]["Role"] =!= "Metric", -(* Then *) - Message[CheckIfMetric::ErrorNotMetric, ID]; - Abort[]; -]; - - -(* Check if a tensor with the given ID exists. *) -CheckIfTensorExists::ErrorDoesNotExist = "The tensor \"`1`\" does not exist."; -CheckIfTensorExists[ID_String] := If[ - !KeyExistsQ[TensorData, ID], -(* Then *) - Message[CheckIfTensorExists::ErrorDoesNotExist, ID]; - Abort[]; -]; - - -(* Check that an index list has been entered correctly: a one-dimensional list with all its components either plus or minus 1. *) -CheckIndicesForm::ErrorIncorrectForm = "The indices must be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index."; -CheckIndicesForm[indices_List] := If[ - !VectorQ[indices] || !AllTrue[indices, (#^2 == 1) &], -(* Then *) - Message[CheckIndicesForm::ErrorIncorrectForm]; - Abort[]; -]; - - -(* Check that an index list matches the tensor's rank. *) -CheckIndicesRank::ErrorIncorrectRank = "The index configuration `1` does not match the rank of the tensor \"`2`\". The number of indices should be `3`."; -CheckIndicesRank[indices_List, ID_String] := If[ - Length[indices] != Length[TensorData[ID]["DefaultIndices"]], -(* Then *) - Message[CheckIndicesRank::ErrorIncorrectRank, indices, ID, Length[TensorData[ID]["DefaultIndices"]]]; - Abort[]; -]; -CheckIndicesRank[indices_String, ID_String] := If[ - StringLength[indices] != Length[TensorData[ID]["DefaultIndices"]], -(* Then *) - Message[CheckIndicesRank::ErrorIncorrectRank, "\"" <> indices <> "\"", ID, Length[TensorData[ID]["DefaultIndices"]]]; - Abort[]; -]; - - -(* Clear all temporary tensors created by TCalc, and reset the counter. *) -ClearTemp[] := ( - ImportTensorData[Select[TensorData, #["Role"] =!= "Temporary" &]]; - Unprotect[TempID]; - TempID = 0; - Protect[TempID]; -); - - -(* Contract two tensors. *) -ContractTensors::ErrorMetricsMatch = "The tensors \"`1`\" and \"`2`\" cannot be contracted, as they are associated with different metrics, \"`3`\" and \"`4`\" respectively."; -ContractTensors[firstID_String[firstIndices_String], secondID_String[secondIndices_String]] := Module[ - { - allVars, - firstComponents, - firstVars, - i, - newComponents, - newID, - newIndices, - newSymbol, - outIndices, - outVars, - removeIndices, - secondComponents, - secondVars, - sumVars, - useCoords, - useFirstIndices, - useSecondIndices - }, - (* Check that both tensors exist. *) - CheckIfTensorExists[firstID]; - CheckIfTensorExists[secondID]; - (* Check that both tensors are associated with the same metric. *) - If[ - TensorData[firstID]["Metric"] =!= TensorData[secondID]["Metric"], - (* Then *) - Message[ContractTensors::ErrorMetricsMatch, firstID, secondID, TensorData[firstID]["Metric"], TensorData[secondID]["Metric"]]; - Abort[]; - ]; - (* Check that the index strings match the ranks of the tensors. *) - CheckIndicesRank[firstIndices, firstID]; - CheckIndicesRank[secondIndices, secondID]; - (* We perform the calculation in the default coordinate system of the first tensor. *) - useCoords = TensorData[firstID]["DefaultCoords"]; - (* We start with the default index configuration of both tensors, but then rearrange the indices on the second tensor so that any contracted indices will be one upper, one lower. *) - useFirstIndices = TensorData[firstID]["DefaultIndices"]; - useSecondIndices = TensorData[secondID]["DefaultIndices"]; - (* If either of the tensors is a scalar, simply do multiplication of tensor by scalar. *) - If[ - Length[useFirstIndices] == 0, - (* Then *) - Return[TensorByScalar[secondID[secondIndices], TensorData[firstID]["Components"][{useFirstIndices, useCoords}][[1]], TensorData[firstID]["Symbol"]]] - ]; - If[ - Length[useSecondIndices] == 0, - (* Then *) - Return[TensorByScalar[firstID[firstIndices], TensorData[secondID]["Components"][{useSecondIndices, useCoords}][[1]], TensorData[secondID]["Symbol"]]] - ]; - (* newIndices will be the index configuration of the newly created tensor. We start from the default indices of the first tensor, remove any indices that were contracted, and add the remaining free indices of the second tensor. *) - newIndices = useFirstIndices; - removeIndices = {}; - Do[ - If[ - # =!= {}, - (* Then *) - useSecondIndices[[i]] = -useFirstIndices[[#[[1, 1]]]]; - AppendTo[removeIndices, {#[[1, 1]]}], - (* Else *) - AppendTo[newIndices, useSecondIndices[[i]]]; - ]& @ StringPosition[firstIndices, Characters[secondIndices][[i]]], - {i, 1, Length[useSecondIndices]} - ]; - newIndices = Delete[newIndices, removeIndices]; - (* The components of the first tensor will be taken in the default index representation. *) - firstComponents = TensorData[firstID]["Components"][{useFirstIndices, useCoords}]; - (* The components of the second tensor will be taken in the index representation that matches the contraction, with indices raised or lowered to match the corresponding indices in the first tensor. *) - secondComponents = AddRepresentation[secondID, useSecondIndices, useCoords]; - (* Collect the variables to be used for contracting the indices.*) - allVars = Association[]; - (* allVars will contain all of the variables for both the first and the second tensor. *) - Scan[(allVars[#] = Unique["var"]) &, Characters[firstIndices <> secondIndices]]; - (* firstVars will contain the variables to be used as indices for the first tensor. *) - firstVars = allVars[#]& /@ Characters[firstIndices]; - (* secondVars will contain the variables to be used as indices for the second tensor. *) - secondVars = allVars[#]& /@ Characters[secondIndices]; - (* sumVars will contain the variables to be used in the sum. *) - sumVars = {}; - (* outVars will contain the variables to be used in the output tensor. *) - outVars = {}; - (* outIndices will be the index string of the output tensor. *) - outIndices = ""; - If[ - Length[Cases[Characters[firstIndices <> secondIndices], #]] == 2, - (* Then *) - AppendTo[sumVars, allVars[#]], - (* Else *) - AppendTo[outVars, allVars[#]]; - outIndices = outIndices <> #; - ]& /@ Keys[allVars]; - (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) - newSymbol = Row[{ - If[ - TensorData[firstID]["Role"] === "Temporary", - (* Then *) - TensorData[firstID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[firstID]["Symbol"], - IndicesToLetters[-1, useFirstIndices, firstIndices], - IndicesToLetters[+1, useFirstIndices, firstIndices] - ] - ], - If[ - TensorData[secondID]["Role"] === "Temporary", - (* Then *) - TensorData[secondID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[secondID]["Symbol"], - IndicesToLetters[-1, useSecondIndices, secondIndices], - IndicesToLetters[+1, useSecondIndices, secondIndices] - ] - ] - }]; - (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) - (* PrintTemporary["Contracting ", newSymbol, "..."]; *) - (* Calculate the components of the new tensor by summing over the contracted variables. *) - newComponents = Table[ - If[ - Length[sumVars] > 0, - (* Then *) - Sum[ - firstComponents[[Sequence @@ firstVars]] * secondComponents[[Sequence @@ secondVars]], - Evaluate[Sequence @@ ({#, 1, Length[firstComponents]} & /@ sumVars)] - ], - (* Else *) - firstComponents[[Sequence @@ firstVars]] * secondComponents[[Sequence @@ secondVars]] - ], - Evaluate[ - If[ - Length[outVars] > 0, - (* Then *) - Sequence @@ ({#, 1, Length[firstComponents]} & /@ outVars), - (* Else *) - 1 - ] - ] - ]; - (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) - newID = NewTempID[]; - SetTensorID[newID, Association[ - "Components" -> Association[{newIndices, useCoords} -> newComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> newIndices, - "Metric" -> TensorData[firstID]["Metric"], - "Role" -> "Temporary", - "Symbol" -> newSymbol - ]]; - Return[newID[outIndices]]; -]; - - -(* Take the covariant derivative of a tensor. *) -CreateUsageMessage[TCovariantD, {index}, "represents the covariant derivative when used in a tensor expression given to TCalc[ ]. -If a tensor with ID \"`2`Christoffel\" exists, where `2` is the metric associated with the tensor the derivative is acting upon, then it will be assumed to be the Levi-Civita connection of the metric, and will be used in the calculation. Otherwise, \"`2`Christoffel\" will be created using TChristoffel[ ].", {metricID}]; -CovariantDivOrGrad[derivativeIndex_String, tensorID_String[tensorIndices_String]] := Module[ - { - myChristoffel, - newComponents, - newID, - out, - useCoords, - useIndices - }, - (* If the Christoffel symbols were not already calculated, calculate them now. *) - myChristoffel = TensorData[tensorID]["Metric"] <> "Christoffel"; - If[ - !KeyExistsQ[TensorData, myChristoffel], - (* Then *) - TChristoffel[TensorData[tensorID]["Metric"]]; - ]; - (* The simplest way to calculate the covariant derivative is to do it for the representation of the tensor with all of its indices raised. Otherwise we have to worry about minus signs and different index order in the Christoffel symbols attached to the tensor's lower indices. So we create a new temporary tensor with all upper indices as its default index configuration. This guarantees that no raising or lowering of indices will take place when contracting the tensor with the partial derivative and the Christoffel symbols. *) - useIndices = 1 & /@ TensorData[tensorID]["DefaultIndices"]; - useCoords = TensorData[tensorID]["DefaultCoords"]; - (* Add a representation with all upper indices to the tensor if it doesn't already exist. *) - newComponents = AddRepresentation[tensorID, useIndices, useCoords]; - newID = NewTempID[]; - SetTensorID[newID, Association[ - "Components" -> Association[{useIndices, useCoords} -> newComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> useIndices, - "Metric" -> TensorData[tensorID]["Metric"], - "Role" -> "CovariantDivOrGrad", - "Symbol" -> TensorData[tensorID]["Symbol"] - ]]; - (* The first term is just the partial derivative. *) - out = DivOrGrad[derivativeIndex, newID[tensorIndices]]; - (* The next terms add one Christoffel symbol per index, contracted with that index. The Unicode symbol \|040200 is used as the summation index, to prevent collisions with indices given by the user. *) - Scan[ - (out = AddTensors[out, - ContractTensors[TensorTrace[myChristoffel[# <> derivativeIndex <> "\|040200"]], - newID[StringReplace[tensorIndices, # -> "\|040200"]]] - ]) &, - Characters[tensorIndices] - ]; - (* Delete the temporary tensor we created above. *) - RemoveTensorID[newID]; - Return[out]; -]; - - -(* Take the divergence or gradient of a tensor. *) -CreateUsageMessage[TPartialD, {index}, "represents the partial derivative when used in a tensor expression given to TCalc[ ]."]; -DivOrGrad::OneIndex = "The index specification of the partial derivative must be a string with exactly one character. If the character matches a character in the index specification of the tensor, it will be contracted with it to produce a divergence. Otherwise, the gradient will be calculated."; -DivOrGrad[derivativeIndex_String, tensorID_String[tensorIndices_String]] := Module[ - { - allVars, - components, - coordinateSymbols, - firstVars, - newComponents, - newID, - newIndices, - newSymbol, - outIndices, - outVars, - pos, - secondVars, - sumVars, - useCoords, - useIndices - }, - (* Check that the tensor exists. *) - CheckIfTensorExists[tensorID]; - (* Check that the derivative has exactly once index. *) - If[ - StringLength[derivativeIndex] != 1, - (* Then *) - Message[DivOrGrad::OneIndex]; - Abort[]; - ]; - (* Check that the index string matches the rank of the tensor. *) - CheckIndicesRank[tensorIndices, tensorID]; - useIndices = TensorData[tensorID]["DefaultIndices"]; - useCoords = TensorData[tensorID]["DefaultCoords"]; - (* If the derivative's index matches one of the tensor's indices, we are calculating a divergence, so raise that index on the tensor (useIndices) to match the lower index on the derivative, and remove that index from the result (newIndices) since we are contracting it. Otherwise, we are calculating a gradient, so prepend a lower index to the result (newIndices) to account for the derivative's index. *) - newIndices = useIndices; - pos = StringPosition[tensorIndices, derivativeIndex]; - If[ - pos =!= {}, - (* Then *) - useIndices[[pos[[1, 1]]]] = 1; - newIndices = Delete[newIndices, pos[[1, 1]]], - (* Else *) - PrependTo[newIndices, -1]; - ]; - (* Get the tensor's components in the desired representation, adding it if it does not already exist. *) - components = AddRepresentation[tensorID, useIndices, useCoords]; - (* Collect the variables to be used for contracting the indices. See ContractTensors for more details on how this part works. *) - allVars = Association[]; - Scan[(allVars[#] = Unique["var"]) &, Characters[derivativeIndex <> tensorIndices]]; - firstVars = allVars[#]& /@ Characters[derivativeIndex]; - secondVars = allVars[#]& /@ Characters[tensorIndices]; - sumVars = {}; - outVars = {}; - outIndices = ""; - If[ - Length[Cases[Characters[derivativeIndex <> tensorIndices], #]] == 2, - (* Then *) - AppendTo[sumVars, allVars[#]], - (* Else *) - AppendTo[outVars, allVars[#]]; - outIndices = outIndices <> #; - ]& /@ Keys[allVars]; - (* Collect the coordinate symbols, since we are taking derivatives with respect to them. *) - coordinateSymbols = TensorData[useCoords]["Components"][{{1}, useCoords}]; - (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) - newSymbol = Row[{ - Subscript["\[PartialD]", derivativeIndex], - If[ - TensorData[tensorID]["Role"] === "Temporary", - (* Then *) - TensorData[tensorID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[tensorID]["Symbol"], - IndicesToLetters[-1, useIndices, tensorIndices], - IndicesToLetters[+1, useIndices, tensorIndices] - ] - ] - }]; - (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) - (* PrintTemporary["Taking the partial derivative ", newSymbol, "..."]; *) - (* Calculate the components of the new tensor by summing over the contracted variables and taking the derivatives of the tensor's components. *) - newComponents = Table[ - If[ - Length[sumVars] > 0, - (* Then *) - Sum[ - D[components[[Sequence @@ secondVars]], coordinateSymbols[[firstVars[[1]]]]], - Evaluate[Sequence @@ ({#, 1, Length[coordinateSymbols]} & /@ sumVars)] - ], - (* Else *) - D[components[[Sequence @@ secondVars]], coordinateSymbols[[firstVars[[1]]]]] - ], - Evaluate[ - If[ - Length[outVars] > 0, - (* Then *) - Sequence @@ ({#, 1, Length[coordinateSymbols]} & /@ outVars), - (* Else *) - 1 - ] - ] - ]; - (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) - newID = NewTempID[]; - SetTensorID[newID, Association[ - "Components" -> Association[{newIndices, useCoords} -> newComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> newIndices, - "Metric" -> TensorData[tensorID]["Metric"], - "Role" -> "Temporary", - "Symbol" -> newSymbol - ]]; - Return[newID[outIndices]]; -]; - - -(* Replace TensorData with the given Association. All previously defined tensor objects will be erased. The Options key will be created if it does not already exist (for compatibility with v1.0). *) -ImportTensorData[data_Association] := ( - If[ - !KeyExistsQ[data, Options] || !KeyExistsQ[data[Options], "OGReVersion"] || data[Options]["OGReVersion"] != OGReVersion, - (* Then *) - OGRePrint["Warning: The imported tensors were created in a different version of OGRe. Compatibility issues may occur."]; - ] - Unprotect[TensorData]; - TensorData = data; - PopulateOptions[]; - Protect[TensorData]; -); - - -(* Convert an index definition (i.e. a List with +1 for an upper index and -1 for a lower index) into letters. Used for displaying tensors using either letters or coordinates as indices. If the first argument is +1, returns a row with the upper indices, and empty spaces to account for the lower indices. If the first argument is -1, do the same with the lower indices. *) -IndicesToLetters[lookFor_Integer, upperLower_List, letters_String] := - Row[MapIndexed[If[ - #1 == lookFor, - (* Then *) - Characters[letters][[First[#2]]], - (* Else *) - Invisible[Characters[letters][[First[#2]]]] - ] &, upperLower]]; - - -(* Ensure that the tensor IDs given to temporary tensors are unique. *) -TempID = 0; -NewTempID[] := ( - Unprotect[TempID]; - TempID++; - Protect[TempID]; - Return["_TCalcTemp" <> ToString[TempID] <> "_"]; -); - - -(* Display an expression using the DisplayFormula style. The user must define what this style means manually in the notebook style sheet. *) -Nice[expression_] := Style[expression, "DisplayFormula"]; - - -(* Change one of a tensor's indices to the desired position (upper = +1 or lower = -1), starting from a specific index configuration (assumed to be already calculated). The new components are then saved as a separate representation within the tensor object. Returns the new index configuration. *) -RaiseLower[ID_String, coordinatesID_String, oldIndices_List, indexPos_Integer, upperLower_Integer] := Module[ - { - allComponents, - components = TensorData[ID]["Components"][{oldIndices, coordinatesID}], - dim, - metricID = TensorData[ID]["Metric"], - newComponents, - newIndices, - newVars, - oldVars, - raiseVar, - sumVar, - useMetric - }, - dim = Length[components]; - (* If the metric used to raise and lower indices for this tensor has not yet had its components calculated in the desired coordinate system, calculate them now. *) - If[ - !KeyExistsQ[TensorData[metricID]["Components"], {{-1, -1}, coordinatesID}], - (* Then *) - TransformCoordinates[metricID, {-1, -1}, TensorData[metricID]["DefaultCoords"], coordinatesID] - ]; - Which[ - oldIndices[[indexPos]] == +1 && upperLower == -1, - (* If lowering the index, use the metric (with two lower indices). *) - useMetric = TensorData[metricID]["Components"][{{-1, -1}, coordinatesID}], - oldIndices[[indexPos]] == -1 && upperLower == +1, - (* If raising the index, use the inverse metric (with two upper indices). *) - useMetric = TensorData[metricID]["Components"][{{+1, +1}, coordinatesID}], - True, - (* If the index is not being raised or lowered, do nothing. *) - Return[oldIndices] - ]; - (* The new indices are the same as the old indices, except for the one index being raised or lowered. *) - newIndices = ReplacePart[oldIndices, indexPos -> upperLower]; - (* If a representation with the desired index configuration already exists, do nothing. *) - If[ - KeyExistsQ[TensorData[ID]["Components"], {newIndices, coordinatesID}], - (* Then *) - Return[newIndices] - ]; - (* Define the variables to be used in the calculation. As an example, say we want to lower the last index of T^abc. Then we have T^ab_c = g_cd T^abd. In this case newVars = {a, b, c}, oldVars = {a, b, d}, raiseVar = c, and sumVar = d. *) - newVars = Unique[Table["var", {Length[newIndices]}]]; - oldVars = ReplacePart[newVars, indexPos -> sumVar]; - raiseVar = newVars[[indexPos]]; - (* Create the new components using a Table with newVars as iterators. Each component will be calculated using a Sum with sumVar as the summation variable. *) - newComponents = (Table[ - Sum[ - useMetric[[raiseVar, sumVar]] * components[[Sequence @@ oldVars]], - {sumVar, 1, dim} - ], ## - ] &) @@ ({#, 1, dim} &) /@ newVars; - (* Store the new representation in the tensor object. *) - allComponents = TensorData[ID]["Components"]; - allComponents[{newIndices, coordinatesID}] = TensorSimplify[newComponents]; - ChangeTensorKey[ID, "Components", allComponents]; - (* Return the new index configuration. *) - Return[newIndices]; -]; - - -(* Remove the tensor object with the given ID. *) -RemoveTensorID[ID_String] := ( - Unprotect[TensorData]; - KeyDropFrom[TensorData, ID]; - Protect[TensorData]; -); - - -(* Create a new tensor object with the given ID, or assign it new data if it already exists. *) -SetTensorID[ID_String, data_Association] := ( - Unprotect[TensorData]; - TensorData[ID] = data; - Protect[TensorData]; -); - - -(* Show or list a tensor's components. Called by TShow and TList. *) -ShowList[ID_String, indices_List, coordinatesID_String, showOrList_String, function_ : Identity] := Module[ - { - allElements, - components, - coordSymbols, - grid, - i, - row, - uniqueValues, - uniqueValuesSign, - useCoords, - useIndices - }, - (* Check that the tensor object ID exists. *) - CheckIfTensorExists[ID]; - (* If specific indices are not given, use the tensor's default indices. *) - If[ - indices === {"_UseDefault_"}, - (* Then *) - useIndices = TensorData[ID]["DefaultIndices"], - (* Else *) - (* Check that the list of indices is of the correct form and has the correct rank. *) - CheckIndicesForm[indices]; - CheckIndicesRank[indices, ID]; - useIndices = indices; - ]; - (* If a specific coordinate system is not given, use the tensor's default coordinate system. *) - If[ - coordinatesID === "_UseDefault_", - (* Then *) - useCoords = TensorData[ID]["DefaultCoords"], - (* Else *) - (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) - CheckIfTensorExists[coordinatesID]; - CheckIfCoordinates[coordinatesID]; - useCoords = coordinatesID; - ]; - (* Get the components of the tensor in the given representation (indices and coordinate system), or calculate it if it does not already exist. *) - components = AddRepresentation[ID, useIndices, useCoords]; - (* Apply the optional function to the components. *) - components = Map[function, components, {ArrayDepth[components]}]; - (* Execute the following if called by TShow. *) - If[ - showOrList === "Show", - (* Then *) - (* Print the tensor's ID followed by a colon. *) - row = {ID, ": "}; - (* Print the tensor's symbol along with the desired upper and lower indices. The index letters will be taken from TensorData[Options]["IndexLetters"]. IndicesToLetters will return a row with only the upper indices or only the lower indices depending on the first argument. *) - row = Append[row, Subsuperscript[ - TensorData[ID]["Symbol"], - IndicesToLetters[-1, useIndices, TensorData[Options]["IndexLetters"]], - IndicesToLetters[+1, useIndices, TensorData[Options]["IndexLetters"]] - ]]; - (* Print the tensor's coordinates as function arguments, e.g. (t, x, y, z), but only if the tensor does not itself represent coordinates. *) - If[ - TensorData[ID]["Role"] =!= "Coordinates", - (* Then *) - row = Join[row, {"(", Row[TensorData[useCoords]["Components"][{{1}, useCoords}], ","], ")"}] - ]; - (* Print an equal sign. *) - row = Append[row, " = "]; - (* Print the components of the tensor. Use MatrixForm, unless it is a scalar. *) - If[ - Length[components] * ArrayDepth[components] != 1, - (* Then *) - row = Append[row, MatrixForm[components]], - (* Else *) - row = Join[row, components] - ]; - (* Print the row, formatted using Nice. *) - OGRePrint[Nice[Row[row]]]; - ]; - (* Execute the following if called by TList. *) - If[ - showOrList === "List", - (* Then *) - If[ - AllTrue[Flatten[components], # === 0 &], - (* Then *) - grid = "No non-zero elements.", - (* Else *) - (* The coordinate symbols (e.g. t, x, y, z) will be used in place of the indices. *) - coordSymbols = TensorData[useCoords]["Components"][{{1}, useCoords}]; - (* Create an array of elements of the form {value, label}, where label is the label of the specific component (with the coordinates as indices, e.g. g_xy is the component with x for the first index and y for the second index) and value is its value. *) - allElements = Flatten[ - MapIndexed[ - { - #1, - Subsuperscript[ - TensorData[ID]["Symbol"], - IndicesToLetters[-1, useIndices, StringJoin[ToString /@ coordSymbols[[#2]]]], - IndicesToLetters[+1, useIndices, StringJoin[ToString /@ coordSymbols[[#2]]]] - ] - } &, - components, - {ArrayDepth[components]} - ], - ArrayDepth[components] - 1 - ]; - (* List only the unique tensor elements out of the array we created above. *) - uniqueValues = DeleteCases[DeleteDuplicates[allElements[[All, 1]]], 0]; - (* List only the tensor elements that are unique up to sign. *) - uniqueValuesSign = {}; - Scan[ - If[ - !MemberQ[uniqueValuesSign, -#1], - (* Then *) - AppendTo[uniqueValuesSign, #1] - ] &, - uniqueValues - ]; - (* Create a grid of the unique tensor elements. In each row we find the elements of allElements that have a specific unique value out of uniqueValuesSign, and print all of them followed by the value. *) - grid = Grid[ - Table[ - { - Row[ - Join[ - Select[allElements, #1[[1]] == uniqueValuesSign[[i]] &][[All, 2]], - -Select[allElements, #1[[1]] == -uniqueValuesSign[[i]] &][[All, 2]] - ], - "=" - ], - "=", - uniqueValuesSign[[i]] - }, - {i, 1, Length[uniqueValuesSign]} - ], - Alignment -> {Left, Baseline} - ]; - ]; - (* Print the grid, preceded by the tensor's ID, formatted using Nice. *) - OGRePrint[Nice[Column[ - { - Row[{ID, ":"}], - grid - }, - Alignment -> {Center, Baseline} - ]]]; - ]; -]; - - -(* Multiply a tensor object by a scalar. *) -TensorByScalar::ErrorCoords = "The tensor \"`1`\" cannot be multiplied by a scalar, as it represents a coordinate system."; -TensorByScalar[ID_String[indices_String], scalar_, useSymbol_: False] := Module[ - { - newComponents, - newID, - newSymbol, - useCoords, - useIndices - }, - (* Check that the tensor exists. *) - CheckIfTensorExists[ID]; - (* Check that the tensor does not represent a coordinate system. *) - If[ - TensorData[ID]["Role"] === "Coordinates", - (* Then *) - Message[TensorByScalar::ErrorCoords, ID]; - Abort[]; - ]; - (* Check that the index string matches the rank of the tensor. *) - CheckIndicesRank[indices, ID]; - (* The components that will be multiplied are the ones corresponding to the default representation of the tensor. *) - useIndices = TensorData[ID]["DefaultIndices"]; - useCoords = TensorData[ID]["DefaultCoords"]; - (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) - newSymbol = Row[{ - (* If the scalar is -1, we just prefix the tensor with a negative sign. If it's any other number, we use that number as the prefix. If it is a rank 0 tensor, we use its symbol. Otherwise, we add parentheses in case it is an expression with several terms. *) - Which[ - NumberQ[scalar] && scalar == -1, "-", - NumberQ[scalar], scalar, - useSymbol =!= False, useSymbol, - True, Splice[{"(", scalar, ")"}] - ], - If[ - TensorData[ID]["Role"] === "Temporary", - (* Then *) - TensorData[ID]["Symbol"], - (* Else *) - Subsuperscript[ - TensorData[ID]["Symbol"], - IndicesToLetters[-1, useIndices, indices], - IndicesToLetters[+1, useIndices, indices] - ] - ] - }]; - (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) - (* PrintTemporary["Multiplying by scalar ", newSymbol, "..."]; *) - (* Calculate the product of the scalar with the tensor. *) - newComponents = scalar * TensorData[ID]["Components"][{useIndices, useCoords}]; - (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) - newID = NewTempID[]; - SetTensorID[newID, Association[ - "Components" -> Association[{useIndices, useCoords} -> newComponents], - "DefaultCoords" -> useCoords, - "DefaultIndices" -> useIndices, - "Metric" -> TensorData[ID]["Metric"], - "Role" -> "Temporary", - "Symbol" -> newSymbol - ]]; - Return[newID[indices]]; -]; - -(* Simplify an expression with optional user-defined assumptions. *) -TensorSimplify[expression_] := Module[ - { - assumptions, - progress, - result, - tasks - }, - assumptions = Join[ - { - If[ - TensorData[Options]["SimplifyAssumptions"]["AssumeReal"], - (* Then *) - Element[_, Reals], - (* Else *) - None - ] - }, - (* The flattening is for compatibility with v1.0, since the assumptions were not stored as a list in that version. *) - Flatten[{TensorData[Options]["SimplifyAssumptions"]["User"]}] - ]; - (* Print a dynamic progress indicator. The progress parameter will be shared between all kernels so they can update it. *) - progress = 0; - SetSharedVariable[progress]; - PrintTemporary["Simplification progress: ", ProgressIndicator[Dynamic[progress], {0, Times @@ Dimensions[expression]}]]; - If[ - TensorData[Options]["Parallelize"], - (* Then *) - (* Submit the simplification of each element in the tensor as an individual task. Whenever a kernel becomes available, it will pick up the next available task. This results in better performance than ParallelMap. *) - tasks = Map[ - (* Using Block instead of Module here for maximum performance. *) - Function[element, ParallelSubmit[Block[{simplified = FullSimplify[element, assumptions]}, progress++; simplified]]], - expression, - {ArrayDepth[expression]} - ]; - (* Wait for all tasks to be completed. *) - result = WaitAll[tasks], - (* Else *) - (* Do the same without parallelization. *) - result = Map[ - Function[element, Block[{simplified = FullSimplify[element, assumptions]}, progress++; simplified]], - expression, - {ArrayDepth[expression]} - ]; - ]; - UnsetShared[progress]; - Return[result]; -]; - - -(* Take the trace of a tensor. *) -TensorTrace::ErrorMoreThanTwo = "The index specification \"`1`\" is invalid, as it contains more than two instances of the index \"`2`\"."; -TensorTrace[ID_String[indices_String]] := Module[ - { - allowedLetters, - chars = Characters[indices], - count, - out, - pos, - tally, - toContract - }, - (* Check that the tensor exists. *) - CheckIfTensorExists[ID]; - (* Tally the indices, i.e. count the multiplicities of all distinct indices. *) - tally = Tally[chars]; - (* If no index appears twice, we do not need to take the trace. Just return the tensor as is. *) - If[ - Max[tally[[All, 2]]] < 2, - (* Then *) - Return[ID[indices]]; - ]; - (* We want to replace any repeated indices by contractions with the metric, so for each contraction, we will need an arbitrary index letter to sum upon. To ensure that there are no collisions with the indices given by the user, we use characters from an unused Unicode plane. *) - allowedLetters = CharacterRange["\|040000", "\|040100"]; - (* The list toContract will be populated with the index letters we are contracting. *) - toContract = {}; - count = 0; - Scan[ - ( - (* Check that no indices appear more than twice. *) - If[ - #[[2]] > 2, - (* Then *) - Message[TensorTrace::ErrorMoreThanTwo, indices, #[[1]]]; - Abort[]; - ]; - (* For each index that appears exactly twice, add it to the list of indices to contract, and replace it with a summation index. *) - If[ - #[[2]] == 2, - (* Then *) - count++; - pos = Position[chars, #[[1]]][[2, 1]]; - (* Each entry in toContract will be of the form {contracted letter, summation letter}. These will be the two indices used in the metric for each contracted index. *) - AppendTo[toContract, {chars[[pos]], allowedLetters[[count]]}]; - chars[[pos]] = allowedLetters[[count]]; - ]; - ) &, - tally - ]; - (* Start with the tensor we are taking the trace of, with the contracted indices replaced. *) - out = ID[StringJoin[chars]]; - (* Contract the metric with each traced index of this tensor. *) - Scan[ - (out = ContractTensors[TensorData[ID]["Metric"][StringJoin @@ #], out]) &, - toContract - ]; - Return[out]; -]; - - -(* Transform the components of a tensor, with the specified index configuration, from one coordinate system to another. Returns the new components as output. *) -TransformCoordinates::ErrorNoRules = "Rules for transforming coordinates from \"`1`\" to \"`2`\" have not been defined." -TransformCoordinates[ID_String, indices_List, sourceID_String, targetID_String] := Module[{ - allComponents, - ChristoffelJacobian, - dim, - inverseJacobian, - jacobian, - k, - newComponents, - newCoordSymbols, - newVars, - old, - oldComponents, - oldCoordSymbols, - oldVars, - rank, - sumVar1, - sumVar2, - sumVar3, - transRules - }, - (* Get the components of all existing representations. *) - allComponents = TensorData[ID]["Components"]; - (* If a representation in the desired coordinate system already exists, do nothing. *) - If[ - KeyExistsQ[allComponents, {indices, targetID}], - (* Then *) - Return[allComponents[{indices, targetID}]] - ]; - (* Get the components in the source coordinate system. *) - oldComponents = allComponents[{indices, sourceID}]; - (* Check that rules to transform from the source to the target coordinate system have been defined. *) - If[ - KeyExistsQ[TensorData[sourceID], "CoordTransformations"] && KeyExistsQ[TensorData[sourceID]["CoordTransformations"], targetID], - (* Then *) - transRules = TensorData[sourceID]["CoordTransformations"][targetID], - (* Else *) - Message[TransformCoordinates::ErrorNoRules, sourceID, targetID]; - Abort[]; - ]; - If[ - indices == {}, - (* Then *) - (* If the tensor is a scalar, simply transform its one component. *) - newComponents = TensorSimplify[oldComponents /. transRules], - (* Else *) - (* If the tensor is not a scalar, transform its components using contractions with the Jacobian. *) - (* Get the rank of the tensor, corresponding to the number of variables to use. *) - rank = ArrayDepth[oldComponents]; - (* Get the symbols (e.g. x, y, z) of the old and new coordinates, in terms of which the transformation is defined. *) - oldCoordSymbols = TensorData[sourceID]["Components"][{{1}, sourceID}]; - newCoordSymbols = TensorData[targetID]["Components"][{{1}, targetID}]; - (* Get the dimension of the coordinates. *) - dim = Length[oldCoordSymbols]; - (* Define the variables in terms of which to calculate the Jacobian. *) - oldVars = Unique[Table["old", {rank}]]; - newVars = Unique[Table["new", {rank}]]; - (* If the Jacobians have not been calculated yet, calculate them now. This is only for compatibility with v1.0. *) - If[ - !KeyExistsQ[TensorData[sourceID], "Jacobians"], - (* Then *) - TAddCoordTransformation[sourceID, targetID, transRules]; - ]; - (* Collect the Jacobians from the object's data. *) - jacobian = TensorData[sourceID]["Jacobians"][targetID]["Jacobian"]; - inverseJacobian = TensorData[sourceID]["Jacobians"][targetID]["InverseJacobian"]; - ChristoffelJacobian = TensorData[sourceID]["Jacobians"][targetID]["ChristoffelJacobian"]; - (* Calculate the new components by contracting each lower index with the Jacobian and each upper index with the inverse Jacobian. *) - newComponents = ( - Table[( - Sum[Product[ - Switch[ - indices[[k]], - -1, jacobian[[oldVars[[k]], newVars[[k]]]], - +1, inverseJacobian[[newVars[[k]], oldVars[[k]]]] - ], - {k, 1, rank} - ] * (oldComponents[[##]] &) @@ oldVars, ##] & - ) @@ ({#, 1, dim} &) /@ oldVars, ##] &) @@ ({#, 1, dim} &) /@ newVars /. transRules; - (* If the tensor object represents a Levi-Civita connection, then it does not transform like a tensor; we need to add an extra term to the transformation. Note that here we are using the class invariant which guarantees that the Christoffel symbols always have {1, -1, -1} as their default index configuration. *) - If[ - TensorData[ID]["Role"] === "Christoffel", - (* Then *) - newComponents += Table[ - Sum[ - inverseJacobian[[sumVar1, old]] * ChristoffelJacobian[[old, sumVar2, sumVar3]], - {old, 1, dim} - ], - {sumVar1, 1, dim}, - {sumVar2, 1, dim}, - {sumVar3, 1, dim} - ] /. transRules; - ]; - (* Simplify the result. *) - newComponents = TensorSimplify[newComponents]; - (* If the tensor is a metric, store the inverse metric and identity matrix for future use. *) - If[ - TensorData[ID]["Role"] === "Metric", - (* Then *) - If[ - indices == {-1, -1} && !KeyExistsQ[allComponents, {{+1, +1}, targetID}], - (* Then *) - allComponents[{{+1, +1}, targetID}] = TensorSimplify[Inverse[newComponents]] - ]; - If[ - indices == {+1, +1} && !KeyExistsQ[allComponents, {{-1, -1}, targetID}], - (* Then *) - allComponents[{{-1, -1}, targetID}] = TensorSimplify[Inverse[newComponents]] - ]; - allComponents[{{+1, -1}, targetID}] = IdentityMatrix[dim]; - allComponents[{{-1, +1}, targetID}] = IdentityMatrix[dim]; - ]; - ]; - (* Store the new components. *) - allComponents[{indices, targetID}] = newComponents; - ChangeTensorKey[ID, "Components", allComponents]; - Return[newComponents]; -]; - - -End[]; (* OGRe`Private` *) - - -(* Protect all OGRe symbols so they will not be accidentally overwritten elsewhere. *) -Protect["OGRe`*"]; -Protect["OGRe`Private`*"]; - - -EndPackage[]; (* OGRe *) +(* ::Package:: *) + + +(* OGRe: An (O)bject-Oriented (G)eneral (Re)lativity Package for Mathematica *) +(* By Barak Shoshany (baraksh@gmail.com) (baraksh.com) *) +(* https://github.com/bshoshany/OGRe *) +(* Copyright (c) 2021 Barak Shoshany. Licensed under the MIT license. *) +(* If you use this package in published research, please cite it as follows: *) +(* Barak Shoshany, "OGRe: An Object-Oriented General Relativity Package *) +(* for Mathematica", doi:10.5281/zenodo.4742935 (May 2021) *) + + +BeginPackage["OGRe`"]; + + +(* Check if the package has already been loaded, in case Get was used instead of Needs. *) +If[ + ValueQ[OGRe`Private`AlreadyLoaded], +(* Then *) + (* Unprotect and clear all symbols, so they can be redefined. Useful for debugging, or to reload the package after updating. *) + Unprotect["OGRe`*"]; + Unprotect["OGRe`Private`*"]; + (* Keep the tensor objects and settings created so far during the session, so they don't get deleted when the package is reloaded. *) + OGReTemp`TensorData = OGRe`Private`TensorData; + ClearAll["OGRe`*"]; + ClearAll["OGRe`Private`*"]; + OGRe`Private`TensorData = OGReTemp`TensorData; + Remove["OGReTemp`*"]; + OGRe`Private`AlreadyLoaded = True, +(* Else *) + OGRe`Private`AlreadyLoaded = True; + (* Initialize the symbol TensorData, which is used to store the data for the tensor objects, as well as user settings. This is done only on first load. *) + OGRe`Private`TensorData = Association[]; +]; + + +(* A dirty trick to make the package's public modules globally visible without defining their usage messages in advance. I prefer to define each usage message at the same time as the module itself, so it can also serve as documentation for the code. *) +Null[{ + TAddCoordTransformation, + TCalc, + TCalcChristoffel, + TCalcEinsteinTensor, + TCalcRicciScalar, + TCalcRicciTensor, + TCalcRiemannTensor, + TChangeDefaultCoords, + TChangeDefaultIndices, + TChangeID, + TChangeSymbol, + TCheckForUpdates, + TCovariantD, + TDelete, + TDocs, + TExport, + TExportAll, + TGetComponents, + TImport, + TImportAll, + TInfo, + TInitializeSymbols, + TList, + TNewCoordinates, + TNewMetric, + TNewTensor, + TPartialD, + TSetAssumptions, + TSetIndexLetters, + TSetParallelization, + TShow, + TSimplify +}]; + + +Begin["`Private`"]; (* OGRe`Private` *) + + +(* DO NOT change the format of the next line. It is used by TCheckForUpdates to detect the version of this file. Changing it will break the automatic update mechanism. Only change the version number and date. *) +OGReVersion = "v1.4 (2021-05-09)"; + + +(* The raw URL of this file on GitHub. *) +OGReURL = "https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m"; + + +(* =================================================== + Public modules (accessible to the user) start here. + =================================================== *) + + +(* Create a nicely-formatted usage message. *) +CreateUsageMessage[f_, msg_String : {}] := Evaluate[f::usage] = ToString[TextCell[Row[Flatten[{List @@ StringReplace[msg, {"`" ~~ (x : Shortest[__]) ~~ "`" :> Style[x, Bold]}]}]]], StandardForm]; + + +CreateUsageMessage[TAddCoordTransformation, "TAddCoordTransformation[`sourceID` \[Rule] `targetID`, `rules`] adds a transformation from the coordinate system `sourceID` to the coordinate system `targetID`. +`rules` must be a list of transformation rules. For example, {x \[Rule] r Sin[\[Theta]] Cos[\[Phi]], y \[Rule] r Sin[\[Theta]] Sin[\[Phi]], z \[Rule] r Cos[\[Theta]]} is a transformation from Cartesian to spherical coordinates."]; +TAddCoordTransformation::ErrorRulesForm = "The transformation rules must be a list of rules of the form x \[Rule] y."; +TAddCoordTransformation::ErrorDifferentCoords = "The source and target coordinate systems must be different."; +TAddCoordTransformation::ErrorNotSameDim = "The source and target coordinate systems must be of the same dimension."; +TAddCoordTransformation[sourceID_String -> targetID_String, rules_List] := TAddCoordTransformation[sourceID, targetID, rules]; +TAddCoordTransformation[sourceID_String, targetID_String, rules_List] := Module[ + { + allJacobians, + ChristoffelJacobian, + dim, + i, + inverseJacobian, + j, + jacobian, + k, + newCoordSymbols, + oldCoordSymbols + }, + (* Check that the tensor object sourceID exists. *) + CheckIfTensorExists[sourceID]; + (* Check that the rules are of the correct form. *) + If[ + !AllTrue[rules, MatchQ[#, _->_] &], + (* Then *) + Message[TAddCoordTransformation::ErrorRulesForm]; + Abort[]; + ]; + (* Check that both tensor objects represents coordinate systems. *) + CheckIfCoordinates[sourceID]; + CheckIfCoordinates[targetID]; + (* Check that the source and target coordinate systems are different. *) + If[ + sourceID === targetID, + (* Then *) + Message[TAddCoordTransformation::ErrorDifferentCoords]; + Abort[]; + ]; + (* Check that the source and target coordinate systems are of the same dimension. *) + If[ + Length[TensorData[sourceID]["Components"][{{1}, sourceID}]] != Length[TensorData[targetID]["Components"][{{1}, targetID}]], + (* Then *) + Message[TAddCoordTransformation::ErrorNotSameDim]; + Abort[]; + ]; + (* Add the transformation to the CoordTransformations key of the source object, or create it if it doesn't already exist. *) + If[ + KeyExistsQ[TensorData[sourceID], "CoordTransformations"] && AssociationQ[TensorData[sourceID]["CoordTransformations"]], + (* Then *) + ChangeTensorKey[sourceID, "CoordTransformations", Append[TensorData[sourceID]["CoordTransformations"], targetID -> rules]], + (* Else *) + ChangeTensorKey[sourceID, "CoordTransformations", Association[targetID -> rules]]; + ]; + (* Calculate the Jacobian, inverse Jacobian, and the "Christoffel Jacobian", i.e. the extra second-derivative term in the coordinate transformation of the Christoffel symbols, and store them in the tensor object of the source coordinates, to be used later whenever a coordinate transformation is performed. *) + oldCoordSymbols = TensorData[sourceID]["Components"][{{1}, sourceID}]; + newCoordSymbols = TensorData[targetID]["Components"][{{1}, targetID}]; + dim = Length[oldCoordSymbols]; + jacobian = TensorSimplify[Table[ + D[oldCoordSymbols[[i]] /. rules, newCoordSymbols[[j]]], + {i, 1, dim}, + {j, 1, dim} + ]]; + inverseJacobian = TensorSimplify[Inverse[jacobian]]; + ChristoffelJacobian = TensorSimplify[Table[ + D[ + oldCoordSymbols[[i]] /. rules, + newCoordSymbols[[j]], + newCoordSymbols[[k]] + ], + {i, 1, dim}, + {j, 1, dim}, + {k, 1, dim} + ]]; + allJacobians = Association[ + "Jacobian" -> jacobian, + "InverseJacobian" -> inverseJacobian, + "ChristoffelJacobian" -> ChristoffelJacobian + ]; + (* Add all three Jacobians to the Jacobians key of the source object, or create it if it doesn't already exist. *) + If[ + KeyExistsQ[TensorData[sourceID], "Jacobians"] && AssociationQ[TensorData[sourceID]["Jacobians"]], + (* Then *) + ChangeTensorKey[sourceID, "Jacobians", Append[TensorData[sourceID]["Jacobians"], targetID -> allJacobians]], + (* Else *) + ChangeTensorKey[sourceID, "Jacobians", Association[targetID -> allJacobians]]; + ]; + Return[sourceID]; +]; + + +DefaultResultID = "Result"; +DefaultSymbol = "\[DottedSquare]"; +CreateUsageMessage[TCalc, "TCalc[`formula`] calculates a tensor `formula`, which may involve any number of tensors in the format `ID`[`indices`], where `ID` is a tensor object and `indices` is a string representing the order of indices, along with any combination of the following operations: +\[Bullet] Addition: For example, \"A\"[\"\[Mu]\[Nu]\"] + \"B\"[\"\[Mu]\[Nu]\"]. +\[Bullet] Contraction: For example, \"A\"[\"\[Mu]\[Lambda]\"] . \"B\"[\"\[Lambda]\[Nu]\"]. +\[Bullet] Multiplication by scalar: For example, 2 * \"A\"[\"\[Mu]\[Nu]\"]. +TCalc[`targetID`[`targetIndices`], `formula`, `symbol`] calculates a tensor `formula` and stores the result in a new tensor object. +`targetID` specifies the ID of the tensor object in which to store the result. If omitted, the ID \"" <> DefaultResultID <> "\" will be used. +`targetIndices` specifies the order of indices of the resulting tensor. The indices must be a permutation of the free indices of `formula`. If omitted, the indices are assumed to be in the same order as they appear in `formula`. +`symbol` specifies the symbol to use for the resulting tensor. If omitted, the placeholder symbol " <> DefaultSymbol <> " will be used."]; +TCalc::ErrorIndices = "The LHS index specification \"`1`\" and the RHS index specification \"`2`\" must be the same up to permutation."; +TCalc::ErrorResult = "Invalid tensor expression obtained: `1`. Please check that the tensor expression you entered contains only tensor references of the form \"ID\"[\"indices\"] combined using addition, contraction (dot product), or multiplication by scalar." +TCalc[RHSExpression_, symbol_String : DefaultSymbol] := TCalc[DefaultResultID[""], RHSExpression, symbol]; +TCalc[LHSTensorID_String, RHSExpression_, symbol_String : DefaultSymbol] := TCalc[LHSTensorID[""], RHSExpression, symbol]; +TCalc[LHSTensorID_String[LHSIndices_String], RHSExpression_, symbol_String : DefaultSymbol] := Module[ + { + allVars, + components, + leafCount, + LHSVars, + newComponents, + newIndices, + progress, + result, + resultID, + resultIndices, + RHSVars, + rules, + useCoords, + useIndices + }, + (* Check that the tensor LHSTensorID doesn't already exist, but only if it's not the default ID. *) + If[ + LHSTensorID =!= DefaultResultID, + (* Then *) + CheckIfOverwriting[LHSTensorID]; + ]; + (* Record the initial leaf count of the expression to be calculated. It will be used to advance the progress bar, since the leaf count decreases with (almost) every operation. *) + leafCount = LeafCount[RHSExpression]; + (* Define the rules for computing tensor formulas. *) + rules = { + (* Trace *) + ID_String[indices_String /; !DuplicateFreeQ[Characters[indices]]] :> + TensorTrace[ID[indices]], + (* Tensor addition *) + firstID_String[firstIndices_String] + secondID_String[secondIndices_String] :> + AddTensors[TensorTrace[firstID[firstIndices]], TensorTrace[secondID[secondIndices]]], + (* Multiplication of tensor by scalar *) + scalar_ * ID_String[indices_String] :> + TensorByScalar[TensorTrace[ID[indices]], scalar], + (* Contraction of tensors *) + firstID_String[firstIndices_String] . secondID_String[secondIndices_String] :> + ContractTensors[TensorTrace[firstID[firstIndices]], TensorTrace[secondID[secondIndices]]], + (* Partial derivative *) + TPartialD[derivativeIndex_String] . tensorID_String[tensorIndices_String] :> + DivOrGrad[derivativeIndex, TensorTrace[tensorID[tensorIndices]]], + (* Covariant derivative *) + TCovariantD[derivativeIndex_String] . tensorID_String[tensorIndices_String] :> + CovariantDivOrGrad[derivativeIndex, TensorTrace[tensorID[tensorIndices]]] + }; + (* Print a dynamic progress indicator. *) + progress = 0; + PrintTemporary["Calculation progress: ", ProgressIndicator[Dynamic[progress], {0, 1}]]; + (* Repeatedly replace tensor operations with their results until we reach a fixed point. Note that we use NestWhile instead of ReplaceRepeated here so that we can report progress to the user. *) + result = NestWhile[( + result = ReplaceAll[#, rules]; + progress = 1 - LeafCount[result] / leafCount; + result + ) &, RHSExpression, UnsameQ, 2]; + progress = 1; + (* Check that the result is valid, i.e. of the form "tensorID"["indices"]. *) + If[ + !MatchQ[result, _String[_String]], + (* Then *) + Message[TCalc::ErrorResult, result]; + (* Clear the temporary tensors that were created for the purpose of the calculation. *) + ClearTemp[]; + Abort[]; + ]; + resultID = result[[0]]; + resultIndices = result[[1]]; + (* Get the indices, coordinates, and components of the result. *) + useIndices = TensorData[resultID]["DefaultIndices"]; + useCoords = TensorData[resultID]["DefaultCoords"]; + components = TensorData[resultID]["Components"][{useIndices, useCoords}]; + (* Simplify the components. *) + components = TensorSimplify[components]; + If[ + LHSIndices === "", + (* Then *) + (* Either a scalar, or no rearranging of indices is desired. Store the result directly in a new tensor object. *) + SetTensorID[LHSTensorID, Association[ + "Components" -> Association[{useIndices, useCoords} -> components], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> useIndices, + "Metric" -> TensorData[resultID]["Metric"], + "Role" -> "Calculated", + "Symbol" -> symbol + ]], + (* Else *) + (* Check that the LHS and RHS index specifications are the same up to permutation. *) + If[ + Sort[Characters[LHSIndices]] != Sort[Characters[resultIndices]], + (* Then *) + Message[TCalc::ErrorIndices, LHSIndices, resultIndices]; + (* Clear the temporary tensors that were created for the purpose of the calculation. *) + ClearTemp[]; + Abort[]; + ]; + (* Collect the variables to be used for rearranging the indices. Both LHSVars and RHSVars will be the same set of variables, but potentially in a different order. *) + allVars = Association[]; + Scan[(allVars[#] = Unique["var"]) &, Characters[LHSIndices]]; + LHSVars = allVars[#]& /@ Characters[LHSIndices]; + RHSVars = allVars[#]& /@ Characters[resultIndices]; + (* Rearrange the components and indices to allow for a LHS with a different index order than the RHS. *) + newComponents = Table[ + components[[Sequence @@ RHSVars]], + Evaluate[Sequence @@ ({#, 1, Length[components]} & /@ LHSVars)] + ]; + newIndices = Table[ + useIndices[[StringPosition[resultIndices, Characters[LHSIndices][[n]]][[1, 1]]]], + {n, 1, StringLength[LHSIndices]} + ]; + (* Store the result in a new tensor object. *) + SetTensorID[LHSTensorID, Association[ + "Components" -> Association[{newIndices, useCoords} -> newComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> newIndices, + "Metric" -> TensorData[resultID]["Metric"], + "Role" -> "Calculated", + "Symbol" -> symbol + ]]; + ]; + (* Print the explicit formula we calculated, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) + (* OGRePrint["Calculated: ", TensorData[resultID]["Symbol"]]; *) + (* Clear the temporary tensors that were created for the purpose of the calculation. *) + ClearTemp[]; + Return[LHSTensorID]; +]; + + +CreateUsageMessage[TCalcChristoffel, "TCalcChristoffel[`metricID`] calculates the Christoffel symbols (the coefficients of the Levi-Civita connection) from the metric `metricID` and stores the result in a new tensor object with ID \"`metricID`Christoffel\". Note that the Christoffel symbols are not the components of a tensor, but this tensor object will know to transform according to the correct rules under change of coordinates."]; +TCalcChristoffel::ErrorNotMetric = "The Christoffel symbols can only be calculated from a tensor object representing a metric."; +TCalcChristoffel[metricID_String] := Module[ + { + christoffelID, + inverseMetricID = NewTempID[] + }, + (* Check that the tensor does not already exist. *) + CheckIfOverwriting[metricID <> "Christoffel"]; + (* Check that metricID is indeed a metric. *) + If[ + TensorData[metricID]["Role"] =!= "Metric", + (* Then *) + Message[TCalcChristoffel::ErrorNotMetric]; + Abort[]; + ]; + (* Create a temporary tensor for the inverse metric, with two upper indices as its default configuration, to force the Christoffel symbols to have the correct index configuration. We do this to increase performance, since if we don't, then we'll have to raise the first index later, which is a costly operation. *) + SetTensorID[inverseMetricID, Association[ + "Components" -> TensorData[metricID]["Components"], + "DefaultCoords" -> TensorData[metricID]["DefaultCoords"], + "DefaultIndices" -> {1, 1}, + "Metric" -> TensorData[metricID]["Metric"], + "Role" -> "Temporary", + "Symbol" -> Superscript[TensorData[metricID]["Symbol"], "\[Lambda]\[Sigma]"] + ]]; + (* Calculate the Christoffel symbols, and give the tensor object the correct ID and symbol. *) + christoffelID = TCalc[ + (metricID <> "Christoffel")["\[Lambda]\[Mu]\[Nu]"], + 1/2 inverseMetricID["\[Lambda]\[Sigma]"] . ( + TPartialD["\[Mu]"] . metricID["\[Nu]\[Sigma]"] + + TPartialD["\[Nu]"] . metricID["\[Sigma]\[Mu]"] - + TPartialD["\[Sigma]"] . metricID["\[Mu]\[Nu]"] + ), + "\[CapitalGamma]" + ]; + (* Set the role of the tensor to Christoffel, so that OGRe will know to transform it as a connection and not as a tensor. *) + ChangeTensorKey[christoffelID, "Role", "Christoffel"]; + Return[christoffelID]; +]; + + +CreateUsageMessage[TCalcEinsteinTensor, "TCalcEinsteinTensor[`metricID`] calculates the Einstein tensor from the metric `metricID` and stores the result in a new tensor object with ID \"`metricID`Einstein\". If a tensor with ID \"`metricID`RicciTensor\" exists, it will be assumed to be the Ricci tensor of the metric, and will be used in the calculation. Otherwise, \"`metricID`RicciTensor\" will be created using TCalcRicciTensor[]."]; +TCalcEinsteinTensor::ErrorNotMetric = "The Einstein tensor can only be calculated from a tensor object representing a metric."; +TCalcEinsteinTensor[metricID_String] := Module[ + { + EinsteinID + }, + (* Check that the tensor does not already exist. *) + CheckIfOverwriting[metricID <> "Einstein"]; + (* Check that metricID is indeed a metric. *) + If[ + TensorData[metricID]["Role"] =!= "Metric", + (* Then *) + Message[TCalcEinsteinTensor::ErrorNotMetric]; + Abort[]; + ]; + (* If the Ricci tensor was not already calculated, calculate it now. *) + If[ + !KeyExistsQ[TensorData, metricID <> "RicciTensor"], + (* Then *) + TCalcRicciTensor[metricID]; + ]; + (* Calculate the Einstein tensor, and give the tensor object the correct ID and symbol. *) + EinsteinID = TCalc[ + (metricID <> "Einstein")["\[Mu]\[Nu]"], + (metricID <> "RicciTensor")["\[Mu]\[Nu]"] - 1/2 metricID["\[Mu]\[Nu]"] . (metricID <> "RicciTensor")["\[Rho]\[Rho]"], + "G" + ]; + (* Set the role of the tensor to Einstein for future reference. *) + ChangeTensorKey[EinsteinID, "Role", "Einstein"]; + Return[EinsteinID]; +]; + + +CreateUsageMessage[TCalcRicciScalar, "TCalcRicciScalar[`metricID` calculates the Ricci scalar from the metric `metricID` and stores the result in a new tensor object with ID \"`metricID`RicciScalar\". If a tensor with ID \"`metricID`RicciTensor\" exists, it will be assumed to be the Ricci tensor of the metric, and will be used in the calculation. Otherwise, \"`metricID`RicciTensor\" will be created using TCalcRicciTensor[]."]; +TCalcRicciScalar::ErrorNotMetric = "The Ricci scalar can only be calculated from a tensor object representing a metric."; +TCalcRicciScalar[metricID_String] := Module[ + { + RicciScalarID + }, + (* Check that the tensor does not already exist. *) + CheckIfOverwriting[metricID <> "RicciScalar"]; + (* Check that metricID is indeed a metric. *) + If[ + TensorData[metricID]["Role"] =!= "Metric", + (* Then *) + Message[TCalcRicciScalar::ErrorNotMetric]; + Abort[]; + ]; + (* If the Ricci tensor was not already calculated, calculate it now. *) + If[ + !KeyExistsQ[TensorData, metricID <> "RicciTensor"], + (* Then *) + TCalcRicciTensor[metricID]; + ]; + (* Calculate the Ricci scalar, and give the tensor object the correct ID and symbol. *) + RicciScalarID = TCalc[ + (metricID <> "RicciScalar")[""], + (metricID <> "RicciTensor")["\[Mu]\[Mu]"], + "R" + ]; + (* Set the role of the tensor to Ricci Scalar for future reference. *) + ChangeTensorKey[RicciScalarID, "Role", "Ricci Scalar"]; + Return[RicciScalarID]; +]; + + +CreateUsageMessage[TCalcRicciTensor, "TCalcRicciTensor[`metricID`] calculates the Ricci tensor from the metric `metricID` and stores the result in a new tensor object with ID \"`metricID`RicciTensor\". If a tensor with ID \"`metricID`Riemann\" exists, it will be assumed to be the Riemann tensor of the metric, and will be used in the calculation. Otherwise, \"`metricID`Riemann\" will be created using TCalcRiemannTensor[]."]; +TCalcRicciTensor::ErrorNotMetric = "The Ricci tensor can only be calculated from a tensor object representing a metric."; +TCalcRicciTensor[metricID_String] := Module[ + { + RicciTensorID + }, + (* Check that the tensor does not already exist. *) + CheckIfOverwriting[metricID <> "RicciTensor"]; + (* Check that metricID is indeed a metric. *) + If[ + TensorData[metricID]["Role"] =!= "Metric", + (* Then *) + Message[TCalcRicciTensor::ErrorNotMetric]; + Abort[]; + ]; + (* If the Riemann tensor was not already calculated, calculate it now. *) + If[ + !KeyExistsQ[TensorData, metricID <> "Riemann"], + (* Then *) + TCalcRiemannTensor[metricID]; + ]; + (* Calculate the Ricci tensor, and give the tensor object the correct ID and symbol. *) + RicciTensorID = TCalc[ + (metricID <> "RicciTensor")["\[Mu]\[Nu]"], + (metricID <> "Riemann")["\[Lambda]\[Mu]\[Lambda]\[Nu]"], + "R" + ]; + (* Set the role of the tensor to Ricci Tensor for future reference. *) + ChangeTensorKey[RicciTensorID, "Role", "Ricci Tensor"]; + Return[RicciTensorID]; +]; + + +CreateUsageMessage[TCalcRiemannTensor, "TCalcRiemannTensor[`metricID`] calculates the Riemann tensor from the metric `metricID` and stores the result in a new tensor object with ID \"`metricID`Riemann\". If a tensor with ID \"`metricID`Christoffel\" exists, it will be assumed to be the Christoffel symbols of the metric, and will be used in the calculation. Otherwise, \"`metricID`Christoffel\" will be created using TCalcChristoffel[]."]; +TCalcRiemannTensor::ErrorNotMetric = "The Riemann tensor can only be calculated from a tensor object representing a metric."; +TCalcRiemannTensor[metricID_String] := Module[ + { + RiemannID + }, + (* Check that the tensor does not already exist. *) + CheckIfOverwriting[metricID <> "Riemann"]; + (* Check that metricID is indeed a metric. *) + If[ + TensorData[metricID]["Role"] =!= "Metric", + (* Then *) + Message[TCalcRiemannTensor::ErrorNotMetric]; + Abort[]; + ]; + (* If the Christoffel symbols were not already calculated, calculate them now. *) + If[ + !KeyExistsQ[TensorData, metricID <> "Christoffel"], + (* Then *) + TCalcChristoffel[metricID]; + ]; + (* Calculate the Riemann tensor, and give the tensor object the correct ID, symbol, and default index configuration. *) + RiemannID = TChangeDefaultIndices[ + TCalc[ + (metricID <> "Riemann")["\[Rho]\[Sigma]\[Mu]\[Nu]"], + TPartialD["\[Mu]"] . (metricID <> "Christoffel")["\[Rho]\[Nu]\[Sigma]"] - + TPartialD["\[Nu]"] . (metricID <> "Christoffel")["\[Rho]\[Mu]\[Sigma]"] + + (metricID <> "Christoffel")["\[Rho]\[Mu]\[Lambda]"] . (metricID <> "Christoffel")["\[Lambda]\[Nu]\[Sigma]"] - + (metricID <> "Christoffel")["\[Rho]\[Nu]\[Lambda]"] . (metricID <> "Christoffel")["\[Lambda]\[Mu]\[Sigma]"], + "R" + ], + {1,-1,-1,-1} + ]; + (* Set the role of the tensor to Riemann for future reference. *) + ChangeTensorKey[RiemannID, "Role", "Riemann"]; + Return[RiemannID]; +]; + + +CreateUsageMessage[TChangeDefaultCoords, "TChangeDefaultCoords[`tensorID`, `coordinatesID`] changes the default coordinate system of the tensor object `tensorID` to `coordinatesID`."]; +TChangeDefaultCoords::ErrorCoordTensor = "Cannot change the default coordinate system for a tensor object representing a coordinate system." +TChangeDefaultCoords[tensorID_String, coordinatesID_String] := ( + (* Check that the tensor objects sourceID and coordinatesID exist. *) + CheckIfTensorExists[tensorID]; + CheckIfTensorExists[coordinatesID]; + (* Check that the tensor object tensorID does not itself represents a coordinate system. *) + If[ + TensorData[tensorID]["Role"] === "Coordinates", + (* Then *) + Message[TChangeDefaultCoords::ErrorCoordTensor]; + Abort[]; + ]; + (* Check that the tensor object coordinatesID represents a coordinate system. *) + CheckIfCoordinates[coordinatesID]; + (* Add a representation to the tensor in the new coordinate system with the default indices, if it doesn't already exist. *) + AddRepresentation[tensorID, TensorData[tensorID]["DefaultIndices"], coordinatesID]; + (* Change the DefaultCoords key. *) + ChangeTensorKey[tensorID, "DefaultCoords", coordinatesID]; + Return[tensorID]; +); + + +CreateUsageMessage[TChangeDefaultIndices, "TChangeDefaultIndices[`ID`, `indices`] changes the default index configuration of the tensor object `ID` to `indices`. +`indices` must be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index."]; +TChangeDefaultIndices::ErrorCoords = "Cannot change the default index configuration for a tensor object representing a coordinate system." +TChangeDefaultIndices::ErrorMetric = "Cannot change the default index configuration for a tensor object representing a metric." +TChangeDefaultIndices::ErrorChristoffel = "Cannot change the default index configuration for a tensor object representing a Levi-Civita connection (Christoffel symbols)." +TChangeDefaultIndices[ID_String, indices_List] := ( + (* Check that the tensor object ID exists. *) + CheckIfTensorExists[ID]; + (* Check that the tensor object does not represent a coordinate system. *) + If[ + TensorData[ID]["Role"] === "Coordinates", + (* Then *) + Message[TChangeDefaultIndices::ErrorCoords]; + Abort[]; + ]; + (* Check that the tensor object does not represent a metric. *) + If[ + TensorData[ID]["Role"] === "Metric", + (* Then *) + Message[TChangeDefaultIndices::ErrorMetric]; + Abort[]; + ]; + (* Check that the tensor object does not represent a connection. *) + If[ + TensorData[ID]["Role"] === "Christoffel", + (* Then *) + Message[TChangeDefaultIndices::ErrorChristoffel]; + Abort[]; + ]; + (* Check that the list of indices is of the correct form. *) + CheckIndicesForm[indices]; + (* Add a representation to the tensor with the new indices in the default coordinate system, if it doesn't already exist. *) + AddRepresentation[ID, indices, TensorData[ID]["DefaultCoords"]]; + (* Change the DefaultIndices key. *) + ChangeTensorKey[ID, "DefaultIndices", indices]; + Return[ID]; +); + + +CreateUsageMessage[TChangeID, "TChangeID[`oldID` \[Rule] `newID`] changes the ID of the tensor object `oldID` to `newID`. +If the tensor is a metric or a coordinate system, all currently defined tensors will be scanned, and any references to `oldID` will be replaced with `newID`."]; +TChangeID[oldID_String -> newID_String] := TChangeID[oldID, newID]; +TChangeID[oldID_String, newID_String] := ( + (* Check that the tensor object oldID exists. *) + CheckIfTensorExists[oldID]; + (* Check that the tensor object newID doesn't already exist. *) + CheckIfOverwriting[newID]; + (* Copy the old tensor data to the new ID and then remove the old ID. *) + SetTensorID[newID, TensorData[oldID]]; + RemoveTensorID[oldID]; + (* If the tensor is a metric, replace all references to it. *) + If[ + this["Role"] === "Metric", + (* Then *) + Scan[ + If[TensorData[#]["Metric"] === oldID, ChangeTensorKey[#, "Metric", newID]] &, + Keys[TensorData] + ]; + ]; + (* If the tensor is a coordinate system, replace all references to it. *) + If[ + this["Role"] === "Coordinates", + (* Then *) + Scan[ + ChangeCoordinateID[#, oldID, newID] &, + Keys[TensorData] + ]; + ]; + Return[newID]; +); + + +CreateUsageMessage[TChangeSymbol, "TChangeSymbol[`ID`, `symbol`] changes the symbol of the tensor object `ID` to `symbol`."]; +TChangeSymbol[ID_String, symbol_String] := ( + CheckIfTensorExists[ID]; + ChangeTensorKey[ID, "Symbol", symbol]; + Return[ID]; +); + + +CreateUsageMessage[TCheckForUpdates, "TCheckForUpdates[] checks the GitHub repository for new versions of this package. If a new version is available, the user will be given the option to download or install it."]; +TCheckForUpdates[] := Module[ + { + errorMessage, + newVersion, + remoteFile, + toPrint, + versionLookup + }, + errorMessage = Row[{"Error: Failed to check for updates. Please visit ", Hyperlink["https://github.com/bshoshany/OGRe"], " to check manually."}]; + OGRePrint["Checking GitHub repository for updates..."]; + remoteFile = Quiet[Import[OGReURL, "Text"]]; + If[ + remoteFile === $Failed, + (* Then *) + OGRePrint[errorMessage]; + Abort[]; + ]; + versionLookup = StringCases[remoteFile, Shortest["OGReVersion = \"" ~~ __ ~~ "\";"]]; + If[ + Length[versionLookup] == 1, + (* Then *) + newVersion = StringTake[versionLookup[[1]], {16, StringLength[versionLookup[[1]]] - 2}]; + If[ + newVersion === OGReVersion, + (* Then *) + OGRePrint["You have the latest version of the package."], + (* Else *) + toPrint = {Row[{"A new version of the package is available: ", Style[newVersion, Bold]}]}; + AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ + "Visit GitHub repository.", + SystemOpen["https://github.com/bshoshany/OGRe"] + ]}]]; + AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ + "Reload new version directly from GitHub without downloading it.", + Get[OGReURL] + ]}]]; + (* If the notebook is an Untitled notebook, meaning it is not an actual file in the file system, then NotebookDirectory[] will return $Failed and issue the error message NotebookDirectory::nosv. Otherwise, show an option to download the notebook to the current notebook directory. *) + Off[NotebookDirectory::nosv]; + If[ + NotebookDirectory[] =!= $Failed, + (* Then *) + AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ + "Download new version to " <> FileNameJoin[{NotebookDirectory[], "OGRe.m"}] <> " and reload the package.", + URLDownload[OGReURL, FileNameJoin[{NotebookDirectory[], "OGRe.m"}]]; OGRePrint["Downloaded! Reloading..."]; Get[FileNameJoin[{NotebookDirectory[], "OGRe.m"}]] + ]}]]; + ]; + On[NotebookDirectory::nosv]; + AppendTo[toPrint, Row[{"\[Bullet] ", CreateButton[ + "Install new version to " <> FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}] <> " and reload the package.", + URLDownload[OGReURL, FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]; OGRePrint["Installed! Reloading..."]; Get[FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]] + ]}]]; + OGRePrint[Column[toPrint]]; + ], + (* Else *) + OGRePrint[errorMessage]; + ]; +]; + + +CreateUsageMessage[TDelete, "TDelete[`ID`] permanently deletes the tensor object `ID`. If the tensor is a metric or coordinate system, it cannot be deleted unless all tensors referring to it have been deleted first."]; +TDelete::ErrorMetric = "The metric \"`1`\" cannot be deleted, as it has been used to define the tensor \"`2`\". To delete the metric, first delete \"`2`\" and any other tensors defined using this metric."; +TDelete::ErrorCoords = "The coordinate system \"`1`\" cannot be deleted, as it is the default coordinate system of the tensor \"`2`\". To delete the coordinate system, first change the default coordinate system of \"`2`\" and any other relevant tensors."; +TDelete[ID_String] := ( + (* Check that the tensor object ID exists. *) + CheckIfTensorExists[ID]; + (* If this tensor represents a metric, check that no tensors are defined using this metric. *) + If[ + TensorData[ID]["Role"] === "Metric", + (* Then *) + Scan[ + If[ + TensorData[#]["Metric"] === ID && # =!= ID, + (* Then *) + Message[TDelete::ErrorMetric, ID, #]; + Abort[]; + ] &, + Keys[TensorData] + ]; + ]; + (* If this tensor represents a coordinate system, check that no tensors are using it as their default coordinate system. *) + If[ + TensorData[ID]["Role"] === "Coordinates", + (* Then *) + Scan[ + If[ + TensorData[#]["DefaultCoords"] === ID && # =!= ID, + (* Then *) + Message[TDelete::ErrorCoords, ID, #]; + Abort[]; + ] &, + Keys[TensorData] + ]; + ]; + RemoveTensorID[ID]; +); + + +CreateUsageMessage[TDocs, "TDocs[] opens the Mathematica notebook OGRe_Documentation.nb from the GitHub repository, which contains the full documentation for the package."]; +TDocs[] := ( + If[ + NotebookOpen["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe_Documentation.nb"] === $Failed, + (* Then *) + OGRePrint[Row[{"Error: Failed to load the documentation. Please visit ", Hyperlink["https://github.com/bshoshany/OGRe"], " to download it manually."}]], + (* Else *) + OGRePrint["Successfully loaded the documentation from GitHub."]; + ] +); + + +CreateUsageMessage[TExport, "TExport[`ID`] exports the raw tensor data for the tensor object `ID` as an Association."]; +TExport[ID_String] := ( + CheckIfTensorExists[ID]; + Return[Association[ + ID -> Append[TensorData[ID], "OGReVersion" -> OGReVersion] + ]]; +); + + +CreateUsageMessage[TExportAll, "TExportAll[] exports the raw tensor data for all tensors defined in the current session as an Association. +TExportAll[`filename`] exports the data to `filename`. If a full path is not given, the file will be created in the current working directory, as given by Directory[]. This directory can be changed using SetDirectory[]. Note that the file will be overwritten if it already exists."]; +TExportAll[] := TensorData; +TExportAll[filename_String] := Module[ + { + stream + }, + stream = OpenWrite[filename]; + Write[stream, TensorData]; + Close[stream]; + OGRePrint["Exported all tensor data to ", filename, "."]; +]; + + +CreateUsageMessage[TGetComponents, "TGetComponents[`ID`, `indices`, `coordinatesID`] extracts the components of the tensor object `ID` with the index configuration `indices` and in the coordinate system `coordinatesID` as a list. +`indices` must be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. The index configuration and coordinate system cannot be omitted; there are no default values. This is to ensure that the user always knows exactly which representation is being extracted."]; +TGetComponents::ErrorRank = "The number of indices must match the rank of the tensor."; +TGetComponents[ID_String, indices_List, coordinatesID_String] := ( + (* Check that the tensor object ID exists. *) + CheckIfTensorExists[ID]; + (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) + CheckIfTensorExists[coordinatesID]; + CheckIfCoordinates[coordinatesID]; + (* Check that the list of indices is of the correct form. *) + CheckIndicesForm[indices]; + (* Check that the number of indices matches the rank of the tensor. *) + If[ + Length[indices] != Length[TensorData[ID]["DefaultIndices"]], + (* Then *) + Message[TGetComponents::ErrorRank]; + Abort[]; + ]; + (* Return the components of the tensor in the desired representation. They will be calculated if the representation is not yet stored in the tensor object. *) + Return[AddRepresentation[ID, indices, coordinatesID]]; +); + + +CreateUsageMessage[TImport, "TImport[`data`] imports a tensor that has been exported using TExport[]."]; +TImport[data_Association] := Module[ + { + newID + }, + newID = Keys[data][[1]]; + If[ + !KeyExistsQ[data[[1]], "OGReVersion"] || data[[1]]["OGReVersion"] != OGReVersion, + (* Then *) + OGRePrint["Warning: The imported tensor was created in a different version of OGRe. Compatibility issues may occur."]; + ]; + (* Check that the imported tensor object doesn't already exist. *) + CheckIfOverwriting[newID]; + SetTensorID[newID, KeyDrop[Values[data][[1]], "OGReVersion"]]; + Return[newID]; +]; + + +CreateUsageMessage[TImportAll, "TImportAll[`source`] imports tensor data that has been exported using TExportAll[]. If `source` is an Association, imports the data directly. If `source` is a file name, imports the data from that file. If a full path is not given, the file is assumed to be located in the current working directory, as given by Directory[]. This directory can be changed using SetDirectory[]. +`WARNING: This will irreversibly delete ALL of the tensors already defined in the current session.`"]; +TImportAll::ErrorFile = "The file `1` does not exist."; +TImportAll[data_Association] := ImportTensorData[data]; +TImportAll[filename_String] := Module[ + { + data, + stream + }, + If[ + !FileExistsQ[filename], + (* Then *) + Message[TImportAll::ErrorFile, filename]; + Abort[]; + ]; + stream = OpenRead[filename]; + data = Read[stream]; + ImportTensorData[data]; + Close[stream]; + OGRePrint["Imported all tensor data from ", filename, "."]; +]; + + +CreateUsageMessage[TInfo, "TInfo[`ID`] displays information about the tensor object `ID`, including its symbol, role, associated metric, and default coordinates and indices, in human-readable form. +If `ID` represents a coordinate system, displays a list of all tensors using it as their default coordinate system. +If `ID` represents a metric, displays a list of all tensors using it as their associated metric."]; +TInfo[ID_String] := Module[ + { + info + }, + (* Check that the tensor object ID exists. *) + CheckIfTensorExists[ID]; + (* Display information about the object. *) + info = {Row[{Style["ID: ", Bold], ID}]}; + AppendTo[info, Row[{Style["Symbol: ", Bold], TensorData[ID]["Symbol"]}]]; + AppendTo[info, Row[{Style["Role: ", Bold], TensorData[ID]["Role"]}]]; + If[TensorData[ID]["Role"] =!= "Coordinates" && TensorData[ID]["Role"] =!= "Metric", AppendTo[info, Row[{Style["Metric: ", Bold], TensorData[ID]["Metric"]}]]]; + If[TensorData[ID]["Role"] =!= "Coordinates", AppendTo[info, Row[{Style["Default Coordinates: ", Bold], TensorData[ID]["DefaultCoords"]}]]]; + AppendTo[info, Row[{Style["Default Indices: ", Bold], TensorData[ID]["DefaultIndices"]}]]; + If[TensorData[ID]["Role"] === "Coordinates", AppendTo[info, Row[{Style["Used as Default Coordinates For: ", Bold], Row[Select[Keys[TensorData], TensorData[#]["DefaultCoords"] === ID && # =!= ID &], ", "]}]]]; + If[TensorData[ID]["Role"] === "Metric", AppendTo[info, Row[{Style["Tensors Using This Metric: ", Bold], Row[Select[Keys[TensorData], TensorData[#]["Metric"] === ID && # =!= ID &], ", "]}]]]; + OGRePrint[Column[info]]; +]; + + +CreateUsageMessage[TInitializeSymbols, "TInitializeSymbols[`symbol1`, `symbol2`, `...`] clears any definitions previously used for the given symbols and protects them against future changes. Useful for making sure coordinate variables, parameters, and abstract functions used in tensors do not accidentally change their definitions and break the code."]; +TInitializeSymbols[symbols__] := ( + Unprotect[symbols]; + ClearAll[symbols]; + Protect[symbols]; +); +Attributes[TInitializeSymbols] = HoldAll; + + +CreateUsageMessage[TList, "TList[`ID`] lists the unique, non-zero components of the tensor object `ID` in its default index configuration and coordinate system. +TList[`ID`, `indices`] lists the components in the index configuration `indices`, which should be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. +TList[`ID`, `coordinatesID`] lists the components in the coordinate system `coordinatesID`. +TList[`ID`, `indices`, `coordinatesID`] lists the components in the index configuration `indices` and the coordinate system `coordinatesID`. +TList[`ID`, `function`] maps `function` to each of the tensor's elements before they are displayed. Typically this would be ReplaceAll[rules] to apply the rules to the elements, but any function can be used. +TList[`ID`, `indices`, `coordinatesID`, `function`] does all of the above; either `indices` or `coordinatesID` can be omitted."]; +TList[ID_String, indices_List : {"_UseDefault_"}, coordinatesID_String : "_UseDefault_", function_ : Identity] /; (!ListQ[function] && !StringQ[function]) := ShowList[ID, indices, coordinatesID, "List", function]; + + +CreateUsageMessage[TNewCoordinates, "TNewCoordinates[`coordinatesID`, `symbols`], creates a new tensor object representing a coordinate system. +`coordinatesID` is a string that will be used to identify the new object, and must be unique. +`symbols` are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be cleared and protected against future changes using TInitializeSymbols[]."]; +TNewCoordinates::ErrorEmptyList = "The coordinate symbols cannot be an empty list. At least one coordinate symbol must be specified."; +TNewCoordinates[coordinatesID_String, coordinates_List?VectorQ] := ( + (* Check that the target tensor object doesn't already exist. *) + CheckIfOverwriting[coordinatesID]; + (* Check that the coordinates are not an empty list. *) + If[coordinates == {}, Message[TNewCoordinates::ErrorEmptyList]; Abort[]]; + (* Clear any definitions previously used for the coordinate symbols and protect them against future changes. *) + TInitializeSymbols @@ Unevaluated[coordinates]; + (* Create a new tensor object for the coordinates with the desired ID. *) + SetTensorID[coordinatesID, Association[ + "Components" -> Association[{{1}, coordinatesID} -> coordinates], + "DefaultCoords" -> coordinatesID, + "DefaultIndices" -> {1}, + "Role" -> "Coordinates", + "Symbol" -> "x" + ]]; + Return[coordinatesID]; +); +Attributes[TNewCoordinates] = HoldRest; + + +CreateUsageMessage[TNewMetric, "TNewMetric[`metricID`, `coordinatesID`, `components`, `symbol`} creates a new tensor object representing a metric. +`metricID` is a string that will be used to identify the new object, and must be unique. +`coordinatesID` is the unique ID of a tensor object representing a coordinate system, created using TNewCoordinates[]. +`components` is a square, symmetric, and invertible matrix representing the metric with two lower indices in that coordinate system. +`symbol` will be used to represent the metric in formulas. If not given, \"g\" will be used."]; +TNewMetric::ErrorIncorrectDim = "The metric components must have the same dimension as the coordinates."; +TNewMetric::ErrorNotInvertible = "The metric must be invertible."; +TNewMetric::ErrorNotSymmetric = "The metric must be symmetric."; +TNewMetric::ErrorNotSquare = "The components of the metric must be a square matrix."; +TNewMetric[metricID_String, coordinatesID_String, components_List, symbol_String : "g"] := Module[ + { + dim = Length[components], + inverse, + simplified + }, + (* Check that the target tensor object doesn't already exist. *) + CheckIfOverwriting[metricID]; + (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) + CheckIfTensorExists[coordinatesID]; + CheckIfCoordinates[coordinatesID]; + (* Simplify the components. *) + simplified = TensorSimplify[components]; + (* Check that the matrix is square. *) + If[ + !SquareMatrixQ[simplified], + (* Then *) + Message[TNewMetric::ErrorNotSquare]; + Abort[]; + ]; + (* Check that the metric components have the same dimension as the coordinates. *) + If[ + dim != Length[TensorData[coordinatesID]["Components"][{{1}, coordinatesID}]], + (* Then *) + Message[TNewMetric::ErrorIncorrectDim]; + Abort[]; + ]; + (* Check that the matrix is symmetric. *) + If[ + !SymmetricMatrixQ[simplified], + (* Then *) + Message[TNewMetric::ErrorNotSymmetric]; + Abort[]; + ]; + (* Invert the components, and return an error if the matrix is singular or cannot be inverted for any reason. *) + inverse = Quiet[Check[Inverse[simplified], "Error"]]; + If[ + inverse === "Error", + (* Then *) + Message[TNewMetric::ErrorNotInvertible]; + Abort[]; + ]; + inverse = TensorSimplify[inverse]; + (* Create a new tensor object for the metric with the desired ID. The components of the matrix in every possible index configuration will be calculated in advance in the default coordinate system, to improve performance. *) + SetTensorID[metricID, Association[ + "Components" -> Association[ + {{-1, -1}, coordinatesID} -> simplified, + {{+1, +1}, coordinatesID} -> inverse, + {{+1, -1}, coordinatesID} -> IdentityMatrix[dim], + {{-1, +1}, coordinatesID} -> IdentityMatrix[dim] + ], + "DefaultCoords" -> coordinatesID, + "DefaultIndices" -> {-1, -1}, + "Metric" -> metricID, + "Role" -> "Metric", + "Symbol" -> symbol + ]]; + Return[metricID]; +]; + + +CreateUsageMessage[TNewTensor, "TNewTensor[`tensorID`, `metricID`, `coordinatesID`, `indices`, `components`, `symbol`, creates a new tensor object. +`tensorID` is a string that will be used to identify the new object, and must be unique. +`metricID` is the unique ID of a tensor object representing a metric, created using TNewMetric[]. The metric will be used to raise and lower indices for the new tensor. +`coordinatesID` is the unique ID of a tensor object representing a coordinate system, created using TNewCoordinates[]. This coordinate system will be used to specify the components of the new tensor. If omitted, the default coordinate system of the metric `metricID` will be used. +`indices` must be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. +`components` is a list specifying the representation of the tensor with the index configuration `indices` and in the coordinate system `coordinatesID`. +`symbol` will be used to represent the tensor in formulas. If not given, the placeholder " <> DefaultSymbol <> " will be used."]; +TNewTensor::ErrorDimension = "The components must have the same dimension as the coordinate system."; +TNewTensor::ErrorRank = "The number of indices must match the rank of the components."; +TNewTensor[tensorID_String, metricID_String, coordinatesID_String : "_UseDefault_", indices_List, components_List, symbol_String : DefaultSymbol] := Module[ + { + useCoords + }, + (* Check that the target tensor object doesn't already exist. *) + CheckIfOverwriting[tensorID]; + (* Check that the tensor object metricID exists and represents a metric. *) + CheckIfTensorExists[metricID]; + CheckIfMetric[metricID]; + (* Check that the list of indices is of the correct form. *) + CheckIndicesForm[indices]; + (* Determine which coordinate system the components for the new tensor are given in. *) + If[ + coordinatesID === "_UseDefault_", + (* Then *) + useCoords = TensorData[metricID]["DefaultCoords"], + (* Else *) + (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) + CheckIfTensorExists[coordinatesID]; + CheckIfCoordinates[coordinatesID]; + useCoords = coordinatesID + ]; + (* Validate the input. This is done differently depending on whether the tensor is a scalar or not. *) + If[ + Length[components] * ArrayDepth[components] != 1, + (* Then *) + (* Not a scalar. Check that the dimension of the given components matches the dimension of the coordinates being used. *) + If[ + Length[components] != Length[TensorData[useCoords]["Components"][{{1}, useCoords}]], + (* Then *) + Message[TNewTensor::ErrorDimension]; + Abort[]; + ]; + (* Check that the rank of the given components matches the number of given indices. *) + If[ + Length[indices] != ArrayDepth[components], + (* Then *) + Message[TNewTensor::ErrorRank]; + Abort[]; + ], + (* Else *) + (* Is a scalar. Check that the number of indices for the scalar is zero. *) + If[ + Length[indices] != 0, + (* Then *) + Message[TNewTensor::ErrorRank]; + Abort[]; + ]; + ]; + (* Create a new tensor object for the tensor with the desired ID. *) + SetTensorID[tensorID, Association[ + "Components" -> Association[{indices, useCoords} -> TensorSimplify[components]], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> indices, + "Metric" -> metricID, + "Role" -> "Tensor", + "Symbol" -> symbol + ]]; + Return[tensorID]; +]; + + +CreateUsageMessage[TSetAssumptions, "TSetAssumptions[] shows the assumptions to be used when simplifying expressions. +TSetAssumptions[`assumptions`] appends new assumptions to the previously added assumptions. +TSetAssumptions[None] clears all previously added assumptions. +TSetAssumptions[!Reals] disables the default assumption that all variable are real, which secretly adds the assumption Element[_, Reals] to the list of assumptions. TSetAssumptions[Reals] re-enables this assumption. +The output of this module is always an Association indicating whether variables are assumed to be real and listing the user-defined assumptions."]; +TSetAssumptions[] := TensorData[Options]["SimplifyAssumptions"]; +TSetAssumptions[assumptions_] := ( + Unprotect[TensorData]; + Switch[ + assumptions, + None, TensorData[Options]["SimplifyAssumptions"]["User"] = None, + Reals, TensorData[Options]["SimplifyAssumptions"]["AssumeReal"] = True, + !Reals, TensorData[Options]["SimplifyAssumptions"]["AssumeReal"] = False, + _, If[ + TensorData[Options]["SimplifyAssumptions"]["User"] === None, + (* Then *) + TensorData[Options]["SimplifyAssumptions"]["User"] = {assumptions}, + (* Else *) + If[ + !MemberQ[TensorData[Options]["SimplifyAssumptions"]["User"], assumptions], + (* Then *) + AppendTo[TensorData[Options]["SimplifyAssumptions"]["User"], assumptions]; + ]; + ]; + ]; + Protect[TensorData]; + Return[TensorData[Options]["SimplifyAssumptions"]]; +); +Attributes[TSetAssumptions] = HoldAll; + + +DefaultIndexLetters = "\[Mu]\[Nu]\[Rho]\[Sigma]\[Kappa]\[Lambda]\[Alpha]\[Beta]\[Gamma]\[Delta]\[CurlyEpsilon]\[Zeta]\[Epsilon]\[Theta]\[Iota]\[Xi]\[Pi]\[Tau]\[Phi]\[Chi]\[Psi]\[Omega]"; +CreateUsageMessage[TSetIndexLetters, "TSetIndexLetters[] shows the index letters used when displaying indices. +TSetIndexLetters[`letters`] changes the index letters. +TSetIndexLetters[Automatic] resets the index letters to the default: \"" <> DefaultIndexLetters <> "\"."]; +TSetIndexLetters[] := TensorData[Options]["IndexLetters"]; +TSetIndexLetters[letters_String] := ( + Unprotect[TensorData]; + TensorData[Options]["IndexLetters"] = letters; + Protect[TensorData]; +); +TSetIndexLetters[Automatic] := TSetIndexLetters[DefaultIndexLetters]; + + +CreateUsageMessage[TSetParallelization, "TSetParallelization[`True`] enables the parallelization of tensor simplifications, and TSetParallelization[`False`] disables it. The default value is `False`. If simplifications take less than a few seconds, then you should leave parallelization off, as it has a small overhead and may actually impede performance. However, if simplifications are taking more than a few seconds, then it is highly recommended to enable parallelization for a significant performance boost."]; +TSetParallelization[par_] := ( + Unprotect[TensorData]; + TensorData[Options]["Parallelize"] = par; + Protect[TensorData]; + If[ + par, + (* Then *) + OGRePrint["Parallelization enabled."]; + (* Launch the kernels for parallelization if they have not been launched yet, or if fewer than the maximum available number of kernels have been launched. Better do it now than cause a delay later. *) + If[ + $KernelCount < $ConfiguredKernels[[1, 1]], + (* Then *) + LaunchKernels[$ConfiguredKernels[[1, 1]] - $KernelCount]; + OGRePrint[$KernelCount, " parallel kernels launched. CPU has ", $ProcessorCount, " cores."]; + ], + (* Else *) + OGRePrint["Parallelization disabled."]; + ]; +); + + +CreateUsageMessage[TShow, "TShow[`ID`] shows the components of the tensor object `ID` in its default index configuration and coordinate system. +TShow[`ID`, `indices`] shows the components in the index configuration `indices`, which should be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index. +TShow[`ID`, `coordinatesID`] shows the components in the coordinate system `coordinatesID`. +TShow[`ID`, `indices`, `coordinatesID`] shows the components in the index configuration `indices` and the coordinate system `coordinatesID`. +TShow[`ID`, `function`] maps `function` to each of the tensor's elements before they are displayed. Typically this would be ReplaceAll[rules] to apply the rules to the elements, but any function can be used. +TShow[`ID`, `indices`, `coordinatesID`, `function`] does all of the above; either `indices` or `coordinatesID` can be omitted."]; +TShow[ID_String, indices_List : {"_UseDefault_"}, coordinatesID_String : "_UseDefault_", function_ : Identity] /; (!ListQ[function] && !StringQ[function]) := ShowList[ID, indices, coordinatesID, "Show", function]; + + +CreateUsageMessage[TSimplify, "TSimplify[`ID`] simplifies all previously-calculated representations of the tensor object `ID` based on the user-defined simplification assumptions set using TSetAssumptions[]. To be used if the assumptions have changed after the components have already been calculated."]; +TSimplify[ID_String] := ( + CheckIfTensorExists[ID]; + ChangeTensorKey[ID, "Components", TensorSimplify /@ TensorData[ID]["Components"]]; + Return[ID]; +); + + +(* =================================================== *) +(* Private modules (for internal use only) start here. *) +(* =================================================== *) + + +(* Add a new representation with a specific index configuration and coordinate system to a tensor object, if it does not already exist. Returns the components of the representation in any case. *) +AddRepresentation::ErrorCoordinatesCoord = "Cannot transform coordinates for a tensor object representing a coordinate system."; +AddRepresentation::ErrorCoordinatesIndex = "Cannot lower index for a tensor object representing a coordinate system."; +AddRepresentation[ID_String, indices_List, coordinatesID_String] := Module[ + { + defCoords = TensorData[ID]["DefaultCoords"], + defIndices = TensorData[ID]["DefaultIndices"], + i, + oldIndices + }, + (* If the representation has already been calculated, simply return the components. *) + If[ + KeyExistsQ[TensorData[ID]["Components"], {indices, coordinatesID}], + (* Then *) + Return[TensorData[ID]["Components"][{indices, coordinatesID}]] + ]; + (* Check that we are not trying to represent a coordinate tensor in a different coordinate system. *) + If[ + TensorData[ID]["Role"] === "Coordinates" && coordinatesID =!= ID, + (* Then *) + Message[AddRepresentation::ErrorCoordinatesCoord]; + Abort[]; + ]; + (* Check that we are not trying to represent a coordinate tensor with a lower index. *) + If[ + TensorData[ID]["Role"] === "Coordinates" && indices != {1}, + (* Then *) + Message[AddRepresentation::ErrorCoordinatesIndex]; + Abort[]; + ]; + (* Transform the tensor to different coordinates if required. We do this first because the Christoffel symbols have a special transformation rule, so we first transform the coordinates using a fixed rule that works only for the default {1, -1, -1} index configuration, and then raise or lower indices if necessary. *) + TransformCoordinates[ID, defIndices, defCoords, coordinatesID]; + (* Raise or lower indices if required, one by one. We only need to do this if the tensor is not a metric, since metric tensors already have their components pre-calculated with all possible index configurations. *) + If[ + TensorData[ID]["Role"] =!= "Metric", + (* Then *) + oldIndices = defIndices; + Do[ + oldIndices = RaiseLower[ID, coordinatesID, oldIndices, i, indices[[i]]], + {i, 1, Length[defIndices]} + ]; + ]; + (* Return the new components. *) + Return[TensorData[ID]["Components"][{indices, coordinatesID}]]; +]; + + +(* Add two tensor objects. *) +AddTensors::ErrorCoords = "The tensor \"`1`\" cannot be added to another tensor, as it represents a coordinate system."; +AddTensors::ErrorIndicesSame = "The tensors \"`1`\"[\"`2`\"] and \"`3`\"[\"`4`\"] cannot be added, as their index specifications must be the same up to permutation." +AddTensors::ErrorMetricsMatch = "The tensors \"`1`\" and \"`2`\" cannot be added, as they are associated with different metrics, \"`3`\" and \"`4`\" respectively."; +AddTensors::ErrorRanksMatch = "The tensors \"`1`\" and \"`2`\" cannot be added, as they have different ranks."; +AddTensors[firstID_String[firstIndices_String], secondID_String[secondIndices_String]] := Module[ + { + allVars, + firstComponents, + firstVars, + i, + newID, + newSymbol, + secondComponents, + secondVars, + sumComponents, + useCoords, + useIndices, + useSecondIndices + }, + (* Check that both tensors exist. *) + CheckIfTensorExists[firstID]; + CheckIfTensorExists[secondID]; + (* Check that neither of the tensors is a coordinate system. *) + Scan[ + If[ + TensorData[#]["Role"] === "Coordinates", + (* Then *) + Message[AddTensors::ErrorCoords, #]; + Abort[]; + ] &, + {firstID, secondID} + ]; + (* Check that both tensors are associated with the same metric. *) + If[ + TensorData[firstID]["Metric"] =!= TensorData[secondID]["Metric"], + (* Then *) + Message[AddTensors::ErrorMetricsMatch, firstID, secondID, TensorData[firstID]["Metric"], TensorData[secondID]["Metric"]]; + Abort[]; + ]; + (* Check that both tensors have the same rank. *) + If[ + Length[TensorData[firstID]["DefaultIndices"]] =!= Length[TensorData[secondID]["DefaultIndices"]], + (* Then *) + Message[AddTensors::ErrorRanksMatch, firstID, secondID]; + Abort[]; + ]; + (* Check that the index strings match the ranks of the tensors. *) + CheckIndicesRank[firstIndices, firstID]; + CheckIndicesRank[secondIndices, secondID]; + (* Check that the index strings of both tensors are the same up to permutation. *) + If[ + Sort[Characters[firstIndices]] != Sort[Characters[secondIndices]], + (* Then *) + Message[AddTensors::ErrorIndicesSame, firstID, firstIndices, secondID, secondIndices]; + Abort[]; + ]; + (* The components that will be added are the ones corresponding to the default representation of the first tensor. *) + useIndices = TensorData[firstID]["DefaultIndices"]; + useCoords = TensorData[firstID]["DefaultCoords"]; + firstComponents = TensorData[firstID]["Components"][{useIndices, useCoords}]; + (* The index configuration for the second tensor will be rearranged to correctly calculate expressions like T^a_b + T_b^a. *) + useSecondIndices = Table[ + useIndices[[StringPosition[firstIndices, Characters[secondIndices][[i]]][[1, 1]]]], + {i, 1, StringLength[firstIndices]} + ]; + (* Add the appropriate index configuration to the second tensor if it does not already exist. *) + secondComponents = AddRepresentation[secondID, useSecondIndices, useCoords]; + (* Collect the variables to be used in the addition. Both firstVars and secondVars will be the same set of variables, but potentially in a different order. *) + allVars = Association[]; + Scan[(allVars[#] = Unique["var"]) &, Characters[firstIndices]]; + firstVars = allVars[#]& /@ Characters[firstIndices]; + secondVars = allVars[#]& /@ Characters[secondIndices]; + (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) + newSymbol = Row[{ + If[ + TensorData[firstID]["Role"] === "Temporary", + (* Then *) + TensorData[firstID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[firstID]["Symbol"], + IndicesToLetters[-1, useIndices, firstIndices], + IndicesToLetters[+1, useIndices, firstIndices] + ] + ], + " + ", + If[ + TensorData[secondID]["Role"] === "Temporary", + (* Then *) + TensorData[secondID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[secondID]["Symbol"], + IndicesToLetters[-1, useSecondIndices, secondIndices], + IndicesToLetters[+1, useSecondIndices, secondIndices] + ] + ] + }]; + (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) + (* PrintTemporary["Adding ", newSymbol, "..."]; *) + (* Add the two tensors by summing over their components using the appropriate variables. *) + sumComponents = Table[ + firstComponents[[Sequence @@ firstVars]] + secondComponents[[Sequence @@ secondVars]], + Evaluate[Sequence @@ ({#, 1, Length[firstComponents]} & /@ firstVars)] + ]; + (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) + newID = NewTempID[]; + SetTensorID[newID, Association[ + "Components" -> Association[{useIndices, useCoords} -> sumComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> useIndices, + "Metric" -> TensorData[firstID]["Metric"], + "Role" -> "Temporary", + "Symbol" -> Row[{"(", newSymbol, ")"}] + ]]; + Return[newID[firstIndices]]; +]; + + +(* Go over the component definitions of a given tensor and change every reference to a coordinate system to a different name. Note that this also means changing the reference in the default coordinate system of a tensor and in any coordinate transformation rules. Used by TChangeID. *) +ChangeCoordinateID[tensorID_String, oldCoordsID_String, newCoordsID_String] := Module[ + { + newComponents = Association[], + oldComponents = TensorData[tensorID]["Components"], + transf + }, + (* For each key of the old components, if oldCoordsID is the coordinate system, convert it to newCoordsID. *) + Scan[ + If[ + #[[2]] === oldCoordsID, + (* Then *) + newComponents[{#[[1]], newCoordsID}] = oldComponents[#], + (* Else *) + newComponents[#] = oldComponents[#]; + ] &, + Keys[oldComponents] + ]; + (* Store the new components. *) + ChangeTensorKey[tensorID, "Components", newComponents]; + (* If the default coordinate system is oldCoordsID, change it to newCoordsID. *) + If[ + TensorData[tensorID]["DefaultCoords"] === oldCoordsID, + (* Then *) + ChangeTensorKey[tensorID, "DefaultCoords", newCoordsID]; + ]; + (* If the tensor object is itself a coordinate system, change oldCoordsID to newCoordsID in any coordinate transformations stored inside it. *) + If[ + TensorData[tensorID]["Role"] === "Coordinates" && KeyExistsQ[TensorData[tensorID], "CoordTransformations"], + (* Then *) + transf = TensorData[tensorID]["CoordTransformations"]; + If[ + KeyExistsQ[transf, oldCoordsID], + (* Then *) + transf[newCoordsID] = transf[oldCoordsID]; + KeyDropFrom[transf, oldCoordsID]; + ChangeTensorKey[tensorID, "CoordTransformations", transf]; + ] + ]; +]; + + +(* Change a particular key for the tensor object with the given ID. *) +ChangeTensorKey[ID_String, key_String, value_] := ( + Unprotect[TensorData]; + TensorData[ID][key] = value; + Protect[TensorData]; +); + + +(* Check if the tensor with the given ID represents a coordinate system. *) +CheckIfCoordinates::ErrorNotCoordinates = "The tensor \"`1`\" does not represent a coordinate system."; +CheckIfCoordinates[ID_String] := If[ + TensorData[ID]["Role"] =!= "Coordinates", +(* Then *) + Message[CheckIfCoordinates::ErrorNotCoordinates, ID]; + Abort[]; +]; + + +(* Check if the tensor with the given ID represents a metric. *) +CheckIfMetric::ErrorNotMetric = "The tensor \"`1`\" does not represent a metric."; +CheckIfMetric[ID_String] := If[ + TensorData[ID]["Role"] =!= "Metric", +(* Then *) + Message[CheckIfMetric::ErrorNotMetric, ID]; + Abort[]; +]; + + +(* Check if a tensor with the given ID exists, and abort if it does. *) +CheckIfOverwriting::ErrorExists = "A tensor with the ID \"`1`\" already exists. Please rename it using TChangeID[] or delete it using TDelete[] first."; +CheckIfOverwriting[ID_String] := If[ + KeyExistsQ[TensorData, ID], +(* Then *) + Message[CheckIfOverwriting::ErrorExists, ID]; + Abort[]; +]; + + +(* Check if a tensor with the given ID exists, and abort if it doesn't. *) +CheckIfTensorExists::ErrorDoesNotExist = "The tensor \"`1`\" does not exist."; +CheckIfTensorExists[ID_String] := If[ + !KeyExistsQ[TensorData, ID], +(* Then *) + Message[CheckIfTensorExists::ErrorDoesNotExist, ID]; + Abort[]; +]; + + +(* Check that an index list has been entered correctly: a one-dimensional list with all its components either plus or minus 1. *) +CheckIndicesForm::ErrorIncorrectForm = "The indices must be a list of the form {\[PlusMinus]1, \[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 corresponds to a lower index."; +CheckIndicesForm[indices_List] := If[ + !VectorQ[indices] || !AllTrue[indices, (#^2 == 1) &], +(* Then *) + Message[CheckIndicesForm::ErrorIncorrectForm]; + Abort[]; +]; + + +(* Check that an index list matches the tensor's rank. *) +CheckIndicesRank::ErrorIncorrectRank = "The index configuration `1` does not match the rank of the tensor \"`2`\". The number of indices should be `3`."; +CheckIndicesRank[indices_List, ID_String] := If[ + Length[indices] != Length[TensorData[ID]["DefaultIndices"]], +(* Then *) + Message[CheckIndicesRank::ErrorIncorrectRank, indices, ID, Length[TensorData[ID]["DefaultIndices"]]]; + Abort[]; +]; +CheckIndicesRank[indices_String, ID_String] := If[ + StringLength[indices] != Length[TensorData[ID]["DefaultIndices"]], +(* Then *) + Message[CheckIndicesRank::ErrorIncorrectRank, "\"" <> indices <> "\"", ID, Length[TensorData[ID]["DefaultIndices"]]]; + Abort[]; +]; + + +(* Clear all temporary tensors created by TCalc, and reset the counter. *) +ClearTemp[] := ( + ImportTensorData[Select[TensorData, #["Role"] =!= "Temporary" &]]; + Unprotect[TempID]; + TempID = 0; + Protect[TempID]; +); + + +(* Contract two tensors. *) +ContractTensors::ErrorMetricsMatch = "The tensors \"`1`\" and \"`2`\" cannot be contracted, as they are associated with different metrics, \"`3`\" and \"`4`\" respectively."; +ContractTensors[firstID_String[firstIndices_String], secondID_String[secondIndices_String]] := Module[ + { + allVars, + firstComponents, + firstVars, + i, + newComponents, + newID, + newIndices, + newSymbol, + outIndices, + outVars, + removeIndices, + secondComponents, + secondVars, + sumVars, + useCoords, + useFirstIndices, + useSecondIndices + }, + (* Check that both tensors exist. *) + CheckIfTensorExists[firstID]; + CheckIfTensorExists[secondID]; + (* Check that both tensors are associated with the same metric. *) + If[ + TensorData[firstID]["Metric"] =!= TensorData[secondID]["Metric"], + (* Then *) + Message[ContractTensors::ErrorMetricsMatch, firstID, secondID, TensorData[firstID]["Metric"], TensorData[secondID]["Metric"]]; + Abort[]; + ]; + (* Check that the index strings match the ranks of the tensors. *) + CheckIndicesRank[firstIndices, firstID]; + CheckIndicesRank[secondIndices, secondID]; + (* We perform the calculation in the default coordinate system of the first tensor. *) + useCoords = TensorData[firstID]["DefaultCoords"]; + (* We start with the default index configuration of both tensors, but then rearrange the indices on the second tensor so that any contracted indices will be one upper, one lower. *) + useFirstIndices = TensorData[firstID]["DefaultIndices"]; + useSecondIndices = TensorData[secondID]["DefaultIndices"]; + (* If either of the tensors is a scalar, simply do multiplication of tensor by scalar. *) + If[ + Length[useFirstIndices] == 0, + (* Then *) + Return[TensorByScalar[secondID[secondIndices], TensorData[firstID]["Components"][{useFirstIndices, useCoords}][[1]], TensorData[firstID]["Symbol"]]] + ]; + If[ + Length[useSecondIndices] == 0, + (* Then *) + Return[TensorByScalar[firstID[firstIndices], TensorData[secondID]["Components"][{useSecondIndices, useCoords}][[1]], TensorData[secondID]["Symbol"]]] + ]; + (* newIndices will be the index configuration of the newly created tensor. We start from the default indices of the first tensor, remove any indices that were contracted, and add the remaining free indices of the second tensor. *) + newIndices = useFirstIndices; + removeIndices = {}; + Do[ + If[ + # =!= {}, + (* Then *) + useSecondIndices[[i]] = -useFirstIndices[[#[[1, 1]]]]; + AppendTo[removeIndices, {#[[1, 1]]}], + (* Else *) + AppendTo[newIndices, useSecondIndices[[i]]]; + ]& @ StringPosition[firstIndices, Characters[secondIndices][[i]]], + {i, 1, Length[useSecondIndices]} + ]; + newIndices = Delete[newIndices, removeIndices]; + (* The components of the first tensor will be taken in the default index representation. *) + firstComponents = TensorData[firstID]["Components"][{useFirstIndices, useCoords}]; + (* The components of the second tensor will be taken in the index representation that matches the contraction, with indices raised or lowered to match the corresponding indices in the first tensor. *) + secondComponents = AddRepresentation[secondID, useSecondIndices, useCoords]; + (* Collect the variables to be used for contracting the indices.*) + allVars = Association[]; + (* allVars will contain all of the variables for both the first and the second tensor. *) + Scan[(allVars[#] = Unique["var"]) &, Characters[firstIndices <> secondIndices]]; + (* firstVars will contain the variables to be used as indices for the first tensor. *) + firstVars = allVars[#]& /@ Characters[firstIndices]; + (* secondVars will contain the variables to be used as indices for the second tensor. *) + secondVars = allVars[#]& /@ Characters[secondIndices]; + (* sumVars will contain the variables to be used in the sum. *) + sumVars = {}; + (* outVars will contain the variables to be used in the output tensor. *) + outVars = {}; + (* outIndices will be the index string of the output tensor. *) + outIndices = ""; + If[ + Length[Cases[Characters[firstIndices <> secondIndices], #]] == 2, + (* Then *) + AppendTo[sumVars, allVars[#]], + (* Else *) + AppendTo[outVars, allVars[#]]; + outIndices = outIndices <> #; + ]& /@ Keys[allVars]; + (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) + newSymbol = Row[{ + If[ + TensorData[firstID]["Role"] === "Temporary", + (* Then *) + TensorData[firstID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[firstID]["Symbol"], + IndicesToLetters[-1, useFirstIndices, firstIndices], + IndicesToLetters[+1, useFirstIndices, firstIndices] + ] + ], + If[ + TensorData[secondID]["Role"] === "Temporary", + (* Then *) + TensorData[secondID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[secondID]["Symbol"], + IndicesToLetters[-1, useSecondIndices, secondIndices], + IndicesToLetters[+1, useSecondIndices, secondIndices] + ] + ] + }]; + (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) + (* PrintTemporary["Contracting ", newSymbol, "..."]; *) + (* Calculate the components of the new tensor by summing over the contracted variables. *) + newComponents = Table[ + If[ + Length[sumVars] > 0, + (* Then *) + Sum[ + firstComponents[[Sequence @@ firstVars]] * secondComponents[[Sequence @@ secondVars]], + Evaluate[Sequence @@ ({#, 1, Length[firstComponents]} & /@ sumVars)] + ], + (* Else *) + firstComponents[[Sequence @@ firstVars]] * secondComponents[[Sequence @@ secondVars]] + ], + Evaluate[ + If[ + Length[outVars] > 0, + (* Then *) + Sequence @@ ({#, 1, Length[firstComponents]} & /@ outVars), + (* Else *) + 1 + ] + ] + ]; + (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) + newID = NewTempID[]; + SetTensorID[newID, Association[ + "Components" -> Association[{newIndices, useCoords} -> newComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> newIndices, + "Metric" -> TensorData[firstID]["Metric"], + "Role" -> "Temporary", + "Symbol" -> newSymbol + ]]; + Return[newID[outIndices]]; +]; + + +(* Take the covariant derivative of a tensor. *) +CreateUsageMessage[TCovariantD, "TCovariantD[`index`] represents the covariant derivative when used in a tensor expression given to TCalc[]. If a tensor with ID \"`metricID`Christoffel\" exists, where `metricID` is the metric associated with the tensor the derivative is acting upon, then it will be assumed to be the Levi-Civita connection of the metric, and will be used in the calculation. Otherwise, \"`metricID`Christoffel\" will be created using TCalcChristoffel[]."]; +CovariantDivOrGrad[derivativeIndex_String, tensorID_String[tensorIndices_String]] := Module[ + { + myChristoffel, + newComponents, + newID, + out, + useCoords, + useIndices + }, + (* If the Christoffel symbols were not already calculated, calculate them now. *) + myChristoffel = TensorData[tensorID]["Metric"] <> "Christoffel"; + If[ + !KeyExistsQ[TensorData, myChristoffel], + (* Then *) + TCalcChristoffel[TensorData[tensorID]["Metric"]]; + ]; + (* The simplest way to calculate the covariant derivative is to do it for the representation of the tensor with all of its indices raised. Otherwise we have to worry about minus signs and different index order in the Christoffel symbols attached to the tensor's lower indices. So we create a new temporary tensor with all upper indices as its default index configuration. This guarantees that no raising or lowering of indices will take place when contracting the tensor with the partial derivative and the Christoffel symbols. *) + useIndices = 1 & /@ TensorData[tensorID]["DefaultIndices"]; + useCoords = TensorData[tensorID]["DefaultCoords"]; + (* Add a representation with all upper indices to the tensor if it doesn't already exist. *) + newComponents = AddRepresentation[tensorID, useIndices, useCoords]; + newID = NewTempID[]; + SetTensorID[newID, Association[ + "Components" -> Association[{useIndices, useCoords} -> newComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> useIndices, + "Metric" -> TensorData[tensorID]["Metric"], + "Role" -> "CovariantDivOrGrad", + "Symbol" -> TensorData[tensorID]["Symbol"] + ]]; + (* The first term is just the partial derivative. *) + out = DivOrGrad[derivativeIndex, newID[tensorIndices]]; + (* The next terms add one Christoffel symbol per index, contracted with that index. The Unicode symbol \|040200 is used as the summation index, to prevent collisions with indices given by the user. *) + Scan[ + (out = AddTensors[out, + ContractTensors[TensorTrace[myChristoffel[# <> derivativeIndex <> "\|040200"]], + newID[StringReplace[tensorIndices, # -> "\|040200"]]] + ]) &, + Characters[tensorIndices] + ]; + (* Delete the temporary tensor we created above. *) + RemoveTensorID[newID]; + Return[out]; +]; + + +(* Create a clickable button that looks and behaves like a hyperlink. *) +CreateButton[label_, action_] := Button[ + MouseAppearance[Mouseover[ + Style[label, "Hyperlink"], + Style[label, "HyperlinkActive"] + ], "LinkHand"], + action, + Appearance -> "Frameless", + BaseStyle -> "Hyperlink" +]; +Attributes[CreateButton] = HoldRest; + + +(* Take the divergence or gradient of a tensor. *) +CreateUsageMessage[TPartialD, "TPartialD[`index`] represents the partial derivative when used in a tensor expression given to TCalc[]."]; +DivOrGrad::OneIndex = "The index specification of the partial derivative must be a string with exactly one character. If the character matches a character in the index specification of the tensor, it will be contracted with it to produce a divergence. Otherwise, the gradient will be calculated."; +DivOrGrad[derivativeIndex_String, tensorID_String[tensorIndices_String]] := Module[ + { + allVars, + components, + coordinateSymbols, + firstVars, + newComponents, + newID, + newIndices, + newSymbol, + outIndices, + outVars, + pos, + secondVars, + sumVars, + useCoords, + useIndices + }, + (* Check that the tensor exists. *) + CheckIfTensorExists[tensorID]; + (* Check that the derivative has exactly once index. *) + If[ + StringLength[derivativeIndex] != 1, + (* Then *) + Message[DivOrGrad::OneIndex]; + Abort[]; + ]; + (* Check that the index string matches the rank of the tensor. *) + CheckIndicesRank[tensorIndices, tensorID]; + useIndices = TensorData[tensorID]["DefaultIndices"]; + useCoords = TensorData[tensorID]["DefaultCoords"]; + (* If the derivative's index matches one of the tensor's indices, we are calculating a divergence, so raise that index on the tensor (useIndices) to match the lower index on the derivative, and remove that index from the result (newIndices) since we are contracting it. Otherwise, we are calculating a gradient, so prepend a lower index to the result (newIndices) to account for the derivative's index. *) + newIndices = useIndices; + pos = StringPosition[tensorIndices, derivativeIndex]; + If[ + pos =!= {}, + (* Then *) + useIndices[[pos[[1, 1]]]] = 1; + newIndices = Delete[newIndices, pos[[1, 1]]], + (* Else *) + PrependTo[newIndices, -1]; + ]; + (* Get the tensor's components in the desired representation, adding it if it does not already exist. *) + components = AddRepresentation[tensorID, useIndices, useCoords]; + (* Collect the variables to be used for contracting the indices. See ContractTensors for more details on how this part works. *) + allVars = Association[]; + Scan[(allVars[#] = Unique["var"]) &, Characters[derivativeIndex <> tensorIndices]]; + firstVars = allVars[#]& /@ Characters[derivativeIndex]; + secondVars = allVars[#]& /@ Characters[tensorIndices]; + sumVars = {}; + outVars = {}; + outIndices = ""; + If[ + Length[Cases[Characters[derivativeIndex <> tensorIndices], #]] == 2, + (* Then *) + AppendTo[sumVars, allVars[#]], + (* Else *) + AppendTo[outVars, allVars[#]]; + outIndices = outIndices <> #; + ]& /@ Keys[allVars]; + (* Collect the coordinate symbols, since we are taking derivatives with respect to them. *) + coordinateSymbols = TensorData[useCoords]["Components"][{{1}, useCoords}]; + (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) + newSymbol = Row[{ + Subscript["\[PartialD]", derivativeIndex], + If[ + TensorData[tensorID]["Role"] === "Temporary", + (* Then *) + TensorData[tensorID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[tensorID]["Symbol"], + IndicesToLetters[-1, useIndices, tensorIndices], + IndicesToLetters[+1, useIndices, tensorIndices] + ] + ] + }]; + (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) + (* PrintTemporary["Taking the partial derivative ", newSymbol, "..."]; *) + (* Calculate the components of the new tensor by summing over the contracted variables and taking the derivatives of the tensor's components. *) + newComponents = Table[ + If[ + Length[sumVars] > 0, + (* Then *) + Sum[ + D[components[[Sequence @@ secondVars]], coordinateSymbols[[firstVars[[1]]]]], + Evaluate[Sequence @@ ({#, 1, Length[coordinateSymbols]} & /@ sumVars)] + ], + (* Else *) + D[components[[Sequence @@ secondVars]], coordinateSymbols[[firstVars[[1]]]]] + ], + Evaluate[ + If[ + Length[outVars] > 0, + (* Then *) + Sequence @@ ({#, 1, Length[coordinateSymbols]} & /@ outVars), + (* Else *) + 1 + ] + ] + ]; + (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) + newID = NewTempID[]; + SetTensorID[newID, Association[ + "Components" -> Association[{newIndices, useCoords} -> newComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> newIndices, + "Metric" -> TensorData[tensorID]["Metric"], + "Role" -> "Temporary", + "Symbol" -> newSymbol + ]]; + Return[newID[outIndices]]; +]; + + +(* Replace TensorData with the given Association. All previously defined tensor objects will be erased. The Options key will be created if it does not already exist (for compatibility with v1.0). *) +ImportTensorData[data_Association] := ( + If[ + !KeyExistsQ[data, Options] || !KeyExistsQ[data[Options], "OGReVersion"] || data[Options]["OGReVersion"] != OGReVersion, + (* Then *) + OGRePrint["Warning: The imported tensors were created in a different version of OGRe. Compatibility issues may occur."]; + ]; + Unprotect[TensorData]; + TensorData = data; + PopulateOptions[]; + Protect[TensorData]; +); + + +(* Convert an index definition (i.e. a List with +1 for an upper index and -1 for a lower index) into letters. Used for displaying tensors using either letters or coordinates as indices. If the first argument is +1, returns a row with the upper indices, and empty spaces to account for the lower indices. If the first argument is -1, do the same with the lower indices. *) +IndicesToLetters[lookFor_Integer, upperLower_List, letters_String] := + Row[MapIndexed[If[ + #1 == lookFor, + (* Then *) + Characters[letters][[First[#2]]], + (* Else *) + Invisible[Characters[letters][[First[#2]]]] + ] &, upperLower]]; + + +(* Ensure that the tensor IDs given to temporary tensors are unique. *) +TempID = 0; +NewTempID[] := ( + Unprotect[TempID]; + TempID++; + Protect[TempID]; + Return["_TCalcTemp" <> ToString[TempID] <> "_"]; +); + + +(* Display an expression using the DisplayFormula style. The user must define what this style means manually in the notebook style sheet. *) +Nice[expression_] := Style[expression, "DisplayFormula"]; + + +(* Print an expression in an uneditable cell with the label OGRe. *) +OGRePrint[expression_] := CellPrint[ExpressionCell[expression, "Output", Editable -> False, CellLabel -> "OGRe:", CellLabelStyle -> Directive["CellLabel", Smaller, Blue]]]; +OGRePrint[expressions__] := OGRePrint[Row[{expressions}]]; + + +(* A special key in TensorData, Options, is used to store information about the current session, for the purpose of exporting and importing between sessions using TExportAll and TImportAll. Since this key is not a string, it cannot be accidentally overwritten by a tensor definition. *) +PopulateOptions[] := Module[ + { + useIndexLetters, + useParallelize, + useSimplifyAssumptions + }, + If[ + !KeyExistsQ[TensorData, Options], + (* Then *) + (* If the Options key doesn't exist, which can happen when the package first loads or when importing from an old version of OGRe, create it with the default values. *) + TensorData[Options] = Association[ + "OGReVersion" -> OGReVersion, + "IndexLetters" -> DefaultIndexLetters, + "Parallelize" -> False, + "SimplifyAssumptions" -> Association[ + "AssumeReal" -> True, + "User" -> None + ] + ], + (* Else *) + (* If the Options key does exist, populate it with the imported values, but substitute the default values if any keys are missing, which can happen when importing from a different version of OGRe. *) + useIndexLetters = Lookup[TensorData[Options], "IndexLetters", DefaultIndexLetters]; + useParallelize = Lookup[TensorData[Options], "Parallelize", False]; + If[ + KeyExistsQ[TensorData[Options], "SimplifyAssumptions"], + (* Then *) + useSimplifyAssumptions = Association[ + "AssumeReal" -> Lookup[TensorData[Options]["SimplifyAssumptions"], "AssumeReal", True], + "User" -> Lookup[TensorData[Options]["SimplifyAssumptions"], "User", None] + ], + (* Else *) + useSimplifyAssumptions = Association[ + "AssumeReal" -> True, + "User" -> None + ] + ]; + TensorData[Options] = Association[ + "OGReVersion" -> OGReVersion, + "IndexLetters" -> useIndexLetters, + "Parallelize" -> useParallelize, + "SimplifyAssumptions" -> useSimplifyAssumptions + ]; + ]; +]; +PopulateOptions[]; + + +(* Change one of a tensor's indices to the desired position (upper = +1 or lower = -1), starting from a specific index configuration (assumed to be already calculated). The new components are then saved as a separate representation within the tensor object. Returns the new index configuration. *) +RaiseLower[ID_String, coordinatesID_String, oldIndices_List, indexPos_Integer, upperLower_Integer] := Module[ + { + allComponents, + components = TensorData[ID]["Components"][{oldIndices, coordinatesID}], + dim, + metricID = TensorData[ID]["Metric"], + newComponents, + newIndices, + newVars, + oldVars, + raiseVar, + sumVar, + useMetric + }, + dim = Length[components]; + (* If the metric used to raise and lower indices for this tensor has not yet had its components calculated in the desired coordinate system, calculate them now. *) + If[ + !KeyExistsQ[TensorData[metricID]["Components"], {{-1, -1}, coordinatesID}], + (* Then *) + TransformCoordinates[metricID, {-1, -1}, TensorData[metricID]["DefaultCoords"], coordinatesID] + ]; + Which[ + oldIndices[[indexPos]] == +1 && upperLower == -1, + (* If lowering the index, use the metric (with two lower indices). *) + useMetric = TensorData[metricID]["Components"][{{-1, -1}, coordinatesID}], + oldIndices[[indexPos]] == -1 && upperLower == +1, + (* If raising the index, use the inverse metric (with two upper indices). *) + useMetric = TensorData[metricID]["Components"][{{+1, +1}, coordinatesID}], + True, + (* If the index is not being raised or lowered, do nothing. *) + Return[oldIndices] + ]; + (* The new indices are the same as the old indices, except for the one index being raised or lowered. *) + newIndices = ReplacePart[oldIndices, indexPos -> upperLower]; + (* If a representation with the desired index configuration already exists, do nothing. *) + If[ + KeyExistsQ[TensorData[ID]["Components"], {newIndices, coordinatesID}], + (* Then *) + Return[newIndices] + ]; + (* Define the variables to be used in the calculation. As an example, say we want to lower the last index of T^abc. Then we have T^ab_c = g_cd T^abd. In this case newVars = {a, b, c}, oldVars = {a, b, d}, raiseVar = c, and sumVar = d. *) + newVars = Unique[Table["var", {Length[newIndices]}]]; + oldVars = ReplacePart[newVars, indexPos -> sumVar]; + raiseVar = newVars[[indexPos]]; + (* Create the new components using a Table with newVars as iterators. Each component will be calculated using a Sum with sumVar as the summation variable. *) + newComponents = (Table[ + Sum[ + useMetric[[raiseVar, sumVar]] * components[[Sequence @@ oldVars]], + {sumVar, 1, dim} + ], ## + ] &) @@ ({#, 1, dim} &) /@ newVars; + (* Store the new representation in the tensor object. *) + allComponents = TensorData[ID]["Components"]; + allComponents[{newIndices, coordinatesID}] = TensorSimplify[newComponents]; + ChangeTensorKey[ID, "Components", allComponents]; + (* Return the new index configuration. *) + Return[newIndices]; +]; + + +(* Remove the tensor object with the given ID. *) +RemoveTensorID[ID_String] := ( + Unprotect[TensorData]; + KeyDropFrom[TensorData, ID]; + Protect[TensorData]; +); + + +(* Create a new tensor object with the given ID, or assign it new data if it already exists. *) +SetTensorID[ID_String, data_Association] := ( + Unprotect[TensorData]; + TensorData[ID] = data; + Protect[TensorData]; +); + + +(* Show or list a tensor's components. Called by TShow and TList. *) +ShowList[ID_String, indices_List, coordinatesID_String, showOrList_String, function_ : Identity] := Module[ + { + allElements, + components, + coordSymbols, + grid, + i, + row, + uniqueValues, + uniqueValuesSign, + useCoords, + useIndices + }, + (* Check that the tensor object ID exists. *) + CheckIfTensorExists[ID]; + (* If specific indices are not given, use the tensor's default indices. *) + If[ + indices === {"_UseDefault_"}, + (* Then *) + useIndices = TensorData[ID]["DefaultIndices"], + (* Else *) + (* Check that the list of indices is of the correct form and has the correct rank. *) + CheckIndicesForm[indices]; + CheckIndicesRank[indices, ID]; + useIndices = indices; + ]; + (* If a specific coordinate system is not given, use the tensor's default coordinate system. *) + If[ + coordinatesID === "_UseDefault_", + (* Then *) + useCoords = TensorData[ID]["DefaultCoords"], + (* Else *) + (* Check that the tensor object coordinatesID exists and represents a coordinate system. *) + CheckIfTensorExists[coordinatesID]; + CheckIfCoordinates[coordinatesID]; + useCoords = coordinatesID; + ]; + (* Get the components of the tensor in the given representation (indices and coordinate system), or calculate it if it does not already exist. *) + components = AddRepresentation[ID, useIndices, useCoords]; + (* Apply the optional function to the components. *) + components = Map[function, components, {ArrayDepth[components]}]; + (* Execute the following if called by TShow. *) + If[ + showOrList === "Show", + (* Then *) + (* Print the tensor's ID followed by a colon. *) + row = {ID, ": "}; + (* Print the tensor's symbol along with the desired upper and lower indices. The index letters will be taken from TensorData[Options]["IndexLetters"]. IndicesToLetters will return a row with only the upper indices or only the lower indices depending on the first argument. *) + row = Append[row, Subsuperscript[ + TensorData[ID]["Symbol"], + IndicesToLetters[-1, useIndices, TensorData[Options]["IndexLetters"]], + IndicesToLetters[+1, useIndices, TensorData[Options]["IndexLetters"]] + ]]; + (* Print the tensor's coordinates as function arguments, e.g. (t, x, y, z), but only if the tensor does not itself represent coordinates. *) + If[ + TensorData[ID]["Role"] =!= "Coordinates", + (* Then *) + row = Join[row, {"(", Row[TensorData[useCoords]["Components"][{{1}, useCoords}], ","], ")"}] + ]; + (* Print an equal sign. *) + row = Append[row, " = "]; + (* Print the components of the tensor. Use MatrixForm, unless it is a scalar. *) + If[ + Length[components] * ArrayDepth[components] != 1, + (* Then *) + row = Append[row, MatrixForm[components]], + (* Else *) + row = Join[row, components] + ]; + (* Print the row, formatted using Nice. *) + OGRePrint[Nice[Row[row]]]; + ]; + (* Execute the following if called by TList. *) + If[ + showOrList === "List", + (* Then *) + If[ + AllTrue[Flatten[components], # === 0 &], + (* Then *) + grid = "No non-zero elements.", + (* Else *) + (* The coordinate symbols (e.g. t, x, y, z) will be used in place of the indices. *) + coordSymbols = TensorData[useCoords]["Components"][{{1}, useCoords}]; + (* Create an array of elements of the form {value, label}, where label is the label of the specific component (with the coordinates as indices, e.g. g_xy is the component with x for the first index and y for the second index) and value is its value. *) + allElements = Flatten[ + MapIndexed[ + { + #1, + Subsuperscript[ + TensorData[ID]["Symbol"], + IndicesToLetters[-1, useIndices, StringJoin[ToString /@ coordSymbols[[#2]]]], + IndicesToLetters[+1, useIndices, StringJoin[ToString /@ coordSymbols[[#2]]]] + ] + } &, + components, + {ArrayDepth[components]} + ], + ArrayDepth[components] - 1 + ]; + (* List only the unique tensor elements out of the array we created above. *) + uniqueValues = DeleteCases[DeleteDuplicates[allElements[[All, 1]]], 0]; + (* List only the tensor elements that are unique up to sign. *) + uniqueValuesSign = {}; + Scan[ + If[ + !MemberQ[uniqueValuesSign, -#1], + (* Then *) + AppendTo[uniqueValuesSign, #1] + ] &, + uniqueValues + ]; + (* Create a grid of the unique tensor elements. In each row we find the elements of allElements that have a specific unique value out of uniqueValuesSign, and print all of them followed by the value. *) + grid = Grid[ + Table[ + { + Row[ + Join[ + Select[allElements, #1[[1]] == uniqueValuesSign[[i]] &][[All, 2]], + -Select[allElements, #1[[1]] == -uniqueValuesSign[[i]] &][[All, 2]] + ], + "=" + ], + "=", + uniqueValuesSign[[i]] + }, + {i, 1, Length[uniqueValuesSign]} + ], + Alignment -> {Left, Baseline} + ]; + ]; + (* Print the grid, preceded by the tensor's ID, formatted using Nice. *) + OGRePrint[Nice[Column[ + { + Row[{ID, ":"}], + grid + }, + Alignment -> {Center, Baseline} + ]]]; + ]; +]; + + +StartupCheckForUpdates[] := Module[ + { + newVersion, + remoteFile, + versionLookup + }, + remoteFile = Quiet[Import[OGReURL, "Text"]]; + Unprotect[UpdateMessage]; + If[ + remoteFile === $Failed, + (* Then *) + UpdateMessage = Row[{"Could not check for updates automatically. Please visit ", Hyperlink["https://github.com/bshoshany/OGRe"], " to check manually."}], + (* Else *) + versionLookup = StringCases[remoteFile, Shortest["OGReVersion = \"" ~~ __ ~~ "\";"]]; + If[ + Length[versionLookup] == 1, + (* Then *) + newVersion = StringTake[versionLookup[[1]], {16, StringLength[versionLookup[[1]]] - 2}]; + If[ + newVersion === OGReVersion, + (* Then *) + UpdateMessage = "You have the latest version of the package.", + (* Else *) + UpdateMessage = Row[{"A new version of the package is available: ", Style[newVersion, Bold], ". For more information, type ", Style["TCheckForUpdates[]", "Input"], " or ", CreateButton["click here.", TCheckForUpdates[]]}]; + ]; + ]; + ]; + Protect[UpdateMessage]; +]; + + +(* Multiply a tensor object by a scalar. *) +TensorByScalar::ErrorCoords = "The tensor \"`1`\" cannot be multiplied by a scalar, as it represents a coordinate system."; +TensorByScalar[ID_String[indices_String], scalar_, useSymbol_: False] := Module[ + { + newComponents, + newID, + newSymbol, + useCoords, + useIndices + }, + (* Check that the tensor exists. *) + CheckIfTensorExists[ID]; + (* Check that the tensor does not represent a coordinate system. *) + If[ + TensorData[ID]["Role"] === "Coordinates", + (* Then *) + Message[TensorByScalar::ErrorCoords, ID]; + Abort[]; + ]; + (* Check that the index string matches the rank of the tensor. *) + CheckIndicesRank[indices, ID]; + (* The components that will be multiplied are the ones corresponding to the default representation of the tensor. *) + useIndices = TensorData[ID]["DefaultIndices"]; + useCoords = TensorData[ID]["DefaultCoords"]; + (* Calculate the explicit symbolic representation for this operation, including the correct index placement. *) + newSymbol = Row[{ + (* If the scalar is -1, we just prefix the tensor with a negative sign. If it's any other number, we use that number as the prefix. If it is a rank 0 tensor, we use its symbol. Otherwise, we add parentheses in case it is an expression with several terms. *) + Which[ + NumberQ[scalar] && scalar == -1, "-", + NumberQ[scalar], scalar, + useSymbol =!= False, useSymbol, + True, Splice[{"(", scalar, ")"}] + ], + If[ + TensorData[ID]["Role"] === "Temporary", + (* Then *) + TensorData[ID]["Symbol"], + (* Else *) + Subsuperscript[ + TensorData[ID]["Symbol"], + IndicesToLetters[-1, useIndices, indices], + IndicesToLetters[+1, useIndices, indices] + ] + ] + }]; + (* Let the user know the explicit operation we are performing, including the correct index placement. TODO: Uncomment this in a future version, once this feature works properly. *) + (* PrintTemporary["Multiplying by scalar ", newSymbol, "..."]; *) + (* Calculate the product of the scalar with the tensor. *) + newComponents = scalar * TensorData[ID]["Components"][{useIndices, useCoords}]; + (* Store the result in a new temporary tensor, which will be deleted once the recursive calculation in TCalc is complete. *) + newID = NewTempID[]; + SetTensorID[newID, Association[ + "Components" -> Association[{useIndices, useCoords} -> newComponents], + "DefaultCoords" -> useCoords, + "DefaultIndices" -> useIndices, + "Metric" -> TensorData[ID]["Metric"], + "Role" -> "Temporary", + "Symbol" -> newSymbol + ]]; + Return[newID[indices]]; +]; + +(* Simplify an expression with optional user-defined assumptions. *) +TensorSimplify[expression_] := Module[ + { + assumptions, + progress, + result, + tasks + }, + assumptions = Join[ + { + If[ + TensorData[Options]["SimplifyAssumptions"]["AssumeReal"], + (* Then *) + Element[_, Reals], + (* Else *) + None + ] + }, + (* The flattening is for compatibility with v1.0, since the assumptions were not stored as a list in that version. *) + Flatten[{TensorData[Options]["SimplifyAssumptions"]["User"]}] + ]; + (* Print a dynamic progress indicator. The progress parameter will be shared between all kernels so they can update it. *) + progress = 0; + SetSharedVariable[progress]; + PrintTemporary["Simplification progress: ", ProgressIndicator[Dynamic[progress], {0, Times @@ Dimensions[expression]}]]; + If[ + TensorData[Options]["Parallelize"], + (* Then *) + (* Submit the simplification of each element in the tensor as an individual task. Whenever a kernel becomes available, it will pick up the next available task. This results in better performance than ParallelMap. *) + tasks = Map[ + (* Using Block instead of Module here for maximum performance. *) + Function[element, ParallelSubmit[Block[{simplified = FullSimplify[element, assumptions]}, progress++; simplified]]], + expression, + {ArrayDepth[expression]} + ]; + (* Wait for all tasks to be completed. *) + result = WaitAll[tasks], + (* Else *) + (* Do the same without parallelization. *) + result = Map[ + Function[element, Block[{simplified = FullSimplify[element, assumptions]}, progress++; simplified]], + expression, + {ArrayDepth[expression]} + ]; + ]; + UnsetShared[progress]; + Return[result]; +]; + + +(* Take the trace of a tensor. *) +TensorTrace::ErrorMoreThanTwo = "The index specification \"`1`\" is invalid, as it contains more than two instances of the index \"`2`\"."; +TensorTrace[ID_String[indices_String]] := Module[ + { + allowedLetters, + chars = Characters[indices], + count, + out, + pos, + tally, + toContract + }, + (* Check that the tensor exists. *) + CheckIfTensorExists[ID]; + (* Tally the indices, i.e. count the multiplicities of all distinct indices. *) + tally = Tally[chars]; + (* If no index appears twice, we do not need to take the trace. Just return the tensor as is. *) + If[ + Max[tally[[All, 2]]] < 2, + (* Then *) + Return[ID[indices]]; + ]; + (* We want to replace any repeated indices by contractions with the metric, so for each contraction, we will need an arbitrary index letter to sum upon. To ensure that there are no collisions with the indices given by the user, we use characters from an unused Unicode plane. *) + allowedLetters = CharacterRange["\|040000", "\|040100"]; + (* The list toContract will be populated with the index letters we are contracting. *) + toContract = {}; + count = 0; + Scan[ + ( + (* Check that no indices appear more than twice. *) + If[ + #[[2]] > 2, + (* Then *) + Message[TensorTrace::ErrorMoreThanTwo, indices, #[[1]]]; + Abort[]; + ]; + (* For each index that appears exactly twice, add it to the list of indices to contract, and replace it with a summation index. *) + If[ + #[[2]] == 2, + (* Then *) + count++; + pos = Position[chars, #[[1]]][[2, 1]]; + (* Each entry in toContract will be of the form {contracted letter, summation letter}. These will be the two indices used in the metric for each contracted index. *) + AppendTo[toContract, {chars[[pos]], allowedLetters[[count]]}]; + chars[[pos]] = allowedLetters[[count]]; + ]; + ) &, + tally + ]; + (* Start with the tensor we are taking the trace of, with the contracted indices replaced. *) + out = ID[StringJoin[chars]]; + (* Contract the metric with each traced index of this tensor. *) + Scan[ + (out = ContractTensors[TensorData[ID]["Metric"][StringJoin @@ #], out]) &, + toContract + ]; + Return[out]; +]; + + +(* Transform the components of a tensor, with the specified index configuration, from one coordinate system to another. Returns the new components as output. *) +TransformCoordinates::ErrorNoRules = "Rules for transforming coordinates from \"`1`\" to \"`2`\" have not been defined." +TransformCoordinates[ID_String, indices_List, sourceID_String, targetID_String] := Module[{ + allComponents, + ChristoffelJacobian, + dim, + inverseJacobian, + jacobian, + k, + newComponents, + newCoordSymbols, + newVars, + old, + oldComponents, + oldCoordSymbols, + oldVars, + rank, + sumVar1, + sumVar2, + sumVar3, + transRules + }, + (* Get the components of all existing representations. *) + allComponents = TensorData[ID]["Components"]; + (* If a representation in the desired coordinate system already exists, do nothing. *) + If[ + KeyExistsQ[allComponents, {indices, targetID}], + (* Then *) + Return[allComponents[{indices, targetID}]] + ]; + (* Get the components in the source coordinate system. *) + oldComponents = allComponents[{indices, sourceID}]; + (* Check that rules to transform from the source to the target coordinate system have been defined. *) + If[ + KeyExistsQ[TensorData[sourceID], "CoordTransformations"] && KeyExistsQ[TensorData[sourceID]["CoordTransformations"], targetID], + (* Then *) + transRules = TensorData[sourceID]["CoordTransformations"][targetID], + (* Else *) + Message[TransformCoordinates::ErrorNoRules, sourceID, targetID]; + Abort[]; + ]; + If[ + indices == {}, + (* Then *) + (* If the tensor is a scalar, simply transform its one component. *) + newComponents = TensorSimplify[oldComponents /. transRules], + (* Else *) + (* If the tensor is not a scalar, transform its components using contractions with the Jacobian. *) + (* Get the rank of the tensor, corresponding to the number of variables to use. *) + rank = ArrayDepth[oldComponents]; + (* Get the symbols (e.g. x, y, z) of the old and new coordinates, in terms of which the transformation is defined. *) + oldCoordSymbols = TensorData[sourceID]["Components"][{{1}, sourceID}]; + newCoordSymbols = TensorData[targetID]["Components"][{{1}, targetID}]; + (* Get the dimension of the coordinates. *) + dim = Length[oldCoordSymbols]; + (* Define the variables in terms of which to calculate the Jacobian. *) + oldVars = Unique[Table["old", {rank}]]; + newVars = Unique[Table["new", {rank}]]; + (* If the Jacobians have not been calculated yet, calculate them now. This is only for compatibility with v1.0. *) + If[ + !KeyExistsQ[TensorData[sourceID], "Jacobians"], + (* Then *) + TAddCoordTransformation[sourceID, targetID, transRules]; + ]; + (* Collect the Jacobians from the object's data. *) + jacobian = TensorData[sourceID]["Jacobians"][targetID]["Jacobian"]; + inverseJacobian = TensorData[sourceID]["Jacobians"][targetID]["InverseJacobian"]; + ChristoffelJacobian = TensorData[sourceID]["Jacobians"][targetID]["ChristoffelJacobian"]; + (* Calculate the new components by contracting each lower index with the Jacobian and each upper index with the inverse Jacobian. *) + newComponents = ( + Table[( + Sum[Product[ + Switch[ + indices[[k]], + -1, jacobian[[oldVars[[k]], newVars[[k]]]], + +1, inverseJacobian[[newVars[[k]], oldVars[[k]]]] + ], + {k, 1, rank} + ] * (oldComponents[[##]] &) @@ oldVars, ##] & + ) @@ ({#, 1, dim} &) /@ oldVars, ##] &) @@ ({#, 1, dim} &) /@ newVars /. transRules; + (* If the tensor object represents a Levi-Civita connection, then it does not transform like a tensor; we need to add an extra term to the transformation. Note that here we are using the class invariant which guarantees that the Christoffel symbols always have {1, -1, -1} as their default index configuration. *) + If[ + TensorData[ID]["Role"] === "Christoffel", + (* Then *) + newComponents += Table[ + Sum[ + inverseJacobian[[sumVar1, old]] * ChristoffelJacobian[[old, sumVar2, sumVar3]], + {old, 1, dim} + ], + {sumVar1, 1, dim}, + {sumVar2, 1, dim}, + {sumVar3, 1, dim} + ] /. transRules; + ]; + (* Simplify the result. *) + newComponents = TensorSimplify[newComponents]; + (* If the tensor is a metric, store the inverse metric and identity matrix for future use. *) + If[ + TensorData[ID]["Role"] === "Metric", + (* Then *) + If[ + indices == {-1, -1} && !KeyExistsQ[allComponents, {{+1, +1}, targetID}], + (* Then *) + allComponents[{{+1, +1}, targetID}] = TensorSimplify[Inverse[newComponents]] + ]; + If[ + indices == {+1, +1} && !KeyExistsQ[allComponents, {{-1, -1}, targetID}], + (* Then *) + allComponents[{{-1, -1}, targetID}] = TensorSimplify[Inverse[newComponents]] + ]; + allComponents[{{+1, -1}, targetID}] = IdentityMatrix[dim]; + allComponents[{{-1, +1}, targetID}] = IdentityMatrix[dim]; + ]; + ]; + (* Store the new components. *) + allComponents[{indices, targetID}] = newComponents; + ChangeTensorKey[ID, "Components", allComponents]; + Return[newComponents]; +]; + + +UpdateMessage = "Checking for updates..."; + + +(* Print a welcome message at startup. *) +OGRePrint[Column[{ + Style[Row[{"OGRe: An ", Style["O", Underlined], "bject-Oriented ", Style["G", Underlined], "eneral ", Style["Re", Underlined], "lativity Package for Mathematica"}], Bold, Larger], + Style[Row[{"By Barak Shoshany (", Hyperlink["baraksh@gmail.com", "mailto:baraksh@gmail.com"], ") (", Hyperlink["baraksh.com", "https://baraksh.com/"], ")"}], Bold], + Style[Row[{OGReVersion}], Bold], + Style[Row[{"GitHub repository: ", Hyperlink["https://github.com/bshoshany/OGRe"]}], Bold], + Row[{"\[Bullet] To view the full documentation for the package, type ", Style["TDocs[]", "Input"], " or ", CreateButton["click here.", TDocs[]]}], + Row[{"\[Bullet] To list all available modules, type ", Style["?OGRe`*", "Input"], " or ", CreateButton["click here.", OGRePrint[Information["OGRe`*"]]]}], + Row[{"\[Bullet] To get help on a particular module, type ", Style["?", "Input"], " followed by the module name."}], + Row[{"\[Bullet] To enable parallelization, type ", Style["TSetParallelization[True]", "Input"], " or ", CreateButton["click here.", TSetParallelization[True]]}], + Row[{"\[Bullet] ", Dynamic[UpdateMessage]}] +}]]; + + +SessionSubmit[StartupCheckForUpdates[]]; + + +End[]; (* OGRe`Private` *) + + +(* Protect all OGRe symbols so they will not be accidentally overwritten elsewhere. *) +Protect["OGRe`*"]; +Protect["OGRe`Private`*"]; + + +EndPackage[]; (* OGRe *) diff --git a/OGRe_Documentation.nb b/OGRe_Documentation.nb index 8feb344..25f84a7 100644 --- a/OGRe_Documentation.nb +++ b/OGRe_Documentation.nb @@ -27,7 +27,7 @@ Cell[TextData[{ ButtonData->{ URL["https://baraksh.com/"], None}, ButtonNote->"https://baraksh.com/"], - ")\nDocumentation for v1.3 (May 6, 2021)\n", + ")\nDocumentation for v1.4 (May 9, 2021)\n", ButtonBox["https://github.com/bshoshany/OGRe", BaseStyle->"Hyperlink", ButtonData->{ @@ -316,6 +316,17 @@ Cell[CellGroupData[{ Cell["Installing and loading the package", \ "Section",ExpressionUUID->"76adc5de-8d17-4c34-a097-3a90a7f33a36"], +Cell[TextData[{ + "This package is compatible with Mathematica 12.0 or newer, on any platform \ +(Windows, Linux, and Mac). It should also run on Mathematica 11 or 10, but \ +that has not been tested. The package will ", + StyleBox["not", + FontWeight->"Bold"], + " work on versions prior to Mathematica 10, due to extensive use of ", + StyleBox["Association", "Input"], + ", which was introduced in Mathematica 10.0." +}], "Text",ExpressionUUID->"d6706a4a-51cb-4114-aa8e-448a06c8d82c"], + Cell[TextData[{ "The package consists of only one file, ", StyleBox["OGRe.m", "Input"], @@ -452,7 +463,7 @@ Cell[BoxData[ FontWeight->Bold]}, { StyleBox[ - TemplateBox[{"\"v1.2 (April 28, 2021)\""}, + TemplateBox[{"\"v1.4 (2021-05-09)\""}, "RowDefault"], StripOnInput->False, FontWeight->Bold]}, @@ -465,25 +476,6 @@ Cell[BoxData[ "RowDefault"], StripOnInput->False, FontWeight->Bold]}, - { - TemplateBox[{ - "\"\[Bullet] To check if a new version is available, type \"", - StyleBox["\"TCheckForUpdates[]\"", "Input", StripOnInput -> False], - "\" or \"", - ButtonBox[ - TagBox[ - PaneSelectorBox[{ - False -> StyleBox[ - "\"click here.\"", "Hyperlink", StripOnInput -> False], True -> - StyleBox[ - "\"click here.\"", "HyperlinkActive", StripOnInput -> False]}, - Dynamic[ - CurrentValue["MouseOver"]], ImageSize -> Automatic, FrameMargins -> - 0], - MouseAppearanceTag["LinkHand"]], ButtonFunction :> - OGRe`TCheckForUpdates[], Appearance -> "Frameless", BaseStyle -> - "Hyperlink", Evaluator -> Automatic, Method -> "Preemptive"]}, - "RowDefault"]}, { TemplateBox[{ "\"\[Bullet] To view the full documentation for the package, type \"", @@ -526,9 +518,9 @@ Cell[BoxData[ "\" followed by the module name.\""}, "RowDefault"]}, { - TemplateBox[{ - "\"\[Bullet] To enable the new parallelization feature, type \"", - StyleBox["\"TParallelize[True]\"", "Input", StripOnInput -> False], + TemplateBox[{"\"\[Bullet] To enable parallelization, type \"", + StyleBox[ + "\"TSetParallelization[True]\"", "Input", StripOnInput -> False], "\" or \"", ButtonBox[ TagBox[ @@ -541,8 +533,13 @@ Cell[BoxData[ CurrentValue["MouseOver"]], ImageSize -> Automatic, FrameMargins -> 0], MouseAppearanceTag["LinkHand"]], ButtonFunction :> - OGRe`TParallelize[True], Appearance -> "Frameless", BaseStyle -> + OGRe`TSetParallelization[True], Appearance -> "Frameless", BaseStyle -> "Hyperlink", Evaluator -> Automatic, Method -> "Preemptive"]}, + "RowDefault"]}, + { + TemplateBox[{"\"\[Bullet] \"", + DynamicBox[ + ToBoxes[OGRe`Private`UpdateMessage, StandardForm]]}, "RowDefault"]} }, DefaultBaseStyle->"Column", @@ -552,7 +549,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"a1506ce5-1bd8-4f1b-82b0-abd14f19bc7b"] + CellLabel->"OGRe:",ExpressionUUID->"1b5217d3-7a75-4832-b793-dc07b90b3607"] }, Open ]], Cell["\<\ @@ -608,38 +605,38 @@ Cell[BoxData[ BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { "TAddCoordTransformation", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TCovariantD", "InformationGridButton"], + StyleBox["TChangeDefaultIndices", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TCovariantD", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TChangeDefaultIndices", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TImportAll", "InformationGridButton"], + StyleBox["TExportAll", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TImportAll", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TExportAll", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TParallelize", "InformationGridButton"], + StyleBox["TNewMetric", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TParallelize", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TNewMetric", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { @@ -649,284 +646,283 @@ Cell[BoxData[ BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { "TCalc", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TDelete", "InformationGridButton"], + StyleBox["TChangeID", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", - ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TDelete", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TChangeID", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TIndexLetters", "InformationGridButton"], + StyleBox["TGetComponents", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TIndexLetters", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TGetComponents", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TPartialD", "InformationGridButton"], + StyleBox["TNewTensor", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TPartialD", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TNewTensor", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TChangeDefaultCoords", "InformationGridButton"], + StyleBox["TCalcChristoffel", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TChangeDefaultCoords", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCalcChristoffel", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TDocs", "InformationGridButton"], + StyleBox["TChangeSymbol", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TDocs", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TChangeSymbol", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TInfo", "InformationGridButton"], + StyleBox["TImport", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TInfo", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TImport", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TRicciScalar", "InformationGridButton"], + StyleBox["TPartialD", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TRicciScalar", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TPartialD", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TChangeDefaultIndices", "InformationGridButton"], + StyleBox["TCalcEinsteinTensor", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TChangeDefaultIndices", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCalcEinsteinTensor", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TEinsteinTensor", "InformationGridButton"], + StyleBox["TCheckForUpdates", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TEinsteinTensor", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCheckForUpdates", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TInitializeSymbols", "InformationGridButton"], + StyleBox["TImportAll", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TInitializeSymbols", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TImportAll", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TRicciTensor", "InformationGridButton"], + StyleBox["TSetAssumptions", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TRicciTensor", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TSetAssumptions", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TChangeID", "InformationGridButton"], + StyleBox["TCalcRicciScalar", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TChangeID", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCalcRicciScalar", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TExport", "InformationGridButton"], + StyleBox["TCovariantD", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TExport", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCovariantD", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TList", "InformationGridButton"], + StyleBox["TInfo", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TList", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TInfo", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TRiemannTensor", "InformationGridButton"], + StyleBox["TSetIndexLetters", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TRiemannTensor", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TSetIndexLetters", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TChangeSymbol", "InformationGridButton"], + StyleBox["TCalcRicciTensor", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TChangeSymbol", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCalcRicciTensor", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TExportAll", "InformationGridButton"], + StyleBox["TDelete", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TExportAll", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TDelete", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TNewCoordinates", "InformationGridButton"], + StyleBox["TInitializeSymbols", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TNewCoordinates", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TInitializeSymbols", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TShow", "InformationGridButton"], + StyleBox["TSetParallelization", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TShow", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TSetParallelization", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TCheckForUpdates", "InformationGridButton"], + StyleBox["TCalcRiemannTensor", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TCheckForUpdates", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TCalcRiemannTensor", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TGetComponents", "InformationGridButton"], + StyleBox["TDocs", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TGetComponents", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TDocs", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TNewMetric", "InformationGridButton"], + StyleBox["TList", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TNewMetric", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TList", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TSimplify", "InformationGridButton"], + StyleBox["TShow", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TSimplify", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TShow", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]}, { ButtonBox[ - StyleBox["TChristoffel", "InformationGridButton"], + StyleBox["TChangeDefaultCoords", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TChristoffel", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TChangeDefaultCoords", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TImport", "InformationGridButton"], + StyleBox["TExport", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TImport", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TExport", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TNewTensor", "InformationGridButton"], + StyleBox["TNewCoordinates", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TNewTensor", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TNewCoordinates", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic], ButtonBox[ - StyleBox["TSimplifyAssumptions", "InformationGridButton"], + StyleBox["TSimplify", "InformationGridButton"], Appearance->None, BaseStyle->"InformationGridLink", ButtonData:>{ - "Info-27393ef9-c7a3-4fed-bc1c-5d00d124b1a5", { - "TSimplifyAssumptions", "OGRe`"}, False}, + "Info-9b8c6fe0-b3e1-4e0f-88c7-365a4ca41ceb", { + "TSimplify", "OGRe`"}, False}, ButtonNote->"OGRe`", Evaluator->Automatic]} }, @@ -952,7 +948,7 @@ Cell[BoxData[ Offset[0.8]}, Offset[0.2]}}], BaseStyle->"InformationTitleFrame"], "InformationGridPlain"]], "Output", - CellLabel->"Out[2]=",ExpressionUUID->"ab69aba3-0ff8-4044-8472-916024c2cf17"] + CellLabel->"Out[2]=",ExpressionUUID->"52d6627f-c5e1-451a-8e68-ab084e664f56"] }, Open ]], Cell[TextData[{ @@ -964,13 +960,12 @@ other packages." }], "Text",ExpressionUUID->"9d602f41-08f8-4fb8-a39a-d004d96a69b0"], Cell[TextData[{ - "If you are running the package from a local file, it is recommended to \ -periodically use the module ", + "When the package loads, it will automatically check the GitHub repository \ +for updates. This can also be done manually using the module ", StyleBox["TCheckForUpdates", "Input"], - " to check the GitHub repository for updates. If a new version of the \ -package has been released, you will be given the option to download or \ -install it in one click. If you are running the package directly from the \ -web, you will always be using the latest version." + ". If a new version of the package has been released, you will be given the \ +option to download or install it in one click. If you are running the package \ +directly from the web, you will always be using the latest version." }], "Text",ExpressionUUID->"b4bd036f-d51e-4dac-af95-956f329b18c9"], Cell[CellGroupData[{ @@ -1004,13 +999,12 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TCheckForUpdates\\\", \\\"[\\\", \\\"] \\\", \\\"checks the GitHub repository \ -for new versions of this package. If a new version is available, the user \ -will be given the option to download or install it.\\\"}]], \ -TextCell[Row[List[\\\"TCheckForUpdates\\\", \\\"[\\\", \\\"] \\\", \\\"checks \ -the GitHub repository for new versions of this package. If a new version is \ -available, the user will be given the option to download or install \ -it.\\\"]]]]\\)\"\>", "InformationUsageText", +TCheckForUpdates[] checks the GitHub repository for new versions of this \ +package. If a new version is available, the user will be given the option to \ +download or install it.\\\"}]], TextCell[Row[List[\\\"TCheckForUpdates[] \ +checks the GitHub repository for new versions of this package. If a new \ +version is available, the user will be given the option to download or \ +install it.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -1049,7 +1043,6 @@ it.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"OGRe`Private`errorMessage", "=", RowBox[{"Row", "[", RowBox[{"{", - RowBox[{ "\"Error: Failed to check for updates. Please visit \"", ",", @@ -1151,7 +1144,6 @@ downloading it.\"", ",", StyleBox[ RowBox[{"NotebookDirectory", "::", "nosv"}], "MessageName"], "]"}], ";", - RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -1189,11 +1181,11 @@ downloading it.\"", ",", RowBox[{ RowBox[{"NotebookDirectory", "[", "]"}], ",", "\"OGRe.m\""}], "}"}], "]"}], "]"}]}]}], "]"}]}], "}"}], - "]"}]}], "]"}], ";"}]}], "]"}], " ", + "]"}]}], "]"}], ";"}]}], "]"}], ";", RowBox[{"On", "[", StyleBox[ RowBox[{"NotebookDirectory", "::", "nosv"}], - "MessageName"], "]"}]}], ";", + "MessageName"], "]"}], ";", RowBox[{"AppendTo", "[", RowBox[{"OGRe`Private`toPrint", ",", RowBox[{"Row", "[", @@ -1361,13 +1353,12 @@ downloading it.\"", ",", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TCheckForUpdates\\\", \\\"[\\\", \\\"] \\\", \\\"checks the GitHub repository \ -for new versions of this package. If a new version is available, the user \ -will be given the option to download or install it.\\\"}]], \ -TextCell[Row[List[\\\"TCheckForUpdates\\\", \\\"[\\\", \\\"] \\\", \\\"checks \ -the GitHub repository for new versions of this package. If a new version is \ -available, the user will be given the option to download or install \ -it.\\\"]]]]\\)\"\>", "InformationUsageText", +TCheckForUpdates[] checks the GitHub repository for new versions of this \ +package. If a new version is available, the user will be given the option to \ +download or install it.\\\"}]], TextCell[Row[List[\\\"TCheckForUpdates[] \ +checks the GitHub repository for new versions of this package. If a new \ +version is available, the user will be given the option to download or \ +install it.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -1431,14 +1422,13 @@ it.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TCheckForUpdates\", \"[\", \"] \ -\", \"checks the GitHub repository for new versions of this package. If a new \ -version is available, the user will be given the option to download or \ -install it.\"}]], TextCell[Row[List[\"TCheckForUpdates\", \"[\", \"] \", \ -\"checks the GitHub repository for new versions of this package. If a new \ -version is available, the user will be given the option to download or \ -install it.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, - "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TCheckForUpdates[] checks the \ +GitHub repository for new versions of this package. If a new version is \ +available, the user will be given the option to download or install it.\"}]], \ +TextCell[Row[List[\"TCheckForUpdates[] checks the GitHub repository for new \ +versions of this package. If a new version is available, the user will be \ +given the option to download or install it.\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TCheckForUpdates, { OGRe`TCheckForUpdates[] :> @@ -1480,9 +1470,9 @@ it.", Get[OGRe`Private`OGReURL]]}]]; Off[ MessageName[NotebookDirectory, "nosv"]]; If[NotebookDirectory[] =!= $Failed, - AppendTo[OGRe`Private`toPrint, - Row[{"\[Bullet] ", - OGRe`Private`CreateButton[ + AppendTo[OGRe`Private`toPrint, + Row[{"\[Bullet] ", + OGRe`Private`CreateButton[ StringJoin["Download new version to ", FileNameJoin[{ NotebookDirectory[], "OGRe.m"}], @@ -1492,8 +1482,8 @@ it.", NotebookDirectory[], "OGRe.m"}]]; OGRe`Private`OGRePrint["Downloaded! Reloading..."]; Get[ FileNameJoin[{ - NotebookDirectory[], "OGRe.m"}]]]}]]; Null] On[ - MessageName[NotebookDirectory, "nosv"]]; + NotebookDirectory[], "OGRe.m"}]]]}]]; Null]; On[ + MessageName[NotebookDirectory, "nosv"]]; AppendTo[OGRe`Private`toPrint, Row[{"\[Bullet] ", OGRe`Private`CreateButton[ @@ -1514,7 +1504,7 @@ it.", "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TCheckForUpdates"], False]]], "Output", - CellLabel->"Out[3]=",ExpressionUUID->"b63c10ae-098a-4609-92c3-7bb47ff36736"] + CellLabel->"Out[3]=",ExpressionUUID->"ee665b4d-37ab-460e-b4ae-d772fee549d3"] }, Open ]], Cell[TextData[{ @@ -1555,13 +1545,12 @@ Cell[BoxData[ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TDocs\ -\\\", \\\"[\\\", \\\"] \\\", \\\" opens the Mathematica notebook \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TDocs[\ +] opens the Mathematica notebook OGRe_Documentation.nb from the GitHub \ +repository, which contains the full documentation for the package.\\\"}]], \ +TextCell[Row[List[\\\"TDocs[] opens the Mathematica notebook \ OGRe_Documentation.nb from the GitHub repository, which contains the full \ -documentation for the package.\\\"}]], TextCell[Row[List[\\\"TDocs\\\", \\\"[\ -\\\", \\\"] \\\", \\\" opens the Mathematica notebook OGRe_Documentation.nb \ -from the GitHub repository, which contains the full documentation for the \ -package.\\\"]]]]\\)\"\>", "InformationUsageText", +documentation for the package.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -1701,6 +1690,7 @@ master/OGRe_Documentation.nb\"", "]"}], "===", "$Failed"}], ",", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], + EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -1737,13 +1727,12 @@ master/OGRe_Documentation.nb\"", "]"}], "===", "$Failed"}], ",", ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TDocs\ -\\\", \\\"[\\\", \\\"] \\\", \\\" opens the Mathematica notebook \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TDocs[\ +] opens the Mathematica notebook OGRe_Documentation.nb from the GitHub \ +repository, which contains the full documentation for the package.\\\"}]], \ +TextCell[Row[List[\\\"TDocs[] opens the Mathematica notebook \ OGRe_Documentation.nb from the GitHub repository, which contains the full \ -documentation for the package.\\\"}]], TextCell[Row[List[\\\"TDocs\\\", \\\"[\ -\\\", \\\"] \\\", \\\" opens the Mathematica notebook OGRe_Documentation.nb \ -from the GitHub repository, which contains the full documentation for the \ -package.\\\"]]]]\\)\"\>", "InformationUsageText", +documentation for the package.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -1807,13 +1796,13 @@ package.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TDocs\", \"[\", \"] \", \" \ -opens the Mathematica notebook OGRe_Documentation.nb from the GitHub \ -repository, which contains the full documentation for the package.\"}]], \ -TextCell[Row[List[\"TDocs\", \"[\", \"] \", \" opens the Mathematica notebook \ -OGRe_Documentation.nb from the GitHub repository, which contains the full \ -documentation for the package.\"]]]]\)", "Documentation" -> None, "OwnValues" -> - None, "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TDocs[] opens the Mathematica \ +notebook OGRe_Documentation.nb from the GitHub repository, which contains the \ +full documentation for the package.\"}]], TextCell[Row[List[\"TDocs[] opens \ +the Mathematica notebook OGRe_Documentation.nb from the GitHub repository, \ +which contains the full documentation for the package.\"]]]]\)", + "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, + "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TDocs, { OGRe`TDocs[] :> @@ -1829,7 +1818,7 @@ Documentation.nb"] === $Failed, "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TDocs"], False]]], "Output", - CellLabel->"Out[4]=",ExpressionUUID->"98a2b0d5-64ae-4a4d-b3c7-8589ac8d7451"] + CellLabel->"Out[4]=",ExpressionUUID->"cdc006e0-6711-401f-9a87-d8d9cf4c7629"] }, Open ]] }, Open ]], @@ -1896,27 +1885,23 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewCoordinates\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbols\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\"] \\\", \\\"creates a new tensor object representing a coordinate system.\\\ -\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ +TNewCoordinates[\\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"symbols\\\", Bold, \ +Rule[StripOnInput, False]], \\\"], creates a new tensor object representing a \ +coordinate system.\\\\n\\\", StyleBox[\\\"coordinatesID\\\", Bold, \ Rule[StripOnInput, False]], \\\" is a string that will be used to identify \ -the new object, and must be unique. If a tensor object with the same ID \ -already exists, it will be overwritten.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"symbols\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be \ -cleared and protected against future changes using TInitializeSymbols[ \ -].\\\"}]], TextCell[Row[List[\\\"TNewCoordinates\\\", \\\"[\\\", \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[symbols, Bold], \\\ -\"] \\\", \\\"creates a new tensor object representing a coordinate system.\\\ -\\n\\\", Style[coordinatesID, Bold], \\\" is a string that will be used to \ -identify the new object, and must be unique. If a tensor object with the same \ -ID already exists, it will be overwritten.\\\\n\\\", Style[symbols, Bold], \\\ -\" are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be \ -cleared and protected against future changes using TInitializeSymbols[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +the new object, and must be unique.\\\\n\\\", StyleBox[\\\"symbols\\\", Bold, \ +Rule[StripOnInput, False]], \\\" are the coordinate symbols, e.g. {t, x, y, \ +z}. They will automatically be cleared and protected against future changes \ +using TInitializeSymbols[].\\\"}]], \ +TextCell[Row[List[\\\"TNewCoordinates[\\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\", \\\", Style[\\\"symbols\\\", Bold], \\\"], creates a new tensor \ +object representing a coordinate system.\\\\n\\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\" is a string that will be used to \ +identify the new object, and must be unique.\\\\n\\\", Style[\\\"symbols\\\", \ +Bold], \\\" are the coordinate symbols, e.g. {t, x, y, z}. They will \ +automatically be cleared and protected against future changes using \ +TInitializeSymbols[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -1950,6 +1935,10 @@ cleared and protected against future changes using TInitializeSymbols[ \ "]"}], ":=", RowBox[{"(", RowBox[{ + + RowBox[{ + "OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`coordinatesID", "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{"OGRe`Private`coordinates", "\[Equal]", @@ -1976,6 +1965,7 @@ cleared and protected against future changes using TInitializeSymbols[ \ RowBox[{"{", "1", "}"}], ",", "OGRe`Private`coordinatesID"}], "}"}], "\[Rule]", "OGRe`Private`coordinates"}], "]"}]}], ",", + RowBox[{"\"DefaultCoords\"", "\[Rule]", "OGRe`Private`coordinatesID"}], ",", RowBox[{"\"DefaultIndices\"", "\[Rule]", @@ -2070,6 +2060,7 @@ cleared and protected against future changes using TInitializeSymbols[ \ System`InformationDump`mouseOver$$]], Alignment->Left, Appearance->{"Default" -> None}, + ButtonFunction:>FEPrivate`Set[ System`InformationDump`open$$, False], Evaluator->Automatic, @@ -2115,27 +2106,23 @@ cleared and protected against future changes using TInitializeSymbols[ \ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewCoordinates\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbols\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\"] \\\", \\\"creates a new tensor object representing a coordinate system.\\\ -\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ +TNewCoordinates[\\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"symbols\\\", Bold, \ +Rule[StripOnInput, False]], \\\"], creates a new tensor object representing a \ +coordinate system.\\\\n\\\", StyleBox[\\\"coordinatesID\\\", Bold, \ Rule[StripOnInput, False]], \\\" is a string that will be used to identify \ -the new object, and must be unique. If a tensor object with the same ID \ -already exists, it will be overwritten.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"symbols\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be \ -cleared and protected against future changes using TInitializeSymbols[ \ -].\\\"}]], TextCell[Row[List[\\\"TNewCoordinates\\\", \\\"[\\\", \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[symbols, Bold], \\\ -\"] \\\", \\\"creates a new tensor object representing a coordinate system.\\\ -\\n\\\", Style[coordinatesID, Bold], \\\" is a string that will be used to \ -identify the new object, and must be unique. If a tensor object with the same \ -ID already exists, it will be overwritten.\\\\n\\\", Style[symbols, Bold], \\\ -\" are the coordinate symbols, e.g. {t, x, y, z}. They will automatically be \ -cleared and protected against future changes using TInitializeSymbols[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +the new object, and must be unique.\\\\n\\\", StyleBox[\\\"symbols\\\", Bold, \ +Rule[StripOnInput, False]], \\\" are the coordinate symbols, e.g. {t, x, y, \ +z}. They will automatically be cleared and protected against future changes \ +using TInitializeSymbols[].\\\"}]], \ +TextCell[Row[List[\\\"TNewCoordinates[\\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\", \\\", Style[\\\"symbols\\\", Bold], \\\"], creates a new tensor \ +object representing a coordinate system.\\\\n\\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\" is a string that will be used to \ +identify the new object, and must be unique.\\\\n\\\", Style[\\\"symbols\\\", \ +Bold], \\\" are the coordinate symbols, e.g. {t, x, y, z}. They will \ +automatically be cleared and protected against future changes using \ +TInitializeSymbols[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -2199,27 +2186,23 @@ cleared and protected against future changes using TInitializeSymbols[ \ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TNewCoordinates\", \"[\", \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"symbols\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"creates a new tensor object representing a coordinate system.\\n\", \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\" is a string that will be used to identify the new object, and must be \ -unique. If a tensor object with the same ID already exists, it will be \ -overwritten.\\n\", StyleBox[Cell[BoxData[\"symbols\"]], Bold, \ -Rule[StripOnInput, False]], \" are the coordinate symbols, e.g. {t, x, y, z}. \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TNewCoordinates[\", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"symbols\", Bold, Rule[StripOnInput, False]], \"], creates a new \ +tensor object representing a coordinate system.\\n\", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \" is a string \ +that will be used to identify the new object, and must be unique.\\n\", \ +StyleBox[\"symbols\", Bold, Rule[StripOnInput, False]], \" are the coordinate \ +symbols, e.g. {t, x, y, z}. They will automatically be cleared and protected \ +against future changes using TInitializeSymbols[].\"}]], \ +TextCell[Row[List[\"TNewCoordinates[\", Style[\"coordinatesID\", Bold], \", \ +\", Style[\"symbols\", Bold], \"], creates a new tensor object representing a \ +coordinate system.\\n\", Style[\"coordinatesID\", Bold], \" is a string that \ +will be used to identify the new object, and must be unique.\\n\", \ +Style[\"symbols\", Bold], \" are the coordinate symbols, e.g. {t, x, y, z}. \ They will automatically be cleared and protected against future changes using \ -TInitializeSymbols[ ].\"}]], TextCell[Row[List[\"TNewCoordinates\", \"[\", \ -Style[coordinatesID, Bold], Style[\", \", Bold], Style[symbols, Bold], \"] \ -\", \"creates a new tensor object representing a coordinate system.\\n\", \ -Style[coordinatesID, Bold], \" is a string that will be used to identify the \ -new object, and must be unique. If a tensor object with the same ID already \ -exists, it will be overwritten.\\n\", Style[symbols, Bold], \" are the \ -coordinate symbols, e.g. {t, x, y, z}. They will automatically be cleared and \ -protected against future changes using TInitializeSymbols[ ].\"]]]]\)", - "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> +TInitializeSymbols[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TNewCoordinates, {OGRe`TNewCoordinates[ Pattern[OGRe`Private`coordinatesID, @@ -2227,6 +2210,7 @@ protected against future changes using TInitializeSymbols[ ].\"]]]]\)", PatternTest[ Pattern[OGRe`Private`coordinates, Blank[List]], VectorQ]] :> ( + OGRe`Private`CheckIfOverwriting[OGRe`Private`coordinatesID]; If[OGRe`Private`coordinates == {}, Message[ MessageName[OGRe`TNewCoordinates, "ErrorEmptyList"]]; Abort[]]; Apply[OGRe`TInitializeSymbols, @@ -2242,7 +2226,7 @@ protected against future changes using TInitializeSymbols[ ].\"]]]]\)", "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {HoldRest, Protected}, "FullName" -> "OGRe`TNewCoordinates"], False]]], "Output", - CellLabel->"Out[5]=",ExpressionUUID->"b20ce5bb-3545-4dac-8def-0bb1dc24a163"] + CellLabel->"Out[5]=",ExpressionUUID->"f3a0769b-a7fb-4929-a5df-5d2de87d6dcc"] }, Open ]], Cell[TextData[{ @@ -2262,7 +2246,7 @@ Cell[BoxData[ CellLabel->"In[6]:=",ExpressionUUID->"bf0ee47f-8412-4480-9d9a-7613acf6b654"], Cell[BoxData["\<\"Cartesian\"\>"], "Output", - CellLabel->"Out[6]=",ExpressionUUID->"fa092d73-17d6-4477-9fde-010eeba750b0"] + CellLabel->"Out[6]=",ExpressionUUID->"72252d9c-3820-4cd7-a8ef-b198229033f4"] }, Open ]], Cell[TextData[{ @@ -2272,11 +2256,12 @@ Cell[TextData[{ ". This is the string that we will use to refer to this tensor from now on, \ and it will also be displayed whenever we print the tensor. The ID string is \ case-sensitive, can include any characters, and can be of any length, but it \ -is recommended to keep it short and simple. If we create another tensor \ -object with the same ID, the previous definition will be overwritten. Note \ -that the ID string is also the return value of the module; generally, all \ -modules that operate on a tensor object will return its ID string as output. \ -This allows us to compose different modules together, as we will see below." +is recommended to keep it short and simple. Once a tensor object is created, \ +you cannot create another tensor object with the same ID unless you rename or \ +delete it first (see below). Note that the ID string is also the return value \ +of the module; generally, all modules that operate on a tensor object will \ +return its ID string as output. This allows us to compose different modules \ +together, as we will see below." }], "Text",ExpressionUUID->"8f3d6bc8-3221-4efa-8952-689cb5c9a4d7"], Cell["\<\ @@ -2298,7 +2283,7 @@ Cell[BoxData[ CellLabel->"In[7]:=",ExpressionUUID->"c9cea4a6-1ebb-4b7d-9ecd-32a9c3663376"], Cell[BoxData["\<\"Spherical\"\>"], "Output", - CellLabel->"Out[7]=",ExpressionUUID->"1b99bfcc-af67-4443-912b-c7701bccbd0d"] + CellLabel->"Out[7]=",ExpressionUUID->"e465455a-a456-4a51-b573-5f677f43b8a6"] }, Open ]], Cell[TextData[{ @@ -2372,22 +2357,20 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TInitializeSymbols\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"symbol1\\\"]], \ -Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, \ -Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"symbol2\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\"...\\\", Bold, Rule[StripOnInput, False]], \\\"] \\\", \ -\\\"clears any definitions previously used for the given symbols and protects \ -them against future changes.\\\\nUseful for making sure coordinate variables, \ -constants, and abstract functions used in tensors do not accidentally change \ -their definitions and break the code.\\\"}]], \ -TextCell[Row[List[\\\"TInitializeSymbols\\\", \\\"[\\\", Style[symbol1, \ -Bold], Style[\\\", \\\", Bold], Style[symbol2, Bold], Style[\\\", \\\", \ -Bold], Style[\\\"...\\\", Bold], \\\"] \\\", \\\"clears any definitions \ -previously used for the given symbols and protects them against future \ -changes.\\\\nUseful for making sure coordinate variables, constants, and \ -abstract functions used in tensors do not accidentally change their \ -definitions and break the code.\\\"]]]]\\)\"\>", "InformationUsageText", +TInitializeSymbols[\\\", StyleBox[\\\"symbol1\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"symbol2\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"...\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] clears any definitions previously used for the given symbols and \ +protects them against future changes. Useful for making sure coordinate \ +variables, parameters, and abstract functions used in tensors do not \ +accidentally change their definitions and break the code.\\\"}]], \ +TextCell[Row[List[\\\"TInitializeSymbols[\\\", Style[\\\"symbol1\\\", Bold], \ +\\\", \\\", Style[\\\"symbol2\\\", Bold], \\\", \\\", Style[\\\"...\\\", \ +Bold], \\\"] clears any definitions previously used for the given symbols and \ +protects them against future changes. Useful for making sure coordinate \ +variables, parameters, and abstract functions used in tensors do not \ +accidentally change their definitions and break the code.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -2502,7 +2485,6 @@ definitions and break the code.\\\"]]]]\\)\"\>", "InformationUsageText", DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpener"]], True-> - DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpenerHot"]]}, Dynamic[ System`InformationDump`mouseOver$$]], @@ -2554,22 +2536,20 @@ definitions and break the code.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TInitializeSymbols\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"symbol1\\\"]], \ -Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, \ -Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"symbol2\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\"...\\\", Bold, Rule[StripOnInput, False]], \\\"] \\\", \ -\\\"clears any definitions previously used for the given symbols and protects \ -them against future changes.\\\\nUseful for making sure coordinate variables, \ -constants, and abstract functions used in tensors do not accidentally change \ -their definitions and break the code.\\\"}]], \ -TextCell[Row[List[\\\"TInitializeSymbols\\\", \\\"[\\\", Style[symbol1, \ -Bold], Style[\\\", \\\", Bold], Style[symbol2, Bold], Style[\\\", \\\", \ -Bold], Style[\\\"...\\\", Bold], \\\"] \\\", \\\"clears any definitions \ -previously used for the given symbols and protects them against future \ -changes.\\\\nUseful for making sure coordinate variables, constants, and \ -abstract functions used in tensors do not accidentally change their \ -definitions and break the code.\\\"]]]]\\)\"\>", "InformationUsageText", +TInitializeSymbols[\\\", StyleBox[\\\"symbol1\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"symbol2\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"...\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] clears any definitions previously used for the given symbols and \ +protects them against future changes. Useful for making sure coordinate \ +variables, parameters, and abstract functions used in tensors do not \ +accidentally change their definitions and break the code.\\\"}]], \ +TextCell[Row[List[\\\"TInitializeSymbols[\\\", Style[\\\"symbol1\\\", Bold], \ +\\\", \\\", Style[\\\"symbol2\\\", Bold], \\\", \\\", Style[\\\"...\\\", \ +Bold], \\\"] clears any definitions previously used for the given symbols and \ +protects them against future changes. Useful for making sure coordinate \ +variables, parameters, and abstract functions used in tensors do not \ +accidentally change their definitions and break the code.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -2633,20 +2613,18 @@ definitions and break the code.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TInitializeSymbols\", \"[\", \ -StyleBox[Cell[BoxData[\"symbol1\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"symbol2\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], StyleBox[\"...\", Bold, \ -Rule[StripOnInput, False]], \"] \", \"clears any definitions previously used \ -for the given symbols and protects them against future changes.\\nUseful for \ -making sure coordinate variables, constants, and abstract functions used in \ -tensors do not accidentally change their definitions and break the \ -code.\"}]], TextCell[Row[List[\"TInitializeSymbols\", \"[\", Style[symbol1, \ -Bold], Style[\", \", Bold], Style[symbol2, Bold], Style[\", \", Bold], Style[\ -\"...\", Bold], \"] \", \"clears any definitions previously used for the \ -given symbols and protects them against future changes.\\nUseful for making \ -sure coordinate variables, constants, and abstract functions used in tensors \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TInitializeSymbols[\", \ +StyleBox[\"symbol1\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"symbol2\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"...\", Bold, Rule[StripOnInput, False]], \"] clears any \ +definitions previously used for the given symbols and protects them against \ +future changes. Useful for making sure coordinate variables, parameters, and \ +abstract functions used in tensors do not accidentally change their \ +definitions and break the code.\"}]], TextCell[Row[List[\"TInitializeSymbols[\ +\", Style[\"symbol1\", Bold], \", \", Style[\"symbol2\", Bold], \", \", \ +Style[\"...\", Bold], \"] clears any definitions previously used for the \ +given symbols and protects them against future changes. Useful for making \ +sure coordinate variables, parameters, and abstract functions used in tensors \ do not accidentally change their definitions and break the code.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> @@ -2659,7 +2637,7 @@ do not accidentally change their definitions and break the code.\"]]]]\)", None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {HoldAll, Protected}, "FullName" -> "OGRe`TInitializeSymbols"], False]]], "Output", - CellLabel->"Out[8]=",ExpressionUUID->"2504f1e0-ca98-495b-b443-c16bb8118f29"] + CellLabel->"Out[8]=",ExpressionUUID->"26cee03e-b35f-4451-bd31-3b8d9d6a2668"] }, Open ]], Cell[TextData[{ @@ -2679,14 +2657,14 @@ Cell[BoxData[ Cell[BoxData[ TemplateBox[{ "Set", "wrsym", "\"Symbol \\!\\(\\*RowBox[{\\\"r\\\"}]\\) is Protected.\"", - 2, 9, 1, 26988534644047075405, "Local"}, + 2, 9, 1, 26994801196498307137, "Local"}, "MessageTemplate"]], "Message", "MSG", CellLabel-> "During evaluation of \ -In[9]:=",ExpressionUUID->"22487fa1-867f-4196-b976-caa7d2eb098c"], +In[9]:=",ExpressionUUID->"77b9ea05-f3b5-42dd-90f7-77fae0b56a96"], Cell[BoxData["1"], "Output", - CellLabel->"Out[9]=",ExpressionUUID->"fe98fc73-f8fc-4558-a122-2ff77574df05"] + CellLabel->"Out[9]=",ExpressionUUID->"2daa81ee-b21d-498d-8047-da20251a192c"] }, Open ]], Cell[TextData[{ @@ -2745,38 +2723,34 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewMetric\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"components\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"creates a new tensor object representing a metric.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is a string that will be used to identify the new object, and must be \ -unique. If a tensor object with the same ID already exists, it will be \ -overwritten.\\\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ].\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"components\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is a square matrix representing the metric with two lower indices in \ -that coordinate system.\\\\n\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" will be used to represent the metric \ -in formulas. If not given, \\\\\\\"g\\\\\\\" will be used.\\\"}]], \ -TextCell[Row[List[\\\"TNewMetric\\\", \\\"[\\\", Style[metricID, Bold], \ -Style[\\\", \\\", Bold], Style[coordinatesID, Bold], Style[\\\", \\\", Bold], \ -Style[components, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \ -\\\", \\\"creates a new tensor object representing a metric.\\\\n\\\", \ -Style[metricID, Bold], \\\" is a string that will be used to identify the new \ -object, and must be unique. If a tensor object with the same ID already \ -exists, it will be overwritten.\\\\n\\\", Style[coordinatesID, Bold], \\\" is \ -the unique ID of a tensor object representing a coordinate system, created \ -using TNewCoordinates[ ].\\\\n\\\", Style[components, Bold], \\\" is a square \ +TNewMetric[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\ +\", \\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\"} \ +creates a new tensor object representing a metric.\\\\n\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" is a string \ +that will be used to identify the new object, and must be unique.\\\\n\\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\" is the \ +unique ID of a tensor object representing a coordinate system, created using \ +TNewCoordinates[].\\\\n\\\", StyleBox[\\\"components\\\", Bold, \ +Rule[StripOnInput, False]], \\\" is a square, symmetric, and invertible \ matrix representing the metric with two lower indices in that coordinate \ -system.\\\\n\\\", Style[symbol, Bold], \\\" will be used to represent the \ -metric in formulas. If not given, \\\\\\\"g\\\\\\\" will be \ -used.\\\"]]]]\\)\"\>", "InformationUsageText", +system.\\\\n\\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be used to represent the metric in formulas. If not given, \ +\\\\\\\"g\\\\\\\" will be used.\\\"}]], \ +TextCell[Row[List[\\\"TNewMetric[\\\", Style[\\\"metricID\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\", \\\", \ +Style[\\\"components\\\", Bold], \\\", \\\", Style[\\\"symbol\\\", Bold], \ +\\\"} creates a new tensor object representing a metric.\\\\n\\\", \ +Style[\\\"metricID\\\", Bold], \\\" is a string that will be used to identify \ +the new object, and must be unique.\\\\n\\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\" is the unique ID of a tensor object representing a coordinate \ +system, created using TNewCoordinates[].\\\\n\\\", Style[\\\"components\\\", \ +Bold], \\\" is a square, symmetric, and invertible matrix representing the \ +metric with two lower indices in that coordinate system.\\\\n\\\", \ +Style[\\\"symbol\\\", Bold], \\\" will be used to represent the metric in \ +formulas. If not given, \\\\\\\"g\\\\\\\" will be used.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -2820,6 +2794,9 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", "OGRe`Private`simplified"}], "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`metricID", "]"}], ";", + RowBox[{"OGRe`Private`CheckIfTensorExists", "[", "OGRe`Private`coordinatesID", "]"}], ";", @@ -2829,7 +2806,6 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"OGRe`Private`TensorSimplify", "[", "OGRe`Private`components", "]"}]}], ";", - RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{"!", @@ -2841,7 +2817,7 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", StyleBox[ RowBox[{"TNewMetric", "::", "ErrorNotSquare"}], "MessageName"], "]"}], ";", - RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], " ", + RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{"OGRe`Private`dim", "\[NotEqual]", @@ -2862,7 +2838,7 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", StyleBox[ RowBox[{"TNewMetric", "::", "ErrorIncorrectDim"}], "MessageName"], "]"}], ";", - RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}]}], ";", + RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{"!", @@ -3085,38 +3061,34 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewMetric\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"components\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"creates a new tensor object representing a metric.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is a string that will be used to identify the new object, and must be \ -unique. If a tensor object with the same ID already exists, it will be \ -overwritten.\\\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ].\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"components\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is a square matrix representing the metric with two lower indices in \ -that coordinate system.\\\\n\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" will be used to represent the metric \ -in formulas. If not given, \\\\\\\"g\\\\\\\" will be used.\\\"}]], \ -TextCell[Row[List[\\\"TNewMetric\\\", \\\"[\\\", Style[metricID, Bold], \ -Style[\\\", \\\", Bold], Style[coordinatesID, Bold], Style[\\\", \\\", Bold], \ -Style[components, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \ -\\\", \\\"creates a new tensor object representing a metric.\\\\n\\\", \ -Style[metricID, Bold], \\\" is a string that will be used to identify the new \ -object, and must be unique. If a tensor object with the same ID already \ -exists, it will be overwritten.\\\\n\\\", Style[coordinatesID, Bold], \\\" is \ -the unique ID of a tensor object representing a coordinate system, created \ -using TNewCoordinates[ ].\\\\n\\\", Style[components, Bold], \\\" is a square \ +TNewMetric[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\ +\", \\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\"} \ +creates a new tensor object representing a metric.\\\\n\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" is a string \ +that will be used to identify the new object, and must be unique.\\\\n\\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\" is the \ +unique ID of a tensor object representing a coordinate system, created using \ +TNewCoordinates[].\\\\n\\\", StyleBox[\\\"components\\\", Bold, \ +Rule[StripOnInput, False]], \\\" is a square, symmetric, and invertible \ matrix representing the metric with two lower indices in that coordinate \ -system.\\\\n\\\", Style[symbol, Bold], \\\" will be used to represent the \ -metric in formulas. If not given, \\\\\\\"g\\\\\\\" will be \ -used.\\\"]]]]\\)\"\>", "InformationUsageText", +system.\\\\n\\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be used to represent the metric in formulas. If not given, \ +\\\\\\\"g\\\\\\\" will be used.\\\"}]], \ +TextCell[Row[List[\\\"TNewMetric[\\\", Style[\\\"metricID\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\", \\\", \ +Style[\\\"components\\\", Bold], \\\", \\\", Style[\\\"symbol\\\", Bold], \ +\\\"} creates a new tensor object representing a metric.\\\\n\\\", \ +Style[\\\"metricID\\\", Bold], \\\" is a string that will be used to identify \ +the new object, and must be unique.\\\\n\\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\" is the unique ID of a tensor object representing a coordinate \ +system, created using TNewCoordinates[].\\\\n\\\", Style[\\\"components\\\", \ +Bold], \\\" is a square, symmetric, and invertible matrix representing the \ +metric with two lower indices in that coordinate system.\\\\n\\\", \ +Style[\\\"symbol\\\", Bold], \\\" will be used to represent the metric in \ +formulas. If not given, \\\\\\\"g\\\\\\\" will be used.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -3141,6 +3113,7 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", System`InformationDump`mouseOver$$]], Alignment->Left, Appearance->{"Default" -> None}, + ButtonFunction:>FEPrivate`Set[ System`InformationDump`open$$, True], Evaluator->Automatic, @@ -3179,37 +3152,31 @@ used.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TNewMetric\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"components\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"creates a new tensor object representing a metric.\\n\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" is \ -a string that will be used to identify the new object, and must be unique. If \ -a tensor object with the same ID already exists, it will be \ -overwritten.\\n\", StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TNewMetric[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"components\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"symbol\", Bold, Rule[StripOnInput, False]], \"} creates a new \ +tensor object representing a metric.\\n\", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" is a string that will be used to identify the \ +new object, and must be unique.\\n\", StyleBox[\"coordinatesID\", Bold, \ Rule[StripOnInput, False]], \" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ].\\n\", \ -StyleBox[Cell[BoxData[\"components\"]], Bold, Rule[StripOnInput, False]], \" \ -is a square matrix representing the metric with two lower indices in that \ -coordinate system.\\n\", StyleBox[Cell[BoxData[\"symbol\"]], Bold, \ +representing a coordinate system, created using TNewCoordinates[].\\n\", \ +StyleBox[\"components\", Bold, Rule[StripOnInput, False]], \" is a square, \ +symmetric, and invertible matrix representing the metric with two lower \ +indices in that coordinate system.\\n\", StyleBox[\"symbol\", Bold, \ Rule[StripOnInput, False]], \" will be used to represent the metric in \ formulas. If not given, \\\"g\\\" will be used.\"}]], \ -TextCell[Row[List[\"TNewMetric\", \"[\", Style[metricID, Bold], Style[\", \", \ -Bold], Style[coordinatesID, Bold], Style[\", \", Bold], Style[components, \ -Bold], Style[\", \", Bold], Style[symbol, Bold], \"] \", \"creates a new \ -tensor object representing a metric.\\n\", Style[metricID, Bold], \" is a \ -string that will be used to identify the new object, and must be unique. If a \ -tensor object with the same ID already exists, it will be overwritten.\\n\", \ -Style[coordinatesID, Bold], \" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ].\\n\", \ -Style[components, Bold], \" is a square matrix representing the metric with \ -two lower indices in that coordinate system.\\n\", Style[symbol, Bold], \" \ -will be used to represent the metric in formulas. If not given, \\\"g\\\" \ +TextCell[Row[List[\"TNewMetric[\", Style[\"metricID\", Bold], \", \", \ +Style[\"coordinatesID\", Bold], \", \", Style[\"components\", Bold], \", \", \ +Style[\"symbol\", Bold], \"} creates a new tensor object representing a \ +metric.\\n\", Style[\"metricID\", Bold], \" is a string that will be used to \ +identify the new object, and must be unique.\\n\", Style[\"coordinatesID\", \ +Bold], \" is the unique ID of a tensor object representing a coordinate \ +system, created using TNewCoordinates[].\\n\", Style[\"components\", Bold], \ +\" is a square, symmetric, and invertible matrix representing the metric with \ +two lower indices in that coordinate system.\\n\", Style[\"symbol\", Bold], \ +\" will be used to represent the metric in formulas. If not given, \\\"g\\\" \ will be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ @@ -3225,18 +3192,19 @@ will be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, Blank[String]], "g"]] :> Module[{OGRe`Private`dim = Length[OGRe`Private`components], OGRe`Private`inverse, OGRe`Private`simplified}, + OGRe`Private`CheckIfOverwriting[OGRe`Private`metricID]; OGRe`Private`CheckIfTensorExists[OGRe`Private`coordinatesID]; OGRe`Private`CheckIfCoordinates[OGRe`Private`coordinatesID]; OGRe`Private`simplified = OGRe`Private`TensorSimplify[OGRe`Private`components]; If[ - Not[ - SquareMatrixQ[OGRe`Private`simplified]], Message[ - MessageName[OGRe`TNewMetric, "ErrorNotSquare"]]; Abort[]; Null] - If[OGRe`Private`dim != Length[ - OGRe`Private`TensorData[OGRe`Private`coordinatesID][ - "Components"][{{1}, OGRe`Private`coordinatesID}]], Message[ - MessageName[OGRe`TNewMetric, "ErrorIncorrectDim"]]; Abort[]; - Null]; If[ + Not[ + SquareMatrixQ[OGRe`Private`simplified]], Message[ + MessageName[OGRe`TNewMetric, "ErrorNotSquare"]]; Abort[]; Null]; + If[OGRe`Private`dim != Length[ + OGRe`Private`TensorData[OGRe`Private`coordinatesID][ + "Components"][{{1}, OGRe`Private`coordinatesID}]], Message[ + MessageName[OGRe`TNewMetric, "ErrorIncorrectDim"]]; Abort[]; + Null]; If[ Not[ SymmetricMatrixQ[OGRe`Private`simplified]], Message[ MessageName[OGRe`TNewMetric, "ErrorNotSymmetric"]]; Abort[]; @@ -3265,7 +3233,7 @@ will be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TNewMetric"], False]]], "Output", - CellLabel->"Out[10]=",ExpressionUUID->"a4f7e472-a963-4ac7-b317-260592d5e0fe"] + CellLabel->"Out[10]=",ExpressionUUID->"ae5d1cad-da48-4270-aa7c-dd29068dcfe5"] }, Open ]], Cell[TextData[{ @@ -3301,7 +3269,7 @@ Cell[BoxData[ CellLabel->"In[11]:=",ExpressionUUID->"f65432d6-6d14-4b78-8ec0-23c513bf794b"], Cell[BoxData["\<\"Minkowski\"\>"], "Output", - CellLabel->"Out[11]=",ExpressionUUID->"12418598-3653-4799-8fcc-3ceb4b2e6ca0"] + CellLabel->"Out[11]=",ExpressionUUID->"553cc572-9a91-4a5c-9167-93bf9b5e6b8c"] }, Open ]], Cell[TextData[{ @@ -3362,7 +3330,7 @@ Cell[BoxData[ CellLabel->"In[13]:=",ExpressionUUID->"268833cf-013e-4294-85c7-c10bb6118a24"], Cell[BoxData["\<\"Schwarzschild\"\>"], "Output", - CellLabel->"Out[13]=",ExpressionUUID->"1069e97b-538a-4216-80f4-61ef8d81d7c9"] + CellLabel->"Out[13]=",ExpressionUUID->"3012cb09-8f6e-4934-84ac-efcdd374fa68"] }, Open ]], Cell[TextData[{ @@ -3415,43 +3383,62 @@ Cell[BoxData[ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TShow\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"shows the components of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -with the index configuration \\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\", in vector or matrix form when applicable.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" should be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, \ -where +1 corresponds to an upper index and -1 corresponds to a lower index.\\\ -\\nIf the index configuration and/or coordinate system are omitted, the \ -default ones will be used.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is an optional function to map to each of the tensor's elements before \ -they are displayed. Typically this would be ReplaceAll[rules] to apply the \ -rules to the elements, but any function can be used.\\\"}]], \ -TextCell[Row[List[\\\"TShow\\\", \\\"[\\\", Style[ID, Bold], Style[\\\", \ -\\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[function, Bold], \ -\\\"] \\\", \\\"shows the components of the tensor object \\\", Style[ID, \ -Bold], \\\" with the index configuration \\\", Style[indices, Bold], \\\" and \ -in the coordinate system \\\", Style[coordinatesID, Bold], \\\", in vector or \ -matrix form when applicable.\\\\n\\\", Style[indices, Bold], \\\" should be a \ -list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\\\nIf the \ -index configuration and/or coordinate system are omitted, the default ones \ -will be used.\\\\n\\\", Style[function, Bold], \\\" is an optional function \ -to map to each of the tensor's elements before they are displayed. Typically \ -this would be ReplaceAll[rules] to apply the rules to the elements, but any \ -function can be used.\\\"]]]]\\)\"\>", "InformationUsageText", + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TShow[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] shows the \ +components of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" in its default index configuration and \ +coordinate system.\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] shows the components in the index \ +configuration \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] shows the components in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\".\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] shows the components in the index configuration \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and the \ +coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] maps \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\\\nTShow[\\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"function\\\", Bold, Rule[StripOnInput, False]], \\\"] does all \ +of the above; either \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" or \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" can be omitted.\\\"}]], TextCell[Row[List[\\\ +\"TShow[\\\", Style[\\\"ID\\\", Bold], \\\"] shows the components of the \ +tensor object \\\", Style[\\\"ID\\\", Bold], \\\" in its default index \ +configuration and coordinate system.\\\\nTShow[\\\", Style[\\\"ID\\\", Bold], \ +\\\", \\\", Style[\\\"indices\\\", Bold], \\\"] shows the components in the \ +index configuration \\\", Style[\\\"indices\\\", Bold], \\\", which should be \ +a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ +corresponds to an upper index and -1 corresponds to a lower index.\\\\nTShow[\ +\\\", Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\"] shows the components in the coordinate system \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTShow[\\\", Style[\\\"ID\\\", \ +Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\"] shows the components in the index \ +configuration \\\", Style[\\\"indices\\\", Bold], \\\" and the coordinate \ +system \\\", Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTShow[\\\", Style[\ +\\\"ID\\\", Bold], \\\", \\\", Style[\\\"function\\\", Bold], \\\"] maps \ +\\\", Style[\\\"function\\\", Bold], \\\" to each of the tensor's elements \ +before they are displayed. Typically this would be ReplaceAll[rules] to apply \ +the rules to the elements, but any function can be used.\\\\nTShow[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"function\\\", \ +Bold], \\\"] does all of the above; either \\\", Style[\\\"indices\\\", \ +Bold], \\\" or \\\", Style[\\\"coordinatesID\\\", Bold], \\\" can be omitted.\ +\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -3628,43 +3615,62 @@ function can be used.\\\"]]]]\\)\"\>", "InformationUsageText", ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TShow\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"shows the components of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -with the index configuration \\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\", in vector or matrix form when applicable.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" should be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, \ -where +1 corresponds to an upper index and -1 corresponds to a lower index.\\\ -\\nIf the index configuration and/or coordinate system are omitted, the \ -default ones will be used.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is an optional function to map to each of the tensor's elements before \ -they are displayed. Typically this would be ReplaceAll[rules] to apply the \ -rules to the elements, but any function can be used.\\\"}]], \ -TextCell[Row[List[\\\"TShow\\\", \\\"[\\\", Style[ID, Bold], Style[\\\", \ -\\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[function, Bold], \ -\\\"] \\\", \\\"shows the components of the tensor object \\\", Style[ID, \ -Bold], \\\" with the index configuration \\\", Style[indices, Bold], \\\" and \ -in the coordinate system \\\", Style[coordinatesID, Bold], \\\", in vector or \ -matrix form when applicable.\\\\n\\\", Style[indices, Bold], \\\" should be a \ -list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\\\nIf the \ -index configuration and/or coordinate system are omitted, the default ones \ -will be used.\\\\n\\\", Style[function, Bold], \\\" is an optional function \ -to map to each of the tensor's elements before they are displayed. Typically \ -this would be ReplaceAll[rules] to apply the rules to the elements, but any \ -function can be used.\\\"]]]]\\)\"\>", "InformationUsageText", + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TShow[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] shows the \ +components of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" in its default index configuration and \ +coordinate system.\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] shows the components in the index \ +configuration \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] shows the components in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\".\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] shows the components in the index configuration \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and the \ +coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\nTShow[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] maps \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\\\nTShow[\\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"function\\\", Bold, Rule[StripOnInput, False]], \\\"] does all \ +of the above; either \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" or \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" can be omitted.\\\"}]], TextCell[Row[List[\\\ +\"TShow[\\\", Style[\\\"ID\\\", Bold], \\\"] shows the components of the \ +tensor object \\\", Style[\\\"ID\\\", Bold], \\\" in its default index \ +configuration and coordinate system.\\\\nTShow[\\\", Style[\\\"ID\\\", Bold], \ +\\\", \\\", Style[\\\"indices\\\", Bold], \\\"] shows the components in the \ +index configuration \\\", Style[\\\"indices\\\", Bold], \\\", which should be \ +a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ +corresponds to an upper index and -1 corresponds to a lower index.\\\\nTShow[\ +\\\", Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\"] shows the components in the coordinate system \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTShow[\\\", Style[\\\"ID\\\", \ +Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\"] shows the components in the index \ +configuration \\\", Style[\\\"indices\\\", Bold], \\\" and the coordinate \ +system \\\", Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTShow[\\\", Style[\ +\\\"ID\\\", Bold], \\\", \\\", Style[\\\"function\\\", Bold], \\\"] maps \ +\\\", Style[\\\"function\\\", Bold], \\\" to each of the tensor's elements \ +before they are displayed. Typically this would be ReplaceAll[rules] to apply \ +the rules to the elements, but any function can be used.\\\\nTShow[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"function\\\", \ +Bold], \\\"] does all of the above; either \\\", Style[\\\"indices\\\", \ +Bold], \\\" or \\\", Style[\\\"coordinatesID\\\", Bold], \\\" can be omitted.\ +\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -3682,7 +3688,6 @@ function can be used.\\\"]]]]\\)\"\>", "InformationUsageText", DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "DownPointerOpener"], ImageSizeCache->{10., {3., 7.}}], True-> - DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "DownPointerOpenerHot"], ImageSizeCache->{10., {3., 7.}}]}, Dynamic[ @@ -3728,43 +3733,57 @@ function can be used.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TShow\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"function\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"shows the components of the tensor object \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" with the \ -index configuration \", StyleBox[Cell[BoxData[\"indices\"]], Bold, \ -Rule[StripOnInput, False]], \" and in the coordinate system \", \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\", in vector or matrix form when applicable.\\n\", \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \" \ -should be a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\nIf the \ -index configuration and/or coordinate system are omitted, the default ones \ -will be used.\\n\", StyleBox[Cell[BoxData[\"function\"]], Bold, \ -Rule[StripOnInput, False]], \" is an optional function to map to each of the \ -tensor's elements before they are displayed. Typically this would be \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TShow[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] shows the components of the tensor \ +object \", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \" in its \ +default index configuration and coordinate system.\\nTShow[\", \ +StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\ +\", Bold, Rule[StripOnInput, False]], \"] shows the components in the index \ +configuration \", StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \", \ +which should be a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, \ +where +1 corresponds to an upper index and -1 corresponds to a lower \ +index.\\nTShow[\", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \"] shows the \ +components in the coordinate system \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \".\\nTShow[\", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \"] shows the components in the index \ +configuration \", StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \" \ +and the coordinate system \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \".\\nTShow[\", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \"] maps \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\nTShow[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \"] does all of the above; either \", \ +StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \" or \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \" can be \ +omitted.\"}]], TextCell[Row[List[\"TShow[\", Style[\"ID\", Bold], \"] shows \ +the components of the tensor object \", Style[\"ID\", Bold], \" in its \ +default index configuration and coordinate system.\\nTShow[\", Style[\"ID\", \ +Bold], \", \", Style[\"indices\", Bold], \"] shows the components in the \ +index configuration \", Style[\"indices\", Bold], \", which should be a list \ +of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an \ +upper index and -1 corresponds to a lower index.\\nTShow[\", Style[\"ID\", \ +Bold], \", \", Style[\"coordinatesID\", Bold], \"] shows the components in \ +the coordinate system \", Style[\"coordinatesID\", Bold], \".\\nTShow[\", \ +Style[\"ID\", Bold], \", \", Style[\"indices\", Bold], \", \", \ +Style[\"coordinatesID\", Bold], \"] shows the components in the index \ +configuration \", Style[\"indices\", Bold], \" and the coordinate system \", \ +Style[\"coordinatesID\", Bold], \".\\nTShow[\", Style[\"ID\", Bold], \", \", \ +Style[\"function\", Bold], \"] maps \", Style[\"function\", Bold], \" to each \ +of the tensor's elements before they are displayed. Typically this would be \ ReplaceAll[rules] to apply the rules to the elements, but any function can be \ -used.\"}]], TextCell[Row[List[\"TShow\", \"[\", Style[ID, Bold], Style[\", \ -\", Bold], Style[indices, Bold], Style[\", \", Bold], Style[coordinatesID, \ -Bold], Style[\", \", Bold], Style[function, Bold], \"] \", \"shows the \ -components of the tensor object \", Style[ID, Bold], \" with the index \ -configuration \", Style[indices, Bold], \" and in the coordinate system \", \ -Style[coordinatesID, Bold], \", in vector or matrix form when \ -applicable.\\n\", Style[indices, Bold], \" should be a list of the form \ -{\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an upper index \ -and -1 corresponds to a lower index.\\nIf the index configuration and/or \ -coordinate system are omitted, the default ones will be used.\\n\", \ -Style[function, Bold], \" is an optional function to map to each of the \ -tensor's elements before they are displayed. Typically this would be \ -ReplaceAll[rules] to apply the rules to the elements, but any function can be \ -used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> - None, "DownValues" -> +used.\\nTShow[\", Style[\"ID\", Bold], \", \", Style[\"indices\", Bold], \", \ +\", Style[\"coordinatesID\", Bold], \", \", Style[\"function\", Bold], \"] \ +does all of the above; either \", Style[\"indices\", Bold], \" or \", \ +Style[\"coordinatesID\", Bold], \" can be omitted.\"]]]]\)", "Documentation" -> + None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TShow, {Condition[ OGRe`TShow[ Pattern[OGRe`Private`ID, @@ -3789,7 +3808,7 @@ used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TShow"], False]]], "Output", - CellLabel->"Out[14]=",ExpressionUUID->"7ad9ae12-aafb-4c2f-9850-544be7abdb76"] + CellLabel->"Out[14]=",ExpressionUUID->"955744fd-9c0b-4178-af2c-0a4df296139a"] }, Open ]], Cell[TextData[{ @@ -3826,7 +3845,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"a9210cca-428a-4308-bad0-0cd5dfb4467b"] + CellLabel->"OGRe:",ExpressionUUID->"cea80ff8-1e02-4023-a43b-3afa371297c5"] }, Open ]], Cell[CellGroupData[{ @@ -3857,7 +3876,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"d632c4b9-3cf2-47a9-9833-0f965d48ae9a"] + CellLabel->"OGRe:",ExpressionUUID->"528fa9e9-e880-401a-b080-f7904f9ae18f"] }, Open ]], Cell[TextData[{ @@ -3904,7 +3923,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"1f9b9626-99a0-4b3e-90db-5b89ccee5d52"] + CellLabel->"OGRe:",ExpressionUUID->"8ae5fa72-7a09-450d-94cc-1fd1a595d03a"] }, Open ]], Cell[CellGroupData[{ @@ -3950,7 +3969,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"2d0314f7-b724-432d-acb1-ccb9f0b68742"] + CellLabel->"OGRe:",ExpressionUUID->"93af8040-3afa-447d-a484-68cc9d00dc5f"] }, Open ]], Cell[TextData[{ @@ -3995,43 +4014,63 @@ Cell[BoxData[ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TList\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"lists the unique, non-zero components of the tensor object \\\ -\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" with the index configuration \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" and in the coordinate system \\\", StyleBox[Cell[BoxData[\\\"coordinatesID\ -\\\"]], Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" should be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, \ -where +1 corresponds to an upper index and -1 corresponds to a lower index.\\\ -\\nIf the index configuration and/or coordinate system are omitted, the \ -default ones will be used.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is an optional function to map to each of the tensor's elements before \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TList[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] lists the \ +unique, non-zero components of the tensor object \\\", StyleBox[\\\"ID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" in its default index configuration and \ +coordinate system.\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] lists the components in the index \ +configuration \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] lists the components in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\".\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] lists the components in the index configuration \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and the \ +coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] maps \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\\\nTList[\\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"function\\\", Bold, Rule[StripOnInput, False]], \\\"] does all \ +of the above; either \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" or \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" can be omitted.\\\"}]], TextCell[Row[List[\\\ +\"TList[\\\", Style[\\\"ID\\\", Bold], \\\"] lists the unique, non-zero \ +components of the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" in its \ +default index configuration and coordinate system.\\\\nTList[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\"] \ +lists the components in the index configuration \\\", Style[\\\"indices\\\", \ +Bold], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTList[\\\", Style[\\\"ID\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\"] lists the components in the \ +coordinate system \\\", Style[\\\"coordinatesID\\\", Bold], \ +\\\".\\\\nTList[\\\", Style[\\\"ID\\\", Bold], \\\", \\\", \ +Style[\\\"indices\\\", Bold], \\\", \\\", Style[\\\"coordinatesID\\\", Bold], \ +\\\"] lists the components in the index configuration \\\", Style[\\\"indices\ +\\\", Bold], \\\" and the coordinate system \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTList[\\\", Style[\\\"ID\\\", \ +Bold], \\\", \\\", Style[\\\"function\\\", Bold], \\\"] maps \\\", \ +Style[\\\"function\\\", Bold], \\\" to each of the tensor's elements before \ they are displayed. Typically this would be ReplaceAll[rules] to apply the \ -rules to the elements, but any function can be used.\\\"}]], \ -TextCell[Row[List[\\\"TList\\\", \\\"[\\\", Style[ID, Bold], Style[\\\", \ -\\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[function, Bold], \ -\\\"] \\\", \\\"lists the unique, non-zero components of the tensor object \\\ -\", Style[ID, Bold], \\\" with the index configuration \\\", Style[indices, \ -Bold], \\\" and in the coordinate system \\\", Style[coordinatesID, Bold], \\\ -\".\\\\n\\\", Style[indices, Bold], \\\" should be a list of the form \ -{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ -index and -1 corresponds to a lower index.\\\\nIf the index configuration \ -and/or coordinate system are omitted, the default ones will be \ -used.\\\\n\\\", Style[function, Bold], \\\" is an optional function to map to \ -each of the tensor's elements before they are displayed. Typically this would \ -be ReplaceAll[rules] to apply the rules to the elements, but any function can \ -be used.\\\"]]]]\\)\"\>", "InformationUsageText", +rules to the elements, but any function can be used.\\\\nTList[\\\", Style[\\\ +\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \\\", Style[\ +\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"function\\\", Bold], \ +\\\"] does all of the above; either \\\", Style[\\\"indices\\\", Bold], \\\" \ +or \\\", Style[\\\"coordinatesID\\\", Bold], \\\" can be \ +omitted.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -4208,43 +4247,63 @@ be used.\\\"]]]]\\)\"\>", "InformationUsageText", ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TList\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"lists the unique, non-zero components of the tensor object \\\ -\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" with the index configuration \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" and in the coordinate system \\\", StyleBox[Cell[BoxData[\\\"coordinatesID\ -\\\"]], Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" should be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, \ -where +1 corresponds to an upper index and -1 corresponds to a lower index.\\\ -\\nIf the index configuration and/or coordinate system are omitted, the \ -default ones will be used.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"function\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is an optional function to map to each of the tensor's elements before \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TList[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] lists the \ +unique, non-zero components of the tensor object \\\", StyleBox[\\\"ID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" in its default index configuration and \ +coordinate system.\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] lists the components in the index \ +configuration \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] lists the components in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\".\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] lists the components in the index configuration \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and the \ +coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\nTList[\\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] maps \\\", StyleBox[\\\"function\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\\\nTList[\\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\", \\\", \ +StyleBox[\\\"function\\\", Bold, Rule[StripOnInput, False]], \\\"] does all \ +of the above; either \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" or \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" can be omitted.\\\"}]], TextCell[Row[List[\\\ +\"TList[\\\", Style[\\\"ID\\\", Bold], \\\"] lists the unique, non-zero \ +components of the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" in its \ +default index configuration and coordinate system.\\\\nTList[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\"] \ +lists the components in the index configuration \\\", Style[\\\"indices\\\", \ +Bold], \\\", which should be a list of the form {\\\\[PlusMinus]1, \ +\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\\\\nTList[\\\", Style[\\\"ID\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\"] lists the components in the \ +coordinate system \\\", Style[\\\"coordinatesID\\\", Bold], \ +\\\".\\\\nTList[\\\", Style[\\\"ID\\\", Bold], \\\", \\\", \ +Style[\\\"indices\\\", Bold], \\\", \\\", Style[\\\"coordinatesID\\\", Bold], \ +\\\"] lists the components in the index configuration \\\", Style[\\\"indices\ +\\\", Bold], \\\" and the coordinate system \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\".\\\\nTList[\\\", Style[\\\"ID\\\", \ +Bold], \\\", \\\", Style[\\\"function\\\", Bold], \\\"] maps \\\", \ +Style[\\\"function\\\", Bold], \\\" to each of the tensor's elements before \ they are displayed. Typically this would be ReplaceAll[rules] to apply the \ -rules to the elements, but any function can be used.\\\"}]], \ -TextCell[Row[List[\\\"TList\\\", \\\"[\\\", Style[ID, Bold], Style[\\\", \ -\\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], Style[\\\", \\\", Bold], Style[function, Bold], \ -\\\"] \\\", \\\"lists the unique, non-zero components of the tensor object \\\ -\", Style[ID, Bold], \\\" with the index configuration \\\", Style[indices, \ -Bold], \\\" and in the coordinate system \\\", Style[coordinatesID, Bold], \\\ -\".\\\\n\\\", Style[indices, Bold], \\\" should be a list of the form \ -{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ -index and -1 corresponds to a lower index.\\\\nIf the index configuration \ -and/or coordinate system are omitted, the default ones will be \ -used.\\\\n\\\", Style[function, Bold], \\\" is an optional function to map to \ -each of the tensor's elements before they are displayed. Typically this would \ -be ReplaceAll[rules] to apply the rules to the elements, but any function can \ -be used.\\\"]]]]\\)\"\>", "InformationUsageText", +rules to the elements, but any function can be used.\\\\nTList[\\\", Style[\\\ +\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \\\", Style[\ +\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"function\\\", Bold], \ +\\\"] does all of the above; either \\\", Style[\\\"indices\\\", Bold], \\\" \ +or \\\", Style[\\\"coordinatesID\\\", Bold], \\\" can be \ +omitted.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -4308,40 +4367,57 @@ be used.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TList\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"function\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"lists the unique, non-zero components of the tensor object \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" with the \ -index configuration \", StyleBox[Cell[BoxData[\"indices\"]], Bold, \ -Rule[StripOnInput, False]], \" and in the coordinate system \", \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\".\\n\", StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, \ -False]], \" should be a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, \ -...}, where +1 corresponds to an upper index and -1 corresponds to a lower \ -index.\\nIf the index configuration and/or coordinate system are omitted, the \ -default ones will be used.\\n\", StyleBox[Cell[BoxData[\"function\"]], Bold, \ -Rule[StripOnInput, False]], \" is an optional function to map to each of the \ -tensor's elements before they are displayed. Typically this would be \ -ReplaceAll[rules] to apply the rules to the elements, but any function can be \ -used.\"}]], TextCell[Row[List[\"TList\", \"[\", Style[ID, Bold], Style[\", \ -\", Bold], Style[indices, Bold], Style[\", \", Bold], Style[coordinatesID, \ -Bold], Style[\", \", Bold], Style[function, Bold], \"] \", \"lists the \ -unique, non-zero components of the tensor object \", Style[ID, Bold], \" with \ -the index configuration \", Style[indices, Bold], \" and in the coordinate \ -system \", Style[coordinatesID, Bold], \".\\n\", Style[indices, Bold], \" \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TList[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] lists the unique, non-zero components \ +of the tensor object \", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \ +\" in its default index configuration and coordinate system.\\nTList[\", \ +StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\ +\", Bold, Rule[StripOnInput, False]], \"] lists the components in the index \ +configuration \", StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \", \ +which should be a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, \ +where +1 corresponds to an upper index and -1 corresponds to a lower \ +index.\\nTList[\", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \"] lists the \ +components in the coordinate system \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \".\\nTList[\", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \"] lists the components in the index \ +configuration \", StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \" \ +and the coordinate system \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \".\\nTList[\", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \"] maps \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\nTList[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \", \", StyleBox[\"function\", Bold, \ +Rule[StripOnInput, False]], \"] does all of the above; either \", \ +StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \" or \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \" can be \ +omitted.\"}]], TextCell[Row[List[\"TList[\", Style[\"ID\", Bold], \"] lists \ +the unique, non-zero components of the tensor object \", Style[\"ID\", Bold], \ +\" in its default index configuration and coordinate system.\\nTList[\", \ +Style[\"ID\", Bold], \", \", Style[\"indices\", Bold], \"] lists the \ +components in the index configuration \", Style[\"indices\", Bold], \", which \ should be a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\nIf the \ -index configuration and/or coordinate system are omitted, the default ones \ -will be used.\\n\", Style[function, Bold], \" is an optional function to map \ -to each of the tensor's elements before they are displayed. Typically this \ -would be ReplaceAll[rules] to apply the rules to the elements, but any \ -function can be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, +corresponds to an upper index and -1 corresponds to a lower \ +index.\\nTList[\", Style[\"ID\", Bold], \", \", Style[\"coordinatesID\", \ +Bold], \"] lists the components in the coordinate system \", \ +Style[\"coordinatesID\", Bold], \".\\nTList[\", Style[\"ID\", Bold], \", \", \ +Style[\"indices\", Bold], \", \", Style[\"coordinatesID\", Bold], \"] lists \ +the components in the index configuration \", Style[\"indices\", Bold], \" \ +and the coordinate system \", Style[\"coordinatesID\", Bold], \".\\nTList[\", \ +Style[\"ID\", Bold], \", \", Style[\"function\", Bold], \"] maps \", \ +Style[\"function\", Bold], \" to each of the tensor's elements before they \ +are displayed. Typically this would be ReplaceAll[rules] to apply the rules \ +to the elements, but any function can be used.\\nTList[\", Style[\"ID\", \ +Bold], \", \", Style[\"indices\", Bold], \", \", Style[\"coordinatesID\", \ +Bold], \", \", Style[\"function\", Bold], \"] does all of the above; either \ +\", Style[\"indices\", Bold], \" or \", Style[\"coordinatesID\", Bold], \" \ +can be omitted.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TList, {Condition[ OGRe`TList[ @@ -4367,7 +4443,7 @@ function can be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TList"], False]]], "Output", - CellLabel->"Out[19]=",ExpressionUUID->"8d6f02e6-d8ed-4074-aa3d-6c27af201fc3"] + CellLabel->"Out[19]=",ExpressionUUID->"be5e75e5-6e2a-49d7-a3e4-2d9d394c7913"] }, Open ]], Cell["For example:", \ @@ -4377,7 +4453,8 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "[", "\"\\"", "]"}]], "Input", - CellLabel->"In[20]:=",ExpressionUUID->"afcb4e26-3867-4d05-9f00-8d73ffd25083"], + CellLabel->"In[20]:=",ExpressionUUID->"afcb4e26-3867-4d05-9f00-8d73ffd25083"] +, Cell[BoxData[ StyleBox[ @@ -4445,7 +4522,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"03df6d7c-e7d2-4e85-b329-7fa5a0a37ddf"] + CellLabel->"OGRe:",ExpressionUUID->"fbc998e6-354a-485d-ac90-a12905d48500"] }, Open ]], Cell[CellGroupData[{ @@ -4538,7 +4615,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"c4b65810-a079-4c70-8c86-7ed6a12a8e04"] + CellLabel->"OGRe:",ExpressionUUID->"100710ae-790f-4d78-ad29-a93e6dd85fa5"] }, Open ]], Cell[TextData[{ @@ -4582,14 +4659,14 @@ Cell[TextData[{ StyleBox["TShow", "Input"], " module uses Greek letters for the indices, in a specific order. The \ letters can be displayed or changed using the ", - StyleBox["TIndexLetters", "Input"], + StyleBox["TSetIndexLetters", "Input"], " module:" }], "Text",ExpressionUUID->"da84f53f-53dd-4bbc-b31e-07e160929ea1"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TIndexLetters"}]], "Input", + RowBox[{"?", "TSetIndexLetters"}]], "Input", CellLabel->"In[22]:=",ExpressionUUID->"825c8084-ae82-4dda-87cd-a98c478f7fec"], Cell[BoxData[ @@ -4617,19 +4694,21 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TIndexLetters\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"changes the letters to be used \ -when displaying indices.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is omitted, shows the index letters currently in use.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is set to Automatic, resets the index letters to the default (lowercase \ -Greek letters).\\\"}]], TextCell[Row[List[\\\"TIndexLetters\\\", \\\"[\\\", \ -Style[letters, Bold], \\\"] \\\", \\\"changes the letters to be used when \ -displaying indices.\\\\nIf \\\", Style[letters, Bold], \\\" is omitted, shows \ -the index letters currently in use.\\\\nIf \\\", Style[letters, Bold], \\\" \ -is set to Automatic, resets the index letters to the default (lowercase Greek \ -letters).\\\"]]]]\\)\"\>", "InformationUsageText", +TSetIndexLetters[] shows the index letters used when displaying \ +indices.\\\\nTSetIndexLetters[\\\", StyleBox[\\\"letters\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] changes the index \ +letters.\\\\nTSetIndexLetters[Automatic] resets the index letters to the \ +default: \\\\\\\"\\\\[Mu]\\\\[Nu]\\\\[Rho]\\\\[Sigma]\\\\[Kappa]\\\\[Lambda]\\\ +\\[Alpha]\\\\[Beta]\\\\[Gamma]\\\\[Delta]\\\\[CurlyEpsilon]\\\\[Zeta]\\\\[\ +Epsilon]\\\\[Theta]\\\\[Iota]\\\\[Xi]\\\\[Pi]\\\\[Tau]\\\\[Phi]\\\\[Chi]\\\\[\ +Psi]\\\\[Omega]\\\\\\\".\\\"}]], TextCell[Row[List[\\\"TSetIndexLetters[] \ +shows the index letters used when displaying indices.\\\\nTSetIndexLetters[\\\ +\", Style[\\\"letters\\\", Bold], \\\"] changes the index \ +letters.\\\\nTSetIndexLetters[Automatic] resets the index letters to the \ +default: \\\\\\\"\\\\[Mu]\\\\[Nu]\\\\[Rho]\\\\[Sigma]\\\\[Kappa]\\\\[Lambda]\\\ +\\[Alpha]\\\\[Beta]\\\\[Gamma]\\\\[Delta]\\\\[CurlyEpsilon]\\\\[Zeta]\\\\[\ +Epsilon]\\\\[Theta]\\\\[Iota]\\\\[Xi]\\\\[Pi]\\\\[Tau]\\\\[Phi]\\\\[Chi]\\\\[\ +Psi]\\\\[Omega]\\\\\\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -4655,20 +4734,20 @@ letters).\\\"]]]]\\)\"\>", "InformationUsageText", TemplateBox[{"\"\[ThinSpace]\"", GridBox[{{ RowBox[{ - RowBox[{"TIndexLetters", "[", "]"}], ":=", + RowBox[{"TSetIndexLetters", "[", "]"}], ":=", RowBox[{ RowBox[{"OGRe`Private`TensorData", "[", "Options", "]"}], "[", "\"IndexLetters\"", "]"}]}]}, {" "}, { RowBox[{ - RowBox[{"TIndexLetters", "[", "Automatic", "]"}], ":=", + RowBox[{"TSetIndexLetters", "[", "Automatic", "]"}], ":=", RowBox[{ - "TIndexLetters", "[", "OGRe`Private`DefaultIndexLetters", - "]"}]}]}, {" "}, { + "TSetIndexLetters", "[", + "OGRe`Private`DefaultIndexLetters", "]"}]}]}, {" "}, { RowBox[{ RowBox[{ - "TIndexLetters", "[", "OGRe`Private`letters_String", + "TSetIndexLetters", "[", "OGRe`Private`letters_String", "]"}], ":=", RowBox[{"(", RowBox[{ @@ -4718,9 +4797,8 @@ letters).\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False], "\"FullName\"", TooltipStyle->"TextStyling"], - Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TIndexLetters\"\>"} + "Tooltip"]& ], "\<\"OGRe`TSetIndexLetters\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -4772,6 +4850,7 @@ letters).\\\"]]]]\\)\"\>", "InformationUsageText", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], + EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -4809,19 +4888,21 @@ letters).\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TIndexLetters\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"changes the letters to be used \ -when displaying indices.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is omitted, shows the index letters currently in use.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"letters\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is set to Automatic, resets the index letters to the default (lowercase \ -Greek letters).\\\"}]], TextCell[Row[List[\\\"TIndexLetters\\\", \\\"[\\\", \ -Style[letters, Bold], \\\"] \\\", \\\"changes the letters to be used when \ -displaying indices.\\\\nIf \\\", Style[letters, Bold], \\\" is omitted, shows \ -the index letters currently in use.\\\\nIf \\\", Style[letters, Bold], \\\" \ -is set to Automatic, resets the index letters to the default (lowercase Greek \ -letters).\\\"]]]]\\)\"\>", "InformationUsageText", +TSetIndexLetters[] shows the index letters used when displaying \ +indices.\\\\nTSetIndexLetters[\\\", StyleBox[\\\"letters\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] changes the index \ +letters.\\\\nTSetIndexLetters[Automatic] resets the index letters to the \ +default: \\\\\\\"\\\\[Mu]\\\\[Nu]\\\\[Rho]\\\\[Sigma]\\\\[Kappa]\\\\[Lambda]\\\ +\\[Alpha]\\\\[Beta]\\\\[Gamma]\\\\[Delta]\\\\[CurlyEpsilon]\\\\[Zeta]\\\\[\ +Epsilon]\\\\[Theta]\\\\[Iota]\\\\[Xi]\\\\[Pi]\\\\[Tau]\\\\[Phi]\\\\[Chi]\\\\[\ +Psi]\\\\[Omega]\\\\\\\".\\\"}]], TextCell[Row[List[\\\"TSetIndexLetters[] \ +shows the index letters used when displaying indices.\\\\nTSetIndexLetters[\\\ +\", Style[\\\"letters\\\", Bold], \\\"] changes the index \ +letters.\\\\nTSetIndexLetters[Automatic] resets the index letters to the \ +default: \\\\\\\"\\\\[Mu]\\\\[Nu]\\\\[Rho]\\\\[Sigma]\\\\[Kappa]\\\\[Lambda]\\\ +\\[Alpha]\\\\[Beta]\\\\[Gamma]\\\\[Delta]\\\\[CurlyEpsilon]\\\\[Zeta]\\\\[\ +Epsilon]\\\\[Theta]\\\\[Iota]\\\\[Xi]\\\\[Pi]\\\\[Tau]\\\\[Phi]\\\\[Chi]\\\\[\ +Psi]\\\\[Omega]\\\\\\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -4885,34 +4966,36 @@ letters).\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TIndexLetters\", \"[\", \ -StyleBox[Cell[BoxData[\"letters\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"changes the letters to be used when displaying indices.\\nIf \", \ -StyleBox[Cell[BoxData[\"letters\"]], Bold, Rule[StripOnInput, False]], \" is \ -omitted, shows the index letters currently in use.\\nIf \", \ -StyleBox[Cell[BoxData[\"letters\"]], Bold, Rule[StripOnInput, False]], \" is \ -set to Automatic, resets the index letters to the default (lowercase Greek \ -letters).\"}]], TextCell[Row[List[\"TIndexLetters\", \"[\", Style[letters, \ -Bold], \"] \", \"changes the letters to be used when displaying indices.\\nIf \ -\", Style[letters, Bold], \" is omitted, shows the index letters currently in \ -use.\\nIf \", Style[letters, Bold], \" is set to Automatic, resets the index \ -letters to the default (lowercase Greek letters).\"]]]]\)", "Documentation" -> - None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TSetIndexLetters[] shows the \ +index letters used when displaying indices.\\nTSetIndexLetters[\", \ +StyleBox[\"letters\", Bold, Rule[StripOnInput, False]], \"] changes the index \ +letters.\\nTSetIndexLetters[Automatic] resets the index letters to the \ +default: \\\"\\[Mu]\\[Nu]\\[Rho]\\[Sigma]\\[Kappa]\\[Lambda]\\[Alpha]\\[Beta]\ +\\[Gamma]\\[Delta]\\[CurlyEpsilon]\\[Zeta]\\[Epsilon]\\[Theta]\\[Iota]\\[Xi]\\\ +[Pi]\\[Tau]\\[Phi]\\[Chi]\\[Psi]\\[Omega]\\\".\"}]], \ +TextCell[Row[List[\"TSetIndexLetters[] shows the index letters used when \ +displaying indices.\\nTSetIndexLetters[\", Style[\"letters\", Bold], \"] \ +changes the index letters.\\nTSetIndexLetters[Automatic] resets the index \ +letters to the default: \ +\\\"\\[Mu]\\[Nu]\\[Rho]\\[Sigma]\\[Kappa]\\[Lambda]\\[Alpha]\\[Beta]\\[Gamma]\ +\\[Delta]\\[CurlyEpsilon]\\[Zeta]\\[Epsilon]\\[Theta]\\[Iota]\\[Xi]\\[Pi]\\[\ +Tau]\\[Phi]\\[Chi]\\[Psi]\\[Omega]\\\".\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TIndexLetters, { - OGRe`TIndexLetters[] :> + DownValues, OGRe`TSetIndexLetters, { + OGRe`TSetIndexLetters[] :> OGRe`Private`TensorData[Options]["IndexLetters"], - OGRe`TIndexLetters[Automatic] :> - OGRe`TIndexLetters[OGRe`Private`DefaultIndexLetters], - OGRe`TIndexLetters[ + OGRe`TSetIndexLetters[Automatic] :> + OGRe`TSetIndexLetters[OGRe`Private`DefaultIndexLetters], + OGRe`TSetIndexLetters[ Pattern[OGRe`Private`letters, Blank[String]]] :> (Unprotect[OGRe`Private`TensorData]; OGRe`Private`TensorData[Options]["IndexLetters"] = OGRe`Private`letters; Protect[OGRe`Private`TensorData]; Null)}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, - "FullName" -> "OGRe`TIndexLetters"], False]]], "Output", - CellLabel->"Out[22]=",ExpressionUUID->"3ad62f97-e5ae-4f5a-b4c8-e0cab4ef20c8"] + "FullName" -> "OGRe`TSetIndexLetters"], False]]], "Output", + CellLabel->"Out[22]=",ExpressionUUID->"91932478-b0a5-4e4e-936f-64ddedce6e91"] }, Open ]], Cell["The default letters are:", \ @@ -4921,13 +5004,13 @@ Cell["The default letters are:", \ Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"TIndexLetters", "[", "]"}]], "Input", + RowBox[{"TSetIndexLetters", "[", "]"}]], "Input", CellLabel->"In[23]:=",ExpressionUUID->"b31afa1f-8706-4674-9489-c39a22c1812d"], Cell[BoxData["\<\"\[Mu]\[Nu]\[Rho]\[Sigma]\[Kappa]\[Lambda]\[Alpha]\[Beta]\ \[Gamma]\[Delta]\[CurlyEpsilon]\[Zeta]\[Epsilon]\[Theta]\[Iota]\[Xi]\[Pi]\ \[Tau]\[Phi]\[Chi]\[Psi]\[Omega]\"\>"], "Output", - CellLabel->"Out[23]=",ExpressionUUID->"aa05e59d-3d6c-4f41-a274-fa42b7e74f1e"] + CellLabel->"Out[23]=",ExpressionUUID->"efd8aa10-77f1-4cb5-9964-6ca365d6f050"] }, Open ]], Cell["\<\ @@ -4937,7 +5020,7 @@ For example, let us change the indices to lowercase English letters:\ \>", "Text",ExpressionUUID->"a9733ba6-41c0-4d1a-ac76-b9078470fb0a"], Cell[BoxData[ - RowBox[{"TIndexLetters", "[", "\"\\"", + RowBox[{"TSetIndexLetters", "[", "\"\\"", "]"}]], "Input", CellLabel->"In[24]:=",ExpressionUUID->"e437e293-8891-4d70-8963-e159543d2169"], @@ -4979,22 +5062,22 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"568bb8de-22ea-486f-bbde-cc372d394dc8"] + CellLabel->"OGRe:",ExpressionUUID->"377d6a32-8e6e-4f90-a48a-a76e78df99ae"] }, Open ]], Cell["Finally, let us reset the letters to the default:", \ "Text",ExpressionUUID->"11bc3c60-085d-4d74-98de-a810ae6def38"], Cell[BoxData[ - RowBox[{"TIndexLetters", "[", "Automatic", "]"}]], "Input", + RowBox[{"TSetIndexLetters", "[", "Automatic", "]"}]], "Input", CellLabel->"In[26]:=",ExpressionUUID->"97b05192-4da8-44ac-bb03-76690cfb15f4"], Cell[TextData[{ "Note that ", StyleBox["TList", "Input"], - " always uses the coordinate symbols for the indices, so it is not affected \ -by ", - StyleBox["TIndexLetters", "Input"], + " always uses the coordinate symbols themselves for the indices, so it is \ +not affected by ", + StyleBox["TSetIndexLetters", "Input"], "." }], "Text",ExpressionUUID->"c36945f7-40e0-4010-8a3b-741106697b99"] }, Open ]], @@ -5042,64 +5125,56 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"components\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", \ -Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"symbol\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"creates a new tensor \ -object.\\\\n\\\", StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, \ +TNewTensor[\\\", StyleBox[\\\"tensorID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \ +\\\", StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\", \\\ +\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\", creates \ +a new tensor object.\\\\n\\\", StyleBox[\\\"tensorID\\\", Bold, \ Rule[StripOnInput, False]], \\\" is a string that will be used to identify \ -the new object, and must be unique. If a tensor object with the same ID \ -already exists, it will be overwritten.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is the unique ID of a tensor object representing a metric, created using \ -TNewMetric[ ]. The metric will be used to raise and lower indices for the new \ -tensor.\\\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ]. This \ -coordinate system will be used to specify the components of the new tensor. \ -If omitted, the default coordinate system of the metric \\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" will be used instead.\\\\n\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" is a list of the form \ +the new object, and must be unique.\\\\n\\\", StyleBox[\\\"metricID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ +representing a metric, created using TNewMetric[]. The metric will be used to \ +raise and lower indices for the new tensor.\\\\n\\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\" is the \ +unique ID of a tensor object representing a coordinate system, created using \ +TNewCoordinates[]. This coordinate system will be used to specify the \ +components of the new tensor. If omitted, the default coordinate system of \ +the metric \\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be used.\\\\n\\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\" must be a list of the form \ {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ -index and -1 corresponds to a lower index.\\\\n\\\", StyleBox[Cell[BoxData[\\\ -\"components\\\"]], Bold, Rule[StripOnInput, False]], \\\" is a list \ +index and -1 corresponds to a lower index.\\\\n\\\", \ +StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\" is a list \ specifying the representation of the tensor with the index configuration \ -\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\\n\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, \ +\\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and in \ +the coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\n\\\", StyleBox[\\\"symbol\\\", Bold, \ Rule[StripOnInput, False]], \\\" will be used to represent the tensor in \ formulas. If not given, the placeholder \\\\[DottedSquare] will be \ -used.\\\"}]], TextCell[Row[List[\\\"TNewTensor\\\", \\\"[\\\", \ -Style[tensorID, Bold], Style[\\\", \\\", Bold], Style[metricID, Bold], Style[\ -\\\", \\\", Bold], Style[coordinatesID, Bold], Style[\\\", \\\", Bold], \ -Style[indices, Bold], Style[\\\", \\\", Bold], Style[components, Bold], \ -Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\"creates a new \ -tensor object.\\\\n\\\", Style[tensorID, Bold], \\\" is a string that will be \ -used to identify the new object, and must be unique. If a tensor object with \ -the same ID already exists, it will be overwritten.\\\\n\\\", Style[metricID, \ -Bold], \\\" is the unique ID of a tensor object representing a metric, \ -created using TNewMetric[ ]. The metric will be used to raise and lower \ -indices for the new tensor.\\\\n\\\", Style[coordinatesID, Bold], \\\" is the \ -unique ID of a tensor object representing a coordinate system, created using \ -TNewCoordinates[ ]. This coordinate system will be used to specify the \ +used.\\\"}]], TextCell[Row[List[\\\"TNewTensor[\\\", Style[\\\"tensorID\\\", \ +Bold], \\\", \\\", Style[\\\"metricID\\\", Bold], \\\", \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \ +\\\", \\\", Style[\\\"components\\\", Bold], \\\", \\\", \ +Style[\\\"symbol\\\", Bold], \\\", creates a new tensor object.\\\\n\\\", \ +Style[\\\"tensorID\\\", Bold], \\\" is a string that will be used to identify \ +the new object, and must be unique.\\\\n\\\", Style[\\\"metricID\\\", Bold], \ +\\\" is the unique ID of a tensor object representing a metric, created using \ +TNewMetric[]. The metric will be used to raise and lower indices for the new \ +tensor.\\\\n\\\", Style[\\\"coordinatesID\\\", Bold], \\\" is the unique ID \ +of a tensor object representing a coordinate system, created using \ +TNewCoordinates[]. This coordinate system will be used to specify the \ components of the new tensor. If omitted, the default coordinate system of \ -the metric \\\", Style[metricID, Bold], \\\" will be used instead.\\\\n\\\", \ -Style[indices, Bold], \\\" is a list of the form {\\\\[PlusMinus]1, \ -\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\\n\\\", Style[components, Bold], \\\" is a \ -list specifying the representation of the tensor with the index configuration \ -\\\", Style[indices, Bold], \\\" and in the coordinate system \\\", \ -Style[coordinatesID, Bold], \\\".\\\\n\\\", Style[symbol, Bold], \\\" will be \ -used to represent the tensor in formulas. If not given, the placeholder \ +the metric \\\", Style[\\\"metricID\\\", Bold], \\\" will be used.\\\\n\\\", \ +Style[\\\"indices\\\", Bold], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index.\\\\n\\\", \ +Style[\\\"components\\\", Bold], \\\" is a list specifying the representation \ +of the tensor with the index configuration \\\", Style[\\\"indices\\\", \ +Bold], \\\" and in the coordinate system \\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\".\\\\n\\\", Style[\\\"symbol\\\", Bold], \\\" will be used to \ +represent the tensor in formulas. If not given, the placeholder \ \\\\[DottedSquare] will be used.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -5145,6 +5220,9 @@ used to represent the tensor in formulas. If not given, the placeholder \ RowBox[{"{", "OGRe`Private`useCoords", "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`tensorID", "]"}], ";", + RowBox[{"OGRe`Private`CheckIfTensorExists", "[", "OGRe`Private`metricID", "]"}], ";", @@ -5253,10 +5331,10 @@ used to represent the tensor in formulas. If not given, the placeholder \ RowBox[{"\"DefaultIndices\"", "\[Rule]", "OGRe`Private`indices"}], ",", + RowBox[{"\"Metric\"", "\[Rule]", "OGRe`Private`metricID"}], ",", RowBox[{"\"Role\"", "\[Rule]", "\"Tensor\""}], ",", - RowBox[{"\"Symbol\"", "\[Rule]", "OGRe`Private`symbol"}]}], "]"}]}], "]"}], ";", RowBox[{"Return", "[", "OGRe`Private`tensorID", "]"}], @@ -5389,64 +5467,56 @@ used to represent the tensor in formulas. If not given, the placeholder \ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TNewTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"components\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", \ -Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"symbol\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"creates a new tensor \ -object.\\\\n\\\", StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, \ +TNewTensor[\\\", StyleBox[\\\"tensorID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \ +\\\", StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\", \\\ +\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\", creates \ +a new tensor object.\\\\n\\\", StyleBox[\\\"tensorID\\\", Bold, \ Rule[StripOnInput, False]], \\\" is a string that will be used to identify \ -the new object, and must be unique. If a tensor object with the same ID \ -already exists, it will be overwritten.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is the unique ID of a tensor object representing a metric, created using \ -TNewMetric[ ]. The metric will be used to raise and lower indices for the new \ -tensor.\\\\n\\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ]. This \ -coordinate system will be used to specify the components of the new tensor. \ -If omitted, the default coordinate system of the metric \\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" will be used instead.\\\\n\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" is a list of the form \ +the new object, and must be unique.\\\\n\\\", StyleBox[\\\"metricID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" is the unique ID of a tensor object \ +representing a metric, created using TNewMetric[]. The metric will be used to \ +raise and lower indices for the new tensor.\\\\n\\\", \ +StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\" is the \ +unique ID of a tensor object representing a coordinate system, created using \ +TNewCoordinates[]. This coordinate system will be used to specify the \ +components of the new tensor. If omitted, the default coordinate system of \ +the metric \\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be used.\\\\n\\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\" must be a list of the form \ {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ -index and -1 corresponds to a lower index.\\\\n\\\", StyleBox[Cell[BoxData[\\\ -\"components\\\"]], Bold, Rule[StripOnInput, False]], \\\" is a list \ +index and -1 corresponds to a lower index.\\\\n\\\", \ +StyleBox[\\\"components\\\", Bold, Rule[StripOnInput, False]], \\\" is a list \ specifying the representation of the tensor with the index configuration \ -\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\\n\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, \ +\\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and in \ +the coordinate system \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\n\\\", StyleBox[\\\"symbol\\\", Bold, \ Rule[StripOnInput, False]], \\\" will be used to represent the tensor in \ formulas. If not given, the placeholder \\\\[DottedSquare] will be \ -used.\\\"}]], TextCell[Row[List[\\\"TNewTensor\\\", \\\"[\\\", \ -Style[tensorID, Bold], Style[\\\", \\\", Bold], Style[metricID, Bold], Style[\ -\\\", \\\", Bold], Style[coordinatesID, Bold], Style[\\\", \\\", Bold], \ -Style[indices, Bold], Style[\\\", \\\", Bold], Style[components, Bold], \ -Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\"creates a new \ -tensor object.\\\\n\\\", Style[tensorID, Bold], \\\" is a string that will be \ -used to identify the new object, and must be unique. If a tensor object with \ -the same ID already exists, it will be overwritten.\\\\n\\\", Style[metricID, \ -Bold], \\\" is the unique ID of a tensor object representing a metric, \ -created using TNewMetric[ ]. The metric will be used to raise and lower \ -indices for the new tensor.\\\\n\\\", Style[coordinatesID, Bold], \\\" is the \ -unique ID of a tensor object representing a coordinate system, created using \ -TNewCoordinates[ ]. This coordinate system will be used to specify the \ +used.\\\"}]], TextCell[Row[List[\\\"TNewTensor[\\\", Style[\\\"tensorID\\\", \ +Bold], \\\", \\\", Style[\\\"metricID\\\", Bold], \\\", \\\", \ +Style[\\\"coordinatesID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \ +\\\", \\\", Style[\\\"components\\\", Bold], \\\", \\\", \ +Style[\\\"symbol\\\", Bold], \\\", creates a new tensor object.\\\\n\\\", \ +Style[\\\"tensorID\\\", Bold], \\\" is a string that will be used to identify \ +the new object, and must be unique.\\\\n\\\", Style[\\\"metricID\\\", Bold], \ +\\\" is the unique ID of a tensor object representing a metric, created using \ +TNewMetric[]. The metric will be used to raise and lower indices for the new \ +tensor.\\\\n\\\", Style[\\\"coordinatesID\\\", Bold], \\\" is the unique ID \ +of a tensor object representing a coordinate system, created using \ +TNewCoordinates[]. This coordinate system will be used to specify the \ components of the new tensor. If omitted, the default coordinate system of \ -the metric \\\", Style[metricID, Bold], \\\" will be used instead.\\\\n\\\", \ -Style[indices, Bold], \\\" is a list of the form {\\\\[PlusMinus]1, \ -\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\\n\\\", Style[components, Bold], \\\" is a \ -list specifying the representation of the tensor with the index configuration \ -\\\", Style[indices, Bold], \\\" and in the coordinate system \\\", \ -Style[coordinatesID, Bold], \\\".\\\\n\\\", Style[symbol, Bold], \\\" will be \ -used to represent the tensor in formulas. If not given, the placeholder \ +the metric \\\", Style[\\\"metricID\\\", Bold], \\\" will be used.\\\\n\\\", \ +Style[\\\"indices\\\", Bold], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index.\\\\n\\\", \ +Style[\\\"components\\\", Bold], \\\" is a list specifying the representation \ +of the tensor with the index configuration \\\", Style[\\\"indices\\\", \ +Bold], \\\" and in the coordinate system \\\", Style[\\\"coordinatesID\\\", \ +Bold], \\\".\\\\n\\\", Style[\\\"symbol\\\", Bold], \\\" will be used to \ +represent the tensor in formulas. If not given, the placeholder \ \\\\[DottedSquare] will be used.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -5511,65 +5581,55 @@ used to represent the tensor in formulas. If not given, the placeholder \ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TNewTensor\", \"[\", \ -StyleBox[Cell[BoxData[\"tensorID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"components\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"creates a new tensor object.\\n\", StyleBox[Cell[BoxData[\"tensorID\"]], \ -Bold, Rule[StripOnInput, False]], \" is a string that will be used to \ -identify the new object, and must be unique. If a tensor object with the same \ -ID already exists, it will be overwritten.\\n\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" is \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TNewTensor[\", \ +StyleBox[\"tensorID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"components\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"symbol\", Bold, Rule[StripOnInput, False]], \", creates a new \ +tensor object.\\n\", StyleBox[\"tensorID\", Bold, Rule[StripOnInput, False]], \ +\" is a string that will be used to identify the new object, and must be \ +unique.\\n\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \" is \ the unique ID of a tensor object representing a metric, created using \ -TNewMetric[ ]. The metric will be used to raise and lower indices for the new \ -tensor.\\n\", StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, \ -Rule[StripOnInput, False]], \" is the unique ID of a tensor object \ -representing a coordinate system, created using TNewCoordinates[ ]. This \ -coordinate system will be used to specify the components of the new tensor. \ -If omitted, the default coordinate system of the metric \", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" \ -will be used instead.\\n\", StyleBox[Cell[BoxData[\"indices\"]], Bold, \ -Rule[StripOnInput, False]], \" is a list of the form {\\[PlusMinus]1, \ -\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\n\", StyleBox[Cell[BoxData[\"components\"]], \ -Bold, Rule[StripOnInput, False]], \" is a list specifying the representation \ -of the tensor with the index configuration \", \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \" and \ -in the coordinate system \", StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, \ -Rule[StripOnInput, False]], \".\\n\", StyleBox[Cell[BoxData[\"symbol\"]], \ -Bold, Rule[StripOnInput, False]], \" will be used to represent the tensor in \ -formulas. If not given, the placeholder \\[DottedSquare] will be used.\"}]], \ -TextCell[Row[List[\"TNewTensor\", \"[\", Style[tensorID, Bold], Style[\", \", \ -Bold], Style[metricID, Bold], Style[\", \", Bold], Style[coordinatesID, \ -Bold], Style[\", \", Bold], Style[indices, Bold], Style[\", \", Bold], \ -Style[components, Bold], Style[\", \", Bold], Style[symbol, Bold], \"] \", \ -\"creates a new tensor object.\\n\", Style[tensorID, Bold], \" is a string \ -that will be used to identify the new object, and must be unique. If a tensor \ -object with the same ID already exists, it will be overwritten.\\n\", \ -Style[metricID, Bold], \" is the unique ID of a tensor object representing a \ -metric, created using TNewMetric[ ]. The metric will be used to raise and \ -lower indices for the new tensor.\\n\", Style[coordinatesID, Bold], \" is the \ -unique ID of a tensor object representing a coordinate system, created using \ -TNewCoordinates[ ]. This coordinate system will be used to specify the \ -components of the new tensor. If omitted, the default coordinate system of \ -the metric \", Style[metricID, Bold], \" will be used instead.\\n\", \ -Style[indices, Bold], \" is a list of the form {\\[PlusMinus]1, \ +TNewMetric[]. The metric will be used to raise and lower indices for the new \ +tensor.\\n\", StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \ +\" is the unique ID of a tensor object representing a coordinate system, \ +created using TNewCoordinates[]. This coordinate system will be used to \ +specify the components of the new tensor. If omitted, the default coordinate \ +system of the metric \", StyleBox[\"metricID\", Bold, Rule[StripOnInput, \ +False]], \" will be used.\\n\", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \" must be a list of the form {\\[PlusMinus]1, \ \\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\n\", Style[components, Bold], \" is a list \ -specifying the representation of the tensor with the index configuration \", \ -Style[indices, Bold], \" and in the coordinate system \", \ -Style[coordinatesID, Bold], \".\\n\", Style[symbol, Bold], \" will be used to \ +corresponds to a lower index.\\n\", StyleBox[\"components\", Bold, \ +Rule[StripOnInput, False]], \" is a list specifying the representation of the \ +tensor with the index configuration \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \" and in the coordinate system \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \".\\n\", \ +StyleBox[\"symbol\", Bold, Rule[StripOnInput, False]], \" will be used to \ represent the tensor in formulas. If not given, the placeholder \ -\\[DottedSquare] will be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> - None, "UpValues" -> None, "DownValues" -> +\\[DottedSquare] will be used.\"}]], TextCell[Row[List[\"TNewTensor[\", \ +Style[\"tensorID\", Bold], \", \", Style[\"metricID\", Bold], \", \", \ +Style[\"coordinatesID\", Bold], \", \", Style[\"indices\", Bold], \", \", \ +Style[\"components\", Bold], \", \", Style[\"symbol\", Bold], \", creates a \ +new tensor object.\\n\", Style[\"tensorID\", Bold], \" is a string that will \ +be used to identify the new object, and must be unique.\\n\", \ +Style[\"metricID\", Bold], \" is the unique ID of a tensor object \ +representing a metric, created using TNewMetric[]. The metric will be used to \ +raise and lower indices for the new tensor.\\n\", Style[\"coordinatesID\", \ +Bold], \" is the unique ID of a tensor object representing a coordinate \ +system, created using TNewCoordinates[]. This coordinate system will be used \ +to specify the components of the new tensor. If omitted, the default \ +coordinate system of the metric \", Style[\"metricID\", Bold], \" will be \ +used.\\n\", Style[\"indices\", Bold], \" must be a list of the form \ +{\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an upper index \ +and -1 corresponds to a lower index.\\n\", Style[\"components\", Bold], \" is \ +a list specifying the representation of the tensor with the index \ +configuration \", Style[\"indices\", Bold], \" and in the coordinate system \ +\", Style[\"coordinatesID\", Bold], \".\\n\", Style[\"symbol\", Bold], \" \ +will be used to represent the tensor in formulas. If not given, the \ +placeholder \\[DottedSquare] will be used.\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TNewTensor, {OGRe`TNewTensor[ Pattern[OGRe`Private`tensorID, @@ -5587,6 +5647,7 @@ represent the tensor in formulas. If not given, the placeholder \ Pattern[OGRe`Private`symbol, Blank[String]], "\[DottedSquare]"]] :> Module[{OGRe`Private`useCoords}, + OGRe`Private`CheckIfOverwriting[OGRe`Private`tensorID]; OGRe`Private`CheckIfTensorExists[OGRe`Private`metricID]; OGRe`Private`CheckIfMetric[OGRe`Private`metricID]; OGRe`Private`CheckIndicesForm[OGRe`Private`indices]; @@ -5620,7 +5681,7 @@ represent the tensor in formulas. If not given, the placeholder \ "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TNewTensor"], False]]], "Output", - CellLabel->"Out[27]=",ExpressionUUID->"38ee0b89-cbb4-498d-8209-3e092328178f"] + CellLabel->"Out[27]=",ExpressionUUID->"b4899061-fc83-47a0-9b19-0b9ca05d009d"] }, Open ]], Cell[TextData[{ @@ -5708,7 +5769,7 @@ Cell[BoxData[ CellLabel->"In[28]:=",ExpressionUUID->"e086714b-c7df-4fd7-835d-b914e9e1ff77"], Cell[BoxData["\<\"Kretschmann\"\>"], "Output", - CellLabel->"Out[28]=",ExpressionUUID->"e8798192-e0e6-4d99-8949-7ee700999676"] + CellLabel->"Out[28]=",ExpressionUUID->"43cc433e-d1a5-4f0e-acc4-a17d47d7af39"] }, Open ]], Cell["\<\ @@ -5740,7 +5801,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"c1621201-2007-416e-9fe3-0481c2dec8b4"] + CellLabel->"OGRe:",ExpressionUUID->"d4693074-783b-47e7-ba6e-b8f1c3538113"] }, Open ]], Cell[TextData[{ @@ -5831,7 +5892,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"49faf5db-bc21-4f79-81de-349db3791ddf"] + CellLabel->"OGRe:",ExpressionUUID->"1583196b-b32e-49f0-9565-387137c071fc"] }, Open ]], Cell[TextData[{ @@ -5914,7 +5975,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"606aad82-3803-42b2-b9e0-61cedbcba0c8"] + CellLabel->"OGRe:",ExpressionUUID->"1a6e4f18-9e27-410a-9680-196dccbd68f9"] }, Open ]], Cell["\<\ @@ -5975,16 +6036,15 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeSymbol\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"changes the symbol of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" to \ -\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\"}]], TextCell[Row[List[\\\"TChangeSymbol\\\", \\\"[\\\", \ -Style[ID, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\ -\"changes the symbol of the tensor object \\\", Style[ID, Bold], \\\" to \ -\\\", Style[symbol, Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", +TChangeSymbol[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\ +\", \\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +changes the symbol of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to \\\", StyleBox[\\\"symbol\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\"}]], \ +TextCell[Row[List[\\\"TChangeSymbol[\\\", Style[\\\"ID\\\", Bold], \\\", \ +\\\", Style[\\\"symbol\\\", Bold], \\\"] changes the symbol of the tensor \ +object \\\", Style[\\\"ID\\\", Bold], \\\" to \\\", Style[\\\"symbol\\\", \ +Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -6155,16 +6215,15 @@ Style[ID, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeSymbol\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"changes the symbol of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" to \ -\\\", StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\"}]], TextCell[Row[List[\\\"TChangeSymbol\\\", \\\"[\\\", \ -Style[ID, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\ -\"changes the symbol of the tensor object \\\", Style[ID, Bold], \\\" to \ -\\\", Style[symbol, Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", +TChangeSymbol[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\ +\", \\\", StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +changes the symbol of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" to \\\", StyleBox[\\\"symbol\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\"}]], \ +TextCell[Row[List[\\\"TChangeSymbol[\\\", Style[\\\"ID\\\", Bold], \\\", \ +\\\", Style[\\\"symbol\\\", Bold], \\\"] changes the symbol of the tensor \ +object \\\", Style[\\\"ID\\\", Bold], \\\" to \\\", Style[\\\"symbol\\\", \ +Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -6178,6 +6237,7 @@ Style[ID, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\ TagBox[ ButtonBox[ PaneSelectorBox[{False-> + DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "DownPointerOpener"], ImageSizeCache->{10., {3., 7.}}], True-> @@ -6227,18 +6287,16 @@ Style[ID, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \\\"] \\\", \\\ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeSymbol\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"changes the symbol of the tensor object \", StyleBox[Cell[BoxData[\"ID\"]], \ -Bold, Rule[StripOnInput, False]], \" to \", \ -StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, False]], \ -\".\"}]], TextCell[Row[List[\"TChangeSymbol\", \"[\", Style[ID, Bold], Style[\ -\", \", Bold], Style[symbol, Bold], \"] \", \"changes the symbol of the \ -tensor object \", Style[ID, Bold], \" to \", Style[symbol, Bold], \ -\".\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> - None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeSymbol[\", StyleBox[\"ID\ +\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"symbol\", Bold, \ +Rule[StripOnInput, False]], \"] changes the symbol of the tensor object \", \ +StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \" to \", \ +StyleBox[\"symbol\", Bold, Rule[StripOnInput, False]], \".\"}]], \ +TextCell[Row[List[\"TChangeSymbol[\", Style[\"ID\", Bold], \", \", \ +Style[\"symbol\", Bold], \"] changes the symbol of the tensor object \", \ +Style[\"ID\", Bold], \" to \", Style[\"symbol\", Bold], \".\"]]]]\)", + "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, + "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TChangeSymbol, {OGRe`TChangeSymbol[ Pattern[OGRe`Private`ID, @@ -6252,7 +6310,7 @@ tensor object \", Style[ID, Bold], \" to \", Style[symbol, Bold], \ "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TChangeSymbol"], False]]], "Output", - CellLabel->"Out[34]=",ExpressionUUID->"a484738a-a2ba-487d-845e-c243532aa2ce"] + CellLabel->"Out[34]=",ExpressionUUID->"60906c38-686d-4df2-b68c-ac6c0f37b2f7"] }, Open ]], Cell[TextData[{ @@ -6303,7 +6361,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"78e7bec5-29ad-4b96-8ffc-90ae324bbcb5"] + CellLabel->"OGRe:",ExpressionUUID->"1d470697-c64d-45dd-afef-330ea062786c"] }, Open ]], Cell[TextData[{ @@ -6343,27 +6401,22 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeID\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"changes the ID of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -to \\\", StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ -currently defined tensors will be scanned, and any references to \\\", \ -StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -will be replaced with \\\", StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\". If a tensor with the ID \\\", \ -StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -already exists, it will be overwritten.\\\"}]], \ -TextCell[Row[List[\\\"TChangeID\\\", \\\"[\\\", Style[oldID, Bold], \ -Style[\\\", \\\", Bold], Style[newID, Bold], \\\"] \\\", \\\"changes the ID \ -of the tensor object \\\", Style[oldID, Bold], \\\" to \\\", Style[newID, \ -Bold], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ -currently defined tensors will be scanned, and any references to \\\", \ -Style[oldID, Bold], \\\" will be replaced with \\\", Style[newID, Bold], \ -\\\". If a tensor with the ID \\\", Style[newID, Bold], \\\" already exists, \ -it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", +TChangeID[\\\", StyleBox[\\\"oldID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" \\\\[Rule] \\\", StyleBox[\\\"newID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] changes the ID of the tensor object \\\", StyleBox[\\\"oldID\\\ +\", Bold, Rule[StripOnInput, False]], \\\" to \\\", StyleBox[\\\"newID\\\", \ +Bold, Rule[StripOnInput, False]], \\\".\\\\nIf the tensor is a metric or a \ +coordinate system, all currently defined tensors will be scanned, and any \ +references to \\\", StyleBox[\\\"oldID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be replaced with \\\", StyleBox[\\\"newID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\"}]], \ +TextCell[Row[List[\\\"TChangeID[\\\", Style[\\\"oldID\\\", Bold], \\\" \ +\\\\[Rule] \\\", Style[\\\"newID\\\", Bold], \\\"] changes the ID of the \ +tensor object \\\", Style[\\\"oldID\\\", Bold], \\\" to \\\", Style[\\\"newID\ +\\\", Bold], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ +currently defined tensors will be scanned, and any references to \\\", Style[\ +\\\"oldID\\\", Bold], \\\" will be replaced with \\\", Style[\\\"newID\\\", \ +Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -6391,6 +6444,15 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{"TChangeID", "[", + RowBox[{ + "OGRe`Private`oldID_String", "\[Rule]", + "OGRe`Private`newID_String"}], "]"}], ":=", + RowBox[{"TChangeID", "[", + RowBox[{"OGRe`Private`oldID", ",", "OGRe`Private`newID"}], + "]"}]}]}, {" "}, { + RowBox[{ + RowBox[{"TChangeID", "[", + RowBox[{ "OGRe`Private`oldID_String", ",", "OGRe`Private`newID_String"}], "]"}], ":=", @@ -6400,6 +6462,10 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ "OGRe`Private`CheckIfTensorExists", "[", "OGRe`Private`oldID", "]"}], ";", + + RowBox[{ + "OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`newID", "]"}], ";", RowBox[{"OGRe`Private`SetTensorID", "[", RowBox[{"OGRe`Private`newID", ",", @@ -6455,7 +6521,6 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", }, DefaultBaseStyle->"Column", GridBoxAlignment->{"Columns" -> {{Left}}}, - GridBoxItemSize->{ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}], "Column"], @@ -6504,6 +6569,7 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", DefaultBaseStyle->"Column", GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxDividers->{"Columns" -> {{False}}, "Rows" -> {{False}}}, + GridBoxItemSize->{ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}, GridBoxSpacings->{"Columns" -> { @@ -6574,27 +6640,22 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeID\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"changes the ID of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -to \\\", StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ -currently defined tensors will be scanned, and any references to \\\", \ -StyleBox[Cell[BoxData[\\\"oldID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -will be replaced with \\\", StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\". If a tensor with the ID \\\", \ -StyleBox[Cell[BoxData[\\\"newID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -already exists, it will be overwritten.\\\"}]], \ -TextCell[Row[List[\\\"TChangeID\\\", \\\"[\\\", Style[oldID, Bold], \ -Style[\\\", \\\", Bold], Style[newID, Bold], \\\"] \\\", \\\"changes the ID \ -of the tensor object \\\", Style[oldID, Bold], \\\" to \\\", Style[newID, \ -Bold], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ -currently defined tensors will be scanned, and any references to \\\", \ -Style[oldID, Bold], \\\" will be replaced with \\\", Style[newID, Bold], \ -\\\". If a tensor with the ID \\\", Style[newID, Bold], \\\" already exists, \ -it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", +TChangeID[\\\", StyleBox[\\\"oldID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" \\\\[Rule] \\\", StyleBox[\\\"newID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] changes the ID of the tensor object \\\", StyleBox[\\\"oldID\\\ +\", Bold, Rule[StripOnInput, False]], \\\" to \\\", StyleBox[\\\"newID\\\", \ +Bold, Rule[StripOnInput, False]], \\\".\\\\nIf the tensor is a metric or a \ +coordinate system, all currently defined tensors will be scanned, and any \ +references to \\\", StyleBox[\\\"oldID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" will be replaced with \\\", StyleBox[\\\"newID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\"}]], \ +TextCell[Row[List[\\\"TChangeID[\\\", Style[\\\"oldID\\\", Bold], \\\" \ +\\\\[Rule] \\\", Style[\\\"newID\\\", Bold], \\\"] changes the ID of the \ +tensor object \\\", Style[\\\"oldID\\\", Bold], \\\" to \\\", Style[\\\"newID\ +\\\", Bold], \\\".\\\\nIf the tensor is a metric or a coordinate system, all \ +currently defined tensors will be scanned, and any references to \\\", Style[\ +\\\"oldID\\\", Bold], \\\" will be replaced with \\\", Style[\\\"newID\\\", \ +Bold], \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -6658,34 +6719,33 @@ it will be overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeID\", \"[\", \ -StyleBox[Cell[BoxData[\"oldID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"newID\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"changes the ID of the tensor object \", StyleBox[Cell[BoxData[\"oldID\"]], \ -Bold, Rule[StripOnInput, False]], \" to \", \ -StyleBox[Cell[BoxData[\"newID\"]], Bold, Rule[StripOnInput, False]], \".\\nIf \ -the tensor is a metric or a coordinate system, all currently defined tensors \ -will be scanned, and any references to \", StyleBox[Cell[BoxData[\"oldID\"]], \ -Bold, Rule[StripOnInput, False]], \" will be replaced with \", \ -StyleBox[Cell[BoxData[\"newID\"]], Bold, Rule[StripOnInput, False]], \". If a \ -tensor with the ID \", StyleBox[Cell[BoxData[\"newID\"]], Bold, \ -Rule[StripOnInput, False]], \" already exists, it will be overwritten.\"}]], \ -TextCell[Row[List[\"TChangeID\", \"[\", Style[oldID, Bold], Style[\", \", \ -Bold], Style[newID, Bold], \"] \", \"changes the ID of the tensor object \", \ -Style[oldID, Bold], \" to \", Style[newID, Bold], \".\\nIf the tensor is a \ -metric or a coordinate system, all currently defined tensors will be scanned, \ -and any references to \", Style[oldID, Bold], \" will be replaced with \", \ -Style[newID, Bold], \". If a tensor with the ID \", Style[newID, Bold], \" \ -already exists, it will be overwritten.\"]]]]\)", "Documentation" -> None, - "OwnValues" -> None, "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeID[\", \ +StyleBox[\"oldID\", Bold, Rule[StripOnInput, False]], \" \\[Rule] \", \ +StyleBox[\"newID\", Bold, Rule[StripOnInput, False]], \"] changes the ID of \ +the tensor object \", StyleBox[\"oldID\", Bold, Rule[StripOnInput, False]], \ +\" to \", StyleBox[\"newID\", Bold, Rule[StripOnInput, False]], \".\\nIf the \ +tensor is a metric or a coordinate system, all currently defined tensors will \ +be scanned, and any references to \", StyleBox[\"oldID\", Bold, \ +Rule[StripOnInput, False]], \" will be replaced with \", StyleBox[\"newID\", \ +Bold, Rule[StripOnInput, False]], \".\"}]], TextCell[Row[List[\"TChangeID[\", \ +Style[\"oldID\", Bold], \" \\[Rule] \", Style[\"newID\", Bold], \"] changes \ +the ID of the tensor object \", Style[\"oldID\", Bold], \" to \", \ +Style[\"newID\", Bold], \".\\nIf the tensor is a metric or a coordinate \ +system, all currently defined tensors will be scanned, and any references to \ +\", Style[\"oldID\", Bold], \" will be replaced with \", Style[\"newID\", \ +Bold], \".\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> + None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TChangeID, {OGRe`TChangeID[ + DownValues, OGRe`TChangeID, {OGRe`TChangeID[Pattern[OGRe`Private`oldID, + Blank[String]] -> Pattern[OGRe`Private`newID, + Blank[String]]] :> + OGRe`TChangeID[OGRe`Private`oldID, OGRe`Private`newID], OGRe`TChangeID[ Pattern[OGRe`Private`oldID, Blank[String]], Pattern[OGRe`Private`newID, Blank[String]]] :> ( OGRe`Private`CheckIfTensorExists[OGRe`Private`oldID]; + OGRe`Private`CheckIfOverwriting[OGRe`Private`newID]; OGRe`Private`SetTensorID[OGRe`Private`newID, OGRe`Private`TensorData[OGRe`Private`oldID]]; OGRe`Private`RemoveTensorID[OGRe`Private`oldID]; @@ -6701,7 +6761,7 @@ already exists, it will be overwritten.\"]]]]\)", "Documentation" -> None, None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TChangeID"], False]]], "Output", - CellLabel->"Out[36]=",ExpressionUUID->"7baad15b-337f-46b8-a7c6-6e78b4c9f8ca"] + CellLabel->"Out[36]=",ExpressionUUID->"d15051d3-a16c-4d25-b33b-e80ec89ed47f"] }, Open ]], Cell[TextData[{ @@ -6717,7 +6777,7 @@ Cell[TextData[{ Cell[BoxData[ RowBox[{ RowBox[{"TChangeID", "[", - RowBox[{"\"\\"", ",", "\"\<4-Velocity\>\""}], "]"}], + RowBox[{"\"\\"", "\[Rule]", "\"\<4-Velocity\>\""}], "]"}], ";"}]], "Input", CellLabel->"In[37]:=",ExpressionUUID->"b09d8624-4f55-4fa4-9451-85144a1d8a9a"], @@ -6737,15 +6797,15 @@ Cell[BoxData[ "OGRe`Private`CheckIfTensorExists", "ErrorDoesNotExist", "\"The tensor \ \\\"\\!\\(\\*RowBox[{\\\"\\\\\\\"FourVelocity\\\\\\\"\\\"}]\\)\\\" does not \ -exist.\"", 2, 38, 2, 26988534644047075405, "Local", +exist.\"", 2, 38, 2, 26994801196498307137, "Local", "OGRe`Private`CheckIfTensorExists"}, "MessageTemplate2"]], "Message", "MSG", CellLabel-> "During evaluation of \ -In[38]:=",ExpressionUUID->"0babbe9d-4967-490c-94c2-46691f8c3358"], +In[38]:=",ExpressionUUID->"26f3b352-c6d8-4e04-8624-9c7c3557d0eb"], Cell[BoxData["$Aborted"], "Output", - CellLabel->"Out[38]=",ExpressionUUID->"950f41bc-c867-4583-9ad3-11499398f416"] + CellLabel->"Out[38]=",ExpressionUUID->"d4f1971b-5321-466b-aaea-4e22f2581875"] }, Open ]], Cell["We can access the tensor using the new ID:", \ @@ -6789,7 +6849,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"0be50234-c43d-4fec-bf3a-6dde6359efed"] + CellLabel->"OGRe:",ExpressionUUID->"da6d7905-e994-4164-a73e-93711aa2274d"] }, Open ]], Cell[TextData[{ @@ -6844,18 +6904,15 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TDelete\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"deletes the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\".\\\ -\\nWARNING: The tensor data will be lost forever and cannot be \ -recovered.\\\\nIf the tensor is a metric or coordinate system, it cannot be \ -deleted unless all tensors referring to it have been deleted first.\\\"}]], \ -TextCell[Row[List[\\\"TDelete\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ -\"deletes the tensor object \\\", Style[ID, Bold], \\\".\\\\nWARNING: The \ -tensor data will be lost forever and cannot be recovered.\\\\nIf the tensor \ -is a metric or coordinate system, it cannot be deleted unless all tensors \ -referring to it have been deleted first.\\\"]]]]\\)\"\>", - "InformationUsageText", +TDelete[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +permanently deletes the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\". If the tensor is a metric or coordinate \ +system, it cannot be deleted unless all tensors referring to it have been \ +deleted first.\\\"}]], TextCell[Row[List[\\\"TDelete[\\\", Style[\\\"ID\\\", \ +Bold], \\\"] permanently deletes the tensor object \\\", Style[\\\"ID\\\", \ +Bold], \\\". If the tensor is a metric or coordinate system, it cannot be \ +deleted unless all tensors referring to it have been deleted \ +first.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -7080,18 +7137,15 @@ referring to it have been deleted first.\\\"]]]]\\)\"\>", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TDelete\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"deletes the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\".\\\ -\\nWARNING: The tensor data will be lost forever and cannot be \ -recovered.\\\\nIf the tensor is a metric or coordinate system, it cannot be \ -deleted unless all tensors referring to it have been deleted first.\\\"}]], \ -TextCell[Row[List[\\\"TDelete\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ -\"deletes the tensor object \\\", Style[ID, Bold], \\\".\\\\nWARNING: The \ -tensor data will be lost forever and cannot be recovered.\\\\nIf the tensor \ -is a metric or coordinate system, it cannot be deleted unless all tensors \ -referring to it have been deleted first.\\\"]]]]\\)\"\>", - "InformationUsageText", +TDelete[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +permanently deletes the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\". If the tensor is a metric or coordinate \ +system, it cannot be deleted unless all tensors referring to it have been \ +deleted first.\\\"}]], TextCell[Row[List[\\\"TDelete[\\\", Style[\\\"ID\\\", \ +Bold], \\\"] permanently deletes the tensor object \\\", Style[\\\"ID\\\", \ +Bold], \\\". If the tensor is a metric or coordinate system, it cannot be \ +deleted unless all tensors referring to it have been deleted \ +first.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -7155,18 +7209,16 @@ referring to it have been deleted first.\\\"]]]]\\)\"\>", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TDelete\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"deletes the tensor object \", StyleBox[Cell[BoxData[\"ID\"]], Bold, \ -Rule[StripOnInput, False]], \".\\nWARNING: The tensor data will be lost \ -forever and cannot be recovered.\\nIf the tensor is a metric or coordinate \ -system, it cannot be deleted unless all tensors referring to it have been \ -deleted first.\"}]], TextCell[Row[List[\"TDelete\", \"[\", Style[ID, Bold], \ -\"] \", \"deletes the tensor object \", Style[ID, Bold], \".\\nWARNING: The \ -tensor data will be lost forever and cannot be recovered.\\nIf the tensor is \ -a metric or coordinate system, it cannot be deleted unless all tensors \ -referring to it have been deleted first.\"]]]]\)", "Documentation" -> None, - "OwnValues" -> None, "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TDelete[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] permanently deletes the tensor object \ +\", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \". If the tensor is a \ +metric or coordinate system, it cannot be deleted unless all tensors \ +referring to it have been deleted first.\"}]], \ +TextCell[Row[List[\"TDelete[\", Style[\"ID\", Bold], \"] permanently deletes \ +the tensor object \", Style[\"ID\", Bold], \". If the tensor is a metric or \ +coordinate system, it cannot be deleted unless all tensors referring to it \ +have been deleted first.\"]]]]\)", "Documentation" -> None, "OwnValues" -> + None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TDelete, {OGRe`TDelete[ Pattern[OGRe`Private`ID, Blank[String]]] :> ( @@ -7191,7 +7243,7 @@ referring to it have been deleted first.\"]]]]\)", "Documentation" -> None, None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TDelete"], False]]], "Output", - CellLabel->"Out[40]=",ExpressionUUID->"47738954-1278-4dab-ac0b-0238325b6458"] + CellLabel->"Out[40]=",ExpressionUUID->"d5936eb1-dbfc-48e0-83a6-6fa37b9da62e"] }, Open ]], Cell[TextData[{ @@ -7222,14 +7274,14 @@ deleted, as it is the default coordinate system of the tensor \ \\\"\\!\\(\\*RowBox[{\\\"\\\\\\\"Minkowski\\\\\\\"\\\"}]\\)\\\". To delete \ the coordinate system, first change the default coordinate system of \ \\\"\\!\\(\\*RowBox[{\\\"\\\\\\\"Minkowski\\\\\\\"\\\"}]\\)\\\" and any other \ -relevant tensors.\"", 2, 41, 3, 26988534644047075405, "Local", "OGRe`TDelete"}, +relevant tensors.\"", 2, 41, 3, 26994801196498307137, "Local", "OGRe`TDelete"}, "MessageTemplate2"]], "Message", "MSG", CellLabel-> "During evaluation of \ -In[41]:=",ExpressionUUID->"62cee85e-b2d9-43e9-9777-2ab347c90e1e"], +In[41]:=",ExpressionUUID->"34dd5850-2fa5-4659-b7a9-e66024097f75"], Cell[BoxData["$Aborted"], "Output", - CellLabel->"Out[41]=",ExpressionUUID->"1f7d3a7f-883c-4799-8695-af487dcc455c"] + CellLabel->"Out[41]=",ExpressionUUID->"ea477063-c81e-45be-87a2-aa6fed2f3e28"] }, Open ]], Cell[TextData[{ @@ -7255,23 +7307,25 @@ Cell[BoxData[ deleted, as it has been used to define the tensor \\\"\\!\\(\\*RowBox[{\\\"\\\ \\\\\"PerfectFluid\\\\\\\"\\\"}]\\)\\\". To delete the metric, first delete \ \\\"\\!\\(\\*RowBox[{\\\"\\\\\\\"PerfectFluid\\\\\\\"\\\"}]\\)\\\" and any \ -other tensors defined using this metric.\"", 2, 42, 4, 26988534644047075405, +other tensors defined using this metric.\"", 2, 42, 4, 26994801196498307137, "Local", "OGRe`TDelete"}, "MessageTemplate2"]], "Message", "MSG", CellLabel-> "During evaluation of \ -In[42]:=",ExpressionUUID->"3b692463-9b23-4e63-9f3c-f33d49217f10"], +In[42]:=",ExpressionUUID->"c1f9aa38-9834-4282-97fd-9db092589825"], Cell[BoxData["$Aborted"], "Output", - CellLabel->"Out[42]=",ExpressionUUID->"82caf8f9-42b6-493c-b6b3-89121c894e49"] + CellLabel->"Out[42]=",ExpressionUUID->"b32f95b5-641a-4e75-808f-6c805f789c6c"] }, Open ]], Cell[TextData[{ "Finally, note that there is no module to change the components of a tensor \ after it has already been defined, as this may break class invariants. \ -Instead, simply create a new tensor with the same ID using the ", +Instead, you can delete the tensor using ", + StyleBox["TDelete", "Input"], + " and then create a new tensor with the same ID using ", StyleBox["TNewTensor", "Input"], - " module, which will overwrite the previously defined tensor." + "." }], "Text",ExpressionUUID->"8c14b054-7b78-4dd0-8f2b-41430b83c5eb"] }, Open ]], @@ -7474,7 +7528,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"537ea04f-23e8-4340-afca-91b8f7989120"] + CellLabel->"OGRe:",ExpressionUUID->"2835724f-8925-481f-a8d0-ecd15cc69dbc"] }, Open ]], Cell[TextData[{ @@ -7568,7 +7622,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"b33c6a4a-1403-467b-a279-66420cfff9a5"] + CellLabel->"OGRe:",ExpressionUUID->"da4b304d-9530-4aa6-8672-8d901e47c4f6"] }, Open ]], Cell["\<\ @@ -7635,7 +7689,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"69596d89-ad78-4cbd-b5e4-5970f918f2a2"] + CellLabel->"OGRe:",ExpressionUUID->"027dfe5b-0105-4f7e-957b-e58cc8ffc05b"] }, Open ]], Cell["\<\ @@ -7719,7 +7773,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"6468d7b4-40f2-44e8-8d58-a1e55c503f5a"] + CellLabel->"OGRe:",ExpressionUUID->"7d7464af-44f0-4167-a82a-47f78016233c"] }, Open ]], Cell[TextData[{ @@ -7771,24 +7825,21 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeDefaultIndices\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, \ -Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"changes the default index \ -configuration of the tensor object \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" to \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\".\\\\n\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is a list of the form {\\\\[PlusMinus]1, \ -\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\"}]], \ -TextCell[Row[List[\\\"TChangeDefaultIndices\\\", \\\"[\\\", Style[ID, Bold], \ -Style[\\\", \\\", Bold], Style[indices, Bold], \\\"] \\\", \\\"changes the \ -default index configuration of the tensor object \\\", Style[ID, Bold], \\\" \ -to \\\", Style[indices, Bold], \\\".\\\\n\\\", Style[indices, Bold], \\\" is \ -a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\\"]]]]\\)\ -\"\>", "InformationUsageText", +TChangeDefaultIndices[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] changes the default index configuration of the tensor object \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" to \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" must be a \ +list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ +corresponds to an upper index and -1 corresponds to a lower index.\\\"}]], \ +TextCell[Row[List[\\\"TChangeDefaultIndices[\\\", Style[\\\"ID\\\", Bold], \\\ +\", \\\", Style[\\\"indices\\\", Bold], \\\"] changes the default index \ +configuration of the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" to \ +\\\", Style[\\\"indices\\\", Bold], \\\".\\\\n\\\", Style[\\\"indices\\\", \ +Bold], \\\" must be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, \ +...}, where +1 corresponds to an upper index and -1 corresponds to a lower \ +index.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -7881,7 +7932,6 @@ corresponds to an upper index and -1 corresponds to a lower index.\\\"]]]]\\)\ RowBox[{"OGRe`Private`TensorData", "[", "OGRe`Private`ID", "]"}], "[", "\"DefaultCoords\"", "]"}]}], "]"}], ";", RowBox[{"OGRe`Private`ChangeTensorKey", "[", - RowBox[{"OGRe`Private`ID", ",", "\"DefaultIndices\"", ",", "OGRe`Private`indices"}], "]"}], ";", RowBox[{"Return", "[", "OGRe`Private`ID", "]"}], ";"}], @@ -8014,24 +8064,21 @@ corresponds to an upper index and -1 corresponds to a lower index.\\\"]]]]\\)\ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeDefaultIndices\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, \ -Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"changes the default index \ -configuration of the tensor object \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" to \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\".\\\\n\\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is a list of the form {\\\\[PlusMinus]1, \ -\\\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\"}]], \ -TextCell[Row[List[\\\"TChangeDefaultIndices\\\", \\\"[\\\", Style[ID, Bold], \ -Style[\\\", \\\", Bold], Style[indices, Bold], \\\"] \\\", \\\"changes the \ -default index configuration of the tensor object \\\", Style[ID, Bold], \\\" \ -to \\\", Style[indices, Bold], \\\".\\\\n\\\", Style[indices, Bold], \\\" is \ -a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\\\"]]]]\\)\ -\"\>", "InformationUsageText", +TChangeDefaultIndices[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] changes the default index configuration of the tensor object \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" to \\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ +StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" must be a \ +list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 \ +corresponds to an upper index and -1 corresponds to a lower index.\\\"}]], \ +TextCell[Row[List[\\\"TChangeDefaultIndices[\\\", Style[\\\"ID\\\", Bold], \\\ +\", \\\", Style[\\\"indices\\\", Bold], \\\"] changes the default index \ +configuration of the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" to \ +\\\", Style[\\\"indices\\\", Bold], \\\".\\\\n\\\", Style[\\\"indices\\\", \ +Bold], \\\" must be a list of the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, \ +...}, where +1 corresponds to an upper index and -1 corresponds to a lower \ +index.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -8095,22 +8142,21 @@ corresponds to an upper index and -1 corresponds to a lower index.\\\"]]]]\\)\ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeDefaultIndices\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"changes the default index configuration of the tensor object \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" to \", \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \".\\n\ -\", StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \" \ -is a list of the form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 \ -corresponds to an upper index and -1 corresponds to a lower index.\"}]], \ -TextCell[Row[List[\"TChangeDefaultIndices\", \"[\", Style[ID, Bold], \ -Style[\", \", Bold], Style[indices, Bold], \"] \", \"changes the default \ -index configuration of the tensor object \", Style[ID, Bold], \" to \", \ -Style[indices, Bold], \".\\n\", Style[indices, Bold], \" is a list of the \ -form {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an upper \ -index and -1 corresponds to a lower index.\"]]]]\)", "Documentation" -> None, + "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeDefaultIndices[\", \ +StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\ +\", Bold, Rule[StripOnInput, False]], \"] changes the default index \ +configuration of the tensor object \", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \" to \", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \".\\n\", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \" must be a list of the form {\\[PlusMinus]1, \ +\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index.\"}]], \ +TextCell[Row[List[\"TChangeDefaultIndices[\", Style[\"ID\", Bold], \", \", \ +Style[\"indices\", Bold], \"] changes the default index configuration of the \ +tensor object \", Style[\"ID\", Bold], \" to \", Style[\"indices\", Bold], \ +\".\\n\", Style[\"indices\", Bold], \" must be a list of the form \ +{\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an upper index \ +and -1 corresponds to a lower index.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TChangeDefaultIndices, {OGRe`TChangeDefaultIndices[ @@ -8118,9 +8164,8 @@ index and -1 corresponds to a lower index.\"]]]]\)", "Documentation" -> None, Blank[String]], Pattern[OGRe`Private`indices, Blank[List]]] :> (OGRe`Private`CheckIfTensorExists[OGRe`Private`ID]; - If[ - OGRe`Private`TensorData[OGRe`Private`ID]["Role"] === "Coordinates", - Message[ + If[OGRe`Private`TensorData[OGRe`Private`ID]["Role"] === "Coordinates", + Message[ MessageName[OGRe`TChangeDefaultIndices, "ErrorCoords"]]; Abort[]; Null]; If[ OGRe`Private`TensorData[OGRe`Private`ID]["Role"] === "Metric", @@ -8139,7 +8184,7 @@ index and -1 corresponds to a lower index.\"]]]]\)", "Documentation" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TChangeDefaultIndices"], False]]], "Output", - CellLabel->"Out[47]=",ExpressionUUID->"67dc6dfa-03f2-41f7-895c-da46fdf56098"] + CellLabel->"Out[47]=",ExpressionUUID->"af227d7c-7271-4d59-8de8-78240ae6571c"] }, Open ]], Cell["\<\ @@ -8194,7 +8239,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"ac08214f-ee82-4597-a2a1-420f75f0cd42"] + CellLabel->"OGRe:",ExpressionUUID->"12e9878f-17d4-4785-a7cb-b7b0ffd0316f"] }, Open ]] }, Open ]], @@ -8506,27 +8551,24 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TAddCoordTransformation\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"sourceID\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"targetID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", \ -Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"rules\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"adds a transformation from \ -the coordinate system \\\", StyleBox[Cell[BoxData[\\\"sourceID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" to the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"targetID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\".\\\\nThe argument \\\", StyleBox[Cell[BoxData[\\\"rules\\\"]], Bold, \ +TAddCoordTransformation[\\\", StyleBox[\\\"sourceID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" \\\\[Rule] \\\", StyleBox[\\\"targetID\\\", \ +Bold, Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"rules\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] adds a transformation from the coordinate \ +system \\\", StyleBox[\\\"sourceID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" to the coordinate system \\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\n\\\", StyleBox[\\\"rules\\\", Bold, \ Rule[StripOnInput, False]], \\\" must be a list of transformation rules. For \ example, {x \\\\[Rule] r Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\ \\\\[Theta]] Sin[\\\\[Phi]], z \\\\[Rule] r Cos[\\\\[Theta]]} is a \ transformation from Cartesian to spherical coordinates.\\\"}]], \ -TextCell[Row[List[\\\"TAddCoordTransformation\\\", \\\"[\\\", Style[sourceID, \ -Bold], Style[\\\", \\\", Bold], Style[targetID, Bold], Style[\\\", \\\", \ -Bold], Style[rules, Bold], \\\"] \\\", \\\"adds a transformation from the \ -coordinate system \\\", Style[sourceID, Bold], \\\" to the coordinate system \ -\\\", Style[targetID, Bold], \\\".\\\\nThe argument \\\", Style[rules, Bold], \ -\\\" must be a list of transformation rules. For example, {x \\\\[Rule] r \ -Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\\\\[Theta]] \ +TextCell[Row[List[\\\"TAddCoordTransformation[\\\", Style[\\\"sourceID\\\", \ +Bold], \\\" \\\\[Rule] \\\", Style[\\\"targetID\\\", Bold], \\\", \\\", \ +Style[\\\"rules\\\", Bold], \\\"] adds a transformation from the coordinate \ +system \\\", Style[\\\"sourceID\\\", Bold], \\\" to the coordinate system \ +\\\", Style[\\\"targetID\\\", Bold], \\\".\\\\n\\\", Style[\\\"rules\\\", \ +Bold], \\\" must be a list of transformation rules. For example, {x \ +\\\\[Rule] r Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\\\\[Theta]] \ Sin[\\\\[Phi]], z \\\\[Rule] r Cos[\\\\[Theta]]} is a transformation from \ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, @@ -8555,6 +8597,20 @@ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", GridBox[{{ RowBox[{ RowBox[{"TAddCoordTransformation", "[", + RowBox[{ + + RowBox[{ + "OGRe`Private`sourceID_String", "\[Rule]", + "OGRe`Private`targetID_String"}], ",", + "OGRe`Private`rules_List"}], "]"}], ":=", + RowBox[{"TAddCoordTransformation", "[", + + RowBox[{ + "OGRe`Private`sourceID", ",", "OGRe`Private`targetID", + ",", "OGRe`Private`rules"}], "]"}]}]}, {" "}, { + RowBox[{ + RowBox[{"TAddCoordTransformation", "[", + RowBox[{ "OGRe`Private`sourceID_String", ",", "OGRe`Private`targetID_String", ",", @@ -8591,7 +8647,6 @@ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"TAddCoordTransformation", "::", "ErrorRulesForm"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", - RowBox[{"OGRe`Private`CheckIfCoordinates", "[", "OGRe`Private`sourceID", "]"}], ";", @@ -8896,6 +8951,7 @@ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", TagBox[ ButtonBox[ PaneSelectorBox[{False-> + DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpener"]], True-> @@ -8950,27 +9006,24 @@ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TAddCoordTransformation\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"sourceID\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"targetID\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \\\", \ -Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\\\"rules\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"adds a transformation from \ -the coordinate system \\\", StyleBox[Cell[BoxData[\\\"sourceID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" to the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"targetID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\".\\\\nThe argument \\\", StyleBox[Cell[BoxData[\\\"rules\\\"]], Bold, \ +TAddCoordTransformation[\\\", StyleBox[\\\"sourceID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" \\\\[Rule] \\\", StyleBox[\\\"targetID\\\", \ +Bold, Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"rules\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] adds a transformation from the coordinate \ +system \\\", StyleBox[\\\"sourceID\\\", Bold, Rule[StripOnInput, False]], \ +\\\" to the coordinate system \\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\".\\\\n\\\", StyleBox[\\\"rules\\\", Bold, \ Rule[StripOnInput, False]], \\\" must be a list of transformation rules. For \ example, {x \\\\[Rule] r Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\ \\\\[Theta]] Sin[\\\\[Phi]], z \\\\[Rule] r Cos[\\\\[Theta]]} is a \ transformation from Cartesian to spherical coordinates.\\\"}]], \ -TextCell[Row[List[\\\"TAddCoordTransformation\\\", \\\"[\\\", Style[sourceID, \ -Bold], Style[\\\", \\\", Bold], Style[targetID, Bold], Style[\\\", \\\", \ -Bold], Style[rules, Bold], \\\"] \\\", \\\"adds a transformation from the \ -coordinate system \\\", Style[sourceID, Bold], \\\" to the coordinate system \ -\\\", Style[targetID, Bold], \\\".\\\\nThe argument \\\", Style[rules, Bold], \ -\\\" must be a list of transformation rules. For example, {x \\\\[Rule] r \ -Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\\\\[Theta]] \ +TextCell[Row[List[\\\"TAddCoordTransformation[\\\", Style[\\\"sourceID\\\", \ +Bold], \\\" \\\\[Rule] \\\", Style[\\\"targetID\\\", Bold], \\\", \\\", \ +Style[\\\"rules\\\", Bold], \\\"] adds a transformation from the coordinate \ +system \\\", Style[\\\"sourceID\\\", Bold], \\\" to the coordinate system \ +\\\", Style[\\\"targetID\\\", Bold], \\\".\\\\n\\\", Style[\\\"rules\\\", \ +Bold], \\\" must be a list of transformation rules. For example, {x \ +\\\\[Rule] r Sin[\\\\[Theta]] Cos[\\\\[Phi]], y \\\\[Rule] r Sin[\\\\[Theta]] \ Sin[\\\\[Phi]], z \\\\[Rule] r Cos[\\\\[Theta]]} is a transformation from \ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, @@ -9036,32 +9089,36 @@ Cartesian to spherical coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TAddCoordTransformation\", \ -\"[\", StyleBox[Cell[BoxData[\"sourceID\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"targetID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"rules\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"adds a transformation from the coordinate system \", StyleBox[Cell[BoxData[\ -\"sourceID\"]], Bold, Rule[StripOnInput, False]], \" to the coordinate system \ -\", StyleBox[Cell[BoxData[\"targetID\"]], Bold, Rule[StripOnInput, False]], \ -\".\\nThe argument \", StyleBox[Cell[BoxData[\"rules\"]], Bold, \ -Rule[StripOnInput, False]], \" must be a list of transformation rules. For \ -example, {x \\[Rule] r Sin[\\[Theta]] Cos[\\[Phi]], y \\[Rule] r \ -Sin[\\[Theta]] Sin[\\[Phi]], z \\[Rule] r Cos[\\[Theta]]} is a transformation \ -from Cartesian to spherical coordinates.\"}]], \ -TextCell[Row[List[\"TAddCoordTransformation\", \"[\", Style[sourceID, Bold], \ -Style[\", \", Bold], Style[targetID, Bold], Style[\", \", Bold], Style[rules, \ -Bold], \"] \", \"adds a transformation from the coordinate system \", \ -Style[sourceID, Bold], \" to the coordinate system \", Style[targetID, Bold], \ -\".\\nThe argument \", Style[rules, Bold], \" must be a list of \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TAddCoordTransformation[\", \ +StyleBox[\"sourceID\", Bold, Rule[StripOnInput, False]], \" \\[Rule] \", \ +StyleBox[\"targetID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"rules\", Bold, Rule[StripOnInput, False]], \"] adds a \ +transformation from the coordinate system \", StyleBox[\"sourceID\", Bold, \ +Rule[StripOnInput, False]], \" to the coordinate system \", \ +StyleBox[\"targetID\", Bold, Rule[StripOnInput, False]], \".\\n\", \ +StyleBox[\"rules\", Bold, Rule[StripOnInput, False]], \" must be a list of \ transformation rules. For example, {x \\[Rule] r Sin[\\[Theta]] Cos[\\[Phi]], \ y \\[Rule] r Sin[\\[Theta]] Sin[\\[Phi]], z \\[Rule] r Cos[\\[Theta]]} is a \ -transformation from Cartesian to spherical coordinates.\"]]]]\)", - "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> +transformation from Cartesian to spherical coordinates.\"}]], \ +TextCell[Row[List[\"TAddCoordTransformation[\", Style[\"sourceID\", Bold], \" \ +\\[Rule] \", Style[\"targetID\", Bold], \", \", Style[\"rules\", Bold], \"] \ +adds a transformation from the coordinate system \", Style[\"sourceID\", \ +Bold], \" to the coordinate system \", Style[\"targetID\", Bold], \".\\n\", \ +Style[\"rules\", Bold], \" must be a list of transformation rules. For \ +example, {x \\[Rule] r Sin[\\[Theta]] Cos[\\[Phi]], y \\[Rule] r \ +Sin[\\[Theta]] Sin[\\[Phi]], z \\[Rule] r Cos[\\[Theta]]} is a transformation \ +from Cartesian to spherical coordinates.\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TAddCoordTransformation, {OGRe`TAddCoordTransformation[ + DownValues, OGRe`TAddCoordTransformation, { + OGRe`TAddCoordTransformation[Pattern[OGRe`Private`sourceID, + Blank[String]] -> Pattern[OGRe`Private`targetID, + Blank[String]], + Pattern[OGRe`Private`rules, + Blank[List]]] :> + OGRe`TAddCoordTransformation[ + OGRe`Private`sourceID, OGRe`Private`targetID, OGRe`Private`rules], + OGRe`TAddCoordTransformation[ Pattern[OGRe`Private`sourceID, Blank[String]], Pattern[OGRe`Private`targetID, @@ -9155,7 +9212,7 @@ transformation from Cartesian to spherical coordinates.\"]]]]\)", "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TAddCoordTransformation"], False]]], "Output", - CellLabel->"Out[50]=",ExpressionUUID->"38c2deaa-3d55-4ebe-b1b6-6c1d8dff0410"] + CellLabel->"Out[50]=",ExpressionUUID->"5a3edaec-3c63-44d0-be9f-41339fae976f"] }, Open ]], Cell["\<\ @@ -9165,7 +9222,8 @@ Let us add the rules to transform from Cartesian to spherical coordinates:\ Cell[BoxData[ RowBox[{ RowBox[{"TAddCoordTransformation", "[", - RowBox[{"\"\\"", ",", "\"\\"", ",", + RowBox[{ + RowBox[{"\"\\"", "\[Rule]", "\"\\""}], ",", RowBox[{"{", RowBox[{ RowBox[{"x", "\[Rule]", @@ -9195,7 +9253,8 @@ to transform from spherical to Cartesian coordinates:" Cell[BoxData[ RowBox[{ RowBox[{"TAddCoordTransformation", "[", - RowBox[{"\"\\"", ",", "\"\\"", ",", + RowBox[{ + RowBox[{"\"\\"", "\[Rule]", "\"\\""}], ",", RowBox[{"{", RowBox[{ RowBox[{"r", "\[Rule]", @@ -9274,7 +9333,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"7ee523cf-96f4-4880-bcf0-645b7752abdb"] + CellLabel->"OGRe:",ExpressionUUID->"c4270d22-848b-425f-94ee-bfbefd089aad"] }, Open ]], Cell[TextData[{ @@ -9325,7 +9384,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"1f47a3ea-6260-4621-b3af-b20a561231ac"] + CellLabel->"OGRe:",ExpressionUUID->"b4caed4c-d501-4898-8f98-ca18881e1e15"] }, Open ]], Cell[TextData[{ @@ -9380,7 +9439,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"682325cd-0c68-4e32-9d39-25631bbf209a"] + CellLabel->"OGRe:",ExpressionUUID->"8fa80db2-8a0d-4095-9833-f8c7dac8fb07"] }, Open ]], Cell[TextData[{ @@ -9425,18 +9484,16 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeDefaultCoords\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], \\\"] \\\", \ -\\\"changes the default coordinate system of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" to \\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ +TChangeDefaultCoords[\\\", StyleBox[\\\"tensorID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] changes the default coordinate system of \ +the tensor object \\\", StyleBox[\\\"tensorID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" to \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ Rule[StripOnInput, False]], \\\".\\\"}]], \ -TextCell[Row[List[\\\"TChangeDefaultCoords\\\", \\\"[\\\", Style[tensorID, \ -Bold], Style[\\\", \\\", Bold], Style[coordinatesID, Bold], \\\"] \\\", \ -\\\"changes the default coordinate system of the tensor object \\\", \ -Style[tensorID, Bold], \\\" to \\\", Style[coordinatesID, Bold], \ +TextCell[Row[List[\\\"TChangeDefaultCoords[\\\", Style[\\\"tensorID\\\", \ +Bold], \\\", \\\", Style[\\\"coordinatesID\\\", Bold], \\\"] changes the \ +default coordinate system of the tensor object \\\", Style[\\\"tensorID\\\", \ +Bold], \\\" to \\\", Style[\\\"coordinatesID\\\", Bold], \ \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -9638,18 +9695,16 @@ Style[tensorID, Bold], \\\" to \\\", Style[coordinatesID, Bold], \ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChangeDefaultCoords\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, False]], \\\"] \\\", \ -\\\"changes the default coordinate system of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"tensorID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" to \\\", StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, \ +TChangeDefaultCoords[\\\", StyleBox[\\\"tensorID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] changes the default coordinate system of \ +the tensor object \\\", StyleBox[\\\"tensorID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" to \\\", StyleBox[\\\"coordinatesID\\\", Bold, \ Rule[StripOnInput, False]], \\\".\\\"}]], \ -TextCell[Row[List[\\\"TChangeDefaultCoords\\\", \\\"[\\\", Style[tensorID, \ -Bold], Style[\\\", \\\", Bold], Style[coordinatesID, Bold], \\\"] \\\", \ -\\\"changes the default coordinate system of the tensor object \\\", \ -Style[tensorID, Bold], \\\" to \\\", Style[coordinatesID, Bold], \ +TextCell[Row[List[\\\"TChangeDefaultCoords[\\\", Style[\\\"tensorID\\\", \ +Bold], \\\", \\\", Style[\\\"coordinatesID\\\", Bold], \\\"] changes the \ +default coordinate system of the tensor object \\\", Style[\\\"tensorID\\\", \ +Bold], \\\" to \\\", Style[\\\"coordinatesID\\\", Bold], \ \\\".\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -9714,19 +9769,17 @@ Style[tensorID, Bold], \\\" to \\\", Style[coordinatesID, Bold], \ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeDefaultCoords\", \"[\", \ -StyleBox[Cell[BoxData[\"tensorID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\"] \", \"changes the default coordinate system of the tensor object \", \ -StyleBox[Cell[BoxData[\"tensorID\"]], Bold, Rule[StripOnInput, False]], \" to \ -\", StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, \ -False]], \".\"}]], TextCell[Row[List[\"TChangeDefaultCoords\", \"[\", \ -Style[tensorID, Bold], Style[\", \", Bold], Style[coordinatesID, Bold], \"] \ -\", \"changes the default coordinate system of the tensor object \", \ -Style[tensorID, Bold], \" to \", Style[coordinatesID, Bold], \".\"]]]]\)", - "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TChangeDefaultCoords[\", \ +StyleBox[\"tensorID\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"coordinatesID\", Bold, Rule[StripOnInput, False]], \"] changes the \ +default coordinate system of the tensor object \", StyleBox[\"tensorID\", \ +Bold, Rule[StripOnInput, False]], \" to \", StyleBox[\"coordinatesID\", Bold, \ +Rule[StripOnInput, False]], \".\"}]], \ +TextCell[Row[List[\"TChangeDefaultCoords[\", Style[\"tensorID\", Bold], \", \ +\", Style[\"coordinatesID\", Bold], \"] changes the default coordinate system \ +of the tensor object \", Style[\"tensorID\", Bold], \" to \", \ +Style[\"coordinatesID\", Bold], \".\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TChangeDefaultCoords, {OGRe`TChangeDefaultCoords[ Pattern[OGRe`Private`tensorID, @@ -9749,7 +9802,7 @@ Style[tensorID, Bold], \" to \", Style[coordinatesID, Bold], \".\"]]]]\)", "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TChangeDefaultCoords"], False]]], "Output", - CellLabel->"Out[56]=",ExpressionUUID->"f8fc1f1c-d270-4eb5-a886-d07780b2a91b"] + CellLabel->"Out[56]=",ExpressionUUID->"ea011131-7007-4555-9500-1b8794c1090a"] }, Open ]], Cell["\<\ @@ -9854,7 +9907,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"373debef-6c1b-4e65-a245-36e07409b373"] + CellLabel->"OGRe:",ExpressionUUID->"2c0a4058-862a-4be5-afc5-07b02a9634c6"] }, Open ]] }, Open ]], @@ -9906,7 +9959,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"e687bbaf-3ee3-4567-a159-3dd5e43ebcd2"] + CellLabel->"OGRe:",ExpressionUUID->"7c7f92c2-a047-45e7-ba95-92a8ab1d847e"] }, Open ]], Cell[TextData[{ @@ -9944,7 +9997,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"053bbf21-3eb5-43b1-bc0e-64b8e986f019"] + CellLabel->"OGRe:",ExpressionUUID->"7e310a45-c61e-41a4-baf1-e006d9b4e6aa"] }, Open ]], Cell[TextData[{ @@ -9979,14 +10032,14 @@ Cell[TextData[{ "The user may specify which assumptions to pass to ", StyleBox["FullSimplify", "Input"], " using the module ", - StyleBox["TSimplifyAssumptions", "Input"], + StyleBox["TSetAssumptions", "Input"], ":" }], "Text",ExpressionUUID->"c514eb2a-9e1c-4793-b708-bb76916fa4a2"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TSimplifyAssumptions"}]], "Input", + RowBox[{"?", "TSetAssumptions"}]], "Input", CellLabel->"In[61]:=",ExpressionUUID->"54be3fe9-d4bf-4b48-81c9-6b6846efedf4"], Cell[BoxData[ @@ -10014,32 +10067,26 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TSimplifyAssumptions\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"assumptions\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"adds assumptions to be used when simplifying \ -expressions. The new assumptions will be appended to any previously added \ -assumptions.\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"assumptions\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is omitted, displays the currently used \ -assumptions instead.\\\\nUse TSimplifyAssumptions[None] to clear all \ -previously added assumptions.\\\\nBy default, OGRe automatically assumes all \ -variable are real, by adding the assumption Element[_, Reals] when \ -simplifying expressions. To disable this assumption, use \ -TSimplifyAssumptions[!Reals]. To re-enable it later, use \ -TSimplifyAssumptions[Reals].\\\\nThe output of this module is always an \ -Association indicating whether variables are assumed to be real and listing \ -the user-defined assumptions.\\\"}]], \ -TextCell[Row[List[\\\"TSimplifyAssumptions\\\", \\\"[\\\", Style[assumptions, \ -Bold], \\\"] \\\", \\\"adds assumptions to be used when simplifying \ -expressions. The new assumptions will be appended to any previously added \ -assumptions.\\\\nIf \\\", Style[assumptions, Bold], \\\" is omitted, displays \ -the currently used assumptions instead.\\\\nUse TSimplifyAssumptions[None] to \ -clear all previously added assumptions.\\\\nBy default, OGRe automatically \ -assumes all variable are real, by adding the assumption Element[_, Reals] \ -when simplifying expressions. To disable this assumption, use \ -TSimplifyAssumptions[!Reals]. To re-enable it later, use \ -TSimplifyAssumptions[Reals].\\\\nThe output of this module is always an \ -Association indicating whether variables are assumed to be real and listing \ -the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", +TSetAssumptions[] shows the assumptions to be used when simplifying \ +expressions.\\\\nTSetAssumptions[\\\", StyleBox[\\\"assumptions\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] appends new assumptions to the previously \ +added assumptions.\\\\nTSetAssumptions[None] clears all previously added \ +assumptions.\\\\nTSetAssumptions[!Reals] disables the default assumption that \ +all variable are real, which secretly adds the assumption Element[_, Reals] \ +to the list of assumptions. TSetAssumptions[Reals] re-enables this \ +assumption.\\\\nThe output of this module is always an Association indicating \ +whether variables are assumed to be real and listing the user-defined \ +assumptions.\\\"}]], TextCell[Row[List[\\\"TSetAssumptions[] shows the \ +assumptions to be used when simplifying \ +expressions.\\\\nTSetAssumptions[\\\", Style[\\\"assumptions\\\", Bold], \ +\\\"] appends new assumptions to the previously added \ +assumptions.\\\\nTSetAssumptions[None] clears all previously added \ +assumptions.\\\\nTSetAssumptions[!Reals] disables the default assumption that \ +all variable are real, which secretly adds the assumption Element[_, Reals] \ +to the list of assumptions. TSetAssumptions[Reals] re-enables this \ +assumption.\\\\nThe output of this module is always an Association indicating \ +whether variables are assumed to be real and listing the user-defined \ +assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -10065,14 +10112,14 @@ the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", TemplateBox[{"\"\[ThinSpace]\"", GridBox[{{ RowBox[{ - RowBox[{"TSimplifyAssumptions", "[", "]"}], ":=", + RowBox[{"TSetAssumptions", "[", "]"}], ":=", RowBox[{ RowBox[{"OGRe`Private`TensorData", "[", "Options", "]"}], "[", "\"SimplifyAssumptions\"", "]"}]}]}, {" "}, { RowBox[{ RowBox[{ - "TSimplifyAssumptions", "[", "OGRe`Private`assumptions_", + "TSetAssumptions", "[", "OGRe`Private`assumptions_", "]"}], ":=", RowBox[{"(", RowBox[{ @@ -10184,7 +10231,7 @@ the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TSimplifyAssumptions\"\>"} + "Tooltip"]& ], "\<\"OGRe`TSetAssumptions\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -10274,32 +10321,26 @@ the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TSimplifyAssumptions\\\", \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"assumptions\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"adds assumptions to be used when simplifying \ -expressions. The new assumptions will be appended to any previously added \ -assumptions.\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"assumptions\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is omitted, displays the currently used \ -assumptions instead.\\\\nUse TSimplifyAssumptions[None] to clear all \ -previously added assumptions.\\\\nBy default, OGRe automatically assumes all \ -variable are real, by adding the assumption Element[_, Reals] when \ -simplifying expressions. To disable this assumption, use \ -TSimplifyAssumptions[!Reals]. To re-enable it later, use \ -TSimplifyAssumptions[Reals].\\\\nThe output of this module is always an \ -Association indicating whether variables are assumed to be real and listing \ -the user-defined assumptions.\\\"}]], \ -TextCell[Row[List[\\\"TSimplifyAssumptions\\\", \\\"[\\\", Style[assumptions, \ -Bold], \\\"] \\\", \\\"adds assumptions to be used when simplifying \ -expressions. The new assumptions will be appended to any previously added \ -assumptions.\\\\nIf \\\", Style[assumptions, Bold], \\\" is omitted, displays \ -the currently used assumptions instead.\\\\nUse TSimplifyAssumptions[None] to \ -clear all previously added assumptions.\\\\nBy default, OGRe automatically \ -assumes all variable are real, by adding the assumption Element[_, Reals] \ -when simplifying expressions. To disable this assumption, use \ -TSimplifyAssumptions[!Reals]. To re-enable it later, use \ -TSimplifyAssumptions[Reals].\\\\nThe output of this module is always an \ -Association indicating whether variables are assumed to be real and listing \ -the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", +TSetAssumptions[] shows the assumptions to be used when simplifying \ +expressions.\\\\nTSetAssumptions[\\\", StyleBox[\\\"assumptions\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] appends new assumptions to the previously \ +added assumptions.\\\\nTSetAssumptions[None] clears all previously added \ +assumptions.\\\\nTSetAssumptions[!Reals] disables the default assumption that \ +all variable are real, which secretly adds the assumption Element[_, Reals] \ +to the list of assumptions. TSetAssumptions[Reals] re-enables this \ +assumption.\\\\nThe output of this module is always an Association indicating \ +whether variables are assumed to be real and listing the user-defined \ +assumptions.\\\"}]], TextCell[Row[List[\\\"TSetAssumptions[] shows the \ +assumptions to be used when simplifying \ +expressions.\\\\nTSetAssumptions[\\\", Style[\\\"assumptions\\\", Bold], \ +\\\"] appends new assumptions to the previously added \ +assumptions.\\\\nTSetAssumptions[None] clears all previously added \ +assumptions.\\\\nTSetAssumptions[!Reals] disables the default assumption that \ +all variable are real, which secretly adds the assumption Element[_, Reals] \ +to the list of assumptions. TSetAssumptions[Reals] re-enables this \ +assumption.\\\\nThe output of this module is always an Association indicating \ +whether variables are assumed to be real and listing the user-defined \ +assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -10363,36 +10404,32 @@ the user-defined assumptions.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TSimplifyAssumptions\", \"[\", \ -StyleBox[Cell[BoxData[\"assumptions\"]], Bold, Rule[StripOnInput, False]], \ -\"] \", \"adds assumptions to be used when simplifying expressions. The new \ -assumptions will be appended to any previously added assumptions.\\nIf \", \ -StyleBox[Cell[BoxData[\"assumptions\"]], Bold, Rule[StripOnInput, False]], \" \ -is omitted, displays the currently used assumptions instead.\\nUse \ -TSimplifyAssumptions[None] to clear all previously added assumptions.\\nBy \ -default, OGRe automatically assumes all variable are real, by adding the \ -assumption Element[_, Reals] when simplifying expressions. To disable this \ -assumption, use TSimplifyAssumptions[!Reals]. To re-enable it later, use \ -TSimplifyAssumptions[Reals].\\nThe output of this module is always an \ -Association indicating whether variables are assumed to be real and listing \ -the user-defined assumptions.\"}]], \ -TextCell[Row[List[\"TSimplifyAssumptions\", \"[\", Style[assumptions, Bold], \ -\"] \", \"adds assumptions to be used when simplifying expressions. The new \ -assumptions will be appended to any previously added assumptions.\\nIf \", \ -Style[assumptions, Bold], \" is omitted, displays the currently used \ -assumptions instead.\\nUse TSimplifyAssumptions[None] to clear all previously \ -added assumptions.\\nBy default, OGRe automatically assumes all variable are \ -real, by adding the assumption Element[_, Reals] when simplifying \ -expressions. To disable this assumption, use TSimplifyAssumptions[!Reals]. To \ -re-enable it later, use TSimplifyAssumptions[Reals].\\nThe output of this \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TSetAssumptions[] shows the \ +assumptions to be used when simplifying expressions.\\nTSetAssumptions[\", \ +StyleBox[\"assumptions\", Bold, Rule[StripOnInput, False]], \"] appends new \ +assumptions to the previously added assumptions.\\nTSetAssumptions[None] \ +clears all previously added assumptions.\\nTSetAssumptions[!Reals] disables \ +the default assumption that all variable are real, which secretly adds the \ +assumption Element[_, Reals] to the list of assumptions. \ +TSetAssumptions[Reals] re-enables this assumption.\\nThe output of this \ module is always an Association indicating whether variables are assumed to \ -be real and listing the user-defined assumptions.\"]]]]\)", "Documentation" -> - None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> +be real and listing the user-defined assumptions.\"}]], \ +TextCell[Row[List[\"TSetAssumptions[] shows the assumptions to be used when \ +simplifying expressions.\\nTSetAssumptions[\", Style[\"assumptions\", Bold], \ +\"] appends new assumptions to the previously added \ +assumptions.\\nTSetAssumptions[None] clears all previously added assumptions.\ +\\nTSetAssumptions[!Reals] disables the default assumption that all variable \ +are real, which secretly adds the assumption Element[_, Reals] to the list of \ +assumptions. TSetAssumptions[Reals] re-enables this assumption.\\nThe output \ +of this module is always an Association indicating whether variables are \ +assumed to be real and listing the user-defined assumptions.\"]]]]\)", + "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, + "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TSimplifyAssumptions, { - OGRe`TSimplifyAssumptions[] :> + DownValues, OGRe`TSetAssumptions, { + OGRe`TSetAssumptions[] :> OGRe`Private`TensorData[Options]["SimplifyAssumptions"], - OGRe`TSimplifyAssumptions[ + OGRe`TSetAssumptions[ Pattern[OGRe`Private`assumptions, Blank[]]] :> (Unprotect[OGRe`Private`TensorData]; Switch[OGRe`Private`assumptions, None, @@ -10418,8 +10455,8 @@ be real and listing the user-defined assumptions.\"]]]]\)", "Documentation" -> "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {HoldAll, Protected}, "FullName" -> - "OGRe`TSimplifyAssumptions"], False]]], "Output", - CellLabel->"Out[61]=",ExpressionUUID->"1e2e1ffa-cdff-427c-ba26-33fead37bfe1"] + "OGRe`TSetAssumptions"], False]]], "Output", + CellLabel->"Out[61]=",ExpressionUUID->"d05f3c3c-89b5-435a-ac04-254ee96369a2"] }, Open ]], Cell[TextData[{ @@ -10439,7 +10476,7 @@ this assumption now:" Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"TSimplifyAssumptions", "[", + RowBox[{"TSetAssumptions", "[", RowBox[{"r", "\[GreaterEqual]", "0"}], "]"}]], "Input", CellLabel->"In[62]:=",ExpressionUUID->"1e1a733e-7d9a-4f2c-a40e-946a569869b5"], @@ -10451,7 +10488,7 @@ Cell[BoxData[ RowBox[{"{", RowBox[{"r", "\[GreaterEqual]", "0"}], "}"}]}]}], "\[RightAssociation]"}]], "Output", - CellLabel->"Out[62]=",ExpressionUUID->"af4c72b1-e95b-4ee5-88eb-65b6957ad738"] + CellLabel->"Out[62]=",ExpressionUUID->"40a07085-8660-45f5-a46f-4aedb2871f1d"] }, Open ]], Cell[TextData[{ @@ -10491,7 +10528,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"bc2eb08e-a095-4a64-8750-c6d29712d544"] + CellLabel->"OGRe:",ExpressionUUID->"fb69ff6f-a80b-463e-b7d8-b87c70261a3c"] }, Open ]], Cell[TextData[{ @@ -10549,19 +10586,17 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TSimplify\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"simplifies all \ -previously-calculated representations of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -based on the user-defined simplification assumptions set using \ -TSimplifyAssumptions[ ]. To be used if the assumptions have changed after the \ -components have already been calculated.\\\"}]], \ -TextCell[Row[List[\\\"TSimplify\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \ -\\\"simplifies all previously-calculated representations of the tensor object \ -\\\", Style[ID, Bold], \\\" based on the user-defined simplification \ -assumptions set using TSimplifyAssumptions[ ]. To be used if the assumptions \ -have changed after the components have already been \ -calculated.\\\"]]]]\\)\"\>", "InformationUsageText", +TSimplify[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +simplifies all previously-calculated representations of the tensor object \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" based on \ +the user-defined simplification assumptions set using TSetAssumptions[]. To \ +be used if the assumptions have changed after the components have already \ +been calculated.\\\"}]], TextCell[Row[List[\\\"TSimplify[\\\", Style[\\\"ID\\\ +\", Bold], \\\"] simplifies all previously-calculated representations of the \ +tensor object \\\", Style[\\\"ID\\\", Bold], \\\" based on the user-defined \ +simplification assumptions set using TSetAssumptions[]. To be used if the \ +assumptions have changed after the components have already been calculated.\\\ +\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -10732,19 +10767,17 @@ calculated.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TSimplify\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"simplifies all \ -previously-calculated representations of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -based on the user-defined simplification assumptions set using \ -TSimplifyAssumptions[ ]. To be used if the assumptions have changed after the \ -components have already been calculated.\\\"}]], \ -TextCell[Row[List[\\\"TSimplify\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \ -\\\"simplifies all previously-calculated representations of the tensor object \ -\\\", Style[ID, Bold], \\\" based on the user-defined simplification \ -assumptions set using TSimplifyAssumptions[ ]. To be used if the assumptions \ -have changed after the components have already been \ -calculated.\\\"]]]]\\)\"\>", "InformationUsageText", +TSimplify[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +simplifies all previously-calculated representations of the tensor object \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" based on \ +the user-defined simplification assumptions set using TSetAssumptions[]. To \ +be used if the assumptions have changed after the components have already \ +been calculated.\\\"}]], TextCell[Row[List[\\\"TSimplify[\\\", Style[\\\"ID\\\ +\", Bold], \\\"] simplifies all previously-calculated representations of the \ +tensor object \\\", Style[\\\"ID\\\", Bold], \\\" based on the user-defined \ +simplification assumptions set using TSetAssumptions[]. To be used if the \ +assumptions have changed after the components have already been calculated.\\\ +\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -10808,17 +10841,16 @@ calculated.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TSimplify\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"simplifies all previously-calculated representations of the tensor object \ -\", StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" \ -based on the user-defined simplification assumptions set using \ -TSimplifyAssumptions[ ]. To be used if the assumptions have changed after the \ -components have already been calculated.\"}]], \ -TextCell[Row[List[\"TSimplify\", \"[\", Style[ID, Bold], \"] \", \"simplifies \ -all previously-calculated representations of the tensor object \", Style[ID, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TSimplify[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] simplifies all previously-calculated \ +representations of the tensor object \", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \" based on the user-defined simplification \ +assumptions set using TSetAssumptions[]. To be used if the assumptions have \ +changed after the components have already been calculated.\"}]], \ +TextCell[Row[List[\"TSimplify[\", Style[\"ID\", Bold], \"] simplifies all \ +previously-calculated representations of the tensor object \", Style[\"ID\", \ Bold], \" based on the user-defined simplification assumptions set using \ -TSimplifyAssumptions[ ]. To be used if the assumptions have changed after the \ +TSetAssumptions[]. To be used if the assumptions have changed after the \ components have already been calculated.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ @@ -10833,7 +10865,7 @@ components have already been calculated.\"]]]]\)", "Documentation" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TSimplify"], False]]], "Output", - CellLabel->"Out[64]=",ExpressionUUID->"9c2bdb87-215e-492a-89eb-0f01f74dc8e0"] + CellLabel->"Out[64]=",ExpressionUUID->"0b1a8b02-dd5d-464f-be3e-199effd0517d"] }, Open ]], Cell["Now we get the expected result:", \ @@ -10862,7 +10894,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"d30e7e58-d902-4ca9-9c81-5b855d551d65"] + CellLabel->"OGRe:",ExpressionUUID->"5dda0c08-379a-4019-8c2f-48a70134110b"] }, Open ]], Cell[TextData[{ @@ -10883,14 +10915,14 @@ Cell[TextData[{ Cell[TextData[{ "Finally, we note that if you are using non-real variables, you can disable \ the assumption that all variables are real using ", - StyleBox["TSimplifyAssumptions[!Reals]", "Input"], - ". If you later want to turn it back on, use ", - StyleBox["TSimplifyAssumptions[Reals]", "Input"], + StyleBox["TSetAssumptions[!Reals]", "Input"], + ". If you later want to turn it back on, use TSetAssumptions", + StyleBox["[Reals]", "Input"], ". The value of the key ", StyleBox["\[OpenCurlyDoubleQuote]AssumeReal\[CloseCurlyDoubleQuote]", "Input"], " in the output of ", - StyleBox["TSimplifyAssumptions", "Input"], + StyleBox["TSetAssumptions", "Input"], " indicates whether this assumption is turned on." }], "Text",ExpressionUUID->"14c91405-93dd-48c2-9129-0e762d8f8cd6"] }, Open ]], @@ -10961,13 +10993,12 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TExport\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"exports the raw tensor data for \ -the tensor object \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" as an Association.\\\"}]], \ -TextCell[Row[List[\\\"TExport\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ -\"exports the raw tensor data for the tensor object \\\", Style[ID, Bold], \\\ -\" as an Association.\\\"]]]]\\)\"\>", "InformationUsageText", +TExport[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +exports the raw tensor data for the tensor object \\\", StyleBox[\\\"ID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" as an Association.\\\"}]], \ +TextCell[Row[List[\\\"TExport[\\\", Style[\\\"ID\\\", Bold], \\\"] exports \ +the raw tensor data for the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" \ +as an Association.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -11103,7 +11134,6 @@ TextCell[Row[List[\\\"TExport\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ ImageMargins->0, ImageSize->Full, Method->"Preemptive"], - EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -11141,13 +11171,12 @@ TextCell[Row[List[\\\"TExport\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TExport\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"exports the raw tensor data for \ -the tensor object \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" as an Association.\\\"}]], \ -TextCell[Row[List[\\\"TExport\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ -\"exports the raw tensor data for the tensor object \\\", Style[ID, Bold], \\\ -\" as an Association.\\\"]]]]\\)\"\>", "InformationUsageText", +TExport[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +exports the raw tensor data for the tensor object \\\", StyleBox[\\\"ID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" as an Association.\\\"}]], \ +TextCell[Row[List[\\\"TExport[\\\", Style[\\\"ID\\\", Bold], \\\"] exports \ +the raw tensor data for the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" \ +as an Association.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -11211,13 +11240,12 @@ TextCell[Row[List[\\\"TExport\\\", \\\"[\\\", Style[ID, Bold], \\\"] \\\", \\\ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TExport\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"exports the raw tensor data for the tensor object \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" as an \ -Association.\"}]], TextCell[Row[List[\"TExport\", \"[\", Style[ID, Bold], \"] \ -\", \"exports the raw tensor data for the tensor object \", Style[ID, Bold], \ -\" as an Association.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "\!\(\*InterpretationBox[Cell[TextData[{\"TExport[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] exports the raw tensor data for the \ +tensor object \", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \" as an \ +Association.\"}]], TextCell[Row[List[\"TExport[\", Style[\"ID\", Bold], \"] \ +exports the raw tensor data for the tensor object \", Style[\"ID\", Bold], \" \ +as an Association.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TExport, {OGRe`TExport[ Pattern[OGRe`Private`ID, @@ -11229,7 +11257,7 @@ Association.\"}]], TextCell[Row[List[\"TExport\", \"[\", Style[ID, Bold], \"] \ "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TExport"], False]]], "Output", - CellLabel->"Out[66]=",ExpressionUUID->"2095fbb0-e131-4931-8134-09d634c8664f"] + CellLabel->"Out[66]=",ExpressionUUID->"21d8b88e-c2f8-4a37-9f66-b5a18128110d"] }, Open ]], Cell["\<\ @@ -11291,9 +11319,9 @@ Cell[BoxData[ RowBox[{"\<\"Role\"\>", "\[Rule]", "\<\"Tensor\"\>"}], ",", RowBox[{"\<\"Symbol\"\>", "\[Rule]", "\<\"u\"\>"}], ",", RowBox[{"\<\"OGReVersion\"\>", - "\[Rule]", "\<\"v1.2 (April 28, 2021)\"\>"}]}], - "\[RightAssociation]"}]}], "\[RightAssociation]"}]], "Output", - CellLabel->"Out[67]=",ExpressionUUID->"c37125ba-6303-489a-b186-43df6a7b575f"] + "\[Rule]", "\<\"v1.4 (2021-05-09)\"\>"}]}], "\[RightAssociation]"}]}], + "\[RightAssociation]"}]], "Output", + CellLabel->"Out[67]=",ExpressionUUID->"bb6fa951-4120-49c2-813a-517a31e4fdb6"] }, Open ]], Cell[TextData[{ @@ -11368,12 +11396,8 @@ be ", StyleBox["TNewTensor", "Input"], ". Other modules that we will discuss below, such as ", StyleBox["TCalc", "Input"], - ", ", - StyleBox["TChristoffel", "Input"], - ", and ", - StyleBox["TRiemannTensor", "Input"], - ", have corresponding roles as well. Additional roles are only used \ -internally by OGRe, such as ", + ", TCalcChristoffel, and TCalcRiemannTensor, have corresponding roles as \ +well. Additional roles are only used internally by OGRe, such as ", StyleBox["\[OpenCurlyDoubleQuote]Temporary\[CloseCurlyDoubleQuote]", "Input"], " for a temporary tensor created as an intermediate step in a calculation." }], "Item",ExpressionUUID->"1396e63d-4c69-4ab2-85c5-9c7549d61df4"], @@ -11388,9 +11412,8 @@ Cell[TextData[{ StyleBox["\[OpenCurlyDoubleQuote]OGReVersion\[CloseCurlyDoubleQuote]", "Input", FontWeight->"Bold"], - ": The version of the package used to create the tensor. This will be used \ -in future versions to ensure backwards compatibility. Note that this key is \ -not stored internally, it is added by ", + ": The version of the package used to create the tensor. Note that this key \ +is not stored internally, it is added by ", StyleBox["TExport", "Input"], "." }], "Item",ExpressionUUID->"6f83cabd-5be5-442e-81bc-55a1a92c07ac"], @@ -11645,9 +11668,9 @@ Cell[BoxData[ "}"}]}]}], "\[RightAssociation]"}]}], "\[RightAssociation]"}]}], ",", RowBox[{"\<\"OGReVersion\"\>", - "\[Rule]", "\<\"v1.2 (April 28, 2021)\"\>"}]}], - "\[RightAssociation]"}]}], "\[RightAssociation]"}]], "Output", - CellLabel->"Out[68]=",ExpressionUUID->"252039cb-b22b-495a-9f0b-2daa19c644cc"] + "\[Rule]", "\<\"v1.4 (2021-05-09)\"\>"}]}], "\[RightAssociation]"}]}], + "\[RightAssociation]"}]], "Output", + CellLabel->"Out[68]=",ExpressionUUID->"f7d6f534-e443-43a2-89c3-785f9de951af"] }, Open ]], Cell[TextData[{ @@ -11691,25 +11714,24 @@ Cell[BoxData[ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TInfo\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"displays information about the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\", \ -including its symbol, role, associated metric, and default coordinates and \ -indices, in human-readable form.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -represents a coordinate system, displays a list of all tensors using it as \ -their default coordinate system.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -represents a metric, displays a list of all tensors using it as their \ -associated metric.\\\"}]], TextCell[Row[List[\\\"TInfo\\\", \\\"[\\\", \ -Style[ID, Bold], \\\"] \\\", \\\"displays information about the tensor object \ -\\\", Style[ID, Bold], \\\", including its symbol, role, associated metric, \ -and default coordinates and indices, in human-readable form.\\\\nIf \\\", \ -Style[ID, Bold], \\\" represents a coordinate system, displays a list of all \ -tensors using it as their default coordinate system.\\\\nIf \\\", Style[ID, \ -Bold], \\\" represents a metric, displays a list of all tensors using it as \ -their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TInfo[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] displays \ +information about the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", including its symbol, role, associated \ +metric, and default coordinates and indices, in human-readable form.\\\\nIf \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" represents \ +a coordinate system, displays a list of all tensors using it as their default \ +coordinate system.\\\\nIf \\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" represents a metric, displays a list of all tensors using it as \ +their associated metric.\\\"}]], TextCell[Row[List[\\\"TInfo[\\\", \ +Style[\\\"ID\\\", Bold], \\\"] displays information about the tensor object \ +\\\", Style[\\\"ID\\\", Bold], \\\", including its symbol, role, associated \ +metric, and default coordinates and indices, in human-readable form.\\\\nIf \ +\\\", Style[\\\"ID\\\", Bold], \\\" represents a coordinate system, displays \ +a list of all tensors using it as their default coordinate system.\\\\nIf \ +\\\", Style[\\\"ID\\\", Bold], \\\" represents a metric, displays a list of \ +all tensors using it as their associated metric.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -11841,6 +11863,7 @@ their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{ RowBox[{ + RowBox[{"OGRe`Private`TensorData", "[", "OGRe`Private`ID", "]"}], "[", "\"Role\"", "]"}], "===", "\"Coordinates\""}], ",", @@ -11850,8 +11873,9 @@ their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"{", RowBox[{ RowBox[{"Style", "[", - RowBox[{"\"Default Coordinates For: \"", ",", "Bold"}], - "]"}], ",", + + RowBox[{"\"Used as Default Coordinates For: \"", ",", + "Bold"}], "]"}], ",", RowBox[{"Row", "[", RowBox[{ RowBox[{"Select", "[", @@ -12029,25 +12053,24 @@ their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TInfo\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"displays information about the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\", \ -including its symbol, role, associated metric, and default coordinates and \ -indices, in human-readable form.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -represents a coordinate system, displays a list of all tensors using it as \ -their default coordinate system.\\\\nIf \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -represents a metric, displays a list of all tensors using it as their \ -associated metric.\\\"}]], TextCell[Row[List[\\\"TInfo\\\", \\\"[\\\", \ -Style[ID, Bold], \\\"] \\\", \\\"displays information about the tensor object \ -\\\", Style[ID, Bold], \\\", including its symbol, role, associated metric, \ -and default coordinates and indices, in human-readable form.\\\\nIf \\\", \ -Style[ID, Bold], \\\" represents a coordinate system, displays a list of all \ -tensors using it as their default coordinate system.\\\\nIf \\\", Style[ID, \ -Bold], \\\" represents a metric, displays a list of all tensors using it as \ -their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TInfo[\ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"] displays \ +information about the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\", including its symbol, role, associated \ +metric, and default coordinates and indices, in human-readable form.\\\\nIf \ +\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" represents \ +a coordinate system, displays a list of all tensors using it as their default \ +coordinate system.\\\\nIf \\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" represents a metric, displays a list of all tensors using it as \ +their associated metric.\\\"}]], TextCell[Row[List[\\\"TInfo[\\\", \ +Style[\\\"ID\\\", Bold], \\\"] displays information about the tensor object \ +\\\", Style[\\\"ID\\\", Bold], \\\", including its symbol, role, associated \ +metric, and default coordinates and indices, in human-readable form.\\\\nIf \ +\\\", Style[\\\"ID\\\", Bold], \\\" represents a coordinate system, displays \ +a list of all tensors using it as their default coordinate system.\\\\nIf \ +\\\", Style[\\\"ID\\\", Bold], \\\" represents a metric, displays a list of \ +all tensors using it as their associated metric.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -12111,25 +12134,23 @@ their associated metric.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TInfo\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"displays information about the tensor object \", StyleBox[Cell[BoxData[\"ID\ -\"]], Bold, Rule[StripOnInput, False]], \", including its symbol, role, \ -associated metric, and default coordinates and indices, in human-readable \ -form.\\nIf \", StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TInfo[\", StyleBox[\"ID\", \ +Bold, Rule[StripOnInput, False]], \"] displays information about the tensor \ +object \", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", including \ +its symbol, role, associated metric, and default coordinates and indices, in \ +human-readable form.\\nIf \", StyleBox[\"ID\", Bold, Rule[StripOnInput, \ False]], \" represents a coordinate system, displays a list of all tensors \ -using it as their default coordinate system.\\nIf \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" \ -represents a metric, displays a list of all tensors using it as their \ -associated metric.\"}]], TextCell[Row[List[\"TInfo\", \"[\", Style[ID, Bold], \ -\"] \", \"displays information about the tensor object \", Style[ID, Bold], \ -\", including its symbol, role, associated metric, and default coordinates \ -and indices, in human-readable form.\\nIf \", Style[ID, Bold], \" represents \ -a coordinate system, displays a list of all tensors using it as their default \ -coordinate system.\\nIf \", Style[ID, Bold], \" represents a metric, displays \ -a list of all tensors using it as their associated metric.\"]]]]\)", - "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> +using it as their default coordinate system.\\nIf \", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \" represents a metric, displays a list of all \ +tensors using it as their associated metric.\"}]], TextCell[Row[List[\"TInfo[\ +\", Style[\"ID\", Bold], \"] displays information about the tensor object \", \ +Style[\"ID\", Bold], \", including its symbol, role, associated metric, and \ +default coordinates and indices, in human-readable form.\\nIf \", \ +Style[\"ID\", Bold], \" represents a coordinate system, displays a list of \ +all tensors using it as their default coordinate system.\\nIf \", \ +Style[\"ID\", Bold], \" represents a metric, displays a list of all tensors \ +using it as their associated metric.\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TInfo, {OGRe`TInfo[ Pattern[OGRe`Private`ID, Blank[String]]] :> @@ -12166,7 +12187,7 @@ a list of all tensors using it as their associated metric.\"]]]]\)", "Coordinates", AppendTo[OGRe`Private`info, Row[{ - Style["Default Coordinates For: ", Bold], + Style["Used as Default Coordinates For: ", Bold], Row[ Select[ Keys[OGRe`Private`TensorData], And[ @@ -12185,7 +12206,7 @@ a list of all tensors using it as their associated metric.\"]]]]\)", "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TInfo"], False]]], "Output", - CellLabel->"Out[69]=",ExpressionUUID->"ff81e470-ba91-4555-88c7-1b4581d1aa98"] + CellLabel->"Out[69]=",ExpressionUUID->"f5356978-2bf7-4303-88f7-03ed8e1e0bd0"] }, Open ]], Cell[TextData[{ @@ -12221,7 +12242,8 @@ Cell[BoxData[ "RowDefault"]}, { TemplateBox[{ - StyleBox["\"Default Coordinates For: \"", Bold, StripOnInput -> False], + StyleBox[ + "\"Used as Default Coordinates For: \"", Bold, StripOnInput -> False], TemplateBox[{ ", ", "\", \"", "\"Minkowski\"", "\"4-Velocity\"", "\"SpatialDistance\""}, "RowWithSeparators"]}, @@ -12234,7 +12256,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"dc09938f-92b6-4465-b2ff-ff826e3c93ec"] + CellLabel->"OGRe:",ExpressionUUID->"0ccdbf4c-33c7-46e8-959b-5eed4055675b"] }, Open ]], Cell[CellGroupData[{ @@ -12286,7 +12308,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"6b54a902-c6f2-46bb-86d7-cf4f6578d005"] + CellLabel->"OGRe:",ExpressionUUID->"0a19c51d-3528-4e5c-8489-2439c5ef316c"] }, Open ]], Cell[CellGroupData[{ @@ -12334,7 +12356,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"d68a11c1-f087-4054-949a-3e104ef5df94"] + CellLabel->"OGRe:",ExpressionUUID->"35212ffa-2858-4b36-8f4a-255660b6fcc7"] }, Open ]], Cell[TextData[{ @@ -12374,23 +12396,11 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TImport\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"data\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"imports a tensor that has been \ -exported using TExport[ ].\\\\nWARNING:\\\\n1. The data is assumed to not \ -have been manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. The ID of \ -the tensor will be taken from the name of the (single) key of the Association \ -being imported. If a tensor with the same ID already exists, it will be \ -overwritten.\\\"}]], TextCell[Row[List[\\\"TImport\\\", \\\"[\\\", \ -Style[data, Bold], \\\"] \\\", \\\"imports a tensor that has been exported \ -using TExport[ ].\\\\nWARNING:\\\\n1. The data is assumed to not have been \ -manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. The ID of \ -the tensor will be taken from the name of the (single) key of the Association \ -being imported. If a tensor with the same ID already exists, it will be \ -overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", +TImport[\\\", StyleBox[\\\"data\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +imports a tensor that has been exported using TExport[].\\\"}]], \ +TextCell[Row[List[\\\"TImport[\\\", Style[\\\"data\\\", Bold], \\\"] imports \ +a tensor that has been exported using TExport[].\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -12420,25 +12430,50 @@ overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ "TImport", "[", "OGRe`Private`data_Association", "]"}], ":=", - RowBox[{"(", + RowBox[{"Module", "[", + RowBox[{ + RowBox[{"{", "OGRe`Private`newID", "}"}], ",", + RowBox[{ + RowBox[{"OGRe`Private`newID", "=", + RowBox[{ + RowBox[{"Keys", "[", "OGRe`Private`data", "]"}], + "\[LeftDoubleBracket]", "1", "\[RightDoubleBracket]"}]}], + ";", + RowBox[{"If", "[", + RowBox[{ + RowBox[{ + RowBox[{"!", + RowBox[{"KeyExistsQ", "[", + RowBox[{ + + RowBox[{"OGRe`Private`data", "\[LeftDoubleBracket]", "1", + "\[RightDoubleBracket]"}], ",", "\"OGReVersion\""}], + "]"}]}], "||", + RowBox[{ + RowBox[{ + + RowBox[{"OGRe`Private`data", "\[LeftDoubleBracket]", "1", + "\[RightDoubleBracket]"}], "[", "\"OGReVersion\"", "]"}], + "\[NotEqual]", "OGRe`Private`OGReVersion"}]}], ",", RowBox[{ + + RowBox[{"OGRe`Private`OGRePrint", "[", + "\"Warning: The imported tensor was created in a \ +different version of OGRe. Compatibility issues may occur.\"", "]"}], ";"}]}], + "]"}], ";", + + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`newID", "]"}], ";", RowBox[{"OGRe`Private`SetTensorID", "[", - RowBox[{ - RowBox[{ - RowBox[{"Keys", "[", "OGRe`Private`data", "]"}], - "\[LeftDoubleBracket]", "1", "\[RightDoubleBracket]"}], - ",", + RowBox[{"OGRe`Private`newID", ",", RowBox[{"KeyDrop", "[", RowBox[{ RowBox[{ RowBox[{"Values", "[", "OGRe`Private`data", "]"}], "\[LeftDoubleBracket]", "1", "\[RightDoubleBracket]"}], ",", "\"OGReVersion\""}], "]"}]}], "]"}], ";", - RowBox[{"Return", "[", - RowBox[{ - RowBox[{"Keys", "[", "OGRe`Private`data", "]"}], - "\[LeftDoubleBracket]", "1", "\[RightDoubleBracket]"}], - "]"}], ";"}], ")"}]}]}, {" "}}, + RowBox[{"Return", "[", "OGRe`Private`newID", "]"}], + ";"}]}], "]"}]}]}, {" "}}, GridBoxAlignment -> {"Columns" -> {{Left}}}, DefaultBaseStyle -> "Column", GridBoxItemSize -> { @@ -12567,23 +12602,11 @@ overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TImport\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"data\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"imports a tensor that has been \ -exported using TExport[ ].\\\\nWARNING:\\\\n1. The data is assumed to not \ -have been manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. The ID of \ -the tensor will be taken from the name of the (single) key of the Association \ -being imported. If a tensor with the same ID already exists, it will be \ -overwritten.\\\"}]], TextCell[Row[List[\\\"TImport\\\", \\\"[\\\", \ -Style[data, Bold], \\\"] \\\", \\\"imports a tensor that has been exported \ -using TExport[ ].\\\\nWARNING:\\\\n1. The data is assumed to not have been \ -manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. The ID of \ -the tensor will be taken from the name of the (single) key of the Association \ -being imported. If a tensor with the same ID already exists, it will be \ -overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", +TImport[\\\", StyleBox[\\\"data\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +imports a tensor that has been exported using TExport[].\\\"}]], \ +TextCell[Row[List[\\\"TImport[\\\", Style[\\\"data\\\", Bold], \\\"] imports \ +a tensor that has been exported using TExport[].\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -12647,38 +12670,36 @@ overwritten.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TImport\", \"[\", \ -StyleBox[Cell[BoxData[\"data\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"imports a tensor that has been exported using TExport[ ].\\nWARNING:\\n1. \ -The data is assumed to not have been manually modified by the user, so it is \ -NOT checked for errors or inconsistencies. Importing tensor data that has \ -been manually modified may cause errors or unexpected results, and should be \ -avoided.\\n2. The ID of the tensor will be taken from the name of the \ -(single) key of the Association being imported. If a tensor with the same ID \ -already exists, it will be overwritten.\"}]], TextCell[Row[List[\"TImport\", \ -\"[\", Style[data, Bold], \"] \", \"imports a tensor that has been exported \ -using TExport[ ].\\nWARNING:\\n1. The data is assumed to not have been \ -manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\n2. The ID of the \ -tensor will be taken from the name of the (single) key of the Association \ -being imported. If a tensor with the same ID already exists, it will be \ -overwritten.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, - "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TImport[\", StyleBox[\"data\", \ +Bold, Rule[StripOnInput, False]], \"] imports a tensor that has been exported \ +using TExport[].\"}]], TextCell[Row[List[\"TImport[\", Style[\"data\", Bold], \ +\"] imports a tensor that has been exported using TExport[].\"]]]]\)", + "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, + "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TImport, {OGRe`TImport[ Pattern[OGRe`Private`data, - Blank[Association]]] :> (OGRe`Private`SetTensorID[ - Part[ - Keys[OGRe`Private`data], 1], - KeyDrop[ - Part[ - Values[OGRe`Private`data], 1], "OGReVersion"]]; Return[ - Part[ - Keys[OGRe`Private`data], 1]]; Null)}], "SubValues" -> None, + Blank[Association]]] :> + Module[{OGRe`Private`newID}, OGRe`Private`newID = Part[ + Keys[OGRe`Private`data], 1]; If[ + Or[ + Not[ + KeyExistsQ[ + Part[OGRe`Private`data, 1], "OGReVersion"]], + Part[OGRe`Private`data, 1]["OGReVersion"] != + OGRe`Private`OGReVersion], + OGRe`Private`OGRePrint[ + "Warning: The imported tensor was created in a different version \ +of OGRe. Compatibility issues may occur."]; Null]; + OGRe`Private`CheckIfOverwriting[OGRe`Private`newID]; + OGRe`Private`SetTensorID[OGRe`Private`newID, + KeyDrop[ + Part[ + Values[OGRe`Private`data], 1], "OGReVersion"]]; + Return[OGRe`Private`newID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TImport"], False]]], "Output", - CellLabel->"Out[73]=",ExpressionUUID->"fdccaca4-1d47-4b82-9247-86ae46227f39"] + CellLabel->"Out[73]=",ExpressionUUID->"58a55d5c-0853-4420-8136-44f29abc3ff7"] }, Open ]], Cell[TextData[{ @@ -12721,21 +12742,21 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TExportAll\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"filename\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"exports the raw tensor data for \ -all tensors defined in the current session as an Association.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"filename\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is optional. If specified, the data is exported to a file with this \ -name. If a full path is not given, the file will be created in the current \ -working directory, as given by Directory[ ]. Note that the file will be \ -overwritten if it already exists.\\\"}]], \ -TextCell[Row[List[\\\"TExportAll\\\", \\\"[\\\", Style[filename, Bold], \\\"] \ -\\\", \\\"exports the raw tensor data for all tensors defined in the current \ -session as an Association.\\\\n\\\", Style[filename, Bold], \\\" is optional. \ -If specified, the data is exported to a file with this name. If a full path \ +TExportAll[] exports the raw tensor data for all tensors defined in the \ +current session as an Association.\\\\nTExportAll[\\\", StyleBox[\\\"filename\ +\\\", Bold, Rule[StripOnInput, False]], \\\"] exports the data to \\\", \ +StyleBox[\\\"filename\\\", Bold, Rule[StripOnInput, False]], \\\". If a full \ +path is not given, the file will be created in the current working directory, \ +as given by Directory[]. This directory can be changed using SetDirectory[]. \ +Note that the file will be overwritten if it already exists.\\\"}]], \ +TextCell[Row[List[\\\"TExportAll[] exports the raw tensor data for all \ +tensors defined in the current session as an \ +Association.\\\\nTExportAll[\\\", Style[\\\"filename\\\", Bold], \\\"] \ +exports the data to \\\", Style[\\\"filename\\\", Bold], \\\". If a full path \ is not given, the file will be created in the current working directory, as \ -given by Directory[ ]. Note that the file will be overwritten if it already \ -exists.\\\"]]]]\\)\"\>", "InformationUsageText", +given by Directory[]. This directory can be changed using SetDirectory[]. \ +Note that the file will be overwritten if it already exists.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -12868,6 +12889,7 @@ exists.\\\"]]]]\\)\"\>", "InformationUsageText", System`InformationDump`mouseOver$$]], Alignment->Left, Appearance->{"Default" -> None}, + ButtonFunction:>FEPrivate`Set[ System`InformationDump`open$$, False], Evaluator->Automatic, @@ -12913,21 +12935,21 @@ exists.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TExportAll\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"filename\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"exports the raw tensor data for \ -all tensors defined in the current session as an Association.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"filename\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is optional. If specified, the data is exported to a file with this \ -name. If a full path is not given, the file will be created in the current \ -working directory, as given by Directory[ ]. Note that the file will be \ -overwritten if it already exists.\\\"}]], \ -TextCell[Row[List[\\\"TExportAll\\\", \\\"[\\\", Style[filename, Bold], \\\"] \ -\\\", \\\"exports the raw tensor data for all tensors defined in the current \ -session as an Association.\\\\n\\\", Style[filename, Bold], \\\" is optional. \ -If specified, the data is exported to a file with this name. If a full path \ +TExportAll[] exports the raw tensor data for all tensors defined in the \ +current session as an Association.\\\\nTExportAll[\\\", StyleBox[\\\"filename\ +\\\", Bold, Rule[StripOnInput, False]], \\\"] exports the data to \\\", \ +StyleBox[\\\"filename\\\", Bold, Rule[StripOnInput, False]], \\\". If a full \ +path is not given, the file will be created in the current working directory, \ +as given by Directory[]. This directory can be changed using SetDirectory[]. \ +Note that the file will be overwritten if it already exists.\\\"}]], \ +TextCell[Row[List[\\\"TExportAll[] exports the raw tensor data for all \ +tensors defined in the current session as an \ +Association.\\\\nTExportAll[\\\", Style[\\\"filename\\\", Bold], \\\"] \ +exports the data to \\\", Style[\\\"filename\\\", Bold], \\\". If a full path \ is not given, the file will be created in the current working directory, as \ -given by Directory[ ]. Note that the file will be overwritten if it already \ -exists.\\\"]]]]\\)\"\>", "InformationUsageText", +given by Directory[]. This directory can be changed using SetDirectory[]. \ +Note that the file will be overwritten if it already exists.\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -12991,22 +13013,21 @@ exists.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TExportAll\", \"[\", \ -StyleBox[Cell[BoxData[\"filename\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"exports the raw tensor data for all tensors defined in the current \ -session as an Association.\\n\", StyleBox[Cell[BoxData[\"filename\"]], Bold, \ -Rule[StripOnInput, False]], \" is optional. If specified, the data is \ -exported to a file with this name. If a full path is not given, the file will \ -be created in the current working directory, as given by Directory[ ]. Note \ -that the file will be overwritten if it already exists.\"}]], \ -TextCell[Row[List[\"TExportAll\", \"[\", Style[filename, Bold], \"] \", \ -\"exports the raw tensor data for all tensors defined in the current session \ -as an Association.\\n\", Style[filename, Bold], \" is optional. If specified, \ -the data is exported to a file with this name. If a full path is not given, \ -the file will be created in the current working directory, as given by \ -Directory[ ]. Note that the file will be overwritten if it already \ -exists.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> - None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TExportAll[] exports the raw \ +tensor data for all tensors defined in the current session as an Association.\ +\\nTExportAll[\", StyleBox[\"filename\", Bold, Rule[StripOnInput, False]], \ +\"] exports the data to \", StyleBox[\"filename\", Bold, Rule[StripOnInput, \ +False]], \". If a full path is not given, the file will be created in the \ +current working directory, as given by Directory[]. This directory can be \ +changed using SetDirectory[]. Note that the file will be overwritten if it \ +already exists.\"}]], TextCell[Row[List[\"TExportAll[] exports the raw tensor \ +data for all tensors defined in the current session as an \ +Association.\\nTExportAll[\", Style[\"filename\", Bold], \"] exports the data \ +to \", Style[\"filename\", Bold], \". If a full path is not given, the file \ +will be created in the current working directory, as given by Directory[]. \ +This directory can be changed using SetDirectory[]. Note that the file will \ +be overwritten if it already exists.\"]]]]\)", "Documentation" -> None, + "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TExportAll, { OGRe`TExportAll[] :> OGRe`Private`TensorData, OGRe`TExportAll[ @@ -13022,7 +13043,7 @@ exists.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TExportAll"], False]]], "Output", - CellLabel->"Out[74]=",ExpressionUUID->"2439bd50-7f01-404e-9142-87f3c83e30a9"] + CellLabel->"Out[74]=",ExpressionUUID->"29cccf10-4e4c-41ba-bb3a-726f70564d54"] }, Open ]], Cell[TextData[{ @@ -13051,7 +13072,7 @@ Cell[BoxData[ ",", "\<\"Kretschmann\"\>", ",", "\<\"PerfectFluid\"\>", ",", "\<\"4-Velocity\"\>", ",", "\<\"SpatialDistance\"\>"}], "}"}]], "Output", - CellLabel->"Out[75]=",ExpressionUUID->"2955cdc7-f296-486e-89ee-6f59ac63a073"] + CellLabel->"Out[75]=",ExpressionUUID->"2b95f3b4-98b4-42ca-b022-76c41504e1d5"] }, Open ]], Cell[TextData[{ @@ -13097,12 +13118,13 @@ Cell[BoxData[ Cell[BoxData[ RowBox[{"\[LeftAssociation]", RowBox[{ - RowBox[{"\<\"OGReVersion\"\>", - "\[Rule]", "\<\"v1.2 (April 28, 2021)\"\>"}], ",", + RowBox[{"\<\"OGReVersion\"\>", "\[Rule]", "\<\"v1.4 (2021-05-09)\"\>"}], + ",", RowBox[{"\<\"IndexLetters\"\>", "\[Rule]", "\<\"\[Mu]\[Nu]\[Rho]\[Sigma]\[Kappa]\[Lambda]\[Alpha]\[Beta]\ \[Gamma]\[Delta]\[CurlyEpsilon]\[Zeta]\[Epsilon]\[Theta]\[Iota]\[Xi]\[Pi]\ \[Tau]\[Phi]\[Chi]\[Psi]\[Omega]\"\>"}], ",", + RowBox[{"\<\"Parallelize\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"SimplifyAssumptions\"\>", "\[Rule]", RowBox[{"\[LeftAssociation]", RowBox[{ @@ -13110,10 +13132,8 @@ Cell[BoxData[ RowBox[{"\<\"User\"\>", "\[Rule]", RowBox[{"{", RowBox[{"r", "\[GreaterEqual]", "0"}], "}"}]}]}], - "\[RightAssociation]"}]}], ",", - RowBox[{"\<\"Parallelize\"\>", "\[Rule]", "False"}]}], - "\[RightAssociation]"}]], "Output", - CellLabel->"Out[76]=",ExpressionUUID->"720c43a4-f457-44b0-a983-773dc93c74d1"] + "\[RightAssociation]"}]}]}], "\[RightAssociation]"}]], "Output", + CellLabel->"Out[76]=",ExpressionUUID->"07678941-e6bf-4caa-8593-b1ccb0b358ce"] }, Open ]], Cell[TextData[{ @@ -13155,30 +13175,25 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TImportAll\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"source\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"imports tensor data that has been \ -exported using TExportAll[ ].\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"source\\\ -\"]], Bold, Rule[StripOnInput, False]], \\\" is an Association, imports the \ -data directly.\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"source\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is a file name, imports the data from that \ -file. If a full path is not given, the file should be located in the current \ -working directory, as given by Directory[ ].\\\\nWARNING:\\\\n1. The data is \ -assumed to not have been manually modified by the user, so it is NOT checked \ -for errors or inconsistencies. Importing tensor data that has been manually \ -modified may cause errors or unexpected results, and should be \ -avoided.\\\\n2. This will irreversibly delete ALL of the tensors already \ -defined in the current session.\\\"}]], TextCell[Row[List[\\\"TImportAll\\\", \ -\\\"[\\\", Style[source, Bold], \\\"] \\\", \\\"imports tensor data that has \ -been exported using TExportAll[ ].\\\\nIf \\\", Style[source, Bold], \\\" is \ -an Association, imports the data directly.\\\\nIf \\\", Style[source, Bold], \ -\\\" is a file name, imports the data from that file. If a full path is not \ -given, the file should be located in the current working directory, as given \ -by Directory[ ].\\\\nWARNING:\\\\n1. The data is assumed to not have been \ -manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. This will \ +TImportAll[\\\", StyleBox[\\\"source\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] imports tensor data that has been exported using TExportAll[]. If \\\", \ +StyleBox[\\\"source\\\", Bold, Rule[StripOnInput, False]], \\\" is an \ +Association, imports the data directly. If \\\", StyleBox[\\\"source\\\", \ +Bold, Rule[StripOnInput, False]], \\\" is a file name, imports the data from \ +that file. If a full path is not given, the file is assumed to be located in \ +the current working directory, as given by Directory[]. This directory can be \ +changed using SetDirectory[].\\\\n\\\", StyleBox[\\\"WARNING: This will \ irreversibly delete ALL of the tensors already defined in the current \ -session.\\\"]]]]\\)\"\>", "InformationUsageText", +session.\\\", Bold, Rule[StripOnInput, False]]}]], \ +TextCell[Row[List[\\\"TImportAll[\\\", Style[\\\"source\\\", Bold], \\\"] \ +imports tensor data that has been exported using TExportAll[]. If \\\", \ +Style[\\\"source\\\", Bold], \\\" is an Association, imports the data \ +directly. If \\\", Style[\\\"source\\\", Bold], \\\" is a file name, imports \ +the data from that file. If a full path is not given, the file is assumed to \ +be located in the current working directory, as given by Directory[]. This \ +directory can be changed using SetDirectory[].\\\\n\\\", Style[\\\"WARNING: \ +This will irreversibly delete ALL of the tensors already defined in the \ +current session.\\\", Bold]]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -13378,30 +13393,25 @@ session.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TImportAll\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"source\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"imports tensor data that has been \ -exported using TExportAll[ ].\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"source\\\ -\"]], Bold, Rule[StripOnInput, False]], \\\" is an Association, imports the \ -data directly.\\\\nIf \\\", StyleBox[Cell[BoxData[\\\"source\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" is a file name, imports the data from that \ -file. If a full path is not given, the file should be located in the current \ -working directory, as given by Directory[ ].\\\\nWARNING:\\\\n1. The data is \ -assumed to not have been manually modified by the user, so it is NOT checked \ -for errors or inconsistencies. Importing tensor data that has been manually \ -modified may cause errors or unexpected results, and should be \ -avoided.\\\\n2. This will irreversibly delete ALL of the tensors already \ -defined in the current session.\\\"}]], TextCell[Row[List[\\\"TImportAll\\\", \ -\\\"[\\\", Style[source, Bold], \\\"] \\\", \\\"imports tensor data that has \ -been exported using TExportAll[ ].\\\\nIf \\\", Style[source, Bold], \\\" is \ -an Association, imports the data directly.\\\\nIf \\\", Style[source, Bold], \ -\\\" is a file name, imports the data from that file. If a full path is not \ -given, the file should be located in the current working directory, as given \ -by Directory[ ].\\\\nWARNING:\\\\n1. The data is assumed to not have been \ -manually modified by the user, so it is NOT checked for errors or \ -inconsistencies. Importing tensor data that has been manually modified may \ -cause errors or unexpected results, and should be avoided.\\\\n2. This will \ +TImportAll[\\\", StyleBox[\\\"source\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] imports tensor data that has been exported using TExportAll[]. If \\\", \ +StyleBox[\\\"source\\\", Bold, Rule[StripOnInput, False]], \\\" is an \ +Association, imports the data directly. If \\\", StyleBox[\\\"source\\\", \ +Bold, Rule[StripOnInput, False]], \\\" is a file name, imports the data from \ +that file. If a full path is not given, the file is assumed to be located in \ +the current working directory, as given by Directory[]. This directory can be \ +changed using SetDirectory[].\\\\n\\\", StyleBox[\\\"WARNING: This will \ irreversibly delete ALL of the tensors already defined in the current \ -session.\\\"]]]]\\)\"\>", "InformationUsageText", +session.\\\", Bold, Rule[StripOnInput, False]]}]], \ +TextCell[Row[List[\\\"TImportAll[\\\", Style[\\\"source\\\", Bold], \\\"] \ +imports tensor data that has been exported using TExportAll[]. If \\\", \ +Style[\\\"source\\\", Bold], \\\" is an Association, imports the data \ +directly. If \\\", Style[\\\"source\\\", Bold], \\\" is a file name, imports \ +the data from that file. If a full path is not given, the file is assumed to \ +be located in the current working directory, as given by Directory[]. This \ +directory can be changed using SetDirectory[].\\\\n\\\", Style[\\\"WARNING: \ +This will irreversibly delete ALL of the tensors already defined in the \ +current session.\\\", Bold]]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -13465,31 +13475,26 @@ session.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TImportAll\", \"[\", \ -StyleBox[Cell[BoxData[\"source\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"imports tensor data that has been exported using TExportAll[ ].\\nIf \", \ -StyleBox[Cell[BoxData[\"source\"]], Bold, Rule[StripOnInput, False]], \" is \ -an Association, imports the data directly.\\nIf \", \ -StyleBox[Cell[BoxData[\"source\"]], Bold, Rule[StripOnInput, False]], \" is a \ -file name, imports the data from that file. If a full path is not given, the \ -file should be located in the current working directory, as given by \ -Directory[ ].\\nWARNING:\\n1. The data is assumed to not have been manually \ -modified by the user, so it is NOT checked for errors or inconsistencies. \ -Importing tensor data that has been manually modified may cause errors or \ -unexpected results, and should be avoided.\\n2. This will irreversibly delete \ -ALL of the tensors already defined in the current session.\"}]], \ -TextCell[Row[List[\"TImportAll\", \"[\", Style[source, Bold], \"] \", \ -\"imports tensor data that has been exported using TExportAll[ ].\\nIf \", \ -Style[source, Bold], \" is an Association, imports the data directly.\\nIf \ -\", Style[source, Bold], \" is a file name, imports the data from that file. \ -If a full path is not given, the file should be located in the current \ -working directory, as given by Directory[ ].\\nWARNING:\\n1. The data is \ -assumed to not have been manually modified by the user, so it is NOT checked \ -for errors or inconsistencies. Importing tensor data that has been manually \ -modified may cause errors or unexpected results, and should be avoided.\\n2. \ -This will irreversibly delete ALL of the tensors already defined in the \ -current session.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, - "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TImportAll[\", \ +StyleBox[\"source\", Bold, Rule[StripOnInput, False]], \"] imports tensor \ +data that has been exported using TExportAll[]. If \", StyleBox[\"source\", \ +Bold, Rule[StripOnInput, False]], \" is an Association, imports the data \ +directly. If \", StyleBox[\"source\", Bold, Rule[StripOnInput, False]], \" is \ +a file name, imports the data from that file. If a full path is not given, \ +the file is assumed to be located in the current working directory, as given \ +by Directory[]. This directory can be changed using SetDirectory[].\\n\", \ +StyleBox[\"WARNING: This will irreversibly delete ALL of the tensors already \ +defined in the current session.\", Bold, Rule[StripOnInput, False]]}]], \ +TextCell[Row[List[\"TImportAll[\", Style[\"source\", Bold], \"] imports \ +tensor data that has been exported using TExportAll[]. If \", \ +Style[\"source\", Bold], \" is an Association, imports the data directly. If \ +\", Style[\"source\", Bold], \" is a file name, imports the data from that \ +file. If a full path is not given, the file is assumed to be located in the \ +current working directory, as given by Directory[]. This directory can be \ +changed using SetDirectory[].\\n\", Style[\"WARNING: This will irreversibly \ +delete ALL of the tensors already defined in the current session.\", \ +Bold]]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> + None, "DownValues" -> Information`InformationValueForm[ DownValues, OGRe`TImportAll, {OGRe`TImportAll[ Pattern[OGRe`Private`data, @@ -13512,7 +13517,7 @@ current session.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TImportAll"], False]]], "Output", - CellLabel->"Out[77]=",ExpressionUUID->"44555592-ece8-49fe-89d6-1c7ab57a8810"] + CellLabel->"Out[77]=",ExpressionUUID->"02447327-e499-4792-b750-7aa3f2fde4cc"] }, Open ]], Cell[TextData[{ @@ -13606,34 +13611,30 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TGetComponents\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"extracts the components of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -with the index configuration \\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" as a regular Mathematica List.\\\\n\\\", StyleBox[Cell[BoxData[\ -\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\" should be a list of \ -the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to \ -an upper index and -1 corresponds to a lower index.\\\\nThe index \ -configuration and/or coordinate system cannot be omitted; there are no \ -default values. This is to ensure that the user always knows which \ -representation is being extracted.\\\"}]], \ -TextCell[Row[List[\\\"TGetComponents\\\", \\\"[\\\", Style[ID, Bold], \ -Style[\\\", \\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], \\\"] \\\", \\\"extracts the components of the \ -tensor object \\\", Style[ID, Bold], \\\" with the index configuration \\\", \ -Style[indices, Bold], \\\" and in the coordinate system \\\", \ -Style[coordinatesID, Bold], \\\" as a regular Mathematica List.\\\\n\\\", \ -Style[indices, Bold], \\\" should be a list of the form {\\\\[PlusMinus]1, \\\ -\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\\nThe index configuration and/or coordinate \ -system cannot be omitted; there are no default values. This is to ensure that \ -the user always knows which representation is being \ +TGetComponents[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \ +\\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +extracts the components of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" with the index configuration \\\", StyleBox[\ +\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" as a list.\\\\n\\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index. The index configuration and \ +coordinate system cannot be omitted; there are no default values. This is to \ +ensure that the user always knows exactly which representation is being \ +extracted.\\\"}]], TextCell[Row[List[\\\"TGetComponents[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\"] extracts the components of \ +the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" with the index \ +configuration \\\", Style[\\\"indices\\\", Bold], \\\" and in the coordinate \ +system \\\", Style[\\\"coordinatesID\\\", Bold], \\\" as a list.\\\\n\\\", \ +Style[\\\"indices\\\", Bold], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index. The index configuration and \ +coordinate system cannot be omitted; there are no default values. This is to \ +ensure that the user always knows exactly which representation is being \ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -13782,7 +13783,6 @@ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpener"]], True-> - DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpenerHot"]]}, Dynamic[ System`InformationDump`mouseOver$$]], @@ -13834,34 +13834,30 @@ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TGetComponents\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, \ -False]], StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"] \\\", \\\"extracts the components of the tensor object \\\", \ -StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, False]], \\\" \ -with the index configuration \\\", StyleBox[Cell[BoxData[\\\"indices\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" and in the coordinate system \\\", \ -StyleBox[Cell[BoxData[\\\"coordinatesID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" as a regular Mathematica List.\\\\n\\\", StyleBox[Cell[BoxData[\ -\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\" should be a list of \ -the form {\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to \ -an upper index and -1 corresponds to a lower index.\\\\nThe index \ -configuration and/or coordinate system cannot be omitted; there are no \ -default values. This is to ensure that the user always knows which \ -representation is being extracted.\\\"}]], \ -TextCell[Row[List[\\\"TGetComponents\\\", \\\"[\\\", Style[ID, Bold], \ -Style[\\\", \\\", Bold], Style[indices, Bold], Style[\\\", \\\", Bold], \ -Style[coordinatesID, Bold], \\\"] \\\", \\\"extracts the components of the \ -tensor object \\\", Style[ID, Bold], \\\" with the index configuration \\\", \ -Style[indices, Bold], \\\" and in the coordinate system \\\", \ -Style[coordinatesID, Bold], \\\" as a regular Mathematica List.\\\\n\\\", \ -Style[indices, Bold], \\\" should be a list of the form {\\\\[PlusMinus]1, \\\ -\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\\\nThe index configuration and/or coordinate \ -system cannot be omitted; there are no default values. This is to ensure that \ -the user always knows which representation is being \ +TGetComponents[\\\", StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \ +\\\", \\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\", \ +\\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +extracts the components of the tensor object \\\", StyleBox[\\\"ID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" with the index configuration \\\", StyleBox[\ +\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" and in the coordinate \ +system \\\", StyleBox[\\\"coordinatesID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" as a list.\\\\n\\\", StyleBox[\\\"indices\\\", Bold, \ +Rule[StripOnInput, False]], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index. The index configuration and \ +coordinate system cannot be omitted; there are no default values. This is to \ +ensure that the user always knows exactly which representation is being \ +extracted.\\\"}]], TextCell[Row[List[\\\"TGetComponents[\\\", \ +Style[\\\"ID\\\", Bold], \\\", \\\", Style[\\\"indices\\\", Bold], \\\", \ +\\\", Style[\\\"coordinatesID\\\", Bold], \\\"] extracts the components of \ +the tensor object \\\", Style[\\\"ID\\\", Bold], \\\" with the index \ +configuration \\\", Style[\\\"indices\\\", Bold], \\\" and in the coordinate \ +system \\\", Style[\\\"coordinatesID\\\", Bold], \\\" as a list.\\\\n\\\", \ +Style[\\\"indices\\\", Bold], \\\" must be a list of the form \ +{\\\\[PlusMinus]1, \\\\[PlusMinus]1, ...}, where +1 corresponds to an upper \ +index and -1 corresponds to a lower index. The index configuration and \ +coordinate system cannot be omitted; there are no default values. This is to \ +ensure that the user always knows exactly which representation is being \ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], @@ -13887,6 +13883,7 @@ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", System`InformationDump`mouseOver$$]], Alignment->Left, Appearance->{"Default" -> None}, + ButtonFunction:>FEPrivate`Set[ System`InformationDump`open$$, True], Evaluator->Automatic, @@ -13925,34 +13922,29 @@ extracted.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TGetComponents\", \"[\", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\", \", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\"] \", \"extracts the components of the tensor object \", \ -StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \" with the \ -index configuration \", StyleBox[Cell[BoxData[\"indices\"]], Bold, \ -Rule[StripOnInput, False]], \" and in the coordinate system \", \ -StyleBox[Cell[BoxData[\"coordinatesID\"]], Bold, Rule[StripOnInput, False]], \ -\" as a regular Mathematica List.\\n\", StyleBox[Cell[BoxData[\"indices\"]], \ -Bold, Rule[StripOnInput, False]], \" should be a list of the form \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TGetComponents[\", \ +StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"indices\ +\", Bold, Rule[StripOnInput, False]], \", \", StyleBox[\"coordinatesID\", \ +Bold, Rule[StripOnInput, False]], \"] extracts the components of the tensor \ +object \", StyleBox[\"ID\", Bold, Rule[StripOnInput, False]], \" with the \ +index configuration \", StyleBox[\"indices\", Bold, Rule[StripOnInput, \ +False]], \" and in the coordinate system \", StyleBox[\"coordinatesID\", \ +Bold, Rule[StripOnInput, False]], \" as a list.\\n\", StyleBox[\"indices\", \ +Bold, Rule[StripOnInput, False]], \" must be a list of the form \ {\\[PlusMinus]1, \\[PlusMinus]1, ...}, where +1 corresponds to an upper index \ -and -1 corresponds to a lower index.\\nThe index configuration and/or \ -coordinate system cannot be omitted; there are no default values. This is to \ -ensure that the user always knows which representation is being \ -extracted.\"}]], TextCell[Row[List[\"TGetComponents\", \"[\", Style[ID, \ -Bold], Style[\", \", Bold], Style[indices, Bold], Style[\", \", Bold], \ -Style[coordinatesID, Bold], \"] \", \"extracts the components of the tensor \ -object \", Style[ID, Bold], \" with the index configuration \", \ -Style[indices, Bold], \" and in the coordinate system \", \ -Style[coordinatesID, Bold], \" as a regular Mathematica List.\\n\", \ -Style[indices, Bold], \" should be a list of the form {\\[PlusMinus]1, \ -\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ -corresponds to a lower index.\\nThe index configuration and/or coordinate \ +and -1 corresponds to a lower index. The index configuration and coordinate \ system cannot be omitted; there are no default values. This is to ensure that \ -the user always knows which representation is being extracted.\"]]]]\)", +the user always knows exactly which representation is being extracted.\"}]], \ +TextCell[Row[List[\"TGetComponents[\", Style[\"ID\", Bold], \", \", \ +Style[\"indices\", Bold], \", \", Style[\"coordinatesID\", Bold], \"] \ +extracts the components of the tensor object \", Style[\"ID\", Bold], \" with \ +the index configuration \", Style[\"indices\", Bold], \" and in the \ +coordinate system \", Style[\"coordinatesID\", Bold], \" as a list.\\n\", \ +Style[\"indices\", Bold], \" must be a list of the form {\\[PlusMinus]1, \ +\\[PlusMinus]1, ...}, where +1 corresponds to an upper index and -1 \ +corresponds to a lower index. The index configuration and coordinate system \ +cannot be omitted; there are no default values. This is to ensure that the \ +user always knows exactly which representation is being extracted.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ @@ -13978,7 +13970,7 @@ the user always knows which representation is being extracted.\"]]]]\)", None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TGetComponents"], False]]], "Output", - CellLabel->"Out[78]=",ExpressionUUID->"370ef69e-1a58-4be1-9606-48a432b041f8"] + CellLabel->"Out[78]=",ExpressionUUID->"fede22a1-4472-4686-9d54-8a23baa04231"] }, Open ]], Cell["For example :", \ @@ -14019,7 +14011,7 @@ Cell[BoxData[ SuperscriptBox[ RowBox[{"Csc", "[", "\[Theta]", "]"}], "2"], SuperscriptBox["r", "2"]]}], "}"}]}], "}"}]], "Output", - CellLabel->"Out[79]=",ExpressionUUID->"33151808-8314-496c-addb-3bc600ca7f9c"] + CellLabel->"Out[79]=",ExpressionUUID->"5666c995-28db-468b-8bc9-c6714df90fbc"] }, Open ]], Cell[TextData[{ @@ -14042,7 +14034,7 @@ Cell[BoxData[ FractionBox["r", RowBox[{ RowBox[{"2", " ", "M"}], "-", "r"}]]], "Output", - CellLabel->"Out[80]=",ExpressionUUID->"d5f01eb0-c305-4484-b49f-d7f293285b5f"] + CellLabel->"Out[80]=",ExpressionUUID->"52c98db5-c9d4-40fd-8006-fcb5c6e8acb6"] }, Open ]] }, Open ]] }, Open ]], @@ -14095,53 +14087,46 @@ Cell[BoxData[ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TCalc\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[RowBox[List[\\\"LHSTensorID\\\", \\\"[\ -\\\", \\\"LHSIndices\\\", \\\"]\\\"]]]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"calculates a tensor formula.\\\\n\\\", StyleBox[Cell[BoxData[\ -\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, False]], \\\" may include \ -any number of tensors in the format \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\"], where \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" is a tensor object and \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is a string representing the order of indices, along with any combination \ -of the following operations:\\\\n\\\\[Bullet] Addition: For example, \ -\\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TCalc[\ +\\\", StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +calculates a tensor \\\", StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which may involve any number of tensors in the format \\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"[\\\", StyleBox[\\\ +\"indices\\\", Bold, Rule[StripOnInput, False]], \\\"], where \\\", StyleBox[\ +\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" is a tensor object and \ +\\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" is a \ +string representing the order of indices, along with any combination of the \ +following operations:\\\\n\\\\[Bullet] Addition: For example, \\\\\\\"A\\\\\\\ +\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Contraction: For example, \ \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Lambda]\\\\\\\"] . \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Lambda]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Multiplication by scalar: For example, 2 * \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\ -\\\\[Nu]\\\\\\\"].\\\\n\\\", StyleBox[Cell[BoxData[\\\"LHSTensorID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" specifies the ID of the tensor object \ -in which to store the result. If omitted, the ID \\\\\\\"Result\\\\\\\" will \ -be used.\\\\n\\\", StyleBox[Cell[BoxData[\\\"LHSIndices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" specifies the order of indices of the \ -resulting tensor. The indices must be a permutation of the free indices of \\\ -\", StyleBox[Cell[BoxData[\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\". If omitted, the indices will be in the same order as they \ -appear in \\\", StyleBox[Cell[BoxData[\\\"RHSExpression\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\". If \\\", \ -StyleBox[Cell[BoxData[\\\"LHSTensorID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" is omitted, then \\\", \ -StyleBox[Cell[BoxData[\\\"LHSIndices\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" must be omitted as well.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" specifies the symbol to use for the result. If omitted, the placeholder \ -symbol \\\\[DottedSquare] will be used.\\\"}]], TextCell[Row[List[\\\"TCalc\\\ -\", \\\"[\\\", Style[LHSTensorID[LHSIndices], Bold], Style[\\\", \\\", Bold], \ -Style[RHSExpression, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \ -\\\"] \\\", \\\"calculates a tensor formula.\\\\n\\\", Style[RHSExpression, \ -Bold], \\\" may include any number of tensors in the format \\\", Style[ID, \ -Bold], \\\"[\\\", Style[indices, Bold], \\\"], where \\\", Style[ID, Bold], \ -\\\" is a tensor object and \\\", Style[indices, Bold], \\\" is a string \ -representing the order of indices, along with any combination of the \ +\\\\[Nu]\\\\\\\"].\\\\nTCalc[\\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"[\\\", StyleBox[\\\"targetIndices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"], \\\", StyleBox[\\\"formula\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"symbol\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] calculates a tensor \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object.\\\\n\\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" specifies the ID of the tensor object in \ +which to store the result. If omitted, the ID \\\\\\\"Result\\\\\\\" will be \ +used.\\\\n\\\", StyleBox[\\\"targetIndices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" specifies the order of indices of the resulting tensor. The \ +indices must be a permutation of the free indices of \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\". If omitted, \ +the indices are assumed to be in the same order as they appear in \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ +StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\" specifies the \ +symbol to use for the resulting tensor. If omitted, the placeholder symbol \\\ +\\[DottedSquare] will be used.\\\"}]], TextCell[Row[List[\\\"TCalc[\\\", \ +Style[\\\"formula\\\", Bold], \\\"] calculates a tensor \\\", \ +Style[\\\"formula\\\", Bold], \\\", which may involve any number of tensors \ +in the format \\\", Style[\\\"ID\\\", Bold], \\\"[\\\", \ +Style[\\\"indices\\\", Bold], \\\"], where \\\", Style[\\\"ID\\\", Bold], \ +\\\" is a tensor object and \\\", Style[\\\"indices\\\", Bold], \\\" is a \ +string representing the order of indices, along with any combination of the \ following operations:\\\\n\\\\[Bullet] Addition: For example, \\\\\\\"A\\\\\\\ \"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ @@ -14149,17 +14134,20 @@ Contraction: For example, \ \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Lambda]\\\\\\\"] . \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Lambda]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Multiplication by scalar: For example, 2 * \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\ -\\\\[Nu]\\\\\\\"].\\\\n\\\", Style[LHSTensorID, Bold], \\\" specifies the ID \ +\\\\[Nu]\\\\\\\"].\\\\nTCalc[\\\", Style[\\\"targetID\\\", Bold], \\\"[\\\", \ +Style[\\\"targetIndices\\\", Bold], \\\"], \\\", Style[\\\"formula\\\", \ +Bold], \\\", \\\", Style[\\\"symbol\\\", Bold], \\\"] calculates a tensor \ +\\\", Style[\\\"formula\\\", Bold], \\\" and stores the result in a new \ +tensor object.\\\\n\\\", Style[\\\"targetID\\\", Bold], \\\" specifies the ID \ of the tensor object in which to store the result. If omitted, the ID \ -\\\\\\\"Result\\\\\\\" will be used.\\\\n\\\", Style[LHSIndices, Bold], \\\" \ -specifies the order of indices of the resulting tensor. The indices must be a \ -permutation of the free indices of \\\", Style[RHSExpression, Bold], \\\". If \ -omitted, the indices will be in the same order as they appear in \\\", \ -Style[RHSExpression, Bold], \\\". If \\\", Style[LHSTensorID, Bold], \\\" is \ -omitted, then \\\", Style[LHSIndices, Bold], \\\" must be omitted as \ -well.\\\\n\\\", Style[symbol, Bold], \\\" specifies the symbol to use for the \ -result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ -\"]]]]\\)\"\>", "InformationUsageText", +\\\\\\\"Result\\\\\\\" will be used.\\\\n\\\", Style[\\\"targetIndices\\\", \ +Bold], \\\" specifies the order of indices of the resulting tensor. The \ +indices must be a permutation of the free indices of \\\", \ +Style[\\\"formula\\\", Bold], \\\". If omitted, the indices are assumed to be \ +in the same order as they appear in \\\", Style[\\\"formula\\\", Bold], \\\".\ +\\\\n\\\", Style[\\\"symbol\\\", Bold], \\\" specifies the symbol to use for \ +the resulting tensor. If omitted, the placeholder symbol \\\\[DottedSquare] \ +will be used.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -14240,6 +14228,15 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ "OGRe`Private`useCoords", ",", "OGRe`Private`useIndices"}], "}"}], ",", RowBox[{ + RowBox[{"If", "[", + RowBox[{ + + RowBox[{"OGRe`Private`LHSTensorID", "=!=", + "OGRe`Private`DefaultResultID"}], ",", + RowBox[{ + + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + "OGRe`Private`LHSTensorID", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`leafCount", "=", RowBox[{"LeafCount", "[", "OGRe`Private`RHSExpression", @@ -14260,7 +14257,6 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ "]"}], "]"}]}], ",", RowBox[{ RowBox[{ - RowBox[{"OGRe`Private`firstID_String", "[", "OGRe`Private`firstIndices_String", "]"}], "+", @@ -14280,6 +14276,7 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ ",", RowBox[{ RowBox[{"OGRe`Private`scalar_", " ", + RowBox[{"OGRe`Private`ID_String", "[", "OGRe`Private`indices_String", "]"}]}], "\[RuleDelayed]", RowBox[{"OGRe`Private`TensorByScalar", "[", @@ -14392,7 +14389,6 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ "1", "\[RightDoubleBracket]"}]}], ";", RowBox[{"OGRe`Private`useIndices", "=", RowBox[{ - RowBox[{"OGRe`Private`TensorData", "[", "OGRe`Private`resultID", "]"}], "[", "\"DefaultIndices\"", "]"}]}], ";", @@ -14414,6 +14410,7 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ RowBox[{"OGRe`Private`useIndices", ",", "OGRe`Private`useCoords"}], "}"}], "]"}]}], ";", RowBox[{"OGRe`Private`components", "=", + RowBox[{"OGRe`Private`TensorSimplify", "[", "OGRe`Private`components", "]"}]}], ";", RowBox[{"If", "[", @@ -14547,6 +14544,7 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ RowBox[{"OGRe`Private`newIndices", ",", "OGRe`Private`useCoords"}], "}"}], "\[Rule]", "OGRe`Private`newComponents"}], "]"}]}], ",", + RowBox[{"\"DefaultCoords\"", "\[Rule]", "OGRe`Private`useCoords"}], ",", @@ -14642,6 +14640,7 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpener"]], True-> + DynamicBox[FEPrivate`FrontEndResource[ "FEBitmaps", "UpPointerOpenerHot"]]}, Dynamic[ System`InformationDump`mouseOver$$]], @@ -14692,53 +14691,46 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ ItemBox[ PaneBox[ - StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TCalc\ -\\\", \\\"[\\\", StyleBox[Cell[BoxData[RowBox[List[\\\"LHSTensorID\\\", \\\"[\ -\\\", \\\"LHSIndices\\\", \\\"]\\\"]]]], Bold, Rule[StripOnInput, False]], \ -StyleBox[\\\", \\\", Bold, Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\ -\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, False]], StyleBox[\\\", \ -\\\", Bold, Rule[StripOnInput, False]], \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"] \\\", \\\"calculates a tensor formula.\\\\n\\\", StyleBox[Cell[BoxData[\ -\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, False]], \\\" may include \ -any number of tensors in the format \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"[\\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\"], where \\\", StyleBox[Cell[BoxData[\\\"ID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" is a tensor object and \\\", \ -StyleBox[Cell[BoxData[\\\"indices\\\"]], Bold, Rule[StripOnInput, False]], \\\ -\" is a string representing the order of indices, along with any combination \ -of the following operations:\\\\n\\\\[Bullet] Addition: For example, \ -\\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ + StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"TCalc[\ +\\\", StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\"] \ +calculates a tensor \\\", StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, \ +False]], \\\", which may involve any number of tensors in the format \\\", \ +StyleBox[\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\"[\\\", StyleBox[\\\ +\"indices\\\", Bold, Rule[StripOnInput, False]], \\\"], where \\\", StyleBox[\ +\\\"ID\\\", Bold, Rule[StripOnInput, False]], \\\" is a tensor object and \ +\\\", StyleBox[\\\"indices\\\", Bold, Rule[StripOnInput, False]], \\\" is a \ +string representing the order of indices, along with any combination of the \ +following operations:\\\\n\\\\[Bullet] Addition: For example, \\\\\\\"A\\\\\\\ +\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Contraction: For example, \ \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Lambda]\\\\\\\"] . \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Lambda]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Multiplication by scalar: For example, 2 * \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\ -\\\\[Nu]\\\\\\\"].\\\\n\\\", StyleBox[Cell[BoxData[\\\"LHSTensorID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\" specifies the ID of the tensor object \ -in which to store the result. If omitted, the ID \\\\\\\"Result\\\\\\\" will \ -be used.\\\\n\\\", StyleBox[Cell[BoxData[\\\"LHSIndices\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" specifies the order of indices of the \ -resulting tensor. The indices must be a permutation of the free indices of \\\ -\", StyleBox[Cell[BoxData[\\\"RHSExpression\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\". If omitted, the indices will be in the same order as they \ -appear in \\\", StyleBox[Cell[BoxData[\\\"RHSExpression\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\". If \\\", \ -StyleBox[Cell[BoxData[\\\"LHSTensorID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" is omitted, then \\\", \ -StyleBox[Cell[BoxData[\\\"LHSIndices\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" must be omitted as well.\\\\n\\\", \ -StyleBox[Cell[BoxData[\\\"symbol\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" specifies the symbol to use for the result. If omitted, the placeholder \ -symbol \\\\[DottedSquare] will be used.\\\"}]], TextCell[Row[List[\\\"TCalc\\\ -\", \\\"[\\\", Style[LHSTensorID[LHSIndices], Bold], Style[\\\", \\\", Bold], \ -Style[RHSExpression, Bold], Style[\\\", \\\", Bold], Style[symbol, Bold], \ -\\\"] \\\", \\\"calculates a tensor formula.\\\\n\\\", Style[RHSExpression, \ -Bold], \\\" may include any number of tensors in the format \\\", Style[ID, \ -Bold], \\\"[\\\", Style[indices, Bold], \\\"], where \\\", Style[ID, Bold], \ -\\\" is a tensor object and \\\", Style[indices, Bold], \\\" is a string \ -representing the order of indices, along with any combination of the \ +\\\\[Nu]\\\\\\\"].\\\\nTCalc[\\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"[\\\", StyleBox[\\\"targetIndices\\\", Bold, \ +Rule[StripOnInput, False]], \\\"], \\\", StyleBox[\\\"formula\\\", Bold, \ +Rule[StripOnInput, False]], \\\", \\\", StyleBox[\\\"symbol\\\", Bold, \ +Rule[StripOnInput, False]], \\\"] calculates a tensor \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object.\\\\n\\\", StyleBox[\\\"targetID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" specifies the ID of the tensor object in \ +which to store the result. If omitted, the ID \\\\\\\"Result\\\\\\\" will be \ +used.\\\\n\\\", StyleBox[\\\"targetIndices\\\", Bold, Rule[StripOnInput, \ +False]], \\\" specifies the order of indices of the resulting tensor. The \ +indices must be a permutation of the free indices of \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\". If omitted, \ +the indices are assumed to be in the same order as they appear in \\\", \ +StyleBox[\\\"formula\\\", Bold, Rule[StripOnInput, False]], \\\".\\\\n\\\", \ +StyleBox[\\\"symbol\\\", Bold, Rule[StripOnInput, False]], \\\" specifies the \ +symbol to use for the resulting tensor. If omitted, the placeholder symbol \\\ +\\[DottedSquare] will be used.\\\"}]], TextCell[Row[List[\\\"TCalc[\\\", \ +Style[\\\"formula\\\", Bold], \\\"] calculates a tensor \\\", \ +Style[\\\"formula\\\", Bold], \\\", which may involve any number of tensors \ +in the format \\\", Style[\\\"ID\\\", Bold], \\\"[\\\", \ +Style[\\\"indices\\\", Bold], \\\"], where \\\", Style[\\\"ID\\\", Bold], \ +\\\" is a tensor object and \\\", Style[\\\"indices\\\", Bold], \\\" is a \ +string representing the order of indices, along with any combination of the \ following operations:\\\\n\\\\[Bullet] Addition: For example, \\\\\\\"A\\\\\\\ \"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"] + \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ @@ -14746,17 +14738,20 @@ Contraction: For example, \ \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\\\\[Lambda]\\\\\\\"] . \ \\\\\\\"B\\\\\\\"[\\\\\\\"\\\\[Lambda]\\\\[Nu]\\\\\\\"].\\\\n\\\\[Bullet] \ Multiplication by scalar: For example, 2 * \\\\\\\"A\\\\\\\"[\\\\\\\"\\\\[Mu]\ -\\\\[Nu]\\\\\\\"].\\\\n\\\", Style[LHSTensorID, Bold], \\\" specifies the ID \ +\\\\[Nu]\\\\\\\"].\\\\nTCalc[\\\", Style[\\\"targetID\\\", Bold], \\\"[\\\", \ +Style[\\\"targetIndices\\\", Bold], \\\"], \\\", Style[\\\"formula\\\", \ +Bold], \\\", \\\", Style[\\\"symbol\\\", Bold], \\\"] calculates a tensor \ +\\\", Style[\\\"formula\\\", Bold], \\\" and stores the result in a new \ +tensor object.\\\\n\\\", Style[\\\"targetID\\\", Bold], \\\" specifies the ID \ of the tensor object in which to store the result. If omitted, the ID \ -\\\\\\\"Result\\\\\\\" will be used.\\\\n\\\", Style[LHSIndices, Bold], \\\" \ -specifies the order of indices of the resulting tensor. The indices must be a \ -permutation of the free indices of \\\", Style[RHSExpression, Bold], \\\". If \ -omitted, the indices will be in the same order as they appear in \\\", \ -Style[RHSExpression, Bold], \\\". If \\\", Style[LHSTensorID, Bold], \\\" is \ -omitted, then \\\", Style[LHSIndices, Bold], \\\" must be omitted as \ -well.\\\\n\\\", Style[symbol, Bold], \\\" specifies the symbol to use for the \ -result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ -\"]]]]\\)\"\>", "InformationUsageText", +\\\\\\\"Result\\\\\\\" will be used.\\\\n\\\", Style[\\\"targetIndices\\\", \ +Bold], \\\" specifies the order of indices of the resulting tensor. The \ +indices must be a permutation of the free indices of \\\", \ +Style[\\\"formula\\\", Bold], \\\". If omitted, the indices are assumed to be \ +in the same order as they appear in \\\", Style[\\\"formula\\\", Bold], \\\".\ +\\\\n\\\", Style[\\\"symbol\\\", Bold], \\\" specifies the symbol to use for \ +the resulting tensor. If omitted, the placeholder symbol \\\\[DottedSquare] \ +will be used.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -14820,63 +14815,62 @@ result. If omitted, the placeholder symbol \\\\[DottedSquare] will be used.\\\ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TCalc\", \"[\", \ -StyleBox[Cell[BoxData[RowBox[List[\"LHSTensorID\", \"[\", \"LHSIndices\", \"]\ -\"]]]], Bold, Rule[StripOnInput, False]], StyleBox[\", \", Bold, \ -Rule[StripOnInput, False]], StyleBox[Cell[BoxData[\"RHSExpression\"]], Bold, \ -Rule[StripOnInput, False]], StyleBox[\", \", Bold, Rule[StripOnInput, \ -False]], StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, \ -False]], \"] \", \"calculates a tensor formula.\\n\", \ -StyleBox[Cell[BoxData[\"RHSExpression\"]], Bold, Rule[StripOnInput, False]], \ -\" may include any number of tensors in the format \", StyleBox[Cell[BoxData[\ -\"ID\"]], Bold, Rule[StripOnInput, False]], \"[\", \ -StyleBox[Cell[BoxData[\"indices\"]], Bold, Rule[StripOnInput, False]], \"], \ -where \", StyleBox[Cell[BoxData[\"ID\"]], Bold, Rule[StripOnInput, False]], \ -\" is a tensor object and \", StyleBox[Cell[BoxData[\"indices\"]], Bold, \ -Rule[StripOnInput, False]], \" is a string representing the order of indices, \ -along with any combination of the following operations:\\n\\[Bullet] \ -Addition: For example, \\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"] + \\\"B\\\"[\\\"\\[Mu]\ -\\[Nu]\\\"].\\n\\[Bullet] Contraction: For example, \ -\\\"A\\\"[\\\"\\[Mu]\\[Lambda]\\\"] . \\\"B\\\"[\\\"\\[Lambda]\\[Nu]\\\"].\\n\ -\\[Bullet] Multiplication by scalar: For example, 2 * \ -\\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\n\", \ -StyleBox[Cell[BoxData[\"LHSTensorID\"]], Bold, Rule[StripOnInput, False]], \" \ -specifies the ID of the tensor object in which to store the result. If \ -omitted, the ID \\\"Result\\\" will be used.\\n\", \ -StyleBox[Cell[BoxData[\"LHSIndices\"]], Bold, Rule[StripOnInput, False]], \" \ -specifies the order of indices of the resulting tensor. The indices must be a \ -permutation of the free indices of \", \ -StyleBox[Cell[BoxData[\"RHSExpression\"]], Bold, Rule[StripOnInput, False]], \ -\". If omitted, the indices will be in the same order as they appear in \", \ -StyleBox[Cell[BoxData[\"RHSExpression\"]], Bold, Rule[StripOnInput, False]], \ -\". If \", StyleBox[Cell[BoxData[\"LHSTensorID\"]], Bold, Rule[StripOnInput, \ -False]], \" is omitted, then \", StyleBox[Cell[BoxData[\"LHSIndices\"]], \ -Bold, Rule[StripOnInput, False]], \" must be omitted as well.\\n\", \ -StyleBox[Cell[BoxData[\"symbol\"]], Bold, Rule[StripOnInput, False]], \" \ -specifies the symbol to use for the result. If omitted, the placeholder \ -symbol \\[DottedSquare] will be used.\"}]], TextCell[Row[List[\"TCalc\", \ -\"[\", Style[LHSTensorID[LHSIndices], Bold], Style[\", \", Bold], \ -Style[RHSExpression, Bold], Style[\", \", Bold], Style[symbol, Bold], \"] \", \ -\"calculates a tensor formula.\\n\", Style[RHSExpression, Bold], \" may \ -include any number of tensors in the format \", Style[ID, Bold], \"[\", \ -Style[indices, Bold], \"], where \", Style[ID, Bold], \" is a tensor object \ -and \", Style[indices, Bold], \" is a string representing the order of \ -indices, along with any combination of the following operations:\\n\\[Bullet] \ -Addition: For example, \\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"] + \\\"B\\\"[\\\"\\[Mu]\ -\\[Nu]\\\"].\\n\\[Bullet] Contraction: For example, \ -\\\"A\\\"[\\\"\\[Mu]\\[Lambda]\\\"] . \\\"B\\\"[\\\"\\[Lambda]\\[Nu]\\\"].\\n\ -\\[Bullet] Multiplication by scalar: For example, 2 * \ -\\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\n\", Style[LHSTensorID, Bold], \" specifies \ -the ID of the tensor object in which to store the result. If omitted, the ID \ -\\\"Result\\\" will be used.\\n\", Style[LHSIndices, Bold], \" specifies the \ -order of indices of the resulting tensor. The indices must be a permutation \ -of the free indices of \", Style[RHSExpression, Bold], \". If omitted, the \ -indices will be in the same order as they appear in \", Style[RHSExpression, \ -Bold], \". If \", Style[LHSTensorID, Bold], \" is omitted, then \", \ -Style[LHSIndices, Bold], \" must be omitted as well.\\n\", Style[symbol, \ -Bold], \" specifies the symbol to use for the result. If omitted, the \ -placeholder symbol \\[DottedSquare] will be used.\"]]]]\)", "Documentation" -> - None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalc[\", StyleBox[\"formula\", \ +Bold, Rule[StripOnInput, False]], \"] calculates a tensor \", \ +StyleBox[\"formula\", Bold, Rule[StripOnInput, False]], \", which may involve \ +any number of tensors in the format \", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \"[\", StyleBox[\"indices\", Bold, \ +Rule[StripOnInput, False]], \"], where \", StyleBox[\"ID\", Bold, \ +Rule[StripOnInput, False]], \" is a tensor object and \", \ +StyleBox[\"indices\", Bold, Rule[StripOnInput, False]], \" is a string \ +representing the order of indices, along with any combination of the \ +following operations:\\n\\[Bullet] Addition: For example, \ +\\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"] + \ +\\\"B\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\n\\[Bullet] Contraction: For example, \\\"A\ +\\\"[\\\"\\[Mu]\\[Lambda]\\\"] . \ +\\\"B\\\"[\\\"\\[Lambda]\\[Nu]\\\"].\\n\\[Bullet] Multiplication by scalar: \ +For example, 2 * \\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\nTCalc[\", \ +StyleBox[\"targetID\", Bold, Rule[StripOnInput, False]], \"[\", \ +StyleBox[\"targetIndices\", Bold, Rule[StripOnInput, False]], \"], \", \ +StyleBox[\"formula\", Bold, Rule[StripOnInput, False]], \", \", \ +StyleBox[\"symbol\", Bold, Rule[StripOnInput, False]], \"] calculates a \ +tensor \", StyleBox[\"formula\", Bold, Rule[StripOnInput, False]], \" and \ +stores the result in a new tensor object.\\n\", StyleBox[\"targetID\", Bold, \ +Rule[StripOnInput, False]], \" specifies the ID of the tensor object in which \ +to store the result. If omitted, the ID \\\"Result\\\" will be used.\\n\", \ +StyleBox[\"targetIndices\", Bold, Rule[StripOnInput, False]], \" specifies \ +the order of indices of the resulting tensor. The indices must be a \ +permutation of the free indices of \", StyleBox[\"formula\", Bold, \ +Rule[StripOnInput, False]], \". If omitted, the indices are assumed to be in \ +the same order as they appear in \", StyleBox[\"formula\", Bold, \ +Rule[StripOnInput, False]], \".\\n\", StyleBox[\"symbol\", Bold, \ +Rule[StripOnInput, False]], \" specifies the symbol to use for the resulting \ +tensor. If omitted, the placeholder symbol \\[DottedSquare] will be \ +used.\"}]], TextCell[Row[List[\"TCalc[\", Style[\"formula\", Bold], \"] \ +calculates a tensor \", Style[\"formula\", Bold], \", which may involve any \ +number of tensors in the format \", Style[\"ID\", Bold], \"[\", \ +Style[\"indices\", Bold], \"], where \", Style[\"ID\", Bold], \" is a tensor \ +object and \", Style[\"indices\", Bold], \" is a string representing the \ +order of indices, along with any combination of the following \ +operations:\\n\\[Bullet] Addition: For example, \ +\\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"] + \ +\\\"B\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\n\\[Bullet] Contraction: For example, \\\"A\ +\\\"[\\\"\\[Mu]\\[Lambda]\\\"] . \ +\\\"B\\\"[\\\"\\[Lambda]\\[Nu]\\\"].\\n\\[Bullet] Multiplication by scalar: \ +For example, 2 * \\\"A\\\"[\\\"\\[Mu]\\[Nu]\\\"].\\nTCalc[\", \ +Style[\"targetID\", Bold], \"[\", Style[\"targetIndices\", Bold], \"], \", \ +Style[\"formula\", Bold], \", \", Style[\"symbol\", Bold], \"] calculates a \ +tensor \", Style[\"formula\", Bold], \" and stores the result in a new tensor \ +object.\\n\", Style[\"targetID\", Bold], \" specifies the ID of the tensor \ +object in which to store the result. If omitted, the ID \\\"Result\\\" will \ +be used.\\n\", Style[\"targetIndices\", Bold], \" specifies the order of \ +indices of the resulting tensor. The indices must be a permutation of the \ +free indices of \", Style[\"formula\", Bold], \". If omitted, the indices are \ +assumed to be in the same order as they appear in \", Style[\"formula\", \ +Bold], \".\\n\", Style[\"symbol\", Bold], \" specifies the symbol to use for \ +the resulting tensor. If omitted, the placeholder symbol \\[DottedSquare] \ +will be used.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "UpValues" -> None, "DownValues" -> Information`InformationValueForm[DownValues, OGRe`TCalc, {OGRe`TCalc[ Pattern[OGRe`Private`RHSExpression, Blank[]], @@ -14910,6 +14904,8 @@ placeholder symbol \\[DottedSquare] will be used.\"]]]]\)", "Documentation" -> OGRe`Private`resultIndices, OGRe`Private`RHSVars, OGRe`Private`rules, OGRe`Private`useCoords, OGRe`Private`useIndices}, + If[OGRe`Private`LHSTensorID =!= OGRe`Private`DefaultResultID, + OGRe`Private`CheckIfOverwriting[OGRe`Private`LHSTensorID]; Null]; OGRe`Private`leafCount = LeafCount[OGRe`Private`RHSExpression]; OGRe`Private`rules = {Pattern[OGRe`Private`ID, Blank[String]][ @@ -15043,13 +15039,13 @@ placeholder symbol \\[DottedSquare] will be used.\"]]]]\)", "Documentation" -> OGRe`Private`useCoords, "DefaultIndices" -> OGRe`Private`newIndices, "Metric" -> OGRe`Private`TensorData[OGRe`Private`resultID]["Metric"], - "Role" -> "Calculated", "Symbol" -> OGRe`Private`symbol]]; - Null]; OGRe`Private`ClearTemp[]; Return[OGRe`Private`LHSTensorID]; + "Role" -> "Calculated", "Symbol" -> OGRe`Private`symbol]]; Null] + ; OGRe`Private`ClearTemp[]; Return[OGRe`Private`LHSTensorID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TCalc"], False]]], "Output", - CellLabel->"Out[81]=",ExpressionUUID->"c876fc03-fd39-4e1f-84ba-47e502493c10"] + CellLabel->"Out[81]=",ExpressionUUID->"9833184a-108b-49d0-9015-73aa6d7c4117"] }, Open ]], Cell[TextData[{ @@ -15257,7 +15253,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"ee413819-6636-47e1-b6e3-6db1bfafc8d0"] + CellLabel->"OGRe:",ExpressionUUID->"dde079af-31ec-46b5-97fc-642f52b684e0"] }, Open ]], Cell[TextData[{ @@ -15307,7 +15303,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"8c2f2fcd-4811-4871-bf8f-3ae420c48a51"] + CellLabel->"OGRe:",ExpressionUUID->"c6346020-1985-46a5-a2eb-2f579e0550ee"] }, Open ]], Cell["\<\ @@ -15372,7 +15368,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"87259336-c1fe-4502-8fbc-1b34202678ae"] + CellLabel->"OGRe:",ExpressionUUID->"1136de47-9496-45a4-a53d-97c51715f66b"] }, Open ]], Cell["\<\ @@ -15436,7 +15432,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"c656e680-2749-4c05-8f5e-f123bcb3c6a7"] + CellLabel->"OGRe:",ExpressionUUID->"3acb6dc4-dbe1-43bc-95e1-e309bfc1f99d"] }, Open ]], Cell["If we add it to the Minkowski metric, we get:", \ @@ -15491,7 +15487,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"684bcc7e-c3e1-47c9-8fe2-cb24cc5f6abc"] + CellLabel->"OGRe:",ExpressionUUID->"b88b4535-e7b6-4378-bad8-894f06f7c4dc"] }, Open ]], Cell[TextData[{ @@ -15553,7 +15549,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"33eae51d-9b1a-4de5-91ca-e50250eb3326"] + CellLabel->"OGRe:",ExpressionUUID->"9fb9a273-8592-45b2-b6bc-c9b1b7171ba2"] }, Open ]], Cell[TextData[{ @@ -15616,7 +15612,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"e8b33ae9-fb90-4e0b-985c-d106f890e0e6"] + CellLabel->"OGRe:",ExpressionUUID->"7640ccd8-38c8-4e94-a56c-a8b96089b045"] }, Open ]], Cell[TextData[{ @@ -15728,7 +15724,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"07816598-57c6-416b-b2e6-e26b57acd557"] + CellLabel->"OGRe:",ExpressionUUID->"02591f13-bb17-45dc-ae43-f1c1bf9ffd40"] }, Open ]] }, Open ]], @@ -15818,7 +15814,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"fa4f2d9f-2b4d-4d32-875f-55cea12444f7"] + CellLabel->"OGRe:",ExpressionUUID->"60259208-8532-4226-8948-f5d772db531c"] }, Open ]], Cell["\<\ @@ -15903,7 +15899,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"a88ae859-e3c0-4ae8-bc88-015aac91b9f4"] + CellLabel->"OGRe:",ExpressionUUID->"70d0f329-4340-482d-b68c-e37bd50bafb0"] }, Open ]] }, Open ]], @@ -16264,7 +16260,7 @@ Cell[BoxData[ RowBox[{" ", RowBox[{"TShow", "@", RowBox[{"TCalc", "[", - RowBox[{"\"\\"", ",", + RowBox[{"\"\\"", ",", RowBox[{ RowBox[{ RowBox[{"(", @@ -16279,7 +16275,7 @@ Cell[BoxData[ Cell[BoxData[ StyleBox[ - TemplateBox[{"\"PerfectFluid\"", "\": \"", + TemplateBox[{"\"PerfectFluidFromVelocity\"", "\": \"", TemplateBox[{"\"T\"", TemplateBox[{"\"\[Mu]\"", "\"\[Nu]\""}, "RowDefault"], TemplateBox[{ @@ -16328,7 +16324,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"5967f292-554e-4b23-8367-faa7dc3b2ae4"] + CellLabel->"OGRe:",ExpressionUUID->"538ae27a-1007-495d-aa25-902196c7ef0f"] }, Open ]], Cell[TextData[{ @@ -16344,14 +16340,14 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TShow", "[", - RowBox[{"\"\\"", ",", + RowBox[{"\"\\"", ",", RowBox[{"ReplaceAll", "[", RowBox[{"v", "\[Rule]", "0"}], "]"}]}], "]"}]], "Input", CellLabel->"In[94]:=",ExpressionUUID->"4ff9f367-164f-40d4-84c5-c21bca734706"], Cell[BoxData[ StyleBox[ - TemplateBox[{"\"PerfectFluid\"", "\": \"", + TemplateBox[{"\"PerfectFluidFromVelocity\"", "\": \"", TemplateBox[{"\"T\"", TemplateBox[{"\"\[Mu]\"", "\"\[Nu]\""}, "RowDefault"], TemplateBox[{ @@ -16374,7 +16370,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"68fc8cc8-ab50-4850-86e9-b37aa30b832c"] + CellLabel->"OGRe:",ExpressionUUID->"b3c32694-0861-420b-b21e-f060981d0a65"] }, Open ]], Cell[TextData[{ @@ -16442,7 +16438,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"54577217-9b88-412c-85e6-7ecd5d765bcd"] + CellLabel->"OGRe:",ExpressionUUID->"3d2d99c4-3e5b-464f-afe0-8cb9ba4353b1"] }, Open ]], Cell[TextData[{ @@ -16479,7 +16475,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"75fce74f-1c15-49ae-9c20-b5a841f2ec14"] + CellLabel->"OGRe:",ExpressionUUID->"a3a8168b-0318-4072-bd6e-7bb19ea594af"] }, Open ]], Cell["\<\ @@ -16514,7 +16510,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"854f6233-7731-4a39-b266-96c8f87cfa70"] + CellLabel->"OGRe:",ExpressionUUID->"34776723-cca2-4a9a-8790-7f62dc913628"] }, Open ]], Cell[TextData[{ @@ -16531,7 +16527,8 @@ Cell[BoxData[ RowBox[{"TCalc", "[", RowBox[{ RowBox[{"\"\<4-Velocity\>\"", "[", "\"\<\[Mu]\>\"", "]"}], ".", - RowBox[{"\"\\"", "[", "\"\<\[Mu]\[Nu]\>\"", "]"}], ".", + RowBox[{ + "\"\\"", "[", "\"\<\[Mu]\[Nu]\>\"", "]"}], ".", RowBox[{"\"\\"", "[", "\"\<\[Nu]\[Rho]\>\"", "]"}]}], "]"}]}]], "Input", CellLabel->"In[98]:=",ExpressionUUID->"f4073cb3-9649-4620-a79a-9cdedd6ec403"], @@ -16565,7 +16562,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"4990f91b-dc96-4fe8-bba6-a47f184d08d6"] + CellLabel->"OGRe:",ExpressionUUID->"866af193-1ac9-40c4-8c53-3379fdb5affb"] }, Open ]], Cell["\<\ @@ -16596,7 +16593,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"aa95d855-ff4c-4363-95dd-f8a4a54f0671"] + CellLabel->"OGRe:",ExpressionUUID->"372f6b56-a8f3-41c3-b429-250c5573f6fe"] }, Open ]], Cell[CellGroupData[{ @@ -16604,7 +16601,8 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TShow", "@", RowBox[{"TCalc", "[", - RowBox[{"\"\\"", "[", "\"\<\[Mu]\[Mu]\>\"", "]"}], + RowBox[{ + "\"\\"", "[", "\"\<\[Mu]\[Mu]\>\"", "]"}], "]"}]}]], "Input", CellLabel-> "In[100]:=",ExpressionUUID->"6129acee-fbe9-4e1d-8a27-f2692f61e160"], @@ -16625,7 +16623,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"d795b2e7-516a-49c4-be1a-e0412fb8a04d"] + CellLabel->"OGRe:",ExpressionUUID->"aab9bcc8-4846-4921-aa7a-7620a38e3a66"] }, Open ]], Cell["\<\ @@ -16689,12 +16687,12 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TPartialD\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"index\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"represents the partial derivative \ -when used in a tensor expression given to TCalc[ ].\\\"}]], \ -TextCell[Row[List[\\\"TPartialD\\\", \\\"[\\\", Style[index, Bold], \\\"] \ -\\\", \\\"represents the partial derivative when used in a tensor expression \ -given to TCalc[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TPartialD[\\\", StyleBox[\\\"index\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] represents the partial derivative when used in a tensor expression \ +given to TCalc[].\\\"}]], TextCell[Row[List[\\\"TPartialD[\\\", \ +Style[\\\"index\\\", Bold], \\\"] represents the partial derivative when used \ +in a tensor expression given to TCalc[].\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -16818,12 +16816,12 @@ given to TCalc[ ].\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TPartialD\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"index\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"represents the partial derivative \ -when used in a tensor expression given to TCalc[ ].\\\"}]], \ -TextCell[Row[List[\\\"TPartialD\\\", \\\"[\\\", Style[index, Bold], \\\"] \ -\\\", \\\"represents the partial derivative when used in a tensor expression \ -given to TCalc[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TPartialD[\\\", StyleBox[\\\"index\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] represents the partial derivative when used in a tensor expression \ +given to TCalc[].\\\"}]], TextCell[Row[List[\\\"TPartialD[\\\", \ +Style[\\\"index\\\", Bold], \\\"] represents the partial derivative when used \ +in a tensor expression given to TCalc[].\\\"]]]]\\)\"\>", + "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -16887,17 +16885,17 @@ given to TCalc[ ].\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TPartialD\", \"[\", \ -StyleBox[Cell[BoxData[\"index\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"represents the partial derivative when used in a tensor expression given to \ -TCalc[ ].\"}]], TextCell[Row[List[\"TPartialD\", \"[\", Style[index, Bold], \ -\"] \", \"represents the partial derivative when used in a tensor expression \ -given to TCalc[ ].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, - "UpValues" -> None, "DownValues" -> None, "SubValues" -> None, - "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, - "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TPartialD"], False]]], "Output", - CellLabel->"Out[101]=",ExpressionUUID->"4e2fdb3c-9a73-4d8c-9a47-bdae07e42c49"] + "\!\(\*InterpretationBox[Cell[TextData[{\"TPartialD[\", \ +StyleBox[\"index\", Bold, Rule[StripOnInput, False]], \"] represents the \ +partial derivative when used in a tensor expression given to TCalc[].\"}]], \ +TextCell[Row[List[\"TPartialD[\", Style[\"index\", Bold], \"] represents the \ +partial derivative when used in a tensor expression given to \ +TCalc[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> + None, "DownValues" -> None, "SubValues" -> None, "DefaultValues" -> None, + "NValues" -> None, "FormatValues" -> None, "Options" -> None, + "Attributes" -> {Protected}, "FullName" -> "OGRe`TPartialD"], + False]]], "Output", + CellLabel->"Out[101]=",ExpressionUUID->"845cdded-d1ff-4b1b-bacd-35323ef000c0"] }, Open ]], Cell[TextData[{ @@ -16980,7 +16978,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"19691510-7562-4b8e-bdd2-ce098451f397"] + CellLabel->"OGRe:",ExpressionUUID->"b4edd576-cbb1-466f-bd93-1337a96dac37"] }, Open ]], Cell[TextData[{ @@ -17045,7 +17043,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"923662e0-41e7-49d9-a68c-155c8f0eefdf"] + CellLabel->"OGRe:",ExpressionUUID->"192a328f-ccad-41e2-8eda-149157d8e855"] }, Open ]], Cell[TextData[{ @@ -17437,7 +17435,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"69404472-0b3a-4e0e-875a-15a30b39abdf"] + CellLabel->"OGRe:",ExpressionUUID->"8d835add-6020-4446-8d99-308a7cdcdc17"] }, Open ]], Cell[TextData[{ @@ -17523,16 +17521,15 @@ manually above using ", " ", StyleBox["must not be used", FontWeight->"Bold"], - ". Instead, we should use the built-in module ", - StyleBox["TChristoffel", "Input"], - ", which not only performs the calculation automatically for us, but also \ -marks the result as a special object with special transformation properties:" + ". Instead, we should use the built-in module TCalcChristoffel, which not \ +only performs the calculation automatically for us, but also marks the result \ +as a special object with special transformation properties:" }], "Text",ExpressionUUID->"b6e18bdf-ac47-437d-a985-10004b5ce801"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TChristoffel"}]], "Input", + RowBox[{"?", "TCalcChristoffel"}]], "Input", CellLabel-> "In[105]:=",ExpressionUUID->"c7332172-ab07-4cd5-8c9d-3e73c9dda0dc"], @@ -17561,31 +17558,22 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChristoffel\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Christoffel \ -symbols (the coefficients of the Levi-Civita connection) from the metric \ -\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" and stores the result in a new tensor object with ID \\\\\\\"\\\ -\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"Christoffel\\\\\\\".\\\\nNote that the connection is not a \ -tensor, and does not transform like a tensor when changing coordinates. \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" will be a special tensor \ -object which transforms according to the appropriate rules. Therefore, one \ -should only calculate the Christoffel symbols using this module. A manual \ -calculation with TCalc[ ] will result in a tensor object with the wrong \ -transformation rules.\\\"}]], TextCell[Row[List[\\\"TChristoffel\\\", \\\"[\\\ -\", Style[metricID, Bold], \\\"] \\\", \\\"calculates the Christoffel symbols \ -(the coefficients of the Levi-Civita connection) from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\".\\\\nNote \ -that the connection is not a tensor, and does not transform like a tensor \ -when changing coordinates. \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"Christoffel\\\\\\\" will be a special tensor object which transforms \ -according to the appropriate rules. Therefore, one should only calculate the \ -Christoffel symbols using this module. A manual calculation with TCalc[ ] \ -will result in a tensor object with the wrong transformation \ -rules.\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcChristoffel[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Christoffel symbols (the coefficients of the \ +Levi-Civita connection) from the metric \\\", StyleBox[\\\"metricID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\". Note that the \ +Christoffel symbols are not the components of a tensor, but this tensor \ +object will know to transform according to the correct rules under change of \ +coordinates.\\\"}]], TextCell[Row[List[\\\"TCalcChristoffel[\\\", \ +Style[\\\"metricID\\\", Bold], \\\"] calculates the Christoffel symbols (the \ +coefficients of the Levi-Civita connection) from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\ +\\\\\". Note that the Christoffel symbols are not the components of a tensor, \ +but this tensor object will know to transform according to the correct rules \ +under change of coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -17613,7 +17601,7 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{ - "TChristoffel", "[", "OGRe`Private`metricID_String", + "TCalcChristoffel", "[", "OGRe`Private`metricID_String", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ @@ -17623,6 +17611,10 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"OGRe`Private`NewTempID", "[", "]"}]}]}], "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + + RowBox[{"OGRe`Private`metricID", "<>", + "\"Christoffel\""}], "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -17634,7 +17626,7 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{"Message", "[", StyleBox[ - RowBox[{"TChristoffel", "::", "ErrorNotMetric"}], + RowBox[{"TCalcChristoffel", "::", "ErrorNotMetric"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`SetTensorID", "[", @@ -17749,7 +17741,7 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TChristoffel\"\>"} + "Tooltip"]& ], "\<\"OGRe`TCalcChristoffel\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -17801,6 +17793,7 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], + EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -17838,31 +17831,22 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TChristoffel\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Christoffel \ -symbols (the coefficients of the Levi-Civita connection) from the metric \ -\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\" and stores the result in a new tensor object with ID \\\\\\\"\\\ -\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"Christoffel\\\\\\\".\\\\nNote that the connection is not a \ -tensor, and does not transform like a tensor when changing coordinates. \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" will be a special tensor \ -object which transforms according to the appropriate rules. Therefore, one \ -should only calculate the Christoffel symbols using this module. A manual \ -calculation with TCalc[ ] will result in a tensor object with the wrong \ -transformation rules.\\\"}]], TextCell[Row[List[\\\"TChristoffel\\\", \\\"[\\\ -\", Style[metricID, Bold], \\\"] \\\", \\\"calculates the Christoffel symbols \ -(the coefficients of the Levi-Civita connection) from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\".\\\\nNote \ -that the connection is not a tensor, and does not transform like a tensor \ -when changing coordinates. \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"Christoffel\\\\\\\" will be a special tensor object which transforms \ -according to the appropriate rules. Therefore, one should only calculate the \ -Christoffel symbols using this module. A manual calculation with TCalc[ ] \ -will result in a tensor object with the wrong transformation \ -rules.\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcChristoffel[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Christoffel symbols (the coefficients of the \ +Levi-Civita connection) from the metric \\\", StyleBox[\\\"metricID\\\", \ +Bold, Rule[StripOnInput, False]], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\". Note that the \ +Christoffel symbols are not the components of a tensor, but this tensor \ +object will know to transform according to the correct rules under change of \ +coordinates.\\\"}]], TextCell[Row[List[\\\"TCalcChristoffel[\\\", \ +Style[\\\"metricID\\\", Bold], \\\"] calculates the Christoffel symbols (the \ +coefficients of the Levi-Civita connection) from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\ +\\\\\". Note that the Christoffel symbols are not the components of a tensor, \ +but this tensor object will know to transform according to the correct rules \ +under change of coordinates.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -17895,7 +17879,6 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], - EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -17926,40 +17909,33 @@ rules.\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TChristoffel\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"calculates the Christoffel symbols (the coefficients of the Levi-Civita \ -connection) from the metric \", StyleBox[Cell[BoxData[\"metricID\"]], Bold, \ -Rule[StripOnInput, False]], \" and stores the result in a new tensor object \ -with ID \\\"\", StyleBox[Cell[BoxData[\"metricID\"]], Bold, \ -Rule[StripOnInput, False]], \"Christoffel\\\".\\nNote that the connection is \ -not a tensor, and does not transform like a tensor when changing coordinates. \ -\\\"\", StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, \ -False]], \"Christoffel\\\" will be a special tensor object which transforms \ -according to the appropriate rules. Therefore, one should only calculate the \ -Christoffel symbols using this module. A manual calculation with TCalc[ ] \ -will result in a tensor object with the wrong transformation rules.\"}]], \ -TextCell[Row[List[\"TChristoffel\", \"[\", Style[metricID, Bold], \"] \", \ -\"calculates the Christoffel symbols (the coefficients of the Levi-Civita \ -connection) from the metric \", Style[metricID, Bold], \" and stores the \ -result in a new tensor object with ID \\\"\", Style[metricID, Bold], \ -\"Christoffel\\\".\\nNote that the connection is not a tensor, and does not \ -transform like a tensor when changing coordinates. \\\"\", Style[metricID, \ -Bold], \"Christoffel\\\" will be a special tensor object which transforms \ -according to the appropriate rules. Therefore, one should only calculate the \ -Christoffel symbols using this module. A manual calculation with TCalc[ ] \ -will result in a tensor object with the wrong transformation rules.\"]]]]\)", - "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalcChristoffel[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \"] calculates the \ +Christoffel symbols (the coefficients of the Levi-Civita connection) from the \ +metric \", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \" and \ +stores the result in a new tensor object with ID \\\"\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \"Christoffel\\\". \ +Note that the Christoffel symbols are not the components of a tensor, but \ +this tensor object will know to transform according to the correct rules \ +under change of coordinates.\"}]], TextCell[Row[List[\"TCalcChristoffel[\", \ +Style[\"metricID\", Bold], \"] calculates the Christoffel symbols (the \ +coefficients of the Levi-Civita connection) from the metric \", \ +Style[\"metricID\", Bold], \" and stores the result in a new tensor object \ +with ID \\\"\", Style[\"metricID\", Bold], \"Christoffel\\\". Note that the \ +Christoffel symbols are not the components of a tensor, but this tensor \ +object will know to transform according to the correct rules under change of \ +coordinates.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TChristoffel, {OGRe`TChristoffel[ + DownValues, OGRe`TCalcChristoffel, {OGRe`TCalcChristoffel[ Pattern[OGRe`Private`metricID, Blank[String]]] :> Module[{OGRe`Private`christoffelID, OGRe`Private`inverseMetricID = - OGRe`Private`NewTempID[]}, + OGRe`Private`NewTempID[]}, OGRe`Private`CheckIfOverwriting[ + StringJoin[OGRe`Private`metricID, "Christoffel"]]; If[OGRe`Private`TensorData[OGRe`Private`metricID]["Role"] =!= "Metric", Message[ - MessageName[OGRe`TChristoffel, "ErrorNotMetric"]]; Abort[]; + MessageName[OGRe`TCalcChristoffel, "ErrorNotMetric"]]; Abort[]; Null]; OGRe`Private`SetTensorID[OGRe`Private`inverseMetricID, Association[ "Components" -> @@ -17985,14 +17961,14 @@ will result in a tensor object with the wrong transformation rules.\"]]]]\)", Return[OGRe`Private`christoffelID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TChristoffel"], False]]], "Output", - CellLabel->"Out[105]=",ExpressionUUID->"12b32bcd-49a6-4993-97a9-8d198f11e78a"] + "OGRe`TCalcChristoffel"], False]]], "Output", + CellLabel->"Out[105]=",ExpressionUUID->"1ecfc964-9225-4907-aa05-20b538f04c79"] }, Open ]], Cell[TextData[{ "Let us, then, calculate the Christoffel symbols for the Schwarzschild \ metric properly, using ", - StyleBox["TChristoffel", "Input"], + StyleBox["TCalcChristoffel", "Input"], ":" }], "Text",ExpressionUUID->"4f0ca65d-a91a-4094-bdac-baa83d815c3b"], @@ -18000,7 +17976,7 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TChristoffel", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcChristoffel", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[106]:=",ExpressionUUID->"c79b42c0-c430-4f24-8d49-8df058729312"], @@ -18238,13 +18214,13 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"051a87d2-789b-4846-a644-9464b4640466"] + CellLabel->"OGRe:",ExpressionUUID->"ca5fa3b5-6efb-4f66-aa7f-0ac38dadfa8a"] }, Open ]], Cell[TextData[{ "These are the same components we got before, but now they will transform \ properly. Note that the name of the tensor object created by ", - StyleBox["TChristoffel", "Input"], + StyleBox["TCalcChristoffel", "Input"], " is always the name of metric with the word ", StyleBox["Christoffel", "Input"], " appended to it (no spaces)." @@ -18295,7 +18271,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"df4621c9-d9ff-4c57-8c4c-2fde8adbab9e"] + CellLabel->"OGRe:",ExpressionUUID->"0b8bf730-84a8-4ad7-825b-63fe52ed05cd"] }, Open ]], Cell["\<\ @@ -18406,12 +18382,12 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"0243ecd2-b6ab-4ac0-9923-d31737533739"] + CellLabel->"OGRe:",ExpressionUUID->"7dd1dcc1-a4d4-44e9-8c13-666f5751f0d3"] }, Open ]], Cell[TextData[{ "Then, with the built-in module ", - StyleBox["TChristoffel", "Input"], + StyleBox["TCalcChristoffel", "Input"], ":" }], "Text",ExpressionUUID->"265cdb3f-b9a8-4d0e-9750-853c2f0320e3"], @@ -18419,7 +18395,7 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TChristoffel", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcChristoffel", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[109]:=",ExpressionUUID->"28ddbc50-b29b-490b-a9f6-2be9f2231fb1"], @@ -18491,14 +18467,14 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"402678f3-f2dc-4646-9a92-0ab5bf371803"] + CellLabel->"OGRe:",ExpressionUUID->"b66e40f4-aab2-4be9-8080-7c6f81db1732"] }, Open ]], Cell[TextData[{ "The two results have the same components, as expected. But now, let us now \ transform them to spherical coordinates. First, we transform the tensor \ object obtained using ", - StyleBox["TChristoffel", "Input"], + StyleBox["TCalcChristoffel", "Input"], ":" }], "Text",ExpressionUUID->"10353b33-ce03-499f-bbd3-a2545352ae49"], @@ -18816,7 +18792,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"2b1c686c-4dd1-4258-b4b3-c059bb9d6510"] + CellLabel->"OGRe:",ExpressionUUID->"0d051302-a572-45eb-9861-b51b1d7f05bf"] }, Open ]], Cell[TextData[{ @@ -19010,7 +18986,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"cccb82ad-2b40-4543-9ae2-774f636d7922"] + CellLabel->"OGRe:",ExpressionUUID->"e8671d42-6d6a-4b0c-9d9f-b626211705ab"] }, Open ]], Cell[TextData[{ @@ -19385,7 +19361,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"97477063-897b-40e4-9c3a-647be097df43"] + CellLabel->"OGRe:",ExpressionUUID->"29d031b9-00b4-4443-a723-d01b8b9b4409"] }, Open ]], Cell[TextData[{ @@ -19393,11 +19369,9 @@ Cell[TextData[{ StyleBox["SimpleMetricChristoffel", "Input"], " to spherical coordinates. We have learned an important lesson: since the \ Christoffel symbols do not transform like a tensor, we should always use the \ -built-in module ", - StyleBox["TChristoffel", "Input"], - " to calculate them, which ensures that they transform properly. (Of course, \ -this method is also much more convenient than writing the explicit \ -definition...)" +built-in module TCalcChristoffel to calculate them, which ensures that they \ +transform properly. (Of course, this method is also much more convenient than \ +writing the explicit definition...)" }], "Text",ExpressionUUID->"f1c705f0-9ebc-4420-90fc-55538060e084"], Cell[TextData[{ @@ -19482,7 +19456,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"b6a35233-0bd0-4138-afef-3ab0e5cfbfa4"] + CellLabel->"OGRe:",ExpressionUUID->"08cd5c90-41b6-4a4c-a509-28bd2cb0fb96"] }, Open ]], Cell[TextData[{ @@ -19508,16 +19482,15 @@ Cell[TextData[{ RowBox[{"-", "1"}]}], TraditionalForm]],ExpressionUUID-> "d40a573f-32cb-41db-b4c6-cd5bc7810505"], " corresponding to positively curved, flat, or negatively curved \ -respectively. Its Christoffel symbols can be easily calculated using ", - StyleBox["TChristoffel", "Input"], - ":" +respectively. Its Christoffel symbols can be easily calculated using \ +TCalcChristoffel:" }], "Text",ExpressionUUID->"ea0e15c3-cd66-485b-9ff8-be83f8851e70"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TChristoffel", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcChristoffel", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[116]:=",ExpressionUUID->"5052eaf1-e609-4514-93e2-c513e2b1501b"], @@ -19855,7 +19828,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"3a0db000-2460-47d2-b675-a661c07f493a"] + CellLabel->"OGRe:",ExpressionUUID->"545aaede-8e76-4cfd-bc83-cd34cac3b16b"] }, Open ]] }, Open ]], @@ -20429,7 +20402,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"74339b40-7701-4dcd-b514-9c35a7ac90fc"] + CellLabel->"OGRe:",ExpressionUUID->"6449b512-92b2-4da3-8ee5-005615ac5030"] }, Open ]], Cell["\<\ @@ -20949,21 +20922,21 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"e235d535-6cc1-41db-a3ce-e792ba712c8d"] + CellLabel->"OGRe:",ExpressionUUID->"7b3d1e70-f8f5-4399-8886-f867932e7aa1"] }, Open ]], Cell[TextData[{ "Don\[CloseCurlyQuote]t worry - you don\[CloseCurlyQuote]t need to write the \ explicit definition of the Riemann tensor every time we want to calculate it. \ Instead, OGRe offers the built-in module ", - StyleBox["TRiemannTensor", "Input"], + StyleBox["TCalcRiemannTensor", "Input"], ":" }], "Text",ExpressionUUID->"b5813b05-68ae-48d0-a303-c817877bf40d"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TRiemannTensor"}]], "Input", + RowBox[{"?", "TCalcRiemannTensor"}]], "Input", CellLabel-> "In[119]:=",ExpressionUUID->"ef28a3ac-3173-4de3-b507-046d8a5b4d3d"], @@ -20992,26 +20965,25 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRiemannTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Riemann \ -tensor from the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\".\\\\nIf a tensor with ID \\\\\ -\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"Christoffel\\\\\\\" exists, it will be assumed to be the \ -Christoffel symbols of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" will be created using \ -TChristoffel[ ].\\\"}]], TextCell[Row[List[\\\"TRiemannTensor\\\", \\\"[\\\", \ -Style[metricID, Bold], \\\"] \\\", \\\"calculates the Riemann tensor from the \ -metric \\\", Style[metricID, Bold], \\\" and stores the result in a new \ -tensor object with ID \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"Riemann\\\\\\\".\\\\nIf a tensor with ID \\\\\\\"\\\", Style[metricID, \ -Bold], \\\"Christoffel\\\\\\\" exists, it will be assumed to be the \ -Christoffel symbols of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\" will \ -be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRiemannTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Riemann tensor from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"Riemann\\\\\\\". If a tensor with \ +ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" exists, it will be assumed to be the Christoffel \ +symbols of the metric, and will be used in the calculation. Otherwise, \\\\\\\ +\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" will be created using TCalcChristoffel[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRiemannTensor[\\\", Style[\\\"metricID\\\", Bold], \ +\\\"] calculates the Riemann tensor from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"Riemann\\\\\\\ +\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Christoffel\\\\\\\" exists, it will be assumed to be the Christoffel \ +symbols of the metric, and will be used in the calculation. Otherwise, \\\\\\\ +\"\\\", Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\\\\\" will be \ +created using TCalcChristoffel[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -21039,12 +21011,15 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{ - "TRiemannTensor", "[", "OGRe`Private`metricID_String", - "]"}], ":=", + "TCalcRiemannTensor", "[", "OGRe`Private`metricID_String", + "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "OGRe`Private`RiemannID", "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + RowBox[{"OGRe`Private`metricID", "<>", "\"Riemann\""}], + "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -21056,7 +21031,7 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{"Message", "[", StyleBox[ - RowBox[{"TRiemannTensor", "::", "ErrorNotMetric"}], + RowBox[{"TCalcRiemannTensor", "::", "ErrorNotMetric"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", @@ -21069,7 +21044,7 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", "\"Christoffel\""}]}], "]"}]}], ",", RowBox[{ - RowBox[{"TChristoffel", "[", "OGRe`Private`metricID", + RowBox[{"TCalcChristoffel", "[", "OGRe`Private`metricID", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`RiemannID", "=", RowBox[{"TChangeDefaultIndices", "[", @@ -21130,6 +21105,7 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{"-", "1"}], ",", RowBox[{"-", "1"}]}], "}"}]}], "]"}]}], ";", RowBox[{"OGRe`Private`ChangeTensorKey", "[", + RowBox[{"OGRe`Private`RiemannID", ",", "\"Role\"", ",", "\"Riemann\""}], "]"}], ";", RowBox[{"Return", "[", "OGRe`Private`RiemannID", "]"}], @@ -21172,7 +21148,7 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TRiemannTensor\"\>"} + "Tooltip"]& ], "\<\"OGRe`TCalcRiemannTensor\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -21262,26 +21238,25 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRiemannTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Riemann \ -tensor from the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\".\\\\nIf a tensor with ID \\\\\ -\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, \ -False]], \\\"Christoffel\\\\\\\" exists, it will be assumed to be the \ -Christoffel symbols of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" will be created using \ -TChristoffel[ ].\\\"}]], TextCell[Row[List[\\\"TRiemannTensor\\\", \\\"[\\\", \ -Style[metricID, Bold], \\\"] \\\", \\\"calculates the Riemann tensor from the \ -metric \\\", Style[metricID, Bold], \\\" and stores the result in a new \ -tensor object with ID \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"Riemann\\\\\\\".\\\\nIf a tensor with ID \\\\\\\"\\\", Style[metricID, \ -Bold], \\\"Christoffel\\\\\\\" exists, it will be assumed to be the \ -Christoffel symbols of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\" will \ -be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRiemannTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Riemann tensor from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"Riemann\\\\\\\". If a tensor with \ +ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" exists, it will be assumed to be the Christoffel \ +symbols of the metric, and will be used in the calculation. Otherwise, \\\\\\\ +\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" will be created using TCalcChristoffel[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRiemannTensor[\\\", Style[\\\"metricID\\\", Bold], \ +\\\"] calculates the Riemann tensor from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"Riemann\\\\\\\ +\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Christoffel\\\\\\\" exists, it will be assumed to be the Christoffel \ +symbols of the metric, and will be used in the calculation. Otherwise, \\\\\\\ +\"\\\", Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\\\\\" will be \ +created using TCalcChristoffel[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -21314,6 +21289,7 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], + EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -21344,39 +21320,40 @@ be created using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TRiemannTensor\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"calculates the Riemann tensor from the metric \", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" \ -and stores the result in a new tensor object with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"Riemann\\\".\\nIf a tensor with ID \\\"\", StyleBox[Cell[BoxData[\"metricID\ -\"]], Bold, Rule[StripOnInput, False]], \"Christoffel\\\" exists, it will be \ -assumed to be the Christoffel symbols of the metric, and will be used in the \ -calculation. Otherwise, \\\"\", StyleBox[Cell[BoxData[\"metricID\"]], Bold, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalcRiemannTensor[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \"] calculates the \ +Riemann tensor from the metric \", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" and stores the result in a new tensor object \ +with ID \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"Riemann\\\". If a tensor with ID \\\"\", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \"Christoffel\\\" exists, it will be assumed to \ +be the Christoffel symbols of the metric, and will be used in the \ +calculation. Otherwise, \\\"\", StyleBox[\"metricID\", Bold, \ Rule[StripOnInput, False]], \"Christoffel\\\" will be created using \ -TChristoffel[ ].\"}]], TextCell[Row[List[\"TRiemannTensor\", \"[\", \ -Style[metricID, Bold], \"] \", \"calculates the Riemann tensor from the \ -metric \", Style[metricID, Bold], \" and stores the result in a new tensor \ -object with ID \\\"\", Style[metricID, Bold], \"Riemann\\\".\\nIf a tensor \ -with ID \\\"\", Style[metricID, Bold], \"Christoffel\\\" exists, it will be \ -assumed to be the Christoffel symbols of the metric, and will be used in the \ -calculation. Otherwise, \\\"\", Style[metricID, Bold], \"Christoffel\\\" will \ -be created using TChristoffel[ ].\"]]]]\)", "Documentation" -> None, - "OwnValues" -> None, "UpValues" -> None, "DownValues" -> +TCalcChristoffel[].\"}]], TextCell[Row[List[\"TCalcRiemannTensor[\", \ +Style[\"metricID\", Bold], \"] calculates the Riemann tensor from the metric \ +\", Style[\"metricID\", Bold], \" and stores the result in a new tensor \ +object with ID \\\"\", Style[\"metricID\", Bold], \"Riemann\\\". If a tensor \ +with ID \\\"\", Style[\"metricID\", Bold], \"Christoffel\\\" exists, it will \ +be assumed to be the Christoffel symbols of the metric, and will be used in \ +the calculation. Otherwise, \\\"\", Style[\"metricID\", Bold], \ +\"Christoffel\\\" will be created using TCalcChristoffel[].\"]]]]\)", + "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, + "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TRiemannTensor, {OGRe`TRiemannTensor[ + DownValues, OGRe`TCalcRiemannTensor, {OGRe`TCalcRiemannTensor[ Pattern[OGRe`Private`metricID, Blank[String]]] :> - Module[{OGRe`Private`RiemannID}, + Module[{OGRe`Private`RiemannID}, OGRe`Private`CheckIfOverwriting[ + StringJoin[OGRe`Private`metricID, "Riemann"]]; If[OGRe`Private`TensorData[OGRe`Private`metricID]["Role"] =!= "Metric", Message[ - MessageName[OGRe`TRiemannTensor, "ErrorNotMetric"]]; Abort[]; + MessageName[OGRe`TCalcRiemannTensor, "ErrorNotMetric"]]; Abort[]; Null]; If[ Not[ KeyExistsQ[OGRe`Private`TensorData, StringJoin[OGRe`Private`metricID, "Christoffel"]]], - OGRe`TChristoffel[OGRe`Private`metricID]; Null]; + OGRe`TCalcChristoffel[OGRe`Private`metricID]; Null]; OGRe`Private`RiemannID = OGRe`TChangeDefaultIndices[ OGRe`TCalc[ StringJoin[OGRe`Private`metricID, "Riemann"][ @@ -21400,8 +21377,8 @@ be created using TChristoffel[ ].\"]]]]\)", "Documentation" -> None, Return[OGRe`Private`RiemannID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TRiemannTensor"], False]]], "Output", - CellLabel->"Out[119]=",ExpressionUUID->"4625fcc4-5460-4046-b804-b879a1119de3"] + "OGRe`TCalcRiemannTensor"], False]]], "Output", + CellLabel->"Out[119]=",ExpressionUUID->"8d4a657c-d12c-4fa9-ad16-ecfeca34a2b5"] }, Open ]], Cell["For example, for the FLRW metric we get:", \ @@ -21411,7 +21388,7 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TRiemannTensor", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcRiemannTensor", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[120]:=",ExpressionUUID->"eaab07fb-7aed-4054-a747-9fc39bc3ed0c"], @@ -21894,15 +21871,15 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"4bb1a738-4cac-4b6c-83bb-6c08497a3dcb"] + CellLabel->"OGRe:",ExpressionUUID->"3646f6ae-547a-48cd-9e48-c15a64f155b4"] }, Open ]], Cell[TextData[{ "Using ", - StyleBox["TRiemannTensor", "Input"], + StyleBox["TCalcRiemannTensor", "Input"], " also has the advantage that it takes a metric as an input, and will \ automatically calculate the Christoffel symbols of the metric using ", - StyleBox["TChristoffel", "Input"], + StyleBox["TCalcChristoffel", "Input"], " if they have not already been calculated. The same principle also applies \ to the other built-in modules for calculating curvature tensors, which we \ will present below; they always take a metric as input, and will calculate \ @@ -21924,8 +21901,8 @@ Cell[BoxData[ RowBox[{ SubscriptBox["R", "\[Rho]\[Sigma]\[Mu]\[Nu]"], SuperscriptBox["R", "\[Rho]\[Sigma]\[Mu]\[Nu]"]}]}], - ","}]], \ -"DisplayFormula",ExpressionUUID->"768114cb-eee2-462e-938b-3f45bec093fb"], + ","}]], "DisplayFormula",ExpressionUUID->"768114cb-eee2-462e-938b-\ +3f45bec093fb"], Cell["so it can be easily calculated in OGRe as follows:", \ "Text",ExpressionUUID->"bd482210-74d4-48c8-81b6-f0616a222c76"], @@ -21935,7 +21912,7 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TShow", "@", RowBox[{"TCalc", "[", - RowBox[{"\"\\"", ",", + RowBox[{"\"\\"", ",", RowBox[{ RowBox[{ "\"\\"", "[", "\"\<\[Rho]\[Sigma]\[Mu]\[Nu]\>\"", @@ -21948,7 +21925,7 @@ Cell[BoxData[ Cell[BoxData[ StyleBox[ - TemplateBox[{"\"Kretschmann\"", "\": \"", + TemplateBox[{"\"KretschmannFromScratch\"", "\": \"", TemplateBox[{"\"K\"", TemplateBox[{}, "RowDefault"], TemplateBox[{}, "RowDefault"]}, "Subsuperscript", SyntaxForm -> @@ -21964,7 +21941,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"95e43228-778f-4662-aed0-b267144d53e0"] + CellLabel->"OGRe:",ExpressionUUID->"ed6bc9dc-1e14-4546-a56f-7f6f5b933a98"] }, Open ]] }, Open ]], @@ -22030,19 +22007,19 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"99a69ec6-5261-4a94-9fab-4788029ea8c9"] + CellLabel->"OGRe:",ExpressionUUID->"40bc039d-9d12-402a-973e-fe5a213126cf"] }, Open ]], Cell[TextData[{ "We can also use the shorthand module ", - StyleBox["TRicciTensor", "Input"], + StyleBox["TCalcRicciTensor", "Input"], ":" }], "Text",ExpressionUUID->"de78cd3c-0e87-432c-81cd-ece45611817e"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TRicciTensor"}]], "Input", + RowBox[{"?", "TCalcRicciTensor"}]], "Input", CellLabel-> "In[123]:=",ExpressionUUID->"db324f47-c124-4e56-815c-e7f63387f1ee"], @@ -22071,26 +22048,25 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRicciTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Ricci tensor from \ -the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\" exists, it will be assumed to \ -be the Riemann tensor of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\" will be created using \ -TRiemannTensor[ ].\\\"}]], TextCell[Row[List[\\\"TRicciTensor\\\", \\\"[\\\", \ -Style[metricID, Bold], \\\"] \\\", \\\"calculates the Ricci tensor from the \ -metric \\\", Style[metricID, Bold], \\\" and stores the result in a new \ -tensor object with ID \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\".\\\\nIf a tensor with ID \\\\\\\"\\\", \ -Style[metricID, Bold], \\\"Riemann\\\\\\\" exists, it will be assumed to be \ -the Riemann tensor of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \\\"Riemann\\\\\\\" will be \ -created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRicciTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Ricci tensor from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\". If a tensor \ +with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"Riemann\\\\\\\" exists, it will be assumed to be the Riemann \ +tensor of the metric, and will be used in the calculation. Otherwise, \ +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"Riemann\\\\\\\" will be created using TCalcRiemannTensor[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRicciTensor[\\\", Style[\\\"metricID\\\", Bold], \ +\\\"] calculates the Ricci tensor from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\ +\\\\\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Riemann\\\\\\\" exists, it will be assumed to be the Riemann tensor of \ +the metric, and will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"Riemann\\\\\\\" will be created using \ +TCalcRiemannTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -22118,12 +22094,16 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{ - "TRicciTensor", "[", "OGRe`Private`metricID_String", + "TCalcRicciTensor", "[", "OGRe`Private`metricID_String", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "OGRe`Private`RicciTensorID", "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + + RowBox[{"OGRe`Private`metricID", "<>", + "\"RicciTensor\""}], "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -22135,7 +22115,7 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", RowBox[{ RowBox[{"Message", "[", StyleBox[ - RowBox[{"TRicciTensor", "::", "ErrorNotMetric"}], + RowBox[{"TCalcRicciTensor", "::", "ErrorNotMetric"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", @@ -22147,8 +22127,8 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", "]"}]}], ",", RowBox[{ - RowBox[{"TRiemannTensor", "[", "OGRe`Private`metricID", - "]"}], ";"}]}], "]"}], ";", + RowBox[{"TCalcRiemannTensor", "[", + "OGRe`Private`metricID", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`RicciTensorID", "=", RowBox[{"TCalc", "[", RowBox[{ @@ -22208,7 +22188,7 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TRicciTensor\"\>"} + "Tooltip"]& ], "\<\"OGRe`TCalcRicciTensor\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -22298,26 +22278,25 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRicciTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Ricci tensor from \ -the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\" exists, it will be assumed to \ -be the Riemann tensor of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Riemann\\\\\\\" will be created using \ -TRiemannTensor[ ].\\\"}]], TextCell[Row[List[\\\"TRicciTensor\\\", \\\"[\\\", \ -Style[metricID, Bold], \\\"] \\\", \\\"calculates the Ricci tensor from the \ -metric \\\", Style[metricID, Bold], \\\" and stores the result in a new \ -tensor object with ID \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\".\\\\nIf a tensor with ID \\\\\\\"\\\", \ -Style[metricID, Bold], \\\"Riemann\\\\\\\" exists, it will be assumed to be \ -the Riemann tensor of the metric, and will be used in the calculation. \ -Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \\\"Riemann\\\\\\\" will be \ -created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRicciTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Ricci tensor from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\". If a tensor \ +with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"Riemann\\\\\\\" exists, it will be assumed to be the Riemann \ +tensor of the metric, and will be used in the calculation. Otherwise, \ +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"Riemann\\\\\\\" will be created using TCalcRiemannTensor[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRicciTensor[\\\", Style[\\\"metricID\\\", Bold], \ +\\\"] calculates the Ricci tensor from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\ +\\\\\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Riemann\\\\\\\" exists, it will be assumed to be the Riemann tensor of \ +the metric, and will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"Riemann\\\\\\\" will be created using \ +TCalcRiemannTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -22381,40 +22360,39 @@ created using TRiemannTensor[ ].\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TRicciTensor\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"calculates the Ricci tensor from the metric \", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" \ -and stores the result in a new tensor object with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciTensor\\\".\\nIf a tensor with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"Riemann\\\" exists, it will be assumed to be the Riemann tensor of the \ -metric, and will be used in the calculation. Otherwise, \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"Riemann\\\" will be created using TRiemannTensor[ ].\"}]], \ -TextCell[Row[List[\"TRicciTensor\", \"[\", Style[metricID, Bold], \"] \", \ -\"calculates the Ricci tensor from the metric \", Style[metricID, Bold], \" \ -and stores the result in a new tensor object with ID \\\"\", Style[metricID, \ -Bold], \"RicciTensor\\\".\\nIf a tensor with ID \\\"\", Style[metricID, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalcRicciTensor[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \"] calculates the \ +Ricci tensor from the metric \", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" and stores the result in a new tensor object \ +with ID \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"RicciTensor\\\". If a tensor with ID \\\"\", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \"Riemann\\\" exists, it will be assumed to be \ +the Riemann tensor of the metric, and will be used in the calculation. \ +Otherwise, \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"Riemann\\\" will be created using TCalcRiemannTensor[].\"}]], \ +TextCell[Row[List[\"TCalcRicciTensor[\", Style[\"metricID\", Bold], \"] \ +calculates the Ricci tensor from the metric \", Style[\"metricID\", Bold], \" \ +and stores the result in a new tensor object with ID \\\"\", Style[\"metricID\ +\", Bold], \"RicciTensor\\\". If a tensor with ID \\\"\", Style[\"metricID\", \ Bold], \"Riemann\\\" exists, it will be assumed to be the Riemann tensor of \ the metric, and will be used in the calculation. Otherwise, \\\"\", \ -Style[metricID, Bold], \"Riemann\\\" will be created using TRiemannTensor[ ].\ -\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> +Style[\"metricID\", Bold], \"Riemann\\\" will be created using \ +TCalcRiemannTensor[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TRicciTensor, {OGRe`TRicciTensor[ + DownValues, OGRe`TCalcRicciTensor, {OGRe`TCalcRicciTensor[ Pattern[OGRe`Private`metricID, Blank[String]]] :> - Module[{OGRe`Private`RicciTensorID}, + Module[{OGRe`Private`RicciTensorID}, OGRe`Private`CheckIfOverwriting[ + StringJoin[OGRe`Private`metricID, "RicciTensor"]]; If[OGRe`Private`TensorData[OGRe`Private`metricID]["Role"] =!= "Metric", Message[ - MessageName[OGRe`TRicciTensor, "ErrorNotMetric"]]; Abort[]; + MessageName[OGRe`TCalcRicciTensor, "ErrorNotMetric"]]; Abort[]; Null]; If[ Not[ KeyExistsQ[OGRe`Private`TensorData, StringJoin[OGRe`Private`metricID, "Riemann"]]], - OGRe`TRiemannTensor[OGRe`Private`metricID]; Null]; + OGRe`TCalcRiemannTensor[OGRe`Private`metricID]; Null]; OGRe`Private`RicciTensorID = OGRe`TCalc[ StringJoin[OGRe`Private`metricID, "RicciTensor"]["\[Mu]\[Nu]"], StringJoin[OGRe`Private`metricID, "Riemann"][ @@ -22424,8 +22402,8 @@ Style[metricID, Bold], \"Riemann\\\" will be created using TRiemannTensor[ ].\ Return[OGRe`Private`RicciTensorID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TRicciTensor"], False]]], "Output", - CellLabel->"Out[123]=",ExpressionUUID->"31a7c5e0-a3e5-495a-bffd-09117298d7e6"] + "OGRe`TCalcRicciTensor"], False]]], "Output", + CellLabel->"Out[123]=",ExpressionUUID->"753f35b6-3911-4643-b53c-87bbd1ec6395"] }, Open ]], Cell["Here is the Ricci tensor for the FLRW metric:", \ @@ -22435,7 +22413,7 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TRicciTensor", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcRicciTensor", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[124]:=",ExpressionUUID->"71fa9fbd-91b3-4e86-8016-0f0bf565541a"], @@ -22571,7 +22549,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"7b8453b7-1793-4a78-80d0-a24ea2eb088e"] + CellLabel->"OGRe:",ExpressionUUID->"1afe4ffa-7fec-4068-9833-a2cc8b9f9c2c"] }, Open ]], Cell[TextData[{ @@ -22639,19 +22617,19 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"ac19cfd8-191d-42fb-b620-97bb24448511"] + CellLabel->"OGRe:",ExpressionUUID->"29becdab-3c38-44e0-865d-2ba17c633fc6"] }, Open ]], Cell[TextData[{ "Or, as usual, we can simply use the shorthand module ", - StyleBox["TRicciScalar", "Input"], + StyleBox["TCalcRicciScalar", "Input"], " to calculate it directly from the metric:" }], "Text",ExpressionUUID->"ac7c3ab6-67d9-418e-8bc2-1c431c185d76"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TRicciScalar"}]], "Input", + RowBox[{"?", "TCalcRicciScalar"}]], "Input", CellLabel-> "In[126]:=",ExpressionUUID->"01b8a418-1303-494d-9cce-2271f4f58e24"], @@ -22680,27 +22658,25 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRicciScalar\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Ricci scalar from \ -the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciScalar\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" exists, it will be \ -assumed to be the Ricci tensor of the metric, and will be used in the \ -calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ ].\\\"}]], \ -TextCell[Row[List[\\\"TRicciScalar\\\", \\\"[\\\", Style[metricID, Bold], \ -\\\"] \\\", \\\"calculates the Ricci scalar from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciScalar\\\\\\\".\\\\nIf a \ -tensor with ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciTensor\\\\\\\" \ -exists, it will be assumed to be the Ricci tensor of the metric, and will be \ -used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRicciScalar[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" calculates the Ricci scalar from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"RicciScalar\\\\\\\". If a tensor \ +with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"RicciTensor\\\\\\\" exists, it will be assumed to be the Ricci \ +tensor of the metric, and will be used in the calculation. Otherwise, \ +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"RicciTensor\\\\\\\" will be created using TCalcRicciTensor[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRicciScalar[\\\", Style[\\\"metricID\\\", Bold], \ +\\\" calculates the Ricci scalar from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"RicciScalar\\\ +\\\\\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"RicciTensor\\\\\\\" exists, it will be assumed to be the Ricci tensor of \ +the metric, and will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -22728,12 +22704,16 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ RowBox[{ RowBox[{ - "TRicciScalar", "[", "OGRe`Private`metricID_String", + "TCalcRicciScalar", "[", "OGRe`Private`metricID_String", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "OGRe`Private`RicciScalarID", "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + + RowBox[{"OGRe`Private`metricID", "<>", + "\"RicciScalar\""}], "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -22745,7 +22725,7 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ RowBox[{ RowBox[{"Message", "[", StyleBox[ - RowBox[{"TRicciScalar", "::", "ErrorNotMetric"}], + RowBox[{"TCalcRicciScalar", "::", "ErrorNotMetric"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", @@ -22758,7 +22738,7 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ "\"RicciTensor\""}]}], "]"}]}], ",", RowBox[{ - RowBox[{"TRicciTensor", "[", "OGRe`Private`metricID", + RowBox[{"TCalcRicciTensor", "[", "OGRe`Private`metricID", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`RicciScalarID", "=", RowBox[{"TCalc", "[", @@ -22819,7 +22799,7 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TRicciScalar\"\>"} + "Tooltip"]& ], "\<\"OGRe`TCalcRicciScalar\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -22909,27 +22889,25 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TRicciScalar\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Ricci scalar from \ -the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciScalar\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" exists, it will be \ -assumed to be the Ricci tensor of the metric, and will be used in the \ -calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ ].\\\"}]], \ -TextCell[Row[List[\\\"TRicciScalar\\\", \\\"[\\\", Style[metricID, Bold], \ -\\\"] \\\", \\\"calculates the Ricci scalar from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciScalar\\\\\\\".\\\\nIf a \ -tensor with ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciTensor\\\\\\\" \ -exists, it will be assumed to be the Ricci tensor of the metric, and will be \ -used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +TCalcRicciScalar[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\" calculates the Ricci scalar from the metric \\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores \ +the result in a new tensor object with ID \\\\\\\"\\\", StyleBox[\\\"metricID\ +\\\", Bold, Rule[StripOnInput, False]], \\\"RicciScalar\\\\\\\". If a tensor \ +with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"RicciTensor\\\\\\\" exists, it will be assumed to be the Ricci \ +tensor of the metric, and will be used in the calculation. Otherwise, \ +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"RicciTensor\\\\\\\" will be created using TCalcRicciTensor[].\\\"}]], \ +TextCell[Row[List[\\\"TCalcRicciScalar[\\\", Style[\\\"metricID\\\", Bold], \ +\\\" calculates the Ricci scalar from the metric \\\", \ +Style[\\\"metricID\\\", Bold], \\\" and stores the result in a new tensor \ +object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \\\"RicciScalar\\\ +\\\\\". If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"RicciTensor\\\\\\\" exists, it will be assumed to be the Ricci tensor of \ +the metric, and will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -22993,40 +22971,39 @@ used in the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TRicciScalar\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"calculates the Ricci scalar from the metric \", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" \ -and stores the result in a new tensor object with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciScalar\\\".\\nIf a tensor with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciTensor\\\" exists, it will be assumed to be the Ricci tensor of the \ -metric, and will be used in the calculation. Otherwise, \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciTensor\\\" will be created using TRicciTensor[ ].\"}]], \ -TextCell[Row[List[\"TRicciScalar\", \"[\", Style[metricID, Bold], \"] \", \ -\"calculates the Ricci scalar from the metric \", Style[metricID, Bold], \" \ -and stores the result in a new tensor object with ID \\\"\", Style[metricID, \ -Bold], \"RicciScalar\\\".\\nIf a tensor with ID \\\"\", Style[metricID, \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalcRicciScalar[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \" calculates the \ +Ricci scalar from the metric \", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" and stores the result in a new tensor object \ +with ID \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"RicciScalar\\\". If a tensor with ID \\\"\", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \"RicciTensor\\\" exists, it will be assumed to \ +be the Ricci tensor of the metric, and will be used in the calculation. \ +Otherwise, \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"RicciTensor\\\" will be created using TCalcRicciTensor[].\"}]], \ +TextCell[Row[List[\"TCalcRicciScalar[\", Style[\"metricID\", Bold], \" \ +calculates the Ricci scalar from the metric \", Style[\"metricID\", Bold], \" \ +and stores the result in a new tensor object with ID \\\"\", Style[\"metricID\ +\", Bold], \"RicciScalar\\\". If a tensor with ID \\\"\", Style[\"metricID\", \ Bold], \"RicciTensor\\\" exists, it will be assumed to be the Ricci tensor of \ the metric, and will be used in the calculation. Otherwise, \\\"\", \ -Style[metricID, Bold], \"RicciTensor\\\" will be created using TRicciTensor[ \ -].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, - "DownValues" -> +Style[\"metricID\", Bold], \"RicciTensor\\\" will be created using \ +TCalcRicciTensor[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, + "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TRicciScalar, {OGRe`TRicciScalar[ + DownValues, OGRe`TCalcRicciScalar, {OGRe`TCalcRicciScalar[ Pattern[OGRe`Private`metricID, Blank[String]]] :> - Module[{OGRe`Private`RicciScalarID}, + Module[{OGRe`Private`RicciScalarID}, OGRe`Private`CheckIfOverwriting[ + StringJoin[OGRe`Private`metricID, "RicciScalar"]]; If[OGRe`Private`TensorData[OGRe`Private`metricID]["Role"] =!= "Metric", Message[ - MessageName[OGRe`TRicciScalar, "ErrorNotMetric"]]; Abort[]; + MessageName[OGRe`TCalcRicciScalar, "ErrorNotMetric"]]; Abort[]; Null]; If[ Not[ KeyExistsQ[OGRe`Private`TensorData, StringJoin[OGRe`Private`metricID, "RicciTensor"]]], - OGRe`TRicciTensor[OGRe`Private`metricID]; Null]; + OGRe`TCalcRicciTensor[OGRe`Private`metricID]; Null]; OGRe`Private`RicciScalarID = OGRe`TCalc[ StringJoin[OGRe`Private`metricID, "RicciScalar"][""], StringJoin[OGRe`Private`metricID, "RicciTensor"]["\[Mu]\[Mu]"], @@ -23035,15 +23012,15 @@ Style[metricID, Bold], \"RicciTensor\\\" will be created using TRicciTensor[ \ Return[OGRe`Private`RicciScalarID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TRicciScalar"], False]]], "Output", - CellLabel->"Out[126]=",ExpressionUUID->"0fab35d7-d303-4709-ad0e-8b42673d6b3c"] + "OGRe`TCalcRicciScalar"], False]]], "Output", + CellLabel->"Out[126]=",ExpressionUUID->"46ece235-19b7-453f-b4ca-0b2abb1f4b1a"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TRicciScalar", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcRicciScalar", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[127]:=",ExpressionUUID->"ade61322-97ed-46dc-b1ed-64a6366a5dd9"], @@ -23092,7 +23069,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"049829b7-ffd0-4d13-b467-47e2b9e9af2e"] + CellLabel->"OGRe:",ExpressionUUID->"cfc45c82-d460-448f-858b-3f14e6bd59cb"] }, Open ]] }, Open ]], @@ -23273,19 +23250,19 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"f9f1c413-13b3-4b02-948a-76a0504c7879"] + CellLabel->"OGRe:",ExpressionUUID->"f30c1c42-036d-4280-8bcc-4d23cfdd418e"] }, Open ]], Cell[TextData[{ "Or we can use the built-in module ", - StyleBox["TEinsteinTensor", "Input"], + StyleBox["TCalcEinsteinTensor", "Input"], ":" }], "Text",ExpressionUUID->"b751c03f-eea0-465e-bf46-f2c5efd20e94"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TEinsteinTensor"}]], "Input", + RowBox[{"?", "TCalcEinsteinTensor"}]], "Input", CellLabel-> "In[129]:=",ExpressionUUID->"10b0bc4c-11b6-4294-9268-456a4ea202cb"], @@ -23314,27 +23291,26 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TEinsteinTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Einstein \ -tensor from the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Einstein\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ +TCalcEinsteinTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Einstein tensor from the metric \\\", StyleBox[\ +\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores the \ +result in a new tensor object with ID \\\\\\\"\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\"Einstein\\\\\ +\\\". If a tensor with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" exists, it will be \ assumed to be the Ricci tensor of the metric, and will be used in the \ -calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ ].\\\"}]], \ -TextCell[Row[List[\\\"TEinsteinTensor\\\", \\\"[\\\", Style[metricID, Bold], \ -\\\"] \\\", \\\"calculates the Einstein tensor from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"Einstein\\\\\\\".\\\\nIf a tensor \ -with ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciTensor\\\\\\\" exists, \ -it will be assumed to be the Ricci tensor of the metric, and will be used in \ -the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +calculation. Otherwise, \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"}]], TextCell[Row[List[\\\"TCalcEinsteinTensor[\\\", \ +Style[\\\"metricID\\\", Bold], \\\"] calculates the Einstein tensor from the \ +metric \\\", Style[\\\"metricID\\\", Bold], \\\" and stores the result in a \ +new tensor object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Einstein\\\\\\\". If a tensor with ID \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\\\\\" exists, it will be \ +assumed to be the Ricci tensor of the metric, and will be used in the \ +calculation. Otherwise, \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -23362,12 +23338,15 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ RowBox[{ RowBox[{ - "TEinsteinTensor", "[", "OGRe`Private`metricID_String", - "]"}], ":=", + "TCalcEinsteinTensor", "[", + "OGRe`Private`metricID_String", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "OGRe`Private`EinsteinID", "}"}], ",", RowBox[{ + RowBox[{"OGRe`Private`CheckIfOverwriting", "[", + RowBox[{"OGRe`Private`metricID", "<>", "\"Einstein\""}], + "]"}], ";", RowBox[{"If", "[", RowBox[{ RowBox[{ @@ -23379,7 +23358,7 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ RowBox[{ RowBox[{"Message", "[", StyleBox[ - RowBox[{"TEinsteinTensor", "::", "ErrorNotMetric"}], + RowBox[{"TCalcEinsteinTensor", "::", "ErrorNotMetric"}], "MessageName"], "]"}], ";", RowBox[{"Abort", "[", "]"}], ";"}]}], "]"}], ";", RowBox[{"If", "[", @@ -23392,7 +23371,7 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ "\"RicciTensor\""}]}], "]"}]}], ",", RowBox[{ - RowBox[{"TRicciTensor", "[", "OGRe`Private`metricID", + RowBox[{"TCalcRicciTensor", "[", "OGRe`Private`metricID", "]"}], ";"}]}], "]"}], ";", RowBox[{"OGRe`Private`EinsteinID", "=", RowBox[{"TCalc", "[", @@ -23411,6 +23390,7 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ RowBox[{ FractionBox["1", "2"], " ", RowBox[{ + RowBox[{"OGRe`Private`metricID", "[", "\"\[Mu]\[Nu]\"", "]"}], ".", RowBox[{ @@ -23463,7 +23443,7 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ TooltipStyle->"TextStyling"], Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TEinsteinTensor\"\>"} + "Tooltip"]& ], "\<\"OGRe`TCalcEinsteinTensor\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -23553,27 +23533,26 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TEinsteinTensor\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], \ -Bold, Rule[StripOnInput, False]], \\\"] \\\", \\\"calculates the Einstein \ -tensor from the metric \\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\" and stores the result in a new tensor object \ -with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Einstein\\\\\\\".\\\\nIf a tensor with ID \ -\\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ +TCalcEinsteinTensor[\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] calculates the Einstein tensor from the metric \\\", StyleBox[\ +\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\" and stores the \ +result in a new tensor object with ID \\\\\\\"\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\"Einstein\\\\\ +\\\". If a tensor with ID \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" exists, it will be \ assumed to be the Ricci tensor of the metric, and will be used in the \ -calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ ].\\\"}]], \ -TextCell[Row[List[\\\"TEinsteinTensor\\\", \\\"[\\\", Style[metricID, Bold], \ -\\\"] \\\", \\\"calculates the Einstein tensor from the metric \\\", \ -Style[metricID, Bold], \\\" and stores the result in a new tensor object with \ -ID \\\\\\\"\\\", Style[metricID, Bold], \\\"Einstein\\\\\\\".\\\\nIf a tensor \ -with ID \\\\\\\"\\\", Style[metricID, Bold], \\\"RicciTensor\\\\\\\" exists, \ -it will be assumed to be the Ricci tensor of the metric, and will be used in \ -the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ -\\\"RicciTensor\\\\\\\" will be created using TRicciTensor[ \ -].\\\"]]]]\\)\"\>", "InformationUsageText", +calculation. Otherwise, \\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"}]], TextCell[Row[List[\\\"TCalcEinsteinTensor[\\\", \ +Style[\\\"metricID\\\", Bold], \\\"] calculates the Einstein tensor from the \ +metric \\\", Style[\\\"metricID\\\", Bold], \\\" and stores the result in a \ +new tensor object with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Einstein\\\\\\\". If a tensor with ID \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"RicciTensor\\\\\\\" exists, it will be \ +assumed to be the Ricci tensor of the metric, and will be used in the \ +calculation. Otherwise, \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"RicciTensor\\\\\\\" will be created using \ +TCalcRicciTensor[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -23637,40 +23616,39 @@ the calculation. Otherwise, \\\\\\\"\\\", Style[metricID, Bold], \ InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TEinsteinTensor\", \"[\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \"] \ -\", \"calculates the Einstein tensor from the metric \", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \" \ -and stores the result in a new tensor object with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"Einstein\\\".\\nIf a tensor with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciTensor\\\" exists, it will be assumed to be the Ricci tensor of the \ -metric, and will be used in the calculation. Otherwise, \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"RicciTensor\\\" will be created using TRicciTensor[ ].\"}]], \ -TextCell[Row[List[\"TEinsteinTensor\", \"[\", Style[metricID, Bold], \"] \", \ -\"calculates the Einstein tensor from the metric \", Style[metricID, Bold], \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TCalcEinsteinTensor[\", \ +StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \"] calculates the \ +Einstein tensor from the metric \", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" and stores the result in a new tensor object \ +with ID \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"Einstein\\\". If a tensor with ID \\\"\", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \"RicciTensor\\\" exists, it will be assumed to \ +be the Ricci tensor of the metric, and will be used in the calculation. \ +Otherwise, \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"RicciTensor\\\" will be created using TCalcRicciTensor[].\"}]], \ +TextCell[Row[List[\"TCalcEinsteinTensor[\", Style[\"metricID\", Bold], \"] \ +calculates the Einstein tensor from the metric \", Style[\"metricID\", Bold], \ \" and stores the result in a new tensor object with ID \\\"\", \ -Style[metricID, Bold], \"Einstein\\\".\\nIf a tensor with ID \\\"\", \ -Style[metricID, Bold], \"RicciTensor\\\" exists, it will be assumed to be the \ +Style[\"metricID\", Bold], \"Einstein\\\". If a tensor with ID \\\"\", Style[\ +\"metricID\", Bold], \"RicciTensor\\\" exists, it will be assumed to be the \ Ricci tensor of the metric, and will be used in the calculation. Otherwise, \ -\\\"\", Style[metricID, Bold], \"RicciTensor\\\" will be created using \ -TRicciTensor[ ].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, +\\\"\", Style[\"metricID\", Bold], \"RicciTensor\\\" will be created using \ +TCalcRicciTensor[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TEinsteinTensor, {OGRe`TEinsteinTensor[ + DownValues, OGRe`TCalcEinsteinTensor, {OGRe`TCalcEinsteinTensor[ Pattern[OGRe`Private`metricID, Blank[String]]] :> - Module[{OGRe`Private`EinsteinID}, + Module[{OGRe`Private`EinsteinID}, OGRe`Private`CheckIfOverwriting[ + StringJoin[OGRe`Private`metricID, "Einstein"]]; If[OGRe`Private`TensorData[OGRe`Private`metricID]["Role"] =!= "Metric", Message[ - MessageName[OGRe`TEinsteinTensor, "ErrorNotMetric"]]; Abort[]; - Null]; If[ + MessageName[OGRe`TCalcEinsteinTensor, "ErrorNotMetric"]]; + Abort[]; Null]; If[ Not[ KeyExistsQ[OGRe`Private`TensorData, StringJoin[OGRe`Private`metricID, "RicciTensor"]]], - OGRe`TRicciTensor[OGRe`Private`metricID]; Null]; + OGRe`TCalcRicciTensor[OGRe`Private`metricID]; Null]; OGRe`Private`EinsteinID = OGRe`TCalc[ StringJoin[OGRe`Private`metricID, "Einstein"]["\[Mu]\[Nu]"], StringJoin[OGRe`Private`metricID, "RicciTensor"]["\[Mu]\[Nu]"] - ( @@ -23683,15 +23661,15 @@ TRicciTensor[ ].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, Return[OGRe`Private`EinsteinID]; Null]}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> - "OGRe`TEinsteinTensor"], False]]], "Output", - CellLabel->"Out[129]=",ExpressionUUID->"bb46d5a2-a71a-4c94-9d3d-6038b1279bb6"] + "OGRe`TCalcEinsteinTensor"], False]]], "Output", + CellLabel->"Out[129]=",ExpressionUUID->"8b9f93cb-9fc8-474f-8206-fdd297f40f1e"] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"TList", "@", - RowBox[{"TEinsteinTensor", "[", "\"\\"", "]"}]}]], "Input", + RowBox[{"TCalcEinsteinTensor", "[", "\"\\"", "]"}]}]], "Input", CellLabel-> "In[130]:=",ExpressionUUID->"527b0471-9c94-4d64-b70d-f02b3953e6cf"], @@ -23821,7 +23799,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"33241db2-0e38-4625-89fc-d7ee6a1292fa"] + CellLabel->"OGRe:",ExpressionUUID->"7f92d7ed-a962-43a3-bf85-57d8fcc20dec"] }, Open ]] }, Open ]], @@ -24099,7 +24077,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"6d0277ad-51d7-4672-bc0a-82f1733e79dd"] + CellLabel->"OGRe:",ExpressionUUID->"5c4d105c-7c6e-4316-a720-c6e5a54265a5"] }, Open ]], Cell[TextData[{ @@ -24144,26 +24122,25 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TCovariantD\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"index\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"represents the covariant \ -derivative when used in a tensor expression given to TCalc[ ].\\\\nIf a \ -tensor with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" exists, where \\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is the metric associated with the tensor the derivative is acting upon, \ -then it will be assumed to be the Levi-Civita connection of the metric, and \ -will be used in the calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"Christoffel\\\\\\\" will be created using TChristoffel[ ].\\\"}]], \ -TextCell[Row[List[\\\"TCovariantD\\\", \\\"[\\\", Style[index, Bold], \\\"] \ -\\\", \\\"represents the covariant derivative when used in a tensor \ -expression given to TCalc[ ].\\\\nIf a tensor with ID \\\\\\\"\\\", \ -Style[metricID, Bold], \\\"Christoffel\\\\\\\" exists, where \\\", \ -Style[metricID, Bold], \\\" is the metric associated with the tensor the \ +TCovariantD[\\\", StyleBox[\\\"index\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] represents the covariant derivative when used in a tensor expression \ +given to TCalc[]. If a tensor with ID \\\\\\\"\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" exists, where \\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" is the metric associated with the tensor the \ derivative is acting upon, then it will be assumed to be the Levi-Civita \ connection of the metric, and will be used in the calculation. Otherwise, \ -\\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\" will be created \ -using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"Christoffel\\\\\\\" will be created using TCalcChristoffel[].\\\"}]], \ +TextCell[Row[List[\\\"TCovariantD[\\\", Style[\\\"index\\\", Bold], \\\"] \ +represents the covariant derivative when used in a tensor expression given to \ +TCalc[]. If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Christoffel\\\\\\\" exists, where \\\", Style[\\\"metricID\\\", Bold], \\\ +\" is the metric associated with the tensor the derivative is acting upon, \ +then it will be assumed to be the Levi-Civita connection of the metric, and \ +will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\\\\\" will be created using \ +TCalcChristoffel[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -24249,7 +24226,6 @@ using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], - EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -24287,26 +24263,25 @@ using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TCovariantD\\\", \\\"[\\\", StyleBox[Cell[BoxData[\\\"index\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"represents the covariant \ -derivative when used in a tensor expression given to TCalc[ ].\\\\nIf a \ -tensor with ID \\\\\\\"\\\", StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, \ -Rule[StripOnInput, False]], \\\"Christoffel\\\\\\\" exists, where \\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\" is the metric associated with the tensor the derivative is acting upon, \ -then it will be assumed to be the Levi-Civita connection of the metric, and \ -will be used in the calculation. Otherwise, \\\\\\\"\\\", \ -StyleBox[Cell[BoxData[\\\"metricID\\\"]], Bold, Rule[StripOnInput, False]], \ -\\\"Christoffel\\\\\\\" will be created using TChristoffel[ ].\\\"}]], \ -TextCell[Row[List[\\\"TCovariantD\\\", \\\"[\\\", Style[index, Bold], \\\"] \ -\\\", \\\"represents the covariant derivative when used in a tensor \ -expression given to TCalc[ ].\\\\nIf a tensor with ID \\\\\\\"\\\", \ -Style[metricID, Bold], \\\"Christoffel\\\\\\\" exists, where \\\", \ -Style[metricID, Bold], \\\" is the metric associated with the tensor the \ +TCovariantD[\\\", StyleBox[\\\"index\\\", Bold, Rule[StripOnInput, False]], \ +\\\"] represents the covariant derivative when used in a tensor expression \ +given to TCalc[]. If a tensor with ID \\\\\\\"\\\", \ +StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \ +\\\"Christoffel\\\\\\\" exists, where \\\", StyleBox[\\\"metricID\\\", Bold, \ +Rule[StripOnInput, False]], \\\" is the metric associated with the tensor the \ derivative is acting upon, then it will be assumed to be the Levi-Civita \ connection of the metric, and will be used in the calculation. Otherwise, \ -\\\\\\\"\\\", Style[metricID, Bold], \\\"Christoffel\\\\\\\" will be created \ -using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", +\\\\\\\"\\\", StyleBox[\\\"metricID\\\", Bold, Rule[StripOnInput, False]], \\\ +\"Christoffel\\\\\\\" will be created using TCalcChristoffel[].\\\"}]], \ +TextCell[Row[List[\\\"TCovariantD[\\\", Style[\\\"index\\\", Bold], \\\"] \ +represents the covariant derivative when used in a tensor expression given to \ +TCalc[]. If a tensor with ID \\\\\\\"\\\", Style[\\\"metricID\\\", Bold], \ +\\\"Christoffel\\\\\\\" exists, where \\\", Style[\\\"metricID\\\", Bold], \\\ +\" is the metric associated with the tensor the derivative is acting upon, \ +then it will be assumed to be the Levi-Civita connection of the metric, and \ +will be used in the calculation. Otherwise, \\\\\\\"\\\", \ +Style[\\\"metricID\\\", Bold], \\\"Christoffel\\\\\\\" will be created using \ +TCalcChristoffel[].\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -24370,30 +24345,29 @@ using TChristoffel[ ].\\\"]]]]\\)\"\>", "InformationUsageText", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TCovariantD\", \"[\", \ -StyleBox[Cell[BoxData[\"index\"]], Bold, Rule[StripOnInput, False]], \"] \", \ -\"represents the covariant derivative when used in a tensor expression given \ -to TCalc[ ].\\nIf a tensor with ID \\\"\", \ -StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, False]], \ -\"Christoffel\\\" exists, where \", StyleBox[Cell[BoxData[\"metricID\"]], \ -Bold, Rule[StripOnInput, False]], \" is the metric associated with the tensor \ -the derivative is acting upon, then it will be assumed to be the Levi-Civita \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TCovariantD[\", \ +StyleBox[\"index\", Bold, Rule[StripOnInput, False]], \"] represents the \ +covariant derivative when used in a tensor expression given to TCalc[]. If a \ +tensor with ID \\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, \ +False]], \"Christoffel\\\" exists, where \", StyleBox[\"metricID\", Bold, \ +Rule[StripOnInput, False]], \" is the metric associated with the tensor the \ +derivative is acting upon, then it will be assumed to be the Levi-Civita \ connection of the metric, and will be used in the calculation. Otherwise, \ -\\\"\", StyleBox[Cell[BoxData[\"metricID\"]], Bold, Rule[StripOnInput, \ -False]], \"Christoffel\\\" will be created using TChristoffel[ ].\"}]], \ -TextCell[Row[List[\"TCovariantD\", \"[\", Style[index, Bold], \"] \", \ -\"represents the covariant derivative when used in a tensor expression given \ -to TCalc[ ].\\nIf a tensor with ID \\\"\", Style[metricID, Bold], \ -\"Christoffel\\\" exists, where \", Style[metricID, Bold], \" is the metric \ -associated with the tensor the derivative is acting upon, then it will be \ -assumed to be the Levi-Civita connection of the metric, and will be used in \ -the calculation. Otherwise, \\\"\", Style[metricID, Bold], \"Christoffel\\\" \ -will be created using TChristoffel[ ].\"]]]]\)", "Documentation" -> None, +\\\"\", StyleBox[\"metricID\", Bold, Rule[StripOnInput, False]], \ +\"Christoffel\\\" will be created using TCalcChristoffel[].\"}]], \ +TextCell[Row[List[\"TCovariantD[\", Style[\"index\", Bold], \"] represents \ +the covariant derivative when used in a tensor expression given to TCalc[]. \ +If a tensor with ID \\\"\", Style[\"metricID\", Bold], \"Christoffel\\\" \ +exists, where \", Style[\"metricID\", Bold], \" is the metric associated with \ +the tensor the derivative is acting upon, then it will be assumed to be the \ +Levi-Civita connection of the metric, and will be used in the calculation. \ +Otherwise, \\\"\", Style[\"metricID\", Bold], \"Christoffel\\\" will be \ +created using TCalcChristoffel[].\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> None, "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, "FullName" -> "OGRe`TCovariantD"], False]]], "Output", - CellLabel->"Out[132]=",ExpressionUUID->"0c748c4b-52b6-42c7-bcaa-57bd296b6cc3"] + CellLabel->"Out[132]=",ExpressionUUID->"5f2ec7c7-54a1-49df-b14b-4b8b52bbdf16"] }, Open ]], Cell["\<\ @@ -24408,8 +24382,8 @@ Cell[BoxData[ RowBox[{"TCalc", "[", RowBox[{ RowBox[{"TCovariantD", "[", "\"\<\[Mu]\>\"", "]"}], ".", - RowBox[{"\"\\"", "[", "\"\<\[Alpha]\[Beta]\>\"", "]"}]}], "]"}]}]], - "Input", + RowBox[{"\"\\"", "[", "\"\<\[Alpha]\[Beta]\>\"", "]"}]}], + "]"}]}]], "Input", CellLabel-> "In[133]:=",ExpressionUUID->"c06c4ec5-ca9d-44f9-978c-f66887febb89"], @@ -24429,7 +24403,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"9efe6420-61df-42d6-9dec-a494a128d5d0"] + CellLabel->"OGRe:",ExpressionUUID->"b792e669-0f77-4ca4-8148-f0c04bddea44"] }, Open ]], Cell["The covariant divergence of the Einstein tensor is:", \ @@ -24511,7 +24485,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"d3ad9dd2-08b7-4ff8-9f9b-8c8ff5eb0e92"] + CellLabel->"OGRe:",ExpressionUUID->"9d56d295-1452-411b-b81d-f3eee2427c5b"] }, Open ]], Cell[TextData[{ @@ -24649,7 +24623,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"86ae1c16-d0af-4d74-84f9-2a37d77aa172"] + CellLabel->"OGRe:",ExpressionUUID->"f972c00c-5d33-4d4b-a873-619bbe492d58"] }, Open ]], Cell[TextData[{ @@ -24683,7 +24657,7 @@ Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"TCalc", "[", - RowBox[{"\"\\"", ",", + RowBox[{"\"\\"", ",", RowBox[{ RowBox[{ RowBox[{"(", @@ -24703,16 +24677,16 @@ Cell[BoxData[{ "\"\\""}], "]"}], ";"}], "\n", RowBox[{ RowBox[{"TChangeDefaultIndices", "[", - RowBox[{"\"\\"", ",", + RowBox[{"\"\\"", ",", RowBox[{"{", RowBox[{"1", ",", "1"}], "}"}]}], "]"}], ";", - RowBox[{"TShow", "[", "\"\\"", "]"}]}]}], "Input", + RowBox[{"TShow", "[", "\"\\"", "]"}]}]}], "Input", CellLabel-> "In[136]:=",ExpressionUUID->"600dcb66-bb54-4dbc-bf47-4884784c9dba"], Cell[BoxData[ StyleBox[ - TemplateBox[{"\"PerfectFluid\"", "\": \"", + TemplateBox[{"\"PerfectFluidFLRW\"", "\": \"", TemplateBox[{"\"T\"", TemplateBox[{ StyleBox["\"\[Mu]\"", ShowContents -> False, StripOnInput -> False], @@ -24766,7 +24740,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"6a31f3d8-a343-404a-b4ca-ba32c8287e89"] + CellLabel->"OGRe:",ExpressionUUID->"b6bb70f2-5a23-4b0f-819d-c6908dac0f32"] }, Open ]], Cell["\<\ @@ -24781,8 +24755,8 @@ Cell[BoxData[ RowBox[{"\"\\"", ",", RowBox[{ RowBox[{"TCovariantD", "[", "\"\<\[Mu]\>\"", "]"}], ".", - RowBox[{"\"\\"", "[", "\"\<\[Mu]\[Nu]\>\"", "]"}]}]}], - "]"}]}]], "Input", + RowBox[{"\"\\"", "[", "\"\<\[Mu]\[Nu]\>\"", "]"}]}]}], + "]"}]}]], "Input", CellLabel-> "In[138]:=",ExpressionUUID->"31559cf6-516d-4edc-9cdf-9594ed88d061"], @@ -24917,7 +24891,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"46af8371-c145-4b18-8ec3-64c16c8daeef"] + CellLabel->"OGRe:",ExpressionUUID->"931a071d-3d9b-4352-81bd-148d2797c92a"] }, Open ]], Cell[TextData[{ @@ -25085,7 +25059,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"6d99e3dc-08ae-455a-bc59-4236c4e3799c"] + CellLabel->"OGRe:",ExpressionUUID->"97052d1a-bd39-406e-afe3-0b7d0d4d60b8"] }, Open ]], Cell[TextData[{ @@ -25101,20 +25075,20 @@ Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"AbsoluteTiming", "[", - RowBox[{"TChristoffel", "[", "\"\\"", "]"}], + RowBox[{"TCalcChristoffel", "[", "\"\\"", "]"}], "]"}]], "Input", CellLabel-> "In[141]:=",ExpressionUUID->"b0f09d28-5034-456d-ab16-ef5dd0a3e719"], Cell[BoxData[ RowBox[{"{", - RowBox[{"9.5052752`", ",", "\<\"ParallelizationTestChristoffel\"\>"}], + RowBox[{"9.6455352`", ",", "\<\"ParallelizationTestChristoffel\"\>"}], "}"}]], "Output", - CellLabel->"Out[141]=",ExpressionUUID->"18ca468c-f917-4e79-b017-f9265c5f6464"] + CellLabel->"Out[141]=",ExpressionUUID->"0a431d60-cc03-48ba-a1b3-2a8a43442391"] }, Open ]], Cell["\<\ -As you can see, on my computer the calculation takes about 9.5 seconds. On \ +As you can see, on my computer the calculation takes about 9.6 seconds. On \ your computer this duration may be shorter or longer, but the calculation \ will invariably take a considerable amount of time on any personal computer. \ The vast majority of that time is spent not on calculating the tensor, but on \ @@ -25127,14 +25101,14 @@ so they cannot be seen in the pre-calculated notebook.)\ Cell[TextData[{ "To turn on parallelization, we use the module ", - StyleBox["TParallelize", "Input"], + StyleBox["TSetParallelization", "Input"], ":" }], "Text",ExpressionUUID->"23b6298f-315e-4107-89ff-c8f0fa907f50"], Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"?", "TParallelize"}]], "Input", + RowBox[{"?", "TSetParallelization"}]], "Input", CellLabel-> "In[142]:=",ExpressionUUID->"927ce82d-0c31-43ca-9273-62e283547f9f"], @@ -25163,23 +25137,24 @@ Cell[BoxData[ PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TParallelize\\\", \\\"[\\\", StyleBox[\\\"True/False\\\", Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"enables or disable the \ -parallelization of tensor simplifications. The default value is \\\", \ +TSetParallelization[\\\", StyleBox[\\\"True\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] enables the parallelization of tensor simplifications, and \ +TSetParallelization[\\\", StyleBox[\\\"False\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] disables it. The default value is \\\", \ StyleBox[\\\"False\\\", Bold, Rule[StripOnInput, False]], \\\". If \ simplifications take less than a few seconds, then you should leave \ parallelization off, as it has a small overhead and may actually impede \ performance. However, if simplifications are taking more than a few seconds, \ then it is highly recommended to enable parallelization for a significant \ -performance boost.\\\"}]], TextCell[Row[List[\\\"TParallelize\\\", \\\"[\\\", \ -Style[\\\"True/False\\\", Bold], \\\"] \\\", \\\"enables or disable the \ -parallelization of tensor simplifications. The default value is \\\", \ -Style[\\\"False\\\", Bold], \\\". If simplifications take less than a few \ -seconds, then you should leave parallelization off, as it has a small \ -overhead and may actually impede performance. However, if simplifications are \ -taking more than a few seconds, then it is highly recommended to enable \ -parallelization for a significant performance boost.\\\"]]]]\\)\"\>", - "InformationUsageText", +performance boost.\\\"}]], TextCell[Row[List[\\\"TSetParallelization[\\\", \ +Style[\\\"True\\\", Bold], \\\"] enables the parallelization of tensor \ +simplifications, and TSetParallelization[\\\", Style[\\\"False\\\", Bold], \\\ +\"] disables it. The default value is \\\", Style[\\\"False\\\", Bold], \\\". \ +If simplifications take less than a few seconds, then you should leave \ +parallelization off, as it has a small overhead and may actually impede \ +performance. However, if simplifications are taking more than a few seconds, \ +then it is highly recommended to enable parallelization for a significant \ +performance boost.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -25205,7 +25180,9 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", TemplateBox[{"\"\[ThinSpace]\"", GridBox[{{ RowBox[{ - RowBox[{"TParallelize", "[", "OGRe`Private`par_", "]"}], + + RowBox[{ + "TSetParallelization", "[", "OGRe`Private`par_", "]"}], ":=", RowBox[{"(", RowBox[{ @@ -25283,8 +25260,9 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", StripOnInput->False], "\"FullName\"", TooltipStyle->"TextStyling"], + Annotation[#, "FullName", - "Tooltip"]& ], "\<\"OGRe`TParallelize\"\>"} + "Tooltip"]& ], "\<\"OGRe`TSetParallelization\"\>"} }, AutoDelete->False, GridBoxAlignment->{"Columns" -> {Right, Left}}, @@ -25336,7 +25314,6 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], - EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -25374,23 +25351,24 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", PaneBox[ StyleBox["\<\"\\!\\(\\*InterpretationBox[Cell[TextData[{\\\"\ -TParallelize\\\", \\\"[\\\", StyleBox[\\\"True/False\\\", Bold, \ -Rule[StripOnInput, False]], \\\"] \\\", \\\"enables or disable the \ -parallelization of tensor simplifications. The default value is \\\", \ +TSetParallelization[\\\", StyleBox[\\\"True\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] enables the parallelization of tensor simplifications, and \ +TSetParallelization[\\\", StyleBox[\\\"False\\\", Bold, Rule[StripOnInput, \ +False]], \\\"] disables it. The default value is \\\", \ StyleBox[\\\"False\\\", Bold, Rule[StripOnInput, False]], \\\". If \ simplifications take less than a few seconds, then you should leave \ parallelization off, as it has a small overhead and may actually impede \ performance. However, if simplifications are taking more than a few seconds, \ then it is highly recommended to enable parallelization for a significant \ -performance boost.\\\"}]], TextCell[Row[List[\\\"TParallelize\\\", \\\"[\\\", \ -Style[\\\"True/False\\\", Bold], \\\"] \\\", \\\"enables or disable the \ -parallelization of tensor simplifications. The default value is \\\", \ -Style[\\\"False\\\", Bold], \\\". If simplifications take less than a few \ -seconds, then you should leave parallelization off, as it has a small \ -overhead and may actually impede performance. However, if simplifications are \ -taking more than a few seconds, then it is highly recommended to enable \ -parallelization for a significant performance boost.\\\"]]]]\\)\"\>", - "InformationUsageText", +performance boost.\\\"}]], TextCell[Row[List[\\\"TSetParallelization[\\\", \ +Style[\\\"True\\\", Bold], \\\"] enables the parallelization of tensor \ +simplifications, and TSetParallelization[\\\", Style[\\\"False\\\", Bold], \\\ +\"] disables it. The default value is \\\", Style[\\\"False\\\", Bold], \\\". \ +If simplifications take less than a few seconds, then you should leave \ +parallelization off, as it has a small overhead and may actually impede \ +performance. However, if simplifications are taking more than a few seconds, \ +then it is highly recommended to enable parallelization for a significant \ +performance boost.\\\"]]]]\\)\"\>", "InformationUsageText", StripOnInput->False, LineSpacing->{1.5, 1.5, 3.}], FrameMargins->{{10, 10}, {8, 10}}], @@ -25423,7 +25401,6 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", ImageMargins->0, ImageSize->Full, Method->"Preemptive"], - EventHandlerTag[{ "MouseEntered" :> FEPrivate`Set[System`InformationDump`mouseOver$$, True], @@ -25454,25 +25431,27 @@ parallelization for a significant performance boost.\\\"]]]]\\)\"\>", InformationData[ Association[ "ObjectType" -> "Symbol", "Usage" -> - "\!\(\*InterpretationBox[Cell[TextData[{\"TParallelize\", \"[\", \ -StyleBox[\"True/False\", Bold, Rule[StripOnInput, False]], \"] \", \"enables \ -or disable the parallelization of tensor simplifications. The default value \ -is \", StyleBox[\"False\", Bold, Rule[StripOnInput, False]], \". If \ -simplifications take less than a few seconds, then you should leave \ + "\!\(\*InterpretationBox[Cell[TextData[{\"TSetParallelization[\", \ +StyleBox[\"True\", Bold, Rule[StripOnInput, False]], \"] enables the \ +parallelization of tensor simplifications, and TSetParallelization[\", \ +StyleBox[\"False\", Bold, Rule[StripOnInput, False]], \"] disables it. The \ +default value is \", StyleBox[\"False\", Bold, Rule[StripOnInput, False]], \ +\". If simplifications take less than a few seconds, then you should leave \ parallelization off, as it has a small overhead and may actually impede \ performance. However, if simplifications are taking more than a few seconds, \ then it is highly recommended to enable parallelization for a significant \ -performance boost.\"}]], TextCell[Row[List[\"TParallelize\", \"[\", \ -Style[\"True/False\", Bold], \"] \", \"enables or disable the parallelization \ -of tensor simplifications. The default value is \", Style[\"False\", Bold], \ -\". If simplifications take less than a few seconds, then you should leave \ +performance boost.\"}]], TextCell[Row[List[\"TSetParallelization[\", \ +Style[\"True\", Bold], \"] enables the parallelization of tensor \ +simplifications, and TSetParallelization[\", Style[\"False\", Bold], \"] \ +disables it. The default value is \", Style[\"False\", Bold], \". If \ +simplifications take less than a few seconds, then you should leave \ parallelization off, as it has a small overhead and may actually impede \ performance. However, if simplifications are taking more than a few seconds, \ then it is highly recommended to enable parallelization for a significant \ performance boost.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, "UpValues" -> None, "DownValues" -> Information`InformationValueForm[ - DownValues, OGRe`TParallelize, {OGRe`TParallelize[ + DownValues, OGRe`TSetParallelization, {OGRe`TSetParallelization[ Pattern[OGRe`Private`par, Blank[]]] :> (Unprotect[OGRe`Private`TensorData]; OGRe`Private`TensorData[Options]["Parallelize"] = OGRe`Private`par; @@ -25487,8 +25466,8 @@ performance boost.\"]]]]\)", "Documentation" -> None, "OwnValues" -> None, OGRe`Private`OGRePrint["Parallelization disabled."]; Null]; Null)}], "SubValues" -> None, "DefaultValues" -> None, "NValues" -> None, "FormatValues" -> None, "Options" -> None, "Attributes" -> {Protected}, - "FullName" -> "OGRe`TParallelize"], False]]], "Output", - CellLabel->"Out[142]=",ExpressionUUID->"4e5d348b-3b55-4638-8d23-e9e079e72ab5"] + "FullName" -> "OGRe`TSetParallelization"], False]]], "Output", + CellLabel->"Out[142]=",ExpressionUUID->"edbbdcad-f55e-4fb8-8b70-e80c9a93b30b"] }, Open ]], Cell["Let us turn it on now:", \ @@ -25497,7 +25476,7 @@ Cell["Let us turn it on now:", \ Cell[CellGroupData[{ Cell[BoxData[ - RowBox[{"TParallelize", "[", "True", "]"}]], "Input", + RowBox[{"TSetParallelization", "[", "True", "]"}]], "Input", CellLabel-> "In[143]:=",ExpressionUUID->"86f645c3-e325-441e-869f-f9a339452cdc"], @@ -25505,7 +25484,7 @@ Cell[BoxData["\<\"Parallelization enabled.\"\>"], "Output", Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"f55d080a-e8f1-4c89-a619-3afc5098cc76"], + CellLabel->"OGRe:",ExpressionUUID->"3a0b8d4f-1491-44d3-bd16-d9de6e3213ea"], Cell[BoxData[ TemplateBox[{ @@ -25514,7 +25493,7 @@ Cell[BoxData[ Editable->False, CellLabelStyle->Directive["CellLabel", Smaller, RGBColor[0, 0, 1]], - CellLabel->"OGRe:",ExpressionUUID->"302fccc9-71cd-4288-811c-67f65d383a9f"] + CellLabel->"OGRe:",ExpressionUUID->"52e6d8cd-989c-4fce-b3f1-db57f7a2de0e"] }, Open ]], Cell["\<\ @@ -25549,8 +25528,8 @@ the test metric.)" }], "Text",ExpressionUUID->"335e92a3-b573-4fc8-a4f2-eac3fc9580fb"], Cell["\<\ -We will also delete the tensor that we calculated previously, just to be on \ -the safe side:\ +We will also delete the tensor that we calculated previously, so that we can \ +calculate it again:\ \>", "Text",ExpressionUUID->"7dcf17bb-56da-414c-9990-e90b5fb2af0d"], Cell[BoxData[ @@ -25560,30 +25539,29 @@ Cell[BoxData[ CellLabel-> "In[145]:=",ExpressionUUID->"01c9cbea-10c4-4e35-8ead-cdea25ec967a"], -Cell[TextData[{ - "Now we can accurately measure the execution time for ", - StyleBox["TChristoffel", "Input"], - " with parallelization:" -}], "Text",ExpressionUUID->"4a6b7266-3504-4d03-9336-7ae20f6ada17"], +Cell["\<\ +Now we can accurately measure the execution time for TCalcChristoffel with \ +parallelization:\ +\>", "Text",ExpressionUUID->"4a6b7266-3504-4d03-9336-7ae20f6ada17"], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"AbsoluteTiming", "[", - RowBox[{"TChristoffel", "[", "\"\\"", "]"}], + RowBox[{"TCalcChristoffel", "[", "\"\\"", "]"}], "]"}]], "Input", CellLabel-> "In[146]:=",ExpressionUUID->"62c3a717-6213-4fbe-b0bc-20031dc024a8"], Cell[BoxData[ RowBox[{"{", - RowBox[{"3.3386697`", ",", "\<\"ParallelizationTestChristoffel\"\>"}], + RowBox[{"3.4739013`", ",", "\<\"ParallelizationTestChristoffel\"\>"}], "}"}]], "Output", - CellLabel->"Out[146]=",ExpressionUUID->"fc3f31df-77c2-4709-9176-793c28c65484"] + CellLabel->"Out[146]=",ExpressionUUID->"dc08707e-c95a-4437-9c37-0235d00acc83"] }, Open ]], Cell["\<\ -We see that the calculation now only took about 3.3 seconds - an improvement \ +We see that the calculation now only took about 3.5 seconds - an improvement \ by roughly a factor of 3. With longer calculations, the improvement will be \ even more significant. Increasing the number of kernels (if it was allowed by \ my license) would provide an additional speedup.\ @@ -25605,23 +25583,6 @@ Cell["Additional information", \ Cell[CellGroupData[{ -Cell["Compatibility", \ -"Subsection",ExpressionUUID->"709ae85f-8120-4ade-a00c-2e1d1b1b54ae"], - -Cell[TextData[{ - "This package is compatible with Mathematica 12.0 or newer, on any platform \ -(Windows, Linux, and Mac). It should also run on Mathematica 11 or 10, but \ -that has not been tested. The package will ", - StyleBox["not", - FontWeight->"Bold"], - " work on versions prior to Mathematica 10, due to extensive use of ", - StyleBox["Association", "Input"], - ", which was introduced in Mathematica 10.0." -}], "Text",ExpressionUUID->"c22858dd-73de-4c16-9bd1-7572f7d48ab3"] -}, Open ]], - -Cell[CellGroupData[{ - Cell["Version history", \ "Subsection",ExpressionUUID->"900dae2a-c217-42f9-901d-9ad83691f7c0"], @@ -25640,188 +25601,26 @@ Cell[TextData[{ Cell[CellGroupData[{ -Cell["Future plans", \ -"Subsection",ExpressionUUID->"ada43399-07c5-47f0-a58c-ce3f44871590"], - -Cell["\<\ -The following features are currently planned for future versions:\ -\>", "Text",ExpressionUUID->"b534b0c5-8bc1-4ce4-89de-84d796b1cd9b"], - -Cell[TextData[{ - "Get a subset of a tensor\[CloseCurlyQuote]s components by replacing one or \ -more indices with a specific coordinate, e.g. ", - Cell[BoxData[ - FormBox[ - SuperscriptBox["T", "012"], TraditionalForm]],ExpressionUUID-> - "3bb2be58-29df-49ab-b10b-3a695681c085"], - " will return that component and ", - Cell[BoxData[ - FormBox[ - SuperscriptBox["T", "\[Mu]\[Nu]0"], TraditionalForm]],ExpressionUUID-> - "c99fa0fe-f1ed-429e-ad91-df0d2a3566f9"], - " will return a rank-2 tensor." -}], "Item",ExpressionUUID->"b0d194cd-bcbc-4dc9-9285-dec1b5622046"], - -Cell[TextData[{ - "More control over the output style of ", - StyleBox["TShow", "Input"], - " and ", - StyleBox["TList", "Input"], - "." -}], "Item",ExpressionUUID->"86933d69-2ee3-44db-be1b-fcbff086648f"], - -Cell["\<\ -More modules to calculate commonly-used curvature tensors, such as the \ -Kretschmann scalar and the Weyl tensor.\ -\>", "Item",ExpressionUUID->"d330cc66-1540-40e6-a8b7-38d538d786d6"], - -Cell[TextData[{ - "Comma and semicolon operators as alternatives to ", - StyleBox["TPartialD", "Input"], - " and ", - StyleBox["TCovariantD", "Input"], - "." -}], "Item",ExpressionUUID->"393ac90c-9bf8-4989-ae87-54f054fae760"], - -Cell[TextData[{ - StyleBox["TShow[\[OpenCurlyDoubleQuote]ID\[CloseCurlyDoubleQuote][\ -\[OpenCurlyDoubleQuote]indices\[CloseCurlyDoubleQuote]]]", "Input"], - " should use the given indices when showing the tensor, instead of the \ -default indices." -}], "Item",ExpressionUUID->"10abe5ed-56db-41d5-83b2-4cbe7bd8d836"], - -Cell[TextData[{ - "Expressions like ", - StyleBox["TCalc[\[OpenCurlyDoubleQuote]A\[CloseCurlyDoubleQuote]+\ -\[OpenCurlyDoubleQuote]B\[CloseCurlyDoubleQuote]]", "Input"], - " or ", - StyleBox["TCalc[\[OpenCurlyDoubleQuote]A\[CloseCurlyDoubleQuote].\ -\[CloseCurlyDoubleQuote]B\[CloseCurlyDoubleQuote]]", "Input"], - " should automatically deduce the indices to use if possible." -}], "Item",ExpressionUUID->"325be66a-31d7-49ce-81cc-f0f4ac76b1cf"], - -Cell["\<\ -Use Mathematica symbols, instead of strings, as tensor IDs - for less \ -cluttered syntax and autocompletion.\ -\>", "Item",ExpressionUUID->"29a81245-ece0-49b0-bb26-f7aedbc16c5f"], - -Cell["\<\ -Improve performance of raising and lowering indices by doing them all at once \ -instead of index by index.\ -\>", "Item",ExpressionUUID->"9b01c00f-6c3a-4706-a11f-91f546091e50"], - -Cell["\<\ -Support for frame fields (a.k.a. tetrads or vierbeins) and internal indices.\ -\>", "Item",ExpressionUUID->"4299571a-d21a-41f1-b25b-ec6780bec97b"], - -Cell["\<\ -If three coordinate systems are defined, and we know how to get from 1 to 2 \ -and from 2 to 3, then OGRe should automatically deduce the transformation \ -from 1 to 3.\ -\>", "Item",ExpressionUUID->"8b606b24-cf2f-4e97-8727-0c7cac1a9730"], - -Cell["Display the metric as a line element.", \ -"Item",ExpressionUUID->"2f1360bb-c200-4c65-9f4f-7e952991afd4"], - -Cell[TextData[{ - StyleBox["TCalc", "Input"], - " should display the equation being calculated in index notation. (This \ -feature is 80% implemented, just need to work out the kinks.)" -}], "Item",ExpressionUUID->"cefdfbf4-cc60-44e0-a82e-240a2c9aad84"], - -Cell["Support for 3+1 decomposition.", \ -"Item",ExpressionUUID->"08bd26dc-4f61-4c3c-ace1-c3374839c39a"], - -Cell["Derive the geodesic equation from a given metric.", \ -"Item",ExpressionUUID->"00a4c38f-f3f6-4752-9079-5560385eb3e8"], - -Cell["\<\ -Warn when importing tensors from a different version of the package.\ -\>", "Item",ExpressionUUID->"fc5350f1-6d6d-49fe-a933-8a24e1cff184"], - -Cell[TextData[{ - "Tensor objects created with ", - StyleBox["TCalc", "Input"], - " that include a ", - StyleBox["TPartialD", "Input"], - " should be marked with a special ", - StyleBox["Role", "Input"], - " and the user should be warned that they may not transform as expected." -}], "Item",ExpressionUUID->"30d7a03f-2351-441a-b552-703dcb028f82"], - -Cell["\<\ -Add errors when incorrect types are given to modules (e.g. a number where a \ -string should be). Currently, if an incorrect type is used, the module will \ -simply not run since the pattern won\[CloseCurlyQuote]t match its definition. \ -This is the default Mathematica behavior, but it\[CloseCurlyQuote]s not very \ -user-friendly.\ -\>", "Item",ExpressionUUID->"d4fb4933-8a3b-452d-bc77-ba0b83686dd7"], - -Cell[TextData[{ - "Option to define or change the elements of a tensor in ", - StyleBox["MatrixForm", "Input"], - "." -}], "Item",ExpressionUUID->"5f7209e6-0301-45a4-8dce-74ca83f6750b"], - -Cell[TextData[{ - "Combine all options into a single ", - StyleBox["TOptions", "Input"], - " module instead of a separate module to set each option." -}], "Item",ExpressionUUID->"b11a6a9d-b730-4d62-b125-1aabacfb700a"], - -Cell[TextData[{ - "Initialized symbols should be exported with ", - StyleBox["TExportAll", "Input"], - " so they can be initialized again when importing at a later session." -}], "Item",ExpressionUUID->"54513edb-b6c3-4d95-9a28-8fe8c3a60adf"], - -Cell["\<\ -Save options permanently to a file and reload them automatically each session.\ -\>", "Item",ExpressionUUID->"4a5926cd-d666-4972-8117-db6e20a1a219"], - -Cell["And much more...", \ -"Item",ExpressionUUID->"d99b7582-5c43-4438-bf4a-c293d56d47ea"], +Cell["Feature requests and bug reports", \ +"Subsection",ExpressionUUID->"bdc413ea-49f8-4552-8821-8d05ac695efd"], Cell[TextData[{ - StyleBox["If you would like a request any additional features, or if you \ -encounter any bugs, please feel free to ", - FontWeight->"Bold"], - StyleBox[ButtonBox["open a new issue on GitHub", + "If you would like a request any additional features, or if you encounter \ +any bugs, please feel free to ", + ButtonBox["open a new issue on GitHub", BaseStyle->"Hyperlink", ButtonData->{ URL["https://github.com/bshoshany/OGRe"], None}, ButtonNote->"https://github.com/bshoshany/OGRe"], - FontWeight->"Bold"], - StyleBox["!", - FontWeight->"Bold"] + "!" }], "Text",ExpressionUUID->"2d5265f6-18a6-4990-9111-22e5fd25cae1"] }, Open ]], Cell[CellGroupData[{ -Cell["Citing", \ +Cell["Copyright and citing", \ "Subsection",ExpressionUUID->"c56d69a9-5559-4a30-aa5e-246da6eaeeb7"], -Cell["\<\ -If you use this package in your research, please cite it as follows:\ -\>", "Text",ExpressionUUID->"f3556f45-64d8-40d1-af37-f0988622fc1f"], - -Cell["\<\ -Barak Shoshany, OGRe: An Object-Oriented General Relativity Package for \ -Mathematica, https://github.com/bshoshany/OGRe (2021).\ -\>", "Item",ExpressionUUID->"199f9d38-a0ea-483c-abe5-4ac4af3dc48b"], - -Cell["\<\ -(This citation will be replaced with a journal reference once a paper is \ -published.)\ -\>", "Text",ExpressionUUID->"09ee9ab2-191d-4f9f-92f8-6835289eb2d4"] -}, Open ]], - -Cell[CellGroupData[{ - -Cell["Copyright and license", \ -"Subsection",ExpressionUUID->"614933e6-70f7-47c5-89c0-ea4337c4b6f8"], - Cell[TextData[{ "Copyright (c) 2021 Barak Shoshany (http://baraksh.com) (", ButtonBox["baraksh@gmail.com", @@ -25838,7 +25637,31 @@ Cell[TextData[{ URL["https://github.com/bshoshany/OGRe"], None}, ButtonNote->"https://github.com/bshoshany/OGRe"], " for more information." -}], "Text",ExpressionUUID->"42c51f9d-01af-4bd1-97d1-147d90734dc8"] +}], "Text",ExpressionUUID->"5cd5de76-272e-49c5-a801-24b6e4a314de"], + +Cell["\<\ +If you use this package in published research, please cite it as follows:\ +\>", "Text",ExpressionUUID->"7da65d28-fd78-4f5c-876b-bebaffa87eff"], + +Cell[TextData[{ + "Barak Shoshany, \[OpenCurlyDoubleQuote]OGRe: An Object-Oriented General \ +Relativity Package for Mathematica\[CloseCurlyDoubleQuote], ", + ButtonBox["doi:10.5281/zenodo.4742935", + BaseStyle->"Hyperlink", + ButtonData->{ + URL["https://doi.org/10.5281/zenodo.4742935)"], None}, + ButtonNote->"https://doi.org/10.5281/zenodo.4742935)"], + " (May 2021)" +}], "Item",ExpressionUUID->"98dfe930-f5a1-41a8-b76d-46d9baa512d0"], + +Cell["You can use the following BibTeX entry:", \ +"Text",ExpressionUUID->"63d97d52-7ed1-4dcb-b107-0f007262e310"], + +Cell[TextData[StyleBox["@article{Shoshany2021_OGRe,\n author = {Barak \ +Shoshany},\n doi = {10.5281/zenodo.4742935},\n month = {May},\n \ +title = {{OGRe: An Object-Oriented General Relativity Package for \ +Mathematica}},\n year = {2021}\n}", "Input"]], \ +"Text",ExpressionUUID->"c144bdeb-97e4-49f7-886a-c2bf9cc4b3e3"] }, Open ]], Cell[CellGroupData[{ @@ -25860,7 +25683,7 @@ through the Ministry of Colleges and Universities.\ }, Open ]] }, Open ]] }, -WindowSize->{1032., 790.8}, +WindowSize->{1032., 796.1999999999999}, WindowMargins->{{-5.3999999999999995`, Automatic}, {Automatic, 0}}, PrivateNotebookOptions->{"FileOutlineCache"->False}, TaggingRules->{"TryRealOnly" -> False}, diff --git a/OGRe_Documentation.pdf b/OGRe_Documentation.pdf index b515e740bf401a864489a1868894bc716ba66788..97fb5ec13940a30204e2475ce753d95f70557bca 100644 GIT binary patch delta 359750 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 z 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

BMTxDO?Z#~D%!;!&EpWlnv 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%0Ai%QuYPl;2NtpNcOvz|4!X(f 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 z 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 delta 363169 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%0DR!aBB(qVg48dr^!{%XLvt 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 diff --git a/README.md b/README.md index 4378992..7abc972 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,176 @@ -# OGRe: An **O**bject-Oriented **G**eneral **Re**lativity Package for Mathematica - - - -- [Summary](#summary) -- [Features](#features) -- [Installing and loading the package](#installing-and-loading-the-package) -- [Documentation](#documentation) -- [Version history](#version-history) -- [Citing](#citing) -- [Copyright and license](#copyright-and-license) - - - - -## Summary - -OGRe is a modern Mathematica package for tensor calculus, designed to be both powerful and user-friendly. It can be used in a variety of contexts where tensor calculations are needed, in both mathematics and physics, but it is especially suitable for general relativity. - -Tensors are abstract objects, which can be represented as multi-dimensional arrays once a choice of index configuration and coordinate system is made. OGRe stays true to this definition, but takes away the complexities that come with combining tensors in different representations. This is done using an object-oriented programming approach, as detailed in the documentation. - -The user initially defines each tensor in OGRe using its explicit components in any single representation. Operations on this tensor are then done abstractly, without needing to specify which representation to use. Possible operations include addition of tensors, multiplication of tensor by scalar, trace, contraction, and partial and covariant derivatives. - -OGRe will automatically choose which representation to use for each tensor based on how the tensors are combined. For example, if two tensors are added, then OGRe will automatically use the same index configuration for both. Similarly, if two tensors are contracted, then OGRe will automatically ensure that the contracted indices are one upper (contravariant) and one lower (covariant). OGRe will also automatically transform all tensors being operated on to the same coordinate system. - -Transformations between representations are done behind the scenes; all the user has to do is specify which metric to use for raising and lowering indices, and how to transform between the coordinate systems being used. This also means that there is no room for user error. The user cannot mistakenly perform "illegal" operations such as 2Aμν+BμλCλν. Instead, the user simply inputs the names of the tensors, the order (but **not** the configuration) of indices for each, and the operations to perform - and the correct combination 2Aμν+BμλCλν will be automatically deduced. - -I initially created OGRe for use in my own research, so I made it as flexible and powerful as possible. I also wanted my students to be able to use it easily and efficiently, even if they only have minimal experience with Mathematica and/or general relativity, so I made it simple to learn and easy to use. As a result, this package is equally suitable for both experienced and novice researchers. - - -## Features - -* Define coordinate systems and the transformation rules between them. Tensor components are then transformed automatically between coordinates behind the scenes as needed. -* Each tensor is associated with a specific metric. Tensor components are then transformed automatically between different index configurations, raising and lowering indices behind the scenes as needed. -* Display any tensor in any index configuration and coordinate system, either in vector/matrix form or as a list of all unique non-zero elements. -* Automatically simplify tensor components, optionally with user-defined simplification assumptions. Simplifications can be parallelized for a significant performance boost. -* Export tensors to a Mathematica notebook or to a file, so they can later be imported into another Mathematica session without having to redefine them from scratch. -* Easily calculate arbitrary tensor formulas using any combination of addition, multiplication by scalar, trace, contraction, partial derivative, and covariant derivative. -* Built-in modules for calculating the Christoffel symbols (Levi-Civita connection), Riemann tensor, Ricci tensor and scalar, and Einstein tensor. More will be added in future versions. -* Built with speed and performance in mind, using optimized algorithms designed specifically for this package. -* Fully portable. Can be imported directly from the web into any Mathematica notebook, without downloading or installing anything. -* Clear and detailed documentation, with many examples, in both [Mathematica notebook](OGRe_Documentation.nb) and [PDF](OGRe_Documentation.pdf) format. Detailed usage messages are also provided. -* Open source. The code is extensively documented; please feel free to fork and modify it as you see fit. -* Under active development. Please see the "future plans" section of the documentation for more information. Bug reports and feature requests are welcome, and should be made via GitHub issues. - - -## Installing and loading the package - -The package consists of only one file, `OGRe.m`. There are several different ways to load the package: - -* **Run from local file with installation:** This is the recommended option, as it allows you to permanently use the package offline from any Mathematica notebook. Download the file `OGRe.m` from [the GitHub repository](https://github.com/bshoshany/OGRe) and copy it to the directory given by `FileNameJoin[{$UserBaseDirectory, "Applications"}]`. The package may now be loaded from any notebook by writing ``Needs["OGRe`"]`` (note the backtick ` following the word OGRe). - -* **Run from local file without installation:** This option allows you to use the package in a portable fashion, without installing it in the `Applications` directory. Download the file `OGRe.m` from [the GitHub repository](https://github.com/bshoshany/OGRe), place it in the same directory as the notebook you would like to use, and use the command `Get["OGRe.m", Path->NotebookDirectory[]]` to load the package. - -* **Run from web with installation:** This option allows you to automatically download and install the package on any computer. Simply run the command `URLDownload["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m", FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]` from any Mathematica notebook to permanently install the package. Then use ``Needs["OGRe`"]`` from any notebook to load it. - -* **Run from web without installation:** This option allows you to use the package from any Mathematica notebook on any computer, without manually downloading or installing it, as long as you have a working Internet connection. It also ensures that you always use the latest version of the package, but be aware that updates may sometimes not be fully backwards compatible. Simply write `Get["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m"]` in any Mathematica notebook to load the package. - -To uninstall the package, just delete the file from the `Applications` directory, which can be done from within Mathematica using the command `DeleteFile[FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]`. - - -## Documentation - -The full and detailed documentation for this package may be found in the following repository files: - -* `OGRe_Documentation.nb`: An interactive Mathematica notebook. Requires Mathematica to open. -* `OGRe_Documentation.pdf`: A PDF version of the notebook. Can be viewed with any PDF reader. - -Once the package is loaded, the documentation can be easily accessed by executing the command `TDocs[]`, which automatically downloads the file `OGRe_Documentation.nb` from GitHub and opens it in Mathematica. - - -## Version history - -* v1.3 (2021-05-06) - * Changes to existing modules: - * `TExport`, `TExportAll`, `TImport`, and `TImportAll`: - * Added a clarification in the usage messages for `TExportAll` and `TImportAll` that the directory where the file will be saved or read from can be changed using `SetDirectory`. - * Importing tensors from a different OGRe version (whether older or newer) will now issue a warning that compatibility issues may occur. - * `Options` will now be populated correctly with the specific keys relevant to this version, even if you import from other versions which may use different `Options` keys. - * Other changes: - * The previous update of the package made use of the new Mathematica syntax for anonymous functions, `x |-> body`. However, since this is a new feature introduced in Mathematica 12.2, this accidentally made the package incompatible with earlier Mathematica versions. I changed it to the old syntax `Function[x, body]` in order to maintain compatibility. -* v1.2 (2021-04-28) - * New modules: - * `TDocs`: Opens the Mathematica notebook `OGRe_Documentation.nb` directly from the GitHub repository. This allows users to instantly access the latest documentation from any Mathematica session, whether the package itself was loaded locally or from GitHub. - * `TParallelize`: - * Enables or disable the parallelization of tensor simplifications (see below). It is disabled by default. - * As a rule of thumb, if simplifications are taking less than a few seconds, then you should leave parallelization off, as it has a small overhead and may actually impede performance in that case. However, if simplifications are taking more than a few seconds, then it is highly recommended to enable parallelization for a significant performance boost. - * This setting will be exported when using `TExportAll`, so it will be imported automatically with `TImportAll` in future sessions. - * Aspects of the package other than simplification are not parallelized, since they are typically short calculations with few elements, and would not benefit from parallelization. - * Changes to existing modules: - * `TCalc` now displays a progress bar (see below). - * `TCheckForUpdates`: - * Fixed a bug where this module falsely reported that a new version is available. - * Fixed a bug where this module issued an error when giving the option to download `OGRe.m` to the current notebook directory if the notebook is an Untitled notebook, meaning it is not an actual file in the file system and thus does not have a notebook directory. - * This module now gives the user the option to reload the new version directly from GitHub without saving it locally. - * `TList` and `TShow`: - * The output of these modules is now uneditable. I made this change after I noticed that some users were editing the output, thinking that they are editing the tensor itself. (An option to actually edit the elements of a tensor in `MatrixForm` may be added in a future version.) - * These modules now take a fourth optional argument: a function to map to each of the tensor's elements before they are displayed. Typically this would be `ReplaceAll[rules]` to apply the `rules` to the elements, but any function can be used. Note that applying `ReplaceAll` to the output of `TShow` or `TList` directly won't work, since the output is formatted. - * `TNewMetric` now verifies that the metric components are an invertible, symmetric, and square matrix. - * Other changes: - * The performance of simplifications has been improved considerably! - * Simplifications are now performed automatically less often, to prevent simplifying the same expression multiple times. - * In addition, simplifications can now be parallelized. This is enabled using the new module `TParallelize` (see above). The parallelization is implemented using a thread pool model (with `ParallelSubmit` and `WaitAll`), which in my benchmarks was found to provide better performance than the simpler `Parallelize` or `ParallelMap`. - * Parallelization can potentially provide a speedup proportional to the number of parallel kernels. Note that this number is determined by your Mathematica license, and it may be less than the number of cores in your CPU. - * Calculations with `TCalc` and simplifications now both display progress bars, so you can keep track of long calculations. This was a popular feature request, especially for simplifications, since they are usually the most time-consuming operations. - * Improved the appearance of the welcome message. - * Messages from OGRe are now displayed with a special cell label. - * Information on how to load the package is now displayed in the `README.md` file. -* v1.1 (2021-04-15) - * New modules: - * `TCheckForUpdates`: Automatically checks the GitHub repository for updates. If a new version of the package is available, the module will offer an option to download or install the new version and reload the package. - * `TGetComponents`: Extracts the components of a tensor object in a specific representation as a `List`. - * `TInfo`: Displays information about a tensor object, and any other objects associated with it, in human-readable form. - * Changes to existing modules: - * `TAddCoordTransformation` now also calculates the Jacobian of the transformation when it is executed, and stores the result for future use within the tensor object of the source coordinates. This improves performance by using the pre-calculated Jacobian whenever a coordinate transformation is performed, instead of calculating it from scratch every time, as was the case in v1.0. - * `TChristoffel` now explicitly marks the resulting tensor object as having special transformation properties. The Levi-Civita connection, whose components are the Christoffel symbols, does not transform like a tensor under a coordinate transformation, and OGRe now automatically knows to use the correct transformation rule. **Please note that tensors created with `TChristoffel` in v1.0 will not transform correctly, so they should be recalculated after updating.** - * `TExport` now adds a key named `"OGReVersion"` which records the version of the package used to create the tensor being exported. This will be used in future versions to ensure backwards compatibility. - * `TExportAll` now exports, in addition to all the tensors defined so far, a special key, `Options`, containing information about the current session. Currently, this key stores the version of the package, the index letters to use, and the simplification assumptions set by the user. When importing the data in another session using `TImportAll`, the version number will be used to ensure backwards compatibility, and the other options will be used to restore any user-defined index letters and simplification assumptions made during the session. - * `TNewTensor` now allows defining the components of the new tensor in any coordinate system. In v1.0, the components had to be defined in the default coordinate system of the associated metric. This is still the default behavior if a coordinate system is not specified, for compatibility with v1.0, but it is recommended to always specify the coordinate system explicitly, to avoid accidentally defining the tensor with the wrong components. - * `TSimplifyAssumptions` now appends new simplification assumptions to the list of previously added assumptions, instead of replacing it. Also, OGRe now automatically assumes that all variables are real, which helps simplify certain expressions. If you are using more exotic variables, use `TSimplifyAssumptions[!Reals]` to disable this assumption. - * Other changes: - * The `"Role"` key of each tensor object now indicates how that object was created. In v1.0, tensors created with `TNewCoordinates` had the role `"Coordinates"` and tensors created with `TNewMetric` had the role `"Metric"`, but all other tensors had the role `"General"`. Now tensors will have the roles `"Tensor"`, `"Calculated"`, `"Christoffel"`, `"Riemann"`, `"Ricci Tensor"`, `"Ricci Scalar"`, or `"Einstein"` if they were created using `TNewTensor`, `TCalc`, `TChristoffel`, `TRiemannTensor`, `TRicciTensor`, `TRicciScalar`, or `TEinstein` respectively. This is currently just for bookkeeping, but may have other uses in future versions. Note that tensors imported from v1.0 will still have the role `"General"`. - * Improved the formatting of the usage messages for all OGRe modules. They no longer break in the middle of words. - * Debug mode has been removed. If the package is loaded more than once in a single session, it will redefine all symbols but keep any previously defined tensors intact. This is useful both for debugging and for reloading the package after an update. - * Bug fixes: - * Fixed a bug where the partial and covariant derivatives of a scalar were not calculated correctly. -* v1.0 (2021-02-10) - * Initial release. - - -## Citing - -If you use this package in your research, please cite it as follows: - -* Barak Shoshany, OGRe: An Object-oriented General Relativity Package for Mathematica, [https://github.com/bshoshany/OGRe](https://github.com/bshoshany/OGRe) (2021). - -(This citation will be replaced with a journal reference once a paper is published.) - - -## Copyright and license - -Copyright (c) 2021 [Barak Shoshany](http://baraksh.com) (baraksh@gmail.com). Licensed under the [MIT license](LICENSE.txt). +[![DOI:10.5281/zenodo.4742935](https://zenodo.org/badge/DOI/10.5281/zenodo.4742935.svg)](https://doi.org/10.5281/zenodo.4742935) +[![License: MIT](https://img.shields.io/github/license/bshoshany/thread-pool)](https://github.com/bshoshany/OGRe/blob/master/LICENSE.txt) +![Language: Mathematica 12](https://img.shields.io/badge/Language-Mathematica%2012-yellow) +![File size in bytes](https://img.shields.io/github/size/bshoshany/OGRe/OGRe.m) +![GitHub last commit](https://img.shields.io/github/last-commit/bshoshany/OGRe) +[![GitHub repo stars](https://img.shields.io/github/stars/bshoshany/OGRe?style=social)](https://github.com/bshoshany/OGRe) +[![Twitter @BarakShoshany](https://img.shields.io/twitter/follow/BarakShoshany?style=social)](https://twitter.com/BarakShoshany) + +# OGRe: An Object-Oriented General Relativity Package for Mathematica + + + +- [Summary](#summary) +- [Features](#features) +- [Installing and loading the package](#installing-and-loading-the-package) +- [Documentation](#documentation) +- [Version history](#version-history) +- [Copyright and citing](#copyright-and-citing) + + + + +## Summary + +OGRe is a modern Mathematica package for tensor calculus, designed to be both powerful and user-friendly. It can be used in a variety of contexts where tensor calculations are needed, in both mathematics and physics, but it is especially suitable for general relativity. + +Tensors are abstract objects, which can be represented as multi-dimensional arrays once a choice of index configuration and coordinate system is made. OGRe stays true to this definition, but takes away the complexities that come with combining tensors in different representations. This is done using an object-oriented programming approach, as detailed in the documentation. + +The user initially defines each tensor in OGRe using its explicit components in any single representation. Operations on this tensor are then done abstractly, without needing to specify which representation to use. Possible operations include addition of tensors, multiplication of tensor by scalar, trace, contraction, and partial and covariant derivatives. + +OGRe will automatically choose which representation to use for each tensor based on how the tensors are combined. For example, if two tensors are added, then OGRe will automatically use the same index configuration for both. Similarly, if two tensors are contracted, then OGRe will automatically ensure that the contracted indices are one upper (contravariant) and one lower (covariant). OGRe will also automatically transform all tensors being operated on to the same coordinate system. + +Transformations between representations are done behind the scenes; all the user has to do is specify which metric to use for raising and lowering indices, and how to transform between the coordinate systems being used. This also means that there is no room for user error. The user cannot mistakenly perform "illegal" operations such as 2Aμν+BμλCλν. Instead, the user simply inputs the names of the tensors, the order (but **not** the configuration) of indices for each, and the operations to perform - and the correct combination 2Aμν+BμλCλν will be automatically deduced. + +I initially created OGRe for use in my own research, so I made it as flexible and powerful as possible. I also wanted my students to be able to use it easily and efficiently, even if they only have minimal experience with Mathematica and/or general relativity, so I made it simple to learn and easy to use. As a result, this package is equally suitable for both experienced and novice researchers. + + +## Features + +* Define coordinate systems and the transformation rules between them. Tensor components are then transformed automatically between coordinates behind the scenes as needed. +* Each tensor is associated with a specific metric. Tensor components are then transformed automatically between different index configurations, raising and lowering indices behind the scenes as needed. +* Display any tensor in any index configuration and coordinate system, either in vector/matrix form or as a list of all unique non-zero elements. +* Automatically simplify tensor components, optionally with user-defined simplification assumptions. Simplifications can be parallelized for a significant performance boost. +* Export tensors to a Mathematica notebook or to a file, so they can later be imported into another Mathematica session without having to redefine them from scratch. +* Easily calculate arbitrary tensor formulas using any combination of addition, multiplication by scalar, trace, contraction, partial derivative, and covariant derivative. +* Built-in modules for calculating the Christoffel symbols (Levi-Civita connection), Riemann tensor, Ricci tensor and scalar, and Einstein tensor. More will be added in future versions. +* Built with speed and performance in mind, using optimized algorithms designed specifically for this package. +* Fully portable. Can be imported directly from the web into any Mathematica notebook, without downloading or installing anything. +* Clear and detailed documentation, with many examples, in both [Mathematica notebook](OGRe_Documentation.nb) and [PDF](OGRe_Documentation.pdf) format. Detailed usage messages are also provided. +* Open source. The code is extensively documented; please feel free to fork and modify it as you see fit. +* Under continuous and active development. Bug reports and feature requests are welcome, and should be made via [GitHub issues](https://github.com/bshoshany/OGRe/issues). + + +## Installing and loading the package + +This package is compatible with Mathematica 12.0 or newer, on any platform (Windows, Linux, and Mac). It should also run on Mathematica 11 or 10, but that has not been tested. The package will not work on versions prior to Mathematica 10, due to extensive use of `Association`, which was introduced in Mathematica 10.0. + +The package consists of only one file, `OGRe.m`. There are several different ways to load the package: + +* **Run from local file with installation:** This is the recommended option, as it allows you to permanently use the package offline from any Mathematica notebook. Download the file `OGRe.m` from [the GitHub repository](https://github.com/bshoshany/OGRe) and copy it to the directory given by `FileNameJoin[{$UserBaseDirectory, "Applications"}]`. The package may now be loaded from any notebook by writing ``Needs["OGRe`"]`` (note the backtick ` following the word OGRe). + +* **Run from local file without installation:** This option allows you to use the package in a portable fashion, without installing it in the `Applications` directory. Download the file `OGRe.m` from [the GitHub repository](https://github.com/bshoshany/OGRe), place it in the same directory as the notebook you would like to use, and use the command `Get["OGRe.m", Path->NotebookDirectory[]]` to load the package. + +* **Run from web with installation:** This option allows you to automatically download and install the package on any computer. Simply run the command `URLDownload["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m", FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]` from any Mathematica notebook to permanently install the package. Then use ``Needs["OGRe`"]`` from any notebook to load it. + +* **Run from web without installation:** This option allows you to use the package from any Mathematica notebook on any computer, without manually downloading or installing it, as long as you have a working Internet connection. It also ensures that you always use the latest version of the package, but be aware that updates may sometimes not be fully backwards compatible. Simply write `Get["https://raw.githubusercontent.com/bshoshany/OGRe/master/OGRe.m"]` in any Mathematica notebook to load the package. + +To uninstall the package, just delete the file from the `Applications` directory, which can be done from within Mathematica using the command `DeleteFile[FileNameJoin[{$UserBaseDirectory, "Applications", "OGRe.m"}]]`. + + +## Documentation + +The full and detailed documentation for this package may be found in the following repository files: + +* `OGRe_Documentation.nb`: An interactive Mathematica notebook. Requires Mathematica to open. +* `OGRe_Documentation.pdf`: A PDF version of the notebook. Can be viewed with any PDF reader. + +Once the package is loaded, the documentation can be easily accessed by executing the command `TDocs[]`, which automatically downloads the file `OGRe_Documentation.nb` from GitHub and opens it in Mathematica. + + +## Version history + +* v1.4 (2021-05-09) + * Changes to existing modules: + * `TAddCoordTransformation` now has the clearer syntax `TAddCoordTransformation[sourceID -> targetID, rules]`. The old syntax (with `,` instead of `->`) can still be used. + * `TChangeID` now has the clearer syntax `TChangeID[oldID -> newID]`. The old syntax (with `,` instead of `->`) can still be used. + * `TChristoffel`, `TEinsteinTensor`, `TRicciScalar`, `TRicciTensor`, and `TRiemannTensor` have been renamed to `TCalcChristoffel`, `TCalcEinsteinTensor`, `TCalcRicciScalar`, `TCalcRicciTensor`, and `TCalcRiemannTensor` respectively, to group them all together and clarify that they all calculate specific tensors using `TCalc`. + * `TIndexLetters`, `TParallelize`, and `TSimplifyAssumptions` have been renamed to `TSetIndexLetters`, `TSetParallelization`, and `TSetAssumptions` respectively, to group them all together and clarify that they all change various settings. + * `TCalc`, `TCalcChristoffel`, `TCalcEinsteinTensor`, `TCalcRicciScalar`, `TCalcRicciTensor`, `TCalcRiemannTensor`, `TChangeID`, `TImport`, `TNewCoordinates`, `TNewMetric`, and `TNewTensor` no longer overwrite existing tensors, to prevent data loss. The user will be instructed to rename the existing tensor using `TChangeID` or delete it using `TDelete` first. + * Other changes: + * Usage messages: + * Many usage messages have been simplified, improved, or clarified. + * Fixed a bug where loading the package directly from GitHub led to usage messages not being displayed properly due to doubling of line breaks. + * The way that usage messages are defined internally has also been simplified. + * Automatic checks for update: + * The package now checks for new versions automatically at startup. No information (personal or otherwise) is sent or collected; the package simply checks the GitHub repository for updates. This check is done asynchronously, to prevent delaying the loading of the package. + * An upcoming release will introduce persistent storage of user settings, including a setting which will allow disabling the checks for update at startup. Until then, users interested in turning off these automatic checks can change the line `SessionSubmit[StartupCheckForUpdates[]];` in `OGRe.m` to `UpdateMessage = "Checking for updates is disabled.";`. + * Fixed several lines in the code where a semicolon was missing at the end of the line, causing the code to not run correctly since Mathematica interprets newlines as multiplication by default. + * This package now has a DOI for citation purposes. Information on how to cite it in publications has been added to the source code and to `README.md`. + * Added GitHub badges to `README.md`. +* v1.3 (2021-05-06) + * Changes to existing modules: + * `TExport`, `TExportAll`, `TImport`, and `TImportAll`: + * Added a clarification in the usage messages for `TExportAll` and `TImportAll` that the directory where the file will be saved or read from can be changed using `SetDirectory`. + * Importing tensors from a different OGRe version (whether older or newer) will now issue a warning that compatibility issues may occur. + * `Options` will now be populated correctly with the specific keys relevant to this version, even if you import from other versions which may use different `Options` keys. + * Other changes: + * The previous update of the package made use of the new Mathematica syntax for anonymous functions, `x |-> body`. However, since this is a new feature introduced in Mathematica 12.2, this accidentally made the package incompatible with earlier Mathematica versions. I changed it to the old syntax `Function[x, body]` in order to maintain compatibility. +* v1.2 (2021-04-28) + * New modules: + * `TDocs`: Opens the Mathematica notebook `OGRe_Documentation.nb` directly from the GitHub repository. This allows users to instantly access the latest documentation from any Mathematica session, whether the package itself was loaded locally or from GitHub. + * `TParallelize`: + * Enables or disable the parallelization of tensor simplifications (see below). It is disabled by default. + * As a rule of thumb, if simplifications are taking less than a few seconds, then you should leave parallelization off, as it has a small overhead and may actually impede performance in that case. However, if simplifications are taking more than a few seconds, then it is highly recommended to enable parallelization for a significant performance boost. + * This setting will be exported when using `TExportAll`, so it will be imported automatically with `TImportAll` in future sessions. + * Aspects of the package other than simplification are not parallelized, since they are typically short calculations with few elements, and would not benefit from parallelization. + * Changes to existing modules: + * `TCalc` now displays a progress bar (see below). + * `TCheckForUpdates`: + * Fixed a bug where this module falsely reported that a new version is available. + * Fixed a bug where this module issued an error when giving the option to download `OGRe.m` to the current notebook directory if the notebook is an Untitled notebook, meaning it is not an actual file in the file system and thus does not have a notebook directory. + * This module now gives the user the option to reload the new version directly from GitHub without saving it locally. + * `TList` and `TShow`: + * The output of these modules is now uneditable. I made this change after I noticed that some users were editing the output, thinking that they are editing the tensor itself. (An option to actually edit the elements of a tensor in `MatrixForm` may be added in a future version.) + * These modules now take a fourth optional argument: a function to map to each of the tensor's elements before they are displayed. Typically this would be `ReplaceAll[rules]` to apply the `rules` to the elements, but any function can be used. Note that applying `ReplaceAll` to the output of `TShow` or `TList` directly won't work, since the output is formatted. + * `TNewMetric` now verifies that the metric components are an invertible, symmetric, and square matrix. + * Other changes: + * The performance of simplifications has been improved considerably! + * Simplifications are now performed automatically less often, to prevent simplifying the same expression multiple times. + * In addition, simplifications can now be parallelized. This is enabled using the new module `TParallelize` (see above). The parallelization is implemented using a thread pool model (with `ParallelSubmit` and `WaitAll`), which in my benchmarks was found to provide better performance than the simpler `Parallelize` or `ParallelMap`. + * Parallelization can potentially provide a speedup proportional to the number of parallel kernels. Note that this number is determined by your Mathematica license, and it may be less than the number of cores in your CPU. + * Calculations with `TCalc` and simplifications now both display progress bars, so you can keep track of long calculations. This was a popular feature request, especially for simplifications, since they are usually the most time-consuming operations. + * Improved the appearance of the welcome message. + * Messages from OGRe are now displayed with a special cell label. + * Information on how to load the package is now displayed in the `README.md` file. +* v1.1 (2021-04-15) + * New modules: + * `TCheckForUpdates`: Automatically checks the GitHub repository for updates. If a new version of the package is available, the module will offer an option to download or install the new version and reload the package. + * `TGetComponents`: Extracts the components of a tensor object in a specific representation as a `List`. + * `TInfo`: Displays information about a tensor object, and any other objects associated with it, in human-readable form. + * Changes to existing modules: + * `TAddCoordTransformation` now also calculates the Jacobian of the transformation when it is executed, and stores the result for future use within the tensor object of the source coordinates. This improves performance by using the pre-calculated Jacobian whenever a coordinate transformation is performed, instead of calculating it from scratch every time, as was the case in v1.0. + * `TChristoffel` now explicitly marks the resulting tensor object as having special transformation properties. The Levi-Civita connection, whose components are the Christoffel symbols, does not transform like a tensor under a coordinate transformation, and OGRe now automatically knows to use the correct transformation rule. **Please note that tensors created with `TChristoffel` in v1.0 will not transform correctly, so they should be recalculated after updating.** + * `TExport` now adds a key named `"OGReVersion"` which records the version of the package used to create the tensor being exported. This will be used in future versions to ensure backwards compatibility. + * `TExportAll` now exports, in addition to all the tensors defined so far, a special key, `Options`, containing information about the current session. Currently, this key stores the version of the package, the index letters to use, and the simplification assumptions set by the user. When importing the data in another session using `TImportAll`, the version number will be used to ensure backwards compatibility, and the other options will be used to restore any user-defined index letters and simplification assumptions made during the session. + * `TNewTensor` now allows defining the components of the new tensor in any coordinate system. In v1.0, the components had to be defined in the default coordinate system of the associated metric. This is still the default behavior if a coordinate system is not specified, for compatibility with v1.0, but it is recommended to always specify the coordinate system explicitly, to avoid accidentally defining the tensor with the wrong components. + * `TSimplifyAssumptions` now appends new simplification assumptions to the list of previously added assumptions, instead of replacing it. Also, OGRe now automatically assumes that all variables are real, which helps simplify certain expressions. If you are using more exotic variables, use `TSimplifyAssumptions[!Reals]` to disable this assumption. + * Other changes: + * The `"Role"` key of each tensor object now indicates how that object was created. In v1.0, tensors created with `TNewCoordinates` had the role `"Coordinates"` and tensors created with `TNewMetric` had the role `"Metric"`, but all other tensors had the role `"General"`. Now tensors will have the roles `"Tensor"`, `"Calculated"`, `"Christoffel"`, `"Riemann"`, `"Ricci Tensor"`, `"Ricci Scalar"`, or `"Einstein"` if they were created using `TNewTensor`, `TCalc`, `TChristoffel`, `TRiemannTensor`, `TRicciTensor`, `TRicciScalar`, or `TEinstein` respectively. This is currently just for bookkeeping, but may have other uses in future versions. Note that tensors imported from v1.0 will still have the role `"General"`. + * Improved the formatting of the usage messages for all OGRe modules. They no longer break in the middle of words. + * Debug mode has been removed. If the package is loaded more than once in a single session, it will redefine all symbols but keep any previously defined tensors intact. This is useful both for debugging and for reloading the package after an update. + * Bug fixes: + * Fixed a bug where the partial and covariant derivatives of a scalar were not calculated correctly. +* v1.0 (2021-02-10) + * Initial release. + + +## Copyright and citing + +Copyright (c) 2021 [Barak Shoshany](http://baraksh.com). Licensed under the [MIT license](LICENSE.txt). + +If you use this package in published research, please cite it as follows: + +* Barak Shoshany, "OGRe: An Object-Oriented General Relativity Package for Mathematica", [doi:10.5281/zenodo.4742935](https://doi.org/10.5281/zenodo.4742935) (May 2021) + +You can use the following BibTeX entry: + +```none +@article{Shoshany2021_OGRe, + author = {Barak Shoshany}, + doi = {10.5281/zenodo.4742935}, + month = {May}, + title = {{OGRe: An Object-Oriented General Relativity Package for Mathematica}}, + year = {2021} +} +```