public Microstructure2DplaneStress(IdegenerateRVEbuilder rveBuilder, Func <Model, ISolver> createSolver, bool EstimateOnlyLinearResponse, int database_size) { this.rveBuilder = rveBuilder; this.createSolver = createSolver; this.EstimateOnlyLinearResponse = EstimateOnlyLinearResponse; this.database_size = database_size; }
public void CalculateOriginalConstitutiveMatrixWithoutNLAnalysis() { ISolver solver; if (matrices_not_initialized) { this.InitializeMatrices(); this.InitializeData(); solver = createSolver(model); solver.OrderDofs(false); foreach (ILinearSystem linearSystem in solver.LinearSystems.Values) { linearSystem.Reset(); //TODO find out if new structures cause any problems linearSystem.Subdomain.Forces = Vector.CreateZero(linearSystem.Size); } this.InitializeFreeAndPrescribedDofsInitialDisplacementVectors(); } else { solver = createSolver(model); solver.OrderDofs(false); //v2.1. TODO: Is this needed in this case? foreach (ILinearSystem linearSystem in solver.LinearSystems.Values) { linearSystem.Reset(); } //solver.ResetSubdomainForcesVector(); } var elementProvider = new ElementStructuralStiffnessProvider(); #region INTEGRATION constitutive Matrix var integrationSimultaneous = new SubdomainCalculationsAndAssembly(); (Dictionary <int, double[][]> KfpDqSubdomains, Dictionary <int, double[][]> KppDqVectorsSubdomains) = integrationSimultaneous.UpdateSubdomainKffAndCalculateKfpDqAndKppDqpMultipleObje(model, elementProvider, scaleTransitions, boundaryNodes, boundaryElements, solver); Dictionary <int, double[][]> f2_vectorsSubdomains = SubdomainCalculationsMultiple.CalculateKffinverseKfpDqSubdomains(KfpDqSubdomains, model, elementProvider, scaleTransitions, boundaryNodes, solver); Dictionary <int, double[][]> f3_vectorsSubdomains = SubdomainCalculationsMultiple.CalculateKpfKffinverseKfpDqSubdomains(f2_vectorsSubdomains, model, elementProvider, scaleTransitions, boundaryNodes); double[][] f3_vectors = SubdomainCalculationsMultiple.CombineMultipleSubdomainsIntegrationVectorsIntoTotal(f3_vectorsSubdomains, scaleTransitions); double[][] KppDqVectors = SubdomainCalculationsMultiple.CombineMultipleSubdomainsIntegrationVectorsIntoTotal(KppDqVectorsSubdomains, scaleTransitions); double[][] f4_vectors = SubdomainCalculations.SubtractConsecutiveVectors(KppDqVectors, f3_vectors); double[,] DqCondDq = SubdomainCalculations.CalculateDqCondDq(f4_vectors, scaleTransitions, boundaryNodes); double[,] constitutiveMat = new double[DqCondDq.GetLength(0), DqCondDq.GetLength(1)]; for (int i1 = 0; i1 < DqCondDq.GetLength(0); i1++) { for (int i2 = 0; i2 < DqCondDq.GetLength(1); i2++) { constitutiveMat[i1, i2] = (1 / volume) * DqCondDq[i1, i2]; } } #endregion #region constitutive tensors transformation methods constitutiveMatrix = Matrix.CreateFromArray(constitutiveMat); #endregion //PrintMethodsForDebug(KfpDq, f2_vectors, f3_vectors, KppDqVectors, f4_vectors, DqCondDq, d2W_dfdf, Cijrs); this.modified = CheckIfConstitutiveMatrixChanged(); if (EstimateOnlyLinearResponse) { model = null; boundaryElements = null; boundaryNodes = null; rveBuilder = null; uInitialFreeDOFDisplacementsPerSubdomain = null; initialConvergedBoundaryDisplacements = null; Cijrs_prev = null; } }