for i in range(0, dim): for j in range(0, dim): if i <= j: M[i, j] = Symbol('m[' + str(i) + ',' + str(j) + ']', real=True) else: M[i, j] = Symbol('m[' + str(j) + ',' + str(i) + ']', real=True) if dim == 2: lambdas = eigs_2d(M) else: lambdas = eigs_3d(M) # lambdas = simplify(lambdas) c99 = pretty_print.C99_print(lambdas) c99 = re.sub(r"m\[(\d{1}),(\d{1})\]", r'm(\1,\2)', c99) c99 = re.sub(r"result_(\d{1})", r'res(\1)', c99) c99 = c99.replace("0.0", "T(0)") c99 = c99.replace(" M_PI", " T(M_PI)") signature = "template<typename T>\nvoid eigs_" + str(dim) + "d(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, 0, 3, 3> &m, " signature += "Eigen::Matrix<T, Eigen::Dynamic, 1, 0, 3, 1> &res)" hpp = hpp + signature + " {\nres.resize(" + str(dim) + ");\n" + c99 + "\n}\n\n" cpp = cpp + "\n" hpp = hpp + "\n" cpp = cpp + "\n}}\n"
disp_grad = f.jacobian(X) def_grad = (eye(dim) + disp_grad) if name == "hooke": sigma = hooke(disp_grad, def_grad) elif name == "saint_venant": sigma = saint_venant(disp_grad, def_grad) elif name == "neo_hookean": sigma = neo_hookean(disp_grad, def_grad) elif name == "linear_elasticity": sigma = linear_elasticity(disp_grad, def_grad) div = divergence(sigma) # div = simplify(div) c99 = pretty_print.C99_print(div) c99 = re.sub(r"f0\(x, y(, z)?\)", "pt(0)", c99) c99 = re.sub(r"f1\(x, y(, z)?\)", "pt(1)", c99) c99 = re.sub(r"f2\(x, y(, z)?\)", "pt(2)", c99) c99 = re.sub(r", x, x\)", ".getHessian()(0,0)", c99) c99 = re.sub(r", x, y\)", ".getHessian()(0,1)", c99) c99 = re.sub(r", x, z\)", ".getHessian()(0,2)", c99) c99 = re.sub(r", y, y\)", ".getHessian()(1,1)", c99) c99 = re.sub(r", y, z\)", ".getHessian()(1,2)", c99) c99 = re.sub(r", z, z\)", ".getHessian()(2,2)", c99) c99 = re.sub(r", x\)", ".getGradient()(0)", c99)
if order == 0: base = base + "result_0.resize(x.size(),1);\n" base = base + "switch(local_index){\n" dbase = dbase + \ "val.resize(uv.rows(), uv.cols());\n Eigen::ArrayXd result_0(uv.rows());\n" + \ "switch(local_index){\n" for i in range(0, fe.nbf()): real_index = indices[i] # real_index = i base = base + "\tcase " + str( i) + ": {" + pretty_print.C99_print( simplify(fe.N[real_index])).replace( " = 1;", ".setOnes();") + "} break;\n" dbase = dbase + "\tcase " + str(i) + ": {" + \ "{" + pretty_print.C99_print(simplify(diff(fe.N[real_index], x))).replace(" = 0;", ".setZero();").replace(" = 1;", ".setOnes();").replace(" = -1;", ".setConstant(-1);") + "val.col(0) = result_0; }" \ "{" + pretty_print.C99_print(simplify(diff(fe.N[real_index], y))).replace(" = 0;", ".setZero();").replace( " = 1;", ".setOnes();").replace(" = -1;", ".setConstant(-1);") + "val.col(1) = result_0; }" if dim == 3: dbase = dbase + "{" + pretty_print.C99_print( simplify(diff(fe.N[real_index], z))).replace( " = 0;", ".setZero();").replace( " = 1;", ".setOnes();").replace( " = -1;", ".setConstant(-1);" ) + "val.col(2) = result_0; }" dbase = dbase + "} break;\n"
# Gradient grad = zeros(1, 2) for j in range(0, 2): grad[0,j] = diff(E,V[0,j]) # Hessian hess = zeros(2, 2) for i in range(0, 2): for j in range(0, 2): hess[i,j] = diff(grad[0,i],V[0,j]) # lambdas = simplify(lambdas) # E = simplify(E) # Energy c99 = pretty_print.C99_print(E) c99 = re.sub(r"V\[(\d{1}),(\d{1})\]", r'V(\1,\2)', c99) c99 = re.sub(r"G\[(\d{1}),(\d{1})\]", r'G(\1,\2)', c99) signature = "template<typename Scalar>\nScalar sd_energy(const Eigen::Matrix<Scalar,3,2>& V, const Eigen::Matrix<Scalar,2,3>& G) " hpp = hpp + signature + " {\n" + "Scalar result_0;\n" + c99 + "\nreturn result_0;\n}\n" # Gradient c99 = pretty_print.C99_print(grad) c99 = re.sub(r"V\[(\d{1}),(\d{1})\]", r'V(\1,\2)', c99) c99 = re.sub(r"G\[(\d{1}),(\d{1})\]", r'G(\1,\2)', c99) c99 = re.sub(r"result_0\[(\d{1})\]", r'res(\1)', c99) signature = "template<typename Scalar>\nvoid sd_grad(const Eigen::Matrix<Scalar,3,2>& V, const Eigen::Matrix<Scalar,2,3>& G, Eigen::Matrix<Scalar,1,2>& res) " hpp = hpp + signature + " {\n" + c99 + "\n}\n" # Hessian c99 = pretty_print.C99_print(hess)