FDTD的PML设置

3 篇文章 3 订阅

//设置三维PML层电导率和导磁系数
    for (i = 1; i < npml; i++)      //后边
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmax[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((npml - i + 0.5) / npml, (n_change + 1))
                    - pow((npml - i - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = IE - npml + 1; i < IE; i++)  //前边
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmax[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((i - (IE - npml) + 0.5) / npml, (n_change + 1))
                    - pow((i - (IE - npml) - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = 0; i < npml; i++)  //后边
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmamx[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((((npml - i - 0.5) + 0.5) / npml), (n_change + 1))
                    - pow((((npml - i - 0.5) - 0.5) / npml), (n_change + 1)))
                    / epsilon;
            }
        }
    }
    for (i = IE - npml; i < IE; i++)  //前边
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmamx[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((i - (IE - npml) + 0.5 + 0.5) / npml, (n_change + 1))
                    - pow((i - (IE - npml) + 0.5 - 0.5) / npml, (n_change + 1)))
                    / epsilon;
            }
        }
    }
    for (i = 0; i <= IE; i++)  //左边
    {
        for (j = 1; j < npml; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmay[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((npml - j + 0.5) / npml, (n_change + 1))
                    - pow((npml - j - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = 0; i <= IE; i++)  //右边
    {
        for (j = JE - npml + 1; j < JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmay[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((j - (JE - npml) + 0.5) / npml, (n_change + 1))
                    - pow((j - (JE - npml) - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = 0; i <= IE; i++)  //左边
    {
        for (j = 0; j < npml; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmamy[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((((npml - j - 0.5) + 0.5) / npml), (n_change + 1))
                    - pow((((npml - j - 0.5) - 0.5) / npml), (n_change + 1)))
                    / epsilon;
            }
        }
    }
    for (i = 0; i <= IE; i++)  //右边
    {
        for (j = JE - npml; j < JE; j++)
        {
            for (k = 0; k <= KE; k++)
            {
                sigmamy[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((j - (JE - npml) + 0.5 + 0.5) / npml, (n_change + 1))
                    - pow((j - (JE - npml) + 0.5 - 0.5) / npml, (n_change + 1)))
                    / epsilon;
            }
        }
    }
    for (i = 0; i <= IE; i++)
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 1; k < npml; k++)
            {
                sigmaz[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((npml - k + 0.5) / npml, (n_change + 1))
                    - pow((npml - k - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = 0; i <= IE; i++)
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = KE - npml + 1; k < KE; k++)
            {
                sigmaz[i][j][k] = (npml*sigma_MAX / (n_change + 1))
                    * (pow((k - (KE - npml) + 0.5) / npml, (n_change + 1))
                    - pow((k - (KE - npml) - 0.5) / npml, (n_change + 1)));
            }
        }
    }
    for (i = 0; i <= IE; i++)
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = 0; k < npml; k++)
            {
                sigmamz[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((((npml - k - 0.5) + 0.5) / npml), (n_change + 1))
                    - pow((((npml - k - 0.5) - 0.5) / npml), (n_change + 1)))
                    / epsilon;
            }
        }
    }
    for (i = 0; i <= IE; i++)
    {
        for (j = 0; j <= JE; j++)
        {
            for (k = KE - npml; k < KE; k++)
            {
                sigmamz[i][j][k] = mur0*(npml*sigma_MAX / (n_change + 1))
                    * (pow((k - (KE - npml) + 0.5 + 0.5) / npml, (n_change + 1))
                    - pow((k - (KE - npml) + 0.5 - 0.5) / npml, (n_change + 1)))
                    / epsilon;
            }
        }
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
FDTD(时域有限差分)是一种数值计算方法,广泛应用于电磁学、光学和声学等领域中的波动问题。而PML(吸收边界条件)是在FDTD中用来模拟无限大空间边界时防止波的反射的技术。 当应用于弹性波的模拟中,Matlab可以通过编写适当的程序来实现FDTD的求解。首先,根据波动方程和边界条件,将问题离散化为网格点上的差分方程。然后,通过时间步进的方式,逐个时间步计算网格点上的值,并更新它们的状态。 对于弹性波的模拟,需要考虑介质的物理特性,如密度、弹性系数等。在求解过程中,需要分别计算横波和纵波的传播。通过将网格点上的位移、速度、应力等物理量进行差分近似,可以得到它们在下一个时间步的更新公式。 PML是在边界附近引入的一种虚拟区域,用于吸收入射波的能量,防止波的反射。PML通常由一些特殊的差分方程来模拟,其核心思想是引入吸收剂量来逐渐降低波的能量。 在Matlab中,可以通过自定义的函数来实现PML边界条件,在求解过程中将其嵌入到FDTD的计算中。该函数将在边界上引入额外的吸收项,并在网格点上根据吸收时间来更新物理量。 总结来说,Matlab可以通过编写适当的程序,结合FDTD方法和PML边界条件,来模拟弹性波的传播。这种求解方法可以帮助我们更好地理解和预测弹性波的行为和性质。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值