private static IVectorView[] SolveModelsWithNewmark(Model[] models, IModelReader[] modelReaders)
        {
            Vector[] initialValues = new Vector[models.Length];
            var      value0        = new Dictionary <int, double[]>();

            for (int i = 0; i < models.Length; i++)
            {
                double[] v0 = new double[models[i].Nodes.Count];
                value0.Add(i, v0);
            }
            foreach (Node node in models[0].Nodes)
            {
                value0[0][node.ID] = 1;
            }

            DenseMatrixSolver[] solvers = new DenseMatrixSolver[models.Length];
            IConvectionDiffusionIntegrationProvider[] providers = new IConvectionDiffusionIntegrationProvider[models.Length];
            IChildAnalyzer[] childAnalyzers = new IChildAnalyzer[models.Length];
            for (int i = 0; i < models.Length; i++)
            {
                initialValues[i] = Vector.CreateFromArray(value0[i]);
                //var builder = new DenseMatrixSolver.Builder();
                builder.IsMatrixPositiveDefinite = false;
                solvers[i]        = builder.BuildSolver(models[i]);
                providers[i]      = new ProblemConvectionDiffusion2(models[i], solvers[i]);
                childAnalyzers[i] = new LinearAnalyzer(models[i], solvers[i], providers[i]);
            }

            const double timestep       = .1;
            const double time           = 3;
            var          parentAnalyzer = new ConvectionDiffusionImplicitDynamicAnalyzerMultiModel(UpdateModels, models, solvers,
                                                                                                   providers, childAnalyzers, timestep, time, initialTemperature: initialValues);

            parentAnalyzer.Initialize();

            var structuralModel    = CreateStructuralModel(3e4, 0, new DynamicMaterial(.001, 0, 0, true), 0, new double[] { 1000, 0, 0 }, 1).Item1; // new Model();
            var structuralSolver   = structuralBuilder.BuildSolver(structuralModel);
            var structuralProvider = new ProblemStructural(structuralModel, structuralSolver);
            //var structuralChildAnalyzer = new LinearAnalyzer(structuralModel, structuralSolver, structuralProvider);
            var increments = 2;
            var structuralChildAnalyzerBuilder = new LoadControlAnalyzer.Builder(structuralModel, structuralSolver, structuralProvider, increments);

            structuralChildAnalyzerBuilder.ResidualTolerance             = 1E-6;
            structuralChildAnalyzerBuilder.MaxIterationsPerIncrement     = 50;
            structuralChildAnalyzerBuilder.NumIterationsForMatrixRebuild = 1;
            //childAnalyzerBuilder.SubdomainUpdaters = new[] { new NonLinearSubdomainUpdater(model.SubdomainsDictionary[subdomainID]) }; // This is the default
            LoadControlAnalyzer structuralChildAnalyzer = structuralChildAnalyzerBuilder.Build();
            var structuralParentAnalyzer = new NewmarkDynamicAnalyzer(UpdateNewmarkModel, structuralModel, structuralSolver,
                                                                      structuralProvider, structuralChildAnalyzer, timestep, time, 0.25, .5);

            structuralParentAnalyzer.Initialize();

            for (int i = 0; i < time / timestep; i++)
            {
                parentAnalyzer.SolveTimestep(i);
                structuralParentAnalyzer.SolveTimestep(i);
            }

            return(solvers.Select(x => x.LinearSystems[subdomainID].Solution).ToArray());
        }
Esempio n. 2
0
        private NewmarkDynamicAnalyzer(IStructuralModel model, ISolver solver, IImplicitIntegrationProvider provider,
                                       IChildAnalyzer childAnalyzer, double timeStep, double totalTime, double alpha, double delta)
        {
            this.model         = model;
            this.linearSystems = solver.LinearSystems;
            this.solver        = solver;
            this.provider      = provider;
            this.ChildAnalyzer = childAnalyzer;
            this.beta          = alpha;
            this.gamma         = delta;
            this.timeStep      = timeStep;
            this.totalTime     = totalTime;
            this.ChildAnalyzer.ParentAnalyzer = this;

            // Initialize coefficients. It would make sense for them to be initialized in a different function, if they could
            // change during the analysis
            a0 = 1 / (alpha * timeStep * timeStep);
            a1 = delta / (alpha * timeStep);
            a2 = 1 / (alpha * timeStep);
            a3 = 1 / (2 * alpha) - 1;
            a4 = delta / alpha - 1;
            a5 = timeStep * 0.5 * (delta / alpha - 2);
            a6 = timeStep * (1 - delta);
            a7 = delta * timeStep;
        }
