private static Tuple <Model, IModelReader> CreateCancerTransportModel(double[] k, double[][] U, double[] TumcElement) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "mesh.mphtxt"); var modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); var materials = new ConvectionDiffusionMaterial[] { new ConvectionDiffusionMaterial(k[0], U[0], L[0]), new ConvectionDiffusionMaterial(k[1], U[1], L[1]) }; if (TumcElement == null) { TumcElement = new double[model.Elements.Count]; for (int i = 0; i < model.Elements.Count; i++) { TumcElement[i] = 0.96; } } double[] f = new double[model.Elements.Count]; int domainID = 1; foreach (Element element in modelReader.elementDomains[domainID]) { f[element.ID] = 1; var nodes = (IReadOnlyList <Node>)element.Nodes; var domainLoad = new ConvectionDiffusionDomainLoad(materials[domainID], f[element.ID], ThermalDof.Temperature); var bodyLoadElementFactory = new BodyLoadElementFactory(domainLoad, model); var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Tet4, nodes); model.BodyLoads.Add(bodyLoadElement); } return(new Tuple <Model, IModelReader>(model, modelReader)); }
private static void RunTest() { Model model = CreateModel(1, new double[] { 2, 2, 2 }, 0).Item1; ComsolMeshReader2 modelReader = CreateModel(1, new double[] { 2, 2, 2 }, 0).Item2; IVectorView solution = SolveModel(model, modelReader); Assert.True(CompareResults(solution)); }
private static void RunTest() { double diff = 1e-4; double conv = 2e-4; Model model = CreateModel(diff, new double[] { conv, conv, conv }, 0).Item1; ComsolMeshReader2 modelReader = CreateModel(diff, new double[] { conv, conv, conv }, 0).Item2; IVectorView solution = SolveModel(model, modelReader); Assert.True(CompareResults(solution)); }
private static IVectorView SolveModel(Model model, ComsolMeshReader2 modelReader) { //var initialTemp = Vector.CreateZero(model.Nodes.Count); double[] temp0 = new double[model.Nodes.Count]; int[] boundaryIDs = new int[] { 0 }; foreach (int boundaryID in boundaryIDs) { foreach (IList <Node> nodes in modelReader.triBoundaries[boundaryID]) { foreach (Node node in nodes) { temp0[node.ID] = 1; } } } boundaryIDs = new int[] { 5 }; foreach (int boundaryID in boundaryIDs) { foreach (IList <Node> nodes in modelReader.triBoundaries[boundaryID]) { foreach (Node node in nodes) { temp0[node.ID] = 0; } } } Vector initialTemp = Vector.CreateFromArray(temp0); var builder = new DenseMatrixSolver.Builder(); builder.IsMatrixPositiveDefinite = false; var solver = builder.BuildSolver(model); var provider = new ProblemConvectionDiffusion(model, solver); var childAnalyzer = new LinearAnalyzer(model, solver, provider); //var parentAnalyzer = new BDF(model, solver, provider, childAnalyzer, 1, 10, 1, initialTemp); var parentAnalyzer = new ConvectionDiffusionExplicitDynamicAnalyzer(model, solver, provider, childAnalyzer, 2.5e-3, 5, initialTemp); parentAnalyzer.Initialize(); parentAnalyzer.Solve(); return(parentAnalyzer.temperature[subdomainID]); //return parentAnalyzer.temperature[1][subdomainID]; // return solver.LinearSystems[subdomainID].Solution; }
private static Tuple <Model, IModelReader> CreateGrowthModel(double k, double[] U, double L, double[] lgr) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "mesh.mphtxt"); var modelReader = new ComsolMeshReader2(filename, new double[] { k, k }, new double[][] { U, U }, new double[] { L, 0 }); Model model = modelReader.CreateModelFromFile(); if (lgr == null) { lgr = new double[model.Elements.Count]; for (int i = 0; i < model.Elements.Count; i++) { lgr[i] = 1; } } if (c_oxElement == null) { c_oxElement = new double[model.Elements.Count]; for (int i = 0; i < model.Elements.Count; i++) { c_oxElement[i] = 0;/* 0.9673;*/ } } var materialODE = new ConvectionDiffusionMaterial(k, U, L); double[] Grox = new double[model.Elements.Count]; double[] fg = new double[model.Elements.Count]; int[] domainIDs = new int[] { 0, }; foreach (int domainID in domainIDs) { foreach (Element element in modelReader.elementDomains[domainID]) { Grox[element.ID] = (loxc[domainID] * cvox * c_oxElement[element.ID]) / (cvox * c_oxElement[element.ID] + Koxc[domainID]); fg[element.ID] = 24d * 3600d * Grox[element.ID] * lgr[element.ID] / 3d; var nodes = (IReadOnlyList <Node>)element.Nodes; var domainLoad = new ConvectionDiffusionDomainLoad(materialODE, fg[element.ID], ThermalDof.Temperature); var bodyLoadElementFactory = new BodyLoadElementFactory(domainLoad, model); var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Tet4, nodes); model.BodyLoads.Add(bodyLoadElement); } } return(new Tuple <Model, IModelReader>(model, modelReader)); }
private static Tuple <Model, IModelReader> CreateOxygenTransportModel(double[] k, double[][] U, double[] L, double[] coxElement) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "mesh.mphtxt"); var modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); var materials = new ConvectionDiffusionMaterial[] { new ConvectionDiffusionMaterial(k[0], U[0], L[0]), new ConvectionDiffusionMaterial(k[1], U[1], L[1]) }; if (coxElement == null) { coxElement = new double[model.Elements.Count]; for (int i = 0; i < model.Elements.Count; i++) { coxElement[i] = 0;/* 0.9673;*/ } } double[] fox = new double[model.Elements.Count]; int[] domainIDs = new int[] { 0, 1 }; foreach (int domainID in domainIDs) { foreach (Element element in modelReader.elementDomains[domainID]) { if (domainID == 0) { fox[element.ID] = (Dox[domainID] / Lwv * 7e3 - ((Aox[domainID] * coxElement[element.ID]) / (kox[domainID] + coxElement[element.ID] * cvox)) * 0.3) * (24d * 3600d); } else { fox[element.ID] = Dox[domainID] / Lwv * 7e3 * (24d * 3600d); } var nodes = (IReadOnlyList <Node>)element.Nodes; var domainLoad = new ConvectionDiffusionDomainLoad(materials[domainID], fox[element.ID], ThermalDof.Temperature); var bodyLoadElementFactory = new BodyLoadElementFactory(domainLoad, model); var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Tet4, nodes); model.BodyLoads.Add(bodyLoadElement); } } return(new Tuple <Model, IModelReader>(model, modelReader)); }
private static Tuple <Model, IModelReader> CreateConvectionDiffusionModel2(double k, double[] U, double L, double b, double f, double bl) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "9hexa.mphtxt"); var modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); var material = new ConvectionDiffusionMaterial(k, U, L); //Boundary Conditions var flux1 = new FluxLoad(f); var dir1 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, b)); }); //var dir2 = new DirichletDistribution(list => //{ // return Vector.CreateWithValue(list.Count, b2); //}); var weakDirichlet1 = new WeakDirichlet(dir1, k); //var weakDirichlet2 = new WeakDirichlet(dir2, k); var dirichletFactory1 = new SurfaceLoadElementFactory(weakDirichlet1); //var dirichletFactory2 = new SurfaceLoadElementFactory(weakDirichlet2); var fluxFactory1 = new SurfaceLoadElementFactory(flux1); var boundaryFactory3D = new SurfaceBoundaryFactory3D(0, new ConvectionDiffusionMaterial(k, new double[] { 0, 0, 0 }, 0)); int[] domainIDs = new int[] { 0, }; foreach (int domainID in domainIDs) { foreach (Element element in modelReader.elementDomains[domainID]) { ////IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); var bodyLoadElementCellType = element.ElementType.CellType; var nodes = (IReadOnlyList <Node>)element.Nodes; var domainLoad = new ConvectionDiffusionDomainLoad(material, bl, ThermalDof.Temperature); var bodyLoadElementFactory = new BodyLoadElementFactory(domainLoad, model); var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Hexa8, nodes); model.BodyLoads.Add(bodyLoadElement); //var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } //foreach (Node node in model.Nodes) //{ // model.Loads.Add(new Load() { Amount = bl[node.ID], Node = node, DOF = ThermalDof.Temperature }); //} int[] boundaryIDs = new int[] { 0, }; int QuadID = model.ElementsDictionary.Count + 1; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.quadBoundaries[boundaryID]) { //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); //var dirichletElement1 = dirichletFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(dirichletElement1); //var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); //var element = new Element(); //element.ID = QuadID; //element.ElementType = SurfaceBoundaryElement; //model.SubdomainsDictionary[0].Elements.Add(element); //model.ElementsDictionary.Add(QuadID, element); //foreach (Node node in nodes) //{ // element.AddNode(node); //} //QuadID += 1; } } boundaryIDs = new int[] { 5 }; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.quadBoundaries[boundaryID]) { //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); //var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(bodyLoadElement); //var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); //var element = new Element(); //element.ID = QuadID; //element.ElementType = SurfaceBoundaryElement; //model.SubdomainsDictionary[0].Elements.Add(element); //model.ElementsDictionary.Add(QuadID, element); //foreach (Node node in nodes) //{ // element.AddNode(node); //} //QuadID += 1; } } return(new Tuple <Model, IModelReader>(model, modelReader)); }
private static Tuple <Model, ComsolMeshReader2> CreateModel(double k, double[] U, double L) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "mesh.mphtxt"); ComsolMeshReader2 modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); //Boundary Conditions var flux1 = new FluxLoad(6.9e08); var flux2 = new FluxLoad(10); var dir1 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, 1)); }); var dir2 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, 0)); }); var weakDirichlet1 = new WeakDirichlet(dir1, k); var weakDirichlet2 = new WeakDirichlet(dir2, k); var dirichletFactory1 = new SurfaceLoadElementFactory(weakDirichlet1); var dirichletFactory2 = new SurfaceLoadElementFactory(weakDirichlet2); var fluxFactory1 = new SurfaceLoadElementFactory(flux1); var fluxFactory2 = new SurfaceLoadElementFactory(flux2); var boundaryFactory3D = new SurfaceBoundaryFactory3D(0, new ConvectionDiffusionMaterial(k, new double[] { 0, 0, 0 }, 0)); int[] boundaryIDs = new int[] { 0, 1, 2 }; //int numberOfQuadElements = 0; //for ( int i = 0; i<boundaryIDs.Length; i++) //{ // numberOfQuadElements += modelReader.quadBoundaries[boundaryIDs[i]].Count; //} int TriID = model.ElementsDictionary.Count + 1; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.triBoundaries[boundaryID]) { //var fluxElement1 = fluxFactory1.CreateElement(CellType.Tri3, nodes); //model.SurfaceLoads.Add(fluxElement1); var dirichletElement1 = dirichletFactory1.CreateElement(CellType.Tri3, nodes); model.SurfaceLoads.Add(dirichletElement1); var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Tri3, nodes); var element = new Element(); element.ID = TriID; element.ElementType = SurfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(TriID, element); foreach (Node node in nodes) { element.AddNode(node); } TriID += 1; // var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } boundaryIDs = new int[] { 5 }; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.quadBoundaries[boundaryID]) { // //IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; // //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); // //model.SurfaceLoads.Add(fluxElement1); var dirichletElement2 = dirichletFactory2.CreateElement(CellType.Quad4, nodes); model.SurfaceLoads.Add(dirichletElement2); var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); var element = new Element(); element.ID = TriID; element.ElementType = SurfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(TriID, element); foreach (Node node in nodes) { element.AddNode(node); } TriID += 1; // // var surfaceElement = new SurfaceLoadElement(); // //element.ID = TriID; // //surfaceElement.ElementType = DirichletElement1; // //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); // //model.ElementsDictionary.Add(TriID, surfaceElement); // //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } //boundaryIDs = new int[] { 1, 2, 3, 4 }; //foreach (int boundaryID in boundaryIDs) //{ // foreach (Element element in modelReader.elementBoundaries[boundaryID]) // { // IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; // var fluxElement = fluxFactory.CreateElement(CellType.Quad4, nodes); // model.SurfaceLoads.Add(fluxElement); // } //} return(new Tuple <Model, ComsolMeshReader2>(model, modelReader)); }
private static void RunTest() { Model model = CreateModel(1, new double[] { 2, 2, 2 }, 0).Item1; ComsolMeshReader2 modelReader = CreateModel(1, new double[] { 2, 2, 2 }, 0).Item2; string path0 = @"C:\Users\Ody\Documents\Marie Curie\comsolModels\MsolveOutput"; string path3 = Path.Combine(Directory.GetCurrentDirectory(), "CDcubeOutput.vtu"); //var path2 = Path.Combine(path0, $"nodes.txt"); IVectorView solution = SolveModel(model, modelReader); var numberOfPoints = model.Nodes.Count; var numberOfCells = model.Elements.Count; using (StreamWriter outputFile = new StreamWriter(path3)) { outputFile.WriteLine("<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\">"); outputFile.WriteLine(" <UnstructuredGrid>"); outputFile.WriteLine($" <Piece NumberOfPoints=\"{numberOfPoints}\" NumberOfCells=\"{numberOfCells}\">"); outputFile.WriteLine(" <Points>"); outputFile.WriteLine(" <DataArray type=\"Float64\" Name=\"position\" NumberOfComponents=\"3\" format =\"ascii\">"); for (int i = 0; i < numberOfPoints; i++) { outputFile.WriteLine($"{model.Nodes[i].X} {model.Nodes[i].Y} {model.Nodes[i].Z} "); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" </Points>"); outputFile.WriteLine(" <PointData>"); outputFile.WriteLine(" <DataArray type=\"Int32\" Name=\"node_ID\" NumberOfComponents=\"1\" format=\"ascii\">"); for (int i = 0; i < numberOfPoints; i++) { outputFile.WriteLine($"{i + 1}"); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" <DataArray type=\"Float64\" Name=\"solution\" NumberOfComponents=\"1\" format=\"ascii\">"); for (int i = 0; i < numberOfPoints; i++) { outputFile.WriteLine($"{solution[i]} "); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" </PointData>"); outputFile.WriteLine(" <CellData>"); outputFile.WriteLine(" <DataArray type=\"Int32\" Name=\"element_ID\" NumberOfComponents=\"1\" format=\"ascii\">"); for (int i = 0; i < numberOfCells; i++) { outputFile.WriteLine($"{i + 1}"); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" </CellData>"); outputFile.WriteLine(" <Cells>"); outputFile.WriteLine(" <DataArray type=\"Int32\" Name=\"connectivity\">"); for (int i = 0; i < numberOfCells; i++) { for (int j = 0; j < model.Elements[i].Nodes.Count; j++) { outputFile.Write($"{model.Elements[i].Nodes[j].ID} "); } outputFile.WriteLine(""); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" <DataArray type=\"Int32\" Name=\"offsets\" NumberOfComponents=\"1\" format=\"ascii\">"); var offset = 0; for (int i = 0; i < numberOfCells; i++) { offset += model.Elements[i].Nodes.Count; outputFile.WriteLine($"{offset} "); } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" <DataArray type=\"Int32\" Name =\"types\" NumberOfComponents =\"1\" format=\"ascii\">"); for (int i = 0; i < numberOfCells; i++) { if (model.Elements[i].Nodes.Count == 4) { outputFile.WriteLine($"{10} "); } else { outputFile.WriteLine($"{5} "); } } outputFile.WriteLine(" </DataArray>"); outputFile.WriteLine(" </Cells>"); outputFile.WriteLine(" </Piece>"); outputFile.WriteLine(" </UnstructuredGrid>"); outputFile.WriteLine("</VTKFile>"); } Assert.True(CompareResults(solution)); }
private static Tuple <Model, ComsolMeshReader2> CreateModel(double k, double[] U, double L, double b1, double b2, double f1, double f2, double[] bl) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "9hexa.mphtxt"); ComsolMeshReader2 modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); //Boundary Conditions var flux1 = new FluxLoad(f1); var flux2 = new FluxLoad(f2); var dir1 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, b1)); }); var dir2 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, b2)); }); var weakDirichlet1 = new WeakDirichlet(dir1, k); var weakDirichlet2 = new WeakDirichlet(dir2, k); var dirichletFactory1 = new SurfaceLoadElementFactory(weakDirichlet1); var dirichletFactory2 = new SurfaceLoadElementFactory(weakDirichlet2); var fluxFactory1 = new SurfaceLoadElementFactory(flux1); var fluxFactory2 = new SurfaceLoadElementFactory(flux2); var boundaryFactory3D = new SurfaceBoundaryFactory3D(0, new ConvectionDiffusionMaterial(k, new double[] { 0, 0, 0 }, 0)); foreach (Node node in model.Nodes) { model.Loads.Add(new Load() { Amount = bl[node.ID], Node = node, DOF = ThermalDof.Temperature }); } int[] boundaryIDs = new int[] { 0, }; int QuadID = model.ElementsDictionary.Count + 1; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.quadBoundaries[boundaryID]) { var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); model.SurfaceLoads.Add(fluxElement1); var dirichletElement1 = dirichletFactory1.CreateElement(CellType.Quad4, nodes); model.SurfaceLoads.Add(dirichletElement1); var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); var element = new Element(); element.ID = QuadID; element.ElementType = SurfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(QuadID, element); foreach (Node node in nodes) { element.AddNode(node); } QuadID += 1; } } boundaryIDs = new int[] { 5 }; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.quadBoundaries[boundaryID]) { var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); model.SurfaceLoads.Add(fluxElement1); var dirichletElement2 = dirichletFactory2.CreateElement(CellType.Quad4, nodes); model.SurfaceLoads.Add(dirichletElement2); var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); var element = new Element(); element.ID = QuadID; element.ElementType = SurfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(QuadID, element); foreach (Node node in nodes) { element.AddNode(node); } QuadID += 1; } } return(new Tuple <Model, ComsolMeshReader2>(model, modelReader)); }
private static Tuple <Model, IModelReader> CreateOxygenTransportModel(double[] k, double[][] U, double[] L, double[] cox) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "mesh.mphtxt"); var modelReader = new ComsolMeshReader2(filename, k, U, L); Model model = modelReader.CreateModelFromFile(); var materials = new ConvectionDiffusionMaterial[] { new ConvectionDiffusionMaterial(k[0], U[0], L[0]), new ConvectionDiffusionMaterial(k[1], U[1], L[1]) }; //Boundary Conditions //var flux1 = new FluxLoad(f); //var dir1 = new DirichletDistribution(list => { // return Vector.CreateWithValue(list.Count, b); //}); //var dir2 = new DirichletDistribution(list => //{ // return Vector.CreateWithValue(list.Count, b2); //}); //var weakDirichlet1 = new WeakDirichlet(dir1, k); //var weakDirichlet2 = new WeakDirichlet(dir2, k); //var dirichletFactory1 = new SurfaceLoadElementFactory(weakDirichlet1); //var dirichletFactory2 = new SurfaceLoadElementFactory(weakDirichlet2); //var fluxFactory1 = new SurfaceLoadElementFactory(flux1); //var boundaryFactory3D = new SurfaceBoundaryFactory3D(0, // new ConvectionDiffusionMaterial(k, new double[] { 0, 0, 0 }, 0)); if (cox == null) { cox = new double[model.Nodes.Count]; for (int i = 0; i < model.Nodes.Count; i++) { cox[i] = 0;/* 0.9673;*/ } } double[] fox = new double[model.Elements.Count]; int[] domainIDs = new int[] { 0, 1 }; var coxElement = new double[model.Elements.Count]; foreach (var e in model.Elements) { coxElement[e.ID] = 0; for (int i = 0; i < e.Nodes.Count; i++) { coxElement[e.ID] += cox[i] / (e.Nodes.Count); } } foreach (int domainID in domainIDs) { //foreach (Element element in modelReader.nodeDomains[domainID]) //{ // if (domainID == 0) // { // fox[element.ID] = (Dox[domainID]/Lwv * (1 - coxElement[element.ID])-((Aox[domainID]* coxElement[element.ID])/(kox[domainID]+ coxElement[element.ID]*cvox))*0.3)*(24d * 3600d); // } // else // { // fox[element.ID] = Dox[domainID] / Lwv * (1 - cox[element.ID])*(24d*3600d); // } // model.Loads.Add(new Load() { Node = element, DOF = ThermalDof.Temperature, Amount = fox[element.ID] }); //} foreach (Element element in modelReader.elementDomains[domainID]) { //IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); if (domainID == 0) { fox[element.ID] = (Dox[domainID] / Lwv * 7e3 - ((Aox[domainID] * coxElement[element.ID]) / (kox[domainID] + coxElement[element.ID] * cvox)) * 0.3) * (24d * 3600d); } else { fox[element.ID] = Dox[domainID] / Lwv * 7e3 * (24d * 3600d); } var nodes = (IReadOnlyList <Node>)element.Nodes; var domainLoad = new ConvectionDiffusionDomainLoad(materials[domainID], fox[element.ID], ThermalDof.Temperature); var bodyLoadElementFactory = new BodyLoadElementFactory(domainLoad, model); var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Tet4, nodes); model.BodyLoads.Add(bodyLoadElement); //var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } //foreach (Node node in model.Nodes) //{ // model.Loads.Add(new Load() { Amount = bl[node.ID], Node = node, DOF = ThermalDof.Temperature }); //} //int[] boundaryIDs = new int[] { 0, }; //int QuadID = model.ElementsDictionary.Count + 1; //foreach (int boundaryID in boundaryIDs) //{ // foreach (IReadOnlyList<Node> nodes in modelReader.quadBoundaries[boundaryID]) // { // //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); // //model.SurfaceLoads.Add(fluxElement1); // //var dirichletElement1 = dirichletFactory1.CreateElement(CellType.Quad4, nodes); // //model.SurfaceLoads.Add(dirichletElement1); // //var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); // //var element = new Element(); // //element.ID = QuadID; // //element.ElementType = SurfaceBoundaryElement; // //model.SubdomainsDictionary[0].Elements.Add(element); // //model.ElementsDictionary.Add(QuadID, element); // //foreach (Node node in nodes) // //{ // // element.AddNode(node); // //} // //QuadID += 1; // } //} //boundaryIDs = new int[] { 5 }; //foreach (int boundaryID in boundaryIDs) //{ // foreach (IReadOnlyList<Node> nodes in modelReader.quadBoundaries[boundaryID]) // { // //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); // //model.SurfaceLoads.Add(fluxElement1); // //var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Quad4, nodes); // //model.SurfaceLoads.Add(bodyLoadElement); // //var SurfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Quad4, nodes); // //var element = new Element(); // //element.ID = QuadID; // //element.ElementType = SurfaceBoundaryElement; // //model.SubdomainsDictionary[0].Elements.Add(element); // //model.ElementsDictionary.Add(QuadID, element); // //foreach (Node node in nodes) // //{ // // element.AddNode(node); // //} // //QuadID += 1; // } //} return(new Tuple <Model, IModelReader>(model, modelReader)); }
private static Tuple <Model, ComsolMeshReader2> CreateModel(double k, double[] U, double L) { string filename = Path.Combine(Directory.GetCurrentDirectory(), "InputFiles", "TumorGrowthModel", "fullModel.mphtxt"); ComsolMeshReader2 modelReader = new ComsolMeshReader2(filename, new double[] { k }, new double[][] { U }, new double[] { L }); Model model = modelReader.CreateModelFromFile(); //Boundary Conditions var bodyLoad = new ConvectionDiffusionDomainLoad(new ConvectionDiffusionMaterial(k, U, L), 1, ThermalDof.Temperature); var flux1 = new FluxLoad(1); var flux2 = new FluxLoad(10); var dir1 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, 1)); }); var dir2 = new DirichletDistribution(list => { return(Vector.CreateWithValue(list.Count, 0)); }); var weakDirichlet1 = new WeakDirichlet(dir1, k); var weakDirichlet2 = new WeakDirichlet(dir2, k); var bodyLoadElementFactory = new BodyLoadElementFactory(bodyLoad, model); var dirichletFactory1 = new SurfaceLoadElementFactory(weakDirichlet1); var dirichletFactory2 = new SurfaceLoadElementFactory(weakDirichlet2); var fluxFactory1 = new SurfaceLoadElementFactory(flux1); var fluxFactory2 = new SurfaceLoadElementFactory(flux2); var boundaryFactory3D = new SurfaceBoundaryFactory3D(0, new ConvectionDiffusionMaterial(k, new double[] { 0, 0, 0 }, 0)); int[] domainIDs = new int[] { 0, }; foreach (int domainID in domainIDs) { foreach (Element element in modelReader.elementDomains[domainID]) { //IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); //var bodyLoadElementCellType = element.ElementType.CellType; //var nodes = (IReadOnlyList<Node>)element.Nodes; //var bodyLoadElement = bodyLoadElementFactory.CreateElement(CellType.Hexa8, nodes); //model.BodyLoads.Add(bodyLoadElement); // var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } //foreach (Node node in model.Nodes) //{ // model.Loads.Add(new Load() { Amount = .25, Node = node, DOF = ThermalDof.Temperature }); //} int[] boundaryIDs = new int[] { 0, 1, 2, 3, 4, 7 }; int TriID = model.ElementsDictionary.Count + 1; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.triBoundaries[boundaryID]) { //IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; //var fluxElement1 = fluxFactory1.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement1); var dirichletElement1 = dirichletFactory1.CreateElement(CellType.Tri3, nodes); model.SurfaceLoads.Add(dirichletElement1); var surfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Tri3, nodes); var element = new Element(); element.ID = TriID; element.ElementType = surfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(TriID, element); foreach (Node node in nodes) { element.AddNode(node); } TriID += 1; // var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } boundaryIDs = new int[] { 6, 8, 9 }; foreach (int boundaryID in boundaryIDs) { foreach (IReadOnlyList <Node> nodes in modelReader.triBoundaries[boundaryID]) { //IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; //var fluxElement2 = fluxFactory2.CreateElement(CellType.Quad4, nodes); //model.SurfaceLoads.Add(fluxElement2); var dirichletElement2 = dirichletFactory2.CreateElement(CellType.Tri3, nodes); model.SurfaceLoads.Add(dirichletElement2); var surfaceBoundaryElement = boundaryFactory3D.CreateElement(CellType.Tri3, nodes); var element = new Element(); element.ID = TriID; element.ElementType = surfaceBoundaryElement; model.SubdomainsDictionary[0].Elements.Add(element); model.ElementsDictionary.Add(TriID, element); foreach (Node node in nodes) { element.AddNode(node); } TriID += 1; // var surfaceElement = new SurfaceLoadElement(); //element.ID = TriID; //surfaceElement.ElementType = DirichletElement1; //model.SubdomainsDictionary[0].Elements.Add(dirichletElement1); //model.ElementsDictionary.Add(TriID, surfaceElement); //model.NodesDictionary[surfaceElement.ID].Constraints.Add(new Constraint() { DOF = ThermalDof.Temperature, Amount = 100 }); } } //boundaryIDs = new int[] { 1, 2, 3, 4 }; //foreach (int boundaryID in boundaryIDs) //{ // foreach (Element element in modelReader.elementBoundaries[boundaryID]) // { // IReadOnlyList<Node> nodes = (IReadOnlyList<Node>)element.Nodes; // var fluxElement = fluxFactory.CreateElement(CellType.Quad4, nodes); // model.SurfaceLoads.Add(fluxElement); // } //} return(new Tuple <Model, ComsolMeshReader2>(model, modelReader)); }