Beispiel #1
0
        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"
Beispiel #2
0
            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)
Beispiel #3
0
            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)