Esempio n. 3
0
        public void SolveTimestep(int i)
        {
            Debug.WriteLine("Newmark step: {0}", i);

            if (CreateNewModel != null)
            {
                CreateNewModel(uu, uc, v, modelsForReplacement, solversForReplacement, providersForReplacement, childAnalyzersForReplacement);
                model         = modelsForReplacement[0];
                solver        = solversForReplacement[0];
                linearSystems = solver.LinearSystems;
                provider      = providersForReplacement[0];
                ChildAnalyzer = childAnalyzersForReplacement[0];
                ChildAnalyzer.ParentAnalyzer = this;

                InitializeInternal(true);
            }
            IDictionary <int, IVector> rhsVectors = provider.GetRhsFromHistoryLoad(i);

            foreach (var l in linearSystems.Values)
            {
                l.RhsVector = rhsVectors[l.Subdomain.ID];
            }
            InitializeRhs();
            CalculateRhsImplicit();

            DateTime start = DateTime.Now;

            ChildAnalyzer.Solve();
            DateTime end = DateTime.Now;

            UpdateVelocityAndAcceleration(i);
            UpdateResultStorages(start, end);
            // Print output results in *.txt file
            string path0 = Path.Combine(Directory.GetCurrentDirectory(), "MsolveOutput");
            var    path2 = Path.Combine(path0, $"MSolveHyperelasticDynamicsImplicitResults.txt");

            using (var fileName = new StreamWriter(path2, true))
            {
                double currentTime      = ((i + 1) * timeStep);
                string strTimeStep      = currentTime.ToString();
                var    totalSolution    = ChildAnalyzer.Responses[0][1];
                string strTotalSolution = totalSolution.ToString();
                fileName.WriteLine(strTimeStep + ", " + strTotalSolution);
            }
            //if (CreateNewModel != null)
            //{
            //    CreateNewModel(uu, uc, v, modelsForReplacement, solversForReplacement, providersForReplacement, childAnalyzersForReplacement);
            //    model = modelsForReplacement[0];
            //    solver = solversForReplacement[0];
            //    linearSystems = solver.LinearSystems;
            //    provider = providersForReplacement[0];
            //    ChildAnalyzer = childAnalyzersForReplacement[0];
            //    ChildAnalyzer.ParentAnalyzer = this;

            //    InitializeInternal(true);
            //}
        }
 public StaticAnalyzer(IStructuralModel model, ISolver solver, IStaticProvider provider,
                       IChildAnalyzer childAnalyzer)
 {
     this.model         = model;
     this.linearSystems = solver.LinearSystems;
     this.solver        = solver;
     this.provider      = provider;
     this.ChildAnalyzer = childAnalyzer;
     this.ChildAnalyzer.ParentAnalyzer = this;
 }
