/** * Parameter regularization L_{q} := \beta(q-\overline{q},\chi) + (\chi\nabla{u},\nabla{\lambda}) * * @param u * @param lambda * @param q * @return */ public SparseVector getResLq(Vector u, Vector lambda, Vector q) { // 4.Weak form WeakFormL22D weakForm = new WeakFormL22D(); weakForm.setParam(FC.C0, FC.C1); // Right hand side(RHS): f(x) = -(1.0/\beta)\nabla{u}\cdot\nabla{v} Function fu = new Vector2Function(u, mesh, "x", "y"); Function flmd = new Vector2Function(lambda, mesh, "x", "y"); Function f = FMath.grad(fu).dot(FMath.grad(flmd)); plotFunction(mesh, f, String.format("Grad(u)Grad(lmd)%02d.dat", this.iterNum)); Function f2 = FC.c(-1.0 / beta).M(f).A(qBar); plotFunction(mesh, f2, String.format("LqRHS%02d.dat", this.iterNum)); weakForm.setF(f2); // 5.Assembly process AssemblerScalar assembler = new AssemblerScalar(mesh, weakForm); System.out.println("Begin Assemble..."); assembler.assemble(); SparseMatrix stiff = assembler.getStiffnessMatrix(); SparseVector load = assembler.getLoadVector(); // Boundary condition assembler.imposeDirichletCondition(FC.c(8.0)); System.out.println("Assemble done!"); if (debug) { // 6.Solve linear system Solver solver = new Solver(); Vector q_solve = solver.solveCGS(stiff, load); plotVector(mesh, q_solve, "q_solve.dat"); } // Residual SparseVector res = new SparseVectorHashMap(q.getDim()); stiff.mult(q, res); res.add(-1.0, load); plotVector(mesh, res, "Res_Lq.dat"); return res; }