// Create arrays nodeType2 and nodeNum2 // return number of nodes in 3D mesh private int nodeTypesNumbers2D() { // nodeType2 - node types for 2D mesh, // =0 - midside, =1 - corner/degenerate nodeType2 = new int[m2.nNod]; for (int iel = 0; iel < m2.nEl; iel++) { for (int i = 0; i < m2.elems[iel].ind.Length; i++) { int inj = m2.elems[iel].ind[i] - 1; if (inj != -1) { nodeType2[inj] = (i + 1) % 2; } } } // nodeNum2[i] is a number of i-th 2D node in 3D mesh nodeNum2 = new int[m2.nNod]; int node = 1; for (int i = 0; i < m2.nNod; i++) { nodeNum2[i] = node; int dn = (nodeType2[i] == 0) ? nlayers + 1 : 2 * nlayers + 1; // If node is located on rotation axis Y if (rotate && m2.getNodeCoord(i, 0) == 0.0) { dn = 1; } node = node + dn; } return(node - 1); }
private void doTranslate() { if (m.nDim == 2 && axis == 'z') { return; } int iax = getIntAxis(axis); for (int i = 0; i < m.nNod; i++) { m.setNodeCoord(i, iax, m.getNodeCoord(i, iax) + value); } }
// Add scaled displacements to nodal coordinates and // center finite element mesh void modifyNodeCoordinates() { // Deformed shape: add scaled displacements // to nodal coordinates if (VisData.showDeformShape) { setBoundingBox(); double displMax = 0; for (int i = 0; i < fem.nNod; i++) { double d = 0; for (int j = 0; j < fem.nDim; j++) { double s = VisData.displ[i * fem.nDim + j]; d += s * s; } displMax = Math.Max(d, displMax); } displMax = Math.Sqrt(displMax); // Scale for visualization of deformed shape double scaleD = sizeMax * VisData.deformScale / displMax; for (int i = 0; i < fem.nNod; i++) { for (int j = 0; j < fem.nDim; j++) { fem.setNodeCoord(i, j, fem.getNodeCoord(i, j) + scaleD * VisData.displ[i * fem.nDim + j]); } } } setBoundingBox(); // Translate JFEM model to have the bounding // box center at (0,0,0). double[] xyzC = new double[3]; for (int j = 0; j < 3; j++) { xyzC[j] = 0.5 * (xyzmin[j] + xyzmax[j]); } for (int i = 0; i < fem.nNod; i++) { for (int j = 0; j < fem.nDim; j++) { fem.setNodeCoord(i, j, fem.getNodeCoord(i, j) - xyzC[j]); } } }
public writemesh() { String modelName = CSMGEN.RD.next(); String fileName = CSMGEN.RD.next(); CSMGEN.PR.Write("WriteMesh: {0} {1}\n", modelName, fileName); StreamWriter WR = new FePrintWriter().getPrinter(fileName); if (CSMGEN.blocks.ContainsKey(modelName)) { m = (FeModel)CSMGEN.blocks[modelName]; } else { UTIL.errorMsg("No such mesh block: " + modelName); } WR.Write("# Model name: {0}\n", modelName); WR.Write("nNod = {0,5}\n", m.nNod); WR.Write("nEl = {0,5}\n", m.nEl); WR.Write("nDim = {0,5}\n", m.nDim); WR.Write("nodCoord\n"); for (int i = 0; i < m.nNod; i++) { for (int j = 0; j < m.nDim; j++) { WR.Write("{0,20:0.000000000}", m.getNodeCoord(i, j)); } WR.WriteLine(""); } WR.Write("\nelCon"); for (int iel = 0; iel < m.nEl; iel++) { WR.Write("\n{0} {1,6}", m.elems[iel].name, m.elems[iel].matName); if (m.elems[iel].name.Equals("quad4") || m.elems[iel].name.Equals("quad8r")) //|| m.elems[iel].name.Equals("genquad4") || m.elems[iel].name.Equals("genquad8")) { WR.Write("{0,6}", m.elems[iel].t); } if (m.elems[iel].name.Equals("truss22") || m.elems[iel].name.Equals("truss32"))//|| m.elems[iel].name.Equals("genquad4") || m.elems[iel].name.Equals("genquad8")) { WR.Write("{0,12}", m.elems[iel].A); } int nind = m.elems[iel].ind.Length; for (int i = 0; i < nind; i++) { WR.Write("{0,12}", m.elems[iel].ind[i]); } } WR.Write("\n\nend\n"); WR.Close(); CSMGEN.PR.Write("Mesh " + modelName + ": nEl = {0} nNod = {1}\n", m.nEl, m.nNod); }
public static void CsfeaToVtk_Main(String[] args) { Console.Clear(); Console.WriteLine(); Console.WriteLine("***************************************************"); Console.WriteLine("* C# Finite Element Analysis - Post-Processor *"); Console.WriteLine("* ------------------------------------------- *"); Console.WriteLine("* Copyright © Ravinder Singh, 2017. *"); Console.WriteLine("* License: Apache v2.0 License. *"); Console.WriteLine("* For further information on this software *"); Console.WriteLine("* email : [email protected]. *"); Console.WriteLine("***************************************************"); Console.WriteLine(); string[] w; switch (args.Length) { case 1: w = args[0].Split('.'); meshFile = args[0]; outFile = w[0] + "_msh" + ".vtk"; break; case 2: w = args[1].Split('.'); meshFile = args[0]; resultFile = args[1]; outFile = w[0] + "_" + w[1] + ".vtk"; break; default: break; } fes = new FeScanner(meshFile); fem = new FeModel(fes, null); Element.fem = fem; fem.readData(); WR = new FePrintWriter().getPrinter(outFile); WR.WriteLine("# vtk DataFile Version 3.1"); WR.WriteLine(outFile); WR.WriteLine("ASCII\nDATASET UNSTRUCTURED_GRID"); WR.WriteLine("POINTS {0} DOUBLE", fem.nNod); int ElemConnectNodeCount = 0; for (int iel = 0; iel < fem.nEl; iel++) { if (fem.elems[iel].name.Equals("hex20") || fem.elems[iel].name.Equals("hex20r")) { ElemConnectNodeCount += 21; } if (fem.elems[iel].name.Equals("hex8") || fem.elems[iel].name.Equals("hex8r")) { ElemConnectNodeCount += 9; } if (fem.elems[iel].name.Equals("quad8") || fem.elems[iel].name.Equals("quad8r")) { ElemConnectNodeCount += 9; } if (fem.elems[iel].name.Equals("quad4") || fem.elems[iel].name.Equals("quad4r")) { ElemConnectNodeCount += 5; } if (fem.elems[iel].name.Equals("truss22") || fem.elems[iel].name.Equals("truss32")) { ElemConnectNodeCount += 3; } } for (int i = 0; i < fem.nNod; i++) { for (int j = 0; j < fem.nDim; j++) { WR.Write("{0,20:0.000000000}", fem.getNodeCoord(i, j)); } if (fem.nDim < 3) { WR.Write("{0,20:0.000000000}", 0.0); } if (fem.nDim < 2) { WR.Write("{0,20:0.000000000}", 0.0); } WR.WriteLine(); } WR.WriteLine(); WR.Write("\nCELLS {0} ", fem.nEl); WR.Write("{0} \n", ElemConnectNodeCount); for (int iel = 0; iel < fem.nEl; iel++) { if (fem.elems[iel].name.Equals("hex20") || fem.elems[iel].name.Equals("hex20r")) { WR.Write("20 "); int nind = fem.elems[iel].ind.Length; for (int i = 0; i < vtkArrInd_hex20.Length; i++) { WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_hex20[i]] - 1); } } if (fem.elems[iel].name.Equals("hex8") || fem.elems[iel].name.Equals("hex8r")) { WR.Write("8 "); int nind = fem.elems[iel].ind.Length; for (int i = 0; i < vtkArrInd_hex8.Length; i++) { WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_hex8[i]] - 1); } } if (fem.elems[iel].name.Equals("quad8") || fem.elems[iel].name.Equals("quad8r")) { WR.Write("8 "); int nind = fem.elems[iel].ind.Length; for (int i = 0; i < vtkArrInd_quad8.Length; i++) { WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_quad8[i]] - 1); } } if (fem.elems[iel].name.Equals("quad4") || fem.elems[iel].name.Equals("quad4r")) { WR.Write("4 "); int nind = fem.elems[iel].ind.Length; for (int i = 0; i < vtkArrInd_quad4.Length; i++) { WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_quad4[i]] - 1); } } if (fem.elems[iel].name.Equals("truss22") || fem.elems[iel].name.Equals("truss32")) { WR.Write("2 "); int nind = fem.elems[iel].ind.Length; for (int i = 0; i < vtkArrInd_truss2.Length; i++) { WR.Write("{0,6}", fem.elems[iel].ind[vtkArrInd_truss2[i]] - 1); } } WR.WriteLine(); } WR.WriteLine("\nCELL_TYPES {0}", fem.nEl); for (int i = 0; i < fem.nEl; i++) { if (fem.elems[i].name.Equals("hex20") || fem.elems[i].name.Equals("hex20r")) { WR.Write("{0,3}", 25); } if (fem.elems[i].name.Equals("hex8") || fem.elems[i].name.Equals("hex8r")) { WR.Write("{0,3}", 12); } if (fem.elems[i].name.Equals("quad8") || fem.elems[i].name.Equals("quad8r")) { WR.Write("{0,3}", 23); } if (fem.elems[i].name.Equals("quad4") || fem.elems[i].name.Equals("quad4r")) { WR.Write("{0,3}", 9); } if (fem.elems[i].name.Equals("truss22") || fem.elems[i].name.Equals("truss32")) { WR.Write("{0,3}", 3); } } WR.WriteLine("\n"); if (resultFile != null) { displ = new double[fem.nNod * fem.nDf]; stress = new FeStress(fem); stress.readResults(resultFile, displ); resAtNod = new ResultAtNodes(fem); WR.Write("POINT_DATA {0}", fem.nNod); writeScalars("Si"); writeScalars("Sx"); writeScalars("Sy"); writeScalars("Sz"); writeScalars("Sxy"); if (fem.nDim == 3) { writeScalars("Syz"); writeScalars("Szx"); } //writeScalars("S1"); //writeScalars("S2"); //if (fem.nDim == 3) //{ // writeScalars("S3"); // writeScalars("S13"); //} writeScalars("Ux"); writeScalars("Uy"); if (fem.nDim == 3) { writeScalars("Uz"); } } WR.Flush(); WR.Close(); }