Esempio n. 5
0
        private static IVectorView[] SolveModels(Model[] models, ComsolMeshReader2[] modelReaders)
        {
            Vector[] initialTemps = new Vector[models.Length];
            var      temp0        = new Dictionary <int, double[]>();

            for (int i = 0; i < models.Length; i++)
            {
                double[] t0 = new double[models[i].Nodes.Count];
                temp0.Add(i, t0);
            }
            int[] boundaryIDs = new int[] { 0 };
            foreach (int boundaryID in boundaryIDs)
            {
                foreach (IList <Node> nodes in modelReaders[0].quadBoundaries[boundaryID])
                {
                    foreach (Node node in nodes)
                    {
                        temp0[0][node.ID] = 0;
                        temp0[1][node.ID] = 0;
                    }
                }
            }
            boundaryIDs = new int[] { 5 };
            foreach (int boundaryID in boundaryIDs)
            {
                foreach (IList <Node> nodes in modelReaders[0].quadBoundaries[boundaryID])
                {
                    foreach (Node node in nodes)
                    {
                        temp0[0][node.ID] = 1;
                        //temp0[1][node.ID] = 0;
                    }
                }
            }

            DenseMatrixSolver[] solvers = new DenseMatrixSolver[models.Length];
            IConvectionDiffusionIntegrationProvider[] providers = new IConvectionDiffusionIntegrationProvider[models.Length];
            IChildAnalyzer[] childAnalyzers = new IChildAnalyzer[models.Length];
            for (int i = 0; i < models.Length; i++)
            {
                initialTemps[i] = Vector.CreateFromArray(temp0[i]);
                //var builder = new DenseMatrixSolver.Builder();
                builder.IsMatrixPositiveDefinite = false;
                solvers[i]        = builder.BuildSolver(models[i]);
                providers[i]      = new ProblemConvectionDiffusion2(models[i], solvers[i]);
                childAnalyzers[i] = new LinearAnalyzer(models[i], solvers[i], providers[i]);
            }

            var parentAnalyzer = new ConvectionDiffusionImplicitDynamicAnalyzerMultiModel(UpdateModels, models, solvers, providers, childAnalyzers, .25, 5, initialTemperature: initialTemps);

            parentAnalyzer.Initialize();
            parentAnalyzer.Solve();

            return(solvers.Select(x => x.LinearSystems[subdomainID].Solution).ToArray());
        }
Esempio n. 6
0
            private double beta = 0.25, gamma = 0.5; // constant acceleration is the default

            public Builder(IStructuralModel model, ISolver solver, IImplicitIntegrationProvider provider,
                           IChildAnalyzer childAnalyzer, double timeStep, double totalTime)
            {
                this.model         = model;
                this.solver        = solver;
                this.provider      = provider;
                this.childAnalyzer = childAnalyzer;

                this.timeStep  = timeStep;
                this.totalTime = totalTime;
            }
Esempio n. 7
0
 /// <summary>
 /// Creates an instance that uses a specific problem type and an appropriate child analyzer for the construction of the system of equations arising from the actual physical problem
 /// </summary>
 /// <param name="model">Instance of the model to be solved</param>
 /// <param name="solver">Instance of the solver that will handle the solution of the system of equations</param>
 /// <param name="provider">Instance of the problem type to be solver</param>
 /// <param name="childAnalyzer">Instance of the child analyzer that will handle the solution of the system of equations</param>
 /// <param name="beta">Instance of parameter "beta" of the method that will be initialized</param>
 /// <param name="timeStep">Instance of the time step of the method that will be initialized</param>
 /// <param name="totalTime">Instance of the total time of the method that will be initialized</param>
 public ThermalDynamicAnalyzer(IModel model, ISolver solver, IImplicitIntegrationProvider provider,
                               IChildAnalyzer childAnalyzer, double beta, double timeStep, double totalTime)
 {
     this.model         = model;
     this.linearSystems = solver.LinearSystems;
     this.solver        = solver;
     this.provider      = provider;
     this.ChildAnalyzer = childAnalyzer;
     this.beta          = beta;
     this.timeStep      = timeStep;
     this.totalTime     = totalTime;
     this.ChildAnalyzer.ParentAnalyzer = this;
 }
Esempio n. 8
0
 public ODEDynamicAnalyzer(IStructuralModel model, ISolver solver, IImplicitIntegrationProvider provider,
                           IChildAnalyzer childAnalyzer, double beta, double timeStep, double totalTime, IVector initialValue = null)
 {
     this.model         = model;
     this.linearSystems = solver.LinearSystems;
     this.solver        = solver;
     //solver.PreventFromOverwrittingSystemMatrices(); //TODO: If the scheme is purely implicit we can overwrite the matrix.
     this.provider      = provider;
     this.ChildAnalyzer = childAnalyzer;
     this.beta          = beta;
     this.timeStep      = timeStep;
     this.totalTime     = totalTime;
     this.ChildAnalyzer.ParentAnalyzer = this;
 }
 public ConvectionDiffusionImplicitDynamicAnalyzer_Beta(IStructuralModel model, ISolver solver, IConvectionDiffusionIntegrationProvider provider,
                                                        IChildAnalyzer childAnalyzer, double timeStep, double totalTime, IVector initialTemperature = null)
 {
     this.model         = model;
     this.linearSystems = solver.LinearSystems;
     this.solver        = solver;
     //solver.PreventFromOverwrittingSystemMatrices(); //TODO: If the scheme is purely implicit we can overwrite the matrix.
     this.provider      = provider;
     this.ChildAnalyzer = childAnalyzer;
     this.timeStep      = timeStep;
     this.totalTime     = totalTime;
     this.ChildAnalyzer.ParentAnalyzer = this;
     this.initialTemperature           = initialTemperature;
 }
Esempio n. 10
0
        private static IVectorView[] SolveModels(Model[] models, IModelReader[] modelReaders)
        {
            Vector[] initialValues = new Vector[models.Length];
            var      value0        = new Dictionary <int, double[]>();

            for (int i = 0; i < models.Length; i++)
            {
                double[] v0 = new double[models[i].Nodes.Count];
                value0.Add(i, v0);
            }
            foreach (Node node in models[0].Nodes)
            {
                value0[0][node.ID] = 0; /* 0.96733;*/
            }

            DenseMatrixSolver[] solvers = new DenseMatrixSolver[models.Length];
            IConvectionDiffusionIntegrationProvider[] providers = new IConvectionDiffusionIntegrationProvider[models.Length];
            IChildAnalyzer[] childAnalyzers = new IChildAnalyzer[models.Length];
            for (int i = 0; i < models.Length; i++)
            {
                initialValues[i] = Vector.CreateFromArray(value0[i]);
                //var builder = new DenseMatrixSolver.Builder();
                builder.IsMatrixPositiveDefinite = false;
                solvers[i]        = builder.BuildSolver(models[i]);
                providers[i]      = new ProblemConvectionDiffusion2(models[i], solvers[i]);
                childAnalyzers[i] = new LinearAnalyzer(models[i], solvers[i], providers[i]);
            }

            const double timestep       = 1;
            const double time           = 3;
            var          parentAnalyzer = new ConvectionDiffusionImplicitDynamicAnalyzerMultiModel(UpdateModels, models, solvers,
                                                                                                   providers, childAnalyzers, timestep, time, initialTemperature: initialValues);

            parentAnalyzer.Initialize();

            for (int i = 0; i < time / timestep; i++)
            {
                parentAnalyzer.SolveTimestep(i);
            }

            return(solvers.Select(x => x.LinearSystems[subdomainID].Solution).ToArray());
        }
        private static IVectorView[] SolveModels(Model[] models)
        {
            SkylineSolver[] solvers = new SkylineSolver[models.Length];
            IImplicitIntegrationProvider[] providers = new IImplicitIntegrationProvider[models.Length];
            IChildAnalyzer[] childAnalyzers          = new IChildAnalyzer[models.Length];
            for (int i = 0; i < models.Length; i++)
            {
                //var builder = new DenseMatrixSolver.Builder();
                solvers[i]        = builder.BuildSolver(models[i]);
                providers[i]      = new ProblemStructural(models[i], solvers[i]);
                childAnalyzers[i] = new LinearAnalyzer(models[i], solvers[i], providers[i]);
            }

            var parentAnalyzer = new NewmarkDynamicAnalyzerMultiModel(UpdateModels, models, solvers, providers, childAnalyzers, 0.28, 3.36, .25, .5);

            parentAnalyzer.Initialize();
            parentAnalyzer.Solve();

            return(solvers.Select(x => x.LinearSystems[subdomainID].Solution).ToArray());
        }
        private static IVectorView[] SolveModels(Model[] models)
        {
            Vector[]            initialTemps = new Vector[models.Length];
            DenseMatrixSolver[] solvers      = new DenseMatrixSolver[models.Length];
            IConvectionDiffusionIntegrationProvider[] providers = new IConvectionDiffusionIntegrationProvider[models.Length];
            IChildAnalyzer[] childAnalyzers = new IChildAnalyzer[models.Length];
            for (int i = 0; i < models.Length; i++)
            {
                initialTemps[i]   = Vector.CreateFromArray(new double[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
                solvers[i]        = (new DenseMatrixSolver.Builder()).BuildSolver(models[i]);
                providers[i]      = new ProblemConvectionDiffusion(models[i], solvers[i]);
                childAnalyzers[i] = new LinearAnalyzer(models[i], solvers[i], providers[i]);
            }

            var parentAnalyzer = new ConvectionDiffusionDynamicAnalyzerMultiModel_Beta(UpdateModels, models, solvers, providers, childAnalyzers, 0.05, 5, initialTemperature: initialTemps);

            parentAnalyzer.Initialize();
            parentAnalyzer.Solve();

            return(solvers.Select(x => x.LinearSystems[subdomainID].Solution).ToArray());
        }
Esempio n. 13
0
        public void SolveTimestep(int i)
        {
            Debug.WriteLine("Newmark step: {0}", i);

            if (CreateNewModel != null)
            {
                CreateNewModel(uu, uc, v, modelsForReplacement, solversForReplacement, providersForReplacement, childAnalyzersForReplacement);
                model         = modelsForReplacement[0];
                solver        = solversForReplacement[0];
                linearSystems = solver.LinearSystems;
                provider      = providersForReplacement[0];
                ChildAnalyzer = childAnalyzersForReplacement[0];
                ChildAnalyzer.ParentAnalyzer = this;

                InitializeInternal(true);
            }
            IDictionary <int, IVector> rhsVectors = provider.GetRhsFromHistoryLoad(i);

            foreach (var l in linearSystems.Values)
            {
                l.RhsVector = rhsVectors[l.Subdomain.ID];
            }
            InitializeRhs();
            CalculateRhsImplicit();

            DateTime start = DateTime.Now;

            ChildAnalyzer.Solve();
            DateTime end = DateTime.Now;

            UpdateVelocityAndAcceleration(i);
            UpdateResultStorages(start, end);
            // Print output results in *.txt file
            if (i == 0)
            {
                using (var fileName = new StreamWriter(path))
                {
                    double currentTime   = ((i + 1) * timeStep);
                    string strTimeStep   = currentTime.ToString();
                    var    totalSolution = ChildAnalyzer.Responses[0][62]; //mesh446elem
                    //var totalSolution = ChildAnalyzer.Responses[0][1]; //meshXXCoarse254elem
                    //var totalSolution = ChildAnalyzer.Responses[0][57]; //meshXXCoarse
                    //var totalSolution = ChildAnalyzer.Responses[0][0]; //106TetCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][19]; //261TetCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][1]; //125HexaHyperelasticCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][13]; //4HexaHyperelasticCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][0]; //1Hexa
                    string strTotalSolution = totalSolution.ToString();
                    fileName.WriteLine(strTimeStep + " " + strTotalSolution);
                }
            }
            else
            {
                using (var fileName = new StreamWriter(path, true))
                {
                    double currentTime   = ((i + 1) * timeStep);
                    string strTimeStep   = currentTime.ToString();
                    var    totalSolution = ChildAnalyzer.Responses[0][62]; //mesh446elem
                    //var totalSolution = ChildAnalyzer.Responses[0][1]; //meshXXCoarse254elem
                    //var totalSolution = ChildAnalyzer.Responses[0][57]; //meshXXCoarse
                    //var totalSolution = ChildAnalyzer.Responses[0][0]; //106TetCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][19]; //261TetCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][1]; //125HexaHyperelasticCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][13]; //4HexaHyperelasticCube100m
                    //var totalSolution = ChildAnalyzer.Responses[0][0]; //1Hexa
                    string strTotalSolution = totalSolution.ToString();
                    fileName.WriteLine(strTimeStep + " " + strTotalSolution);
                }
            }
        }