public void run() { // 1.Read in a triangle mesh from an input file with // format ASCII UCD generated by Gridgen MeshReader reader = new MeshReader("triangle.grd"); Mesh mesh = reader.read2DMesh(); // Compute geometry relationship of nodes and elements mesh.computeNodeBelongsToElements(); // 2.Mark border types HashMap<NodeType, Function> mapNTF = new HashMap<NodeType, Function>(); mapNTF.put(NodeType.Dirichlet, null); mesh.markBorderNode(mapNTF); // 3.Use element library to assign degrees of // freedom (DOF) to element ElementList eList = mesh.getElementList(); FELinearTriangle feLT = new FELinearTriangle(); for (int i = 1; i <= eList.size(); i++) feLT.assignTo(eList.at(i)); // 4.Weak form WeakFormLaplace2D weakForm = new WeakFormLaplace2D(); // Right hand side(RHS): f = -2*(x^2+y^2)+36 weakForm.setF(X.M(X).A(Y.M(Y)).M(-2.0).A(36.0)); // 5.Assembly process AssemblerScalar assembler = new AssemblerScalar(mesh, weakForm); assembler.assemble(); Matrix stiff = assembler.getStiffnessMatrix(); Vector load = assembler.getLoadVector(); // Boundary condition assembler.imposeDirichletCondition(C0); // 6.Solve linear system SolverJBLAS solver = new SolverJBLAS(); Vector u = solver.solveDGESV(stiff, load); System.out.println("u="); for (int i = 1; i <= u.getDim(); i++) System.out.println(String.format("%.3f", u.get(i))); // 7.Output results to an Techplot format file MeshWriter writer = new MeshWriter(mesh); writer.writeTechplot("./tutorial/Laplace2D.dat", u); this.mesh = mesh; this.u = u; }
public void readMesh() { MeshReader reader = new MeshReader("lagrangian.grd"); mesh = reader.read2DMesh(); mesh.computeNodeBelongsToElements(); // 2.Mark border types HashMap<NodeType, Function> mapNTF = new HashMap<NodeType, Function>(); mapNTF.put(NodeType.Dirichlet, null); mesh.markBorderNode(mapNTF); ElementList eList = mesh.getElementList(); // for(int i=1;i<=eList.size();i++) { // System.out.println(eList.at(i)); // } // 3.Use element library to assign degrees of // freedom (DOF) to element FELinearTriangle feLT = new FELinearTriangle(); for (int i = 1; i <= eList.size(); i++) feLT.assignTo(eList.at(i)); }
public void imposeDirichletCondition(SparseBlockMatrix BM, SparseBlockVector BV, Function diri) { ElementList eList = mesh.getElementList(); int nNode = mesh.getNodeList().size(); for (int i = 1; i <= eList.size(); i++) { Element e = eList.at(i); DOFList DOFs = e.getAllDOFList(DOFOrder.NEFV); for (int j = 1; j <= DOFs.size(); j++) { DOF dof = DOFs.at(j); GeoEntity ge = dof.getOwner(); if (ge instanceof Node) { Node n = (Node) ge; if (n.getNodeType() == NodeType.Dirichlet) { Variable v = Variable.createFrom(diri, n, 0); setDirichlet(BM, BV, dof.getGlobalIndex(), diri.value(v)); setDirichlet(BM, BV, nNode + dof.getGlobalIndex(), diri.value(v)); setDirichlet(BM, BV, nNode * 2 + dof.getGlobalIndex(), diri.value(v)); } } } } }