public void ComputeForces() { ResetCell(); for (int i = 0; i < edgeCount(); i++) { //edges[i].force = MGModel.Force(edges[i].length(), MGModel.u0, edges[i].l0); edges[i].force = MGModel.Force(edges[i].length(), MGModel.J[tissueId, tissueId], edges[i].l0); } for (int i = 0; i < nucleusEdges.getCount(); i++) { //nucleusEdges[i].force = MGModel.Force(nucleusEdges[i].length(), MGModel.u0, nucleusEdges[i].l0); nucleusEdges[i].force = MGModel.Force(nucleusEdges[i].length(), MGModel.J[tissueId, tissueId], nucleusEdges[i].l0); //Console.WriteLine(cellId + ", " + i + ", " + nucleusEdges[i].force + "; " + nucleusEdges[i].l0 + "; " + nucleusEdges[i].length()); } for (int i = 0; i < edgeCount(); i++) { edges[i].ends[0].internalForces += edges[i].force * edges[i].UnitVector(); edges[i].ends[1].internalForces -= edges[i].force * edges[i].UnitVector(); } for (int i = 0; i < nucleusEdges.getCount(); i++) { nucleusEdges[i].ends[0].nucleusForce0 += nucleusEdges[i].force * nucleusEdges[i].UnitVector(); nucleusEdges[i].ends[1].force -= nucleusEdges[i].force * nucleusEdges[i].UnitVector(); } for (int i = 0; i < nbOfParticles; i++) { vertices[i].force = vertices[i].internalForces + vertices[i].nucleusForce0; } }
public void ComputeForces() { ResetCell(); for (int i = 0; i < edgeCount(); i++) { //edges[i].force = MGModel.Force(edges[i].length(), MGModel.u0, edges[i].l0); edges[i].force = MGModel.Force(edges[i].length(), MGModel.J[tissueId, tissueId], edges[i].l0); } for (int i = 0; i < nucleusEdges.getCount(); i++) { //nucleusEdges[i].force = MGModel.Force(nucleusEdges[i].length(), MGModel.u0, nucleusEdges[i].l0); nucleusEdges[i].force = MGModel.Force(nucleusEdges[i].length(), MGModel.J[tissueId, tissueId], nucleusEdges[i].l0); } for (int i = 0; i < edgeCount(); i++) { edges[i].ends[0].internalForces += edges[i].force * edges[i].UnitVector(); edges[i].ends[1].internalForces -= edges[i].force * edges[i].UnitVector(); } for (int i = 0; i < nucleusEdges.getCount(); i++) { nucleusEdges[i].ends[0].nucleusForce0 += nucleusEdges[i].force * nucleusEdges[i].UnitVector(); nucleusEdges[i].ends[1].force -= nucleusEdges[i].force * nucleusEdges[i].UnitVector(); } }
public void ComputeExternalForces() { if (MGModel.elasticExternalSpring) { for (int i = 0; i < externalEdges.getCount(); i++) { externalEdges[i].force = MGModel.Force(externalEdges[i].length(), MGModel.J[externalEdges[i].ends[0].tissueId, externalEdges[i].ends[1].tissueId], MGModel.DCol); } for (int i = 0; i < externalEdges.getCount(); i++) { externalEdges[i].ends[0].externalForces += externalEdges[i].force * externalEdges[i].UnitVector(); externalEdges[i].ends[1].externalForces -= externalEdges[i].force * externalEdges[i].UnitVector(); } } for (int i = 0; i < externalEdges.getCount(); i++) { //Console.WriteLine(cellId + ", " + i + ", " + externalEdges[i].ends[1].nucleusForce0); if (!externalEdges[i].ends[1].nullForces) { //externalEdges[i].ends[0].externalForces += externalEdges[i].ends[1].internalForces + externalEdges[i].ends[1].nucleusForce0 + externalEdges[i].ends[1].globalForces; externalEdges[i].ends[1].externalForces += externalEdges[i].gamma * (externalEdges[i].ends[0].internalForces + externalEdges[i].ends[0].nucleusForce0 + externalEdges[i].ends[0].globalForces); } //else // externalEdges[i].ends[0].externalForces += externalEdges[i].ends[1].internalForces + externalEdges[i].ends[1].nucleusForce0; //if(cellId>=50) //Console.WriteLine(externalEdges[i].ends[1].externalForces); } for (int i = 0; i < nbOfParticles; i++) { if (!vertices[i].nullForces) { vertices[i].force = vertices[i].internalForces + vertices[i].nucleusForce0; /* * if (vertices[i].force.norm() > MGModel.maxForce) * vertices[i].force *= MGModel.maxForce / vertices[i].force.norm(); * * if (vertices[i].externalForces.norm() > MGModel.maxForce) * vertices[i].externalForces *= MGModel.maxForce / vertices[i].externalForces.norm(); * //*/ //Console.WriteLine(cellId + ", " + i + ", " + vertices[i].externalForces); vertices[i].force += vertices[i].externalForces + vertices[i].globalForces; } else { vertices[i].force = new Vector(); } //Console.WriteLine(cellId + ", " + i + ", " + vertices[i].internalForces + "; " + vertices[i].nucleusForce0 + "; " + vertices[i].externalForces); //Console.WriteLine(cellId + ", " + i + ", " + vertices[i].internalForces + "; " + vertices[i].nucleusForce0); //Console.WriteLine(cellId + ", " + i + ", " + vertices[i].force + "; " + vertices[i].force.norm()); } }
public void ComputeExternalForces() { if (MGModel.elasticExternalSpring) { /* * Parallel.For(0, externalEdges.getCount(), i => * { * externalEdges[i].force = MGModel.Force(externalEdges[i].length(), MGModel.u1, externalEdges[i].l0); * }); */ for (int i = 0; i < externalEdges.getCount(); i++) { //externalEdges[i].force = MGModel.Force(externalEdges[i].length(), MGModel.u1, externalEdges[i].l0); externalEdges[i].force = MGModel.Force(externalEdges[i].length(), 5f, MGModel.DCol); } for (int i = 0; i < externalEdges.getCount(); i++) { externalEdges[i].ends[0].externalForces += externalEdges[i].force * externalEdges[i].UnitVector(); externalEdges[i].ends[1].externalForces -= externalEdges[i].force * externalEdges[i].UnitVector(); } } else { for (int i = 0; i < externalEdges.getCount(); i++) { //if (!externalEdges[i].ends[0].nullForces) externalEdges[i].ends[0].externalForces += externalEdges[i].ends[1].internalForces + externalEdges[i].ends[1].nucleusForce0 + externalEdges[i].ends[1].globalForces; //else // externalEdges[i].ends[0].externalForces += externalEdges[i].ends[1].internalForces + externalEdges[i].ends[1].nucleusForce0; } } for (int i = 0; i < nbOfParticles; i++) { if (!vertices[i].nullForces) { vertices[i].force = vertices[i].internalForces + vertices[i].nucleusForce0 + vertices[i].externalForces + vertices[i].globalForces; } //Console.WriteLine(cellId + ", " + i + ", " + vertices[i].internalForces + "; " + vertices[i].nucleusForce0 + "; " + vertices[i].externalForces); } }
public void LogParameters() { if (String.IsNullOrEmpty(logDir)) { double timeStamp = (DateTime.Now.ToUniversalTime() - new DateTime(2000, 1, 1)).TotalMilliseconds; logDir = "Logs/" + name + "_" + timeStamp.ToString(); Directory.CreateDirectory(logDir); } string parFile = "Parameters.mg"; string logFile = logDir + "/" + parFile; StringBuilder parameters = new StringBuilder(); parameters.AppendLine("# GENERAL SIMULATION PARAMETERS"); parameters.AppendLine("NrDevSteps=" + nbOfSimulationSteps / logFrequency); MGModel model = new MGModel(); var properties = model.GetType().GetProperties(); for (int i = 0; i < properties.Length; i++) { parameters.AppendLine(properties[i].Name + "=" + properties[i].GetValue(model).ToString()); } parameters.AppendLine(); parameters.AppendLine("# CELL TYPES"); parameters.AppendLine("NrCells=" + popSize); parameters.AppendLine("NrCellsMax=" + popMaxSize); parameters.AppendLine("NrCellTypes=" + nbCellTypes); for (int i = 0; i < nbCellTypes; i++) { parameters.AppendLine("NrCell" + i + "=" + cellPopulation.tissues[i].populationSize); } parameters.AppendLine(); for (int i = 0; i < nbCellTypes; i++) { parameters.AppendLine("JCell" + i + "med=" + MGModel.J[0, i]); } for (int i = 0; i < nbCellTypes; i++) { for (int j = 0; j <= i; j++) { parameters.AppendLine("JCell" + i + "Cell" + j + "=" + MGModel.J[i + 1, j]); } } parameters.AppendLine(); parameters.AppendLine("# CELL MESHES (TRIANGULATION)"); for (int i = 0; i < nbCellTypes; i++) { parameters.AppendLine(); parameters.AppendLine("# CELL " + i); parameters.AppendLine("NrVertices=" + cellPopulation.tissues[i].mesh.vertexCount()); parameters.AppendLine("NrTriangles=" + cellPopulation.tissues[i].mesh.faceCount()); parameters.AppendLine(); parameters.AppendLine("# VERTICES"); parameters.AppendLine(cellPopulation.tissues[i].mesh.PrintVertices()); parameters.AppendLine("# TRIANGLES"); parameters.AppendLine(cellPopulation.tissues[i].mesh.PrintTriangles()); } File.WriteAllText(logFile, parameters.ToString()); }