예제 #1
0
        /// <summary>
        /// Converts v0.1 Broombridge to v0.2.
        /// </summary>
        /// <param name="input">Source Broombridge in v0.1 format.</param>
        /// <returns>Converted Broombridge in v0.2 format.</returns>
        public static V0_2.Data Update(V0_1.Data input)
        {
            var output = new V0_2.Data()
            {
                Schema              = input.Schema,
                Format              = input.Format,
                Generator           = input.Generator,
                Bibliography        = input.Bibliography,
                ProblemDescriptions = new List <V0_2.ProblemDescription>()
            };

            foreach (var integralSet in input.IntegralSets)
            {
                var problemDescription = new V0_2.ProblemDescription()
                {
                    Metadata         = integralSet.Metadata,
                    BasisSet         = integralSet.BasisSet,
                    Geometry         = integralSet.Geometry,
                    CoulombRepulsion = integralSet.CoulombRepulsion,
                    ScfEnergy        = integralSet.ScfEnergy,
                    ScfEnergyOffset  = integralSet.ScfEnergyOffset,
                    FciEnergy        = integralSet.FciEnergy,
                    NOrbitals        = integralSet.NOrbitals,
                    NElectrons       = integralSet.NElectrons,
                    EnergyOffset     = integralSet.EnergyOffset,
                    Hamiltonian      = integralSet.Hamiltonian,
                    InitialStates    = new List <V0_2.State>()
                };



                if (integralSet.SuggestedState != null)
                {
                    foreach (var sourceInitialState in integralSet.SuggestedState)
                    {
                        var initialState = new V0_2.State()
                        {
                            Label         = sourceInitialState.SuggestedStateData.Label,
                            Energy        = sourceInitialState.SuggestedStateData.Energy,
                            Method        = V0_2.UpdaterStrings.SparseMultiConfigurational,
                            Superposition = sourceInitialState.SuggestedStateData.Superposition
                        };

                        problemDescription.InitialStates.Add(initialState);
                    }
                }

                output.ProblemDescriptions.Add(problemDescription);
            }

            return(output);
        }
        // Parses all wavefunctions.
        internal static (StateType, double, object) ToWavefunction(V0_2.State state)
        {
            StateType             method          = ParseInitialStateMethod(state.Method);
            double                energy          = state.Energy != null ? state.Energy.Value : 0.0;
            List <List <string> > superposition   = state.Superposition ?? new List <List <string> >();
            ClusterOperator       clusterOperator = state.ClusterOperator;
            object                outputState;

            if (method == StateType.SparseMultiConfigurational)
            {
                outputState = ToSparseMultiCFWavefunction(superposition);
            }
            else if (method == StateType.UnitaryCoupledCluster)
            {
                outputState = ToUnitaryCCWavefunction(clusterOperator);
            }
            else
            {
                throw new System.ArgumentException($"initial state `{state.Label}` is not recognized or implemented.");
            }
            return(method, energy, outputState);
        }