/// <summary> /// Create a derived frame system using a change of basis matrix for the basis vectors /// </summary> /// <param name="baseFrame">The base frame. It may be any kind of frame</param> /// <param name="cbm">The 'Change Of Basis Vectors' matrix. It must be invertable</param> /// <returns></returns> public static GaSymMetricNonOrthogonal CreateDerivedCbmFrameSystem(GaSymFrame baseFrame, MathematicaMatrix cbm) { var baseIpm = baseFrame.Ipm.ToMathematicaMatrix(); var cbmTrans = (MathematicaMatrix)cbm.Transpose(); var cbmInverseTrans = (MathematicaMatrix)cbmTrans.Inverse(); var ipm = cbm * baseIpm * cbmTrans; var baseToDerivedCba = cbmInverseTrans.ToOutermorphismTree(); var derivedToBaseCba = cbmTrans.ToOutermorphismTree(); if (ipm.IsDiagonal()) { var derivedFrame = CreateOrthogonal(ipm.GetDiagonal()); return(new GaSymMetricNonOrthogonal(baseFrame, derivedFrame, derivedToBaseCba, baseToDerivedCba)); } if (baseFrame.IsOrthogonal) { var derivedFrame = new GaSymFrameNonOrthogonal(baseFrame, ipm, derivedToBaseCba, baseToDerivedCba); return(derivedFrame.NonOrthogonalMetric); } var gaFrame = //new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm); CreateNonOrthogonalFromIpm(ipm.ToMathematicaMatrix()); return(gaFrame.NonOrthogonalMetric); //return new DerivedFrameSystem(baseFrame, gaFrame, derivedToBaseOm, baseToDerivedOm); }
/// <summary> /// Create a derived frame system using a change of basis matrix for the basis vectors /// </summary> /// <param name="baseFrame">The base frame. It may be any kind of frame</param> /// <param name="cbm">The 'Change Of Basis Vectors' matrix. It must be invertable</param> /// <returns></returns> public static DerivedFrameSystem CreateDerivedCbmFrameSystem(GaFrame baseFrame, MathematicaMatrix cbm) { var baseIpm = baseFrame.Ipm.ToMathematicaMatrix(); var cbmTrans = (MathematicaMatrix)cbm.Transpose(); var cbmInverseTrans = (MathematicaMatrix)cbmTrans.Inverse(); var ipm = cbm * baseIpm * cbmTrans; var baseToDerivedOm = GaOuterMorphismFull.Create(cbmInverseTrans); var derivedToBaseOm = GaOuterMorphismFull.Create(cbmTrans); if (ipm.IsDiagonal()) { var derivedFrame = CreateOrthogonal(ipm.GetDiagonal()); return(new DerivedFrameSystem(baseFrame, derivedFrame, derivedToBaseOm, baseToDerivedOm)); } if (baseFrame.IsOrthogonal) { var derivedFrame = new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm); return(derivedFrame.Dfs); } var gaFrame = //new GaFrameNonOrthogonal(baseFrame, ipm, derivedToBaseOm, baseToDerivedOm); CreateNonOrthogonalFromIpm(ipm.ToMathematicaMatrix()); return(gaFrame.Dfs); //return new DerivedFrameSystem(baseFrame, gaFrame, derivedToBaseOm, baseToDerivedOm); }