r"""模板程序：定义在任意二维域内的二维函数的数值积分。

用于创新实验————数值积分的编程实现

- 张仪 @ DGMP
- www.mathischeap.com
"""


import numpy as np


def Jacobian_det(d_Phi_x_d_xi, d_Phi_x_d_eta, d_Phi_y_d_xi, d_Phi_y_d_eta, N):
    r"""计算雅可比矩阵的行列式在数值积分采样点的值。

    Parameters
    ----------
    d_Phi_x_d_xi :
        雅可比矩阵中的J_00。
    d_Phi_x_d_eta :
        雅可比矩阵中的J_01。
    d_Phi_y_d_xi :
        雅可比矩阵中的J_10。
    d_Phi_y_d_eta :
        雅可比矩阵中的J_11。
    N :
        数值积分的阶数。

    Returns
    -------

    """
    # TODO: 补全此程序


def num_integration_2d_phy(
        Phi_x, Phi_y,
        d_Phi_x_d_xi, d_Phi_x_d_eta, d_Phi_y_d_xi, d_Phi_y_d_eta,
        int_func, N,
):
    r"""我们使用这个函数来计算定义在任意二维域内的函数在此区间上的积分值。

    Parameters
    ----------
    Phi_x :
        x分量的映射函数。
    Phi_y :
        y分量的映射函数。
    d_Phi_x_d_xi :
        雅可比矩阵中的J_00。
    d_Phi_x_d_eta :
        雅可比矩阵中的J_01。
    d_Phi_y_d_xi :
        雅可比矩阵中的J_10。
    d_Phi_y_d_eta :
        雅可比矩阵中的J_11。

    int_func :
        被积函数
    N :
        数值积分的阶数。

    Return
    ------
    int_value :
        积分值。
    """
    quad_nodes, quad_weights = np.polynomial.legendre.leggauss(N)
    # TODO: 补全此程序


# ------- 积分域1 和 积分函数 1 ----------------------------------------------------
def Phi1_x(xi, eta):
    r""""""
    # TODO: 补全此程序


def Phi1_y(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi1_x_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi1_x_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi1_y_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi1_y_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def func1(x, y):
    r"""被积函数1。"""
    return np.sin(2 * np.pi * x) + np.cos(2 * np.pi * y)


# ------- 积分域2 和 积分函数 2 ----------------------------------------------------
def Phi2_x(xi, eta):
    r""""""
    # TODO: 补全此程序


def Phi2_y(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi2_x_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi2_x_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi2_y_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi2_y_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def func2(x, y):
    r"""被积函数1。"""
    # TODO: 补全此程序


# ------- 积分域3 和 积分函数 3 ----------------------------------------------------
def Phi3_x(xi, eta):
    r""""""
    # TODO: 补全此程序


def Phi3_y(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi3_x_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi3_x_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi3_y_d_xi(xi, eta):
    r""""""
    # TODO: 补全此程序


def d_Phi3_y_d_eta(xi, eta):
    r""""""
    # TODO: 补全此程序


def func3(x, y):
    r"""被积函数1。"""
    # TODO: 补全此程序


if __name__ == '__main__':
    N = 8

    int_value1 = num_integration_2d_phy(
        Phi1_x, Phi1_y,
        d_Phi1_x_d_xi, d_Phi1_x_d_eta, d_Phi1_y_d_xi, d_Phi1_y_d_eta,
        func1, N,
    )

    int_value2 = num_integration_2d_phy(
        Phi2_x, Phi2_y,
        d_Phi2_x_d_xi, d_Phi2_x_d_eta, d_Phi2_y_d_xi, d_Phi2_y_d_eta,
        func2, N,
    )

    int_value3 = num_integration_2d_phy(
        Phi3_x, Phi3_y,
        d_Phi3_x_d_xi, d_Phi3_x_d_eta, d_Phi3_y_d_xi, d_Phi3_y_d_eta,
        func3, N,
    )

    print(int_value1, int_value2, int_value3)
