⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pml_update.f90

📁 Sfdtd Simple finite-difference time-domain
💻 F90
📖 第 1 页 / 共 5 页
字号:
        b%top_z%H(ix, iy, iz, 1) =     c1 *   b%top_z%H(ix, iy, iz, 1)                     &                                     - c2 * ( Ezx_1                                        &                                            - b%top_z%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%top_z%E(ix, iy, iz, 6))        b%top_z%H(ix, iy, iz, 2) =     c3 *   b%top_z%H(ix, iy, iz, 2)                     &                                     + c4 * ( b%top_z%E(ix, iy, iz+1, 3)                   &                                            - b%top_z%E(ix, iy, iz, 3)                     &                                            + b%top_z%E(ix, iy, iz+1, 4)                   &                                            - b%top_z%E(ix, iy, iz, 4))      ENDDO    ENDDO  ENDDOEND SUBROUTINE PML_update_HxSUBROUTINE PML_update_Hy(g, b)  TYPE(gitter), INTENT(IN)                                      :: g  TYPE(pml_boundary), INTENT(INOUT)                             :: b  INTEGER                                                       :: ix, iy, iz  DOUBLE PRECISION                                              :: c1, c2, c3, c4  DOUBLE PRECISION                                              :: Exy_1, Exz_1  DOUBLE PRECISION                                              :: Ezx_1, Ezy_1  DOUBLE PRECISION                                              :: modif_1, modif_2  ! bas_x  DO ix = b%min_xo, g%nxl-1, 1    DO iy = b%min_yo, b%max_yo-1, 1      DO iz = b%min_zo, b%max_zo-1, 1         IF(ix .EQ. (g%nxl-1)) THEN          IF(iy < g%nyl ) THEN            Ezx_1 = b%bas_y%E(ix+1, iy, iz, 5)            Ezy_1 = b%bas_y%E(ix+1, iy, iz, 6)          ELSEIF(iy > g%nyyh) THEN            Ezx_1 = b%top_y%E(ix+1, iy, iz, 5)            Ezy_1 = b%top_y%E(ix+1, iy, iz, 6)          ELSEIF (iz < g%nzl) THEN            Ezx_1 = b%bas_z%E(ix+1, iy, iz, 5)            Ezy_1 = b%bas_z%E(ix+1, iy, iz, 6)          ELSEIF (iz > g%nzyh) THEN            Ezx_1 = b%top_z%E(ix+1, iy, iz, 5)            Ezy_1 = b%top_z%E(ix+1, iy, iz, 6)          ELSE            Ezx_1 = g%E(ix+1, iy, iz, 3)            Ezy_1 = 0.0d0          ENDIF        ELSE          Ezx_1 = b%bas_x%E(ix+1, iy, iz, 5)          Ezy_1 = b%bas_x%E(ix+1, iy, iz, 6)        ENDIF        c1 = EXP(- b%bas_x%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_x%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%bas_x%sigma(ix, iy, iz, 4) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_x%sigma(ix, iy, iz, 4), c3, c4)        b%bas_x%H(ix, iy, iz, 3) =     c1 *   b%bas_x%H(ix, iy, iz, 3)                     &                                     - c2 * ( b%bas_x%E(ix, iy, iz+1, 1)                   &                                            - b%bas_x%E(ix, iy, iz, 1)                     &                                            + b%bas_x%E(ix, iy, iz+1, 2)                   &                                            - b%bas_x%E(ix, iy, iz, 2))        b%bas_x%H(ix, iy, iz, 4) =     c3 *   b%bas_x%H(ix, iy, iz, 4)                     &                                     + c4 * ( Ezx_1                                        &                                            - b%bas_x%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%bas_x%E(ix, iy, iz, 6))      ENDDO    ENDDO  ENDDO  ! top_x  DO ix = g%nxgh, b%max_xo-1, 1    DO iy = b%min_yo, b%max_yo-1, 1      DO iz = b%min_zo, b%max_zo-1, 1        c1 = EXP(- b%top_x%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%top_x%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%top_x%sigma(ix, iy, iz, 4) * g%dt/g%eps)        CALL compute_H_factor(g, b%top_x%sigma(ix, iy, iz, 4), c3, c4)        b%top_x%H(ix, iy, iz, 3) =     c1 *   b%top_x%H(ix, iy, iz, 3)                     &                                     - c2 * ( b%top_x%E(ix, iy, iz+1, 1)                   &                                            - b%top_x%E(ix, iy, iz, 1)                     &                                            + b%top_x%E(ix, iy, iz+1, 2)                   &                                            - b%top_x%E(ix, iy, iz, 2))        b%top_x%H(ix, iy, iz, 4) =     c3 *   b%top_x%H(ix, iy, iz, 4)                     &                                     + c4 * ( b%top_x%E(ix+1, iy, iz, 5)                   &                                            - b%top_x%E(ix, iy, iz, 5)                     &                                            + b%top_x%E(ix+1, iy, iz, 6)                   &                                            - b%top_x%E(ix, iy, iz, 6))      ENDDO    ENDDO  ENDDO  ! bas_y  DO ix = g%nxl, g%nxyh, 1    DO iy = b%min_yo, g%nyl-1, 1      DO iz = b%min_zo, b%max_zo-1, 1         IF (ix .EQ. g%nxyh) THEN          Ezx_1 = b%top_x%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_x%E(ix+1, iy, iz, 6)        ELSE          Ezx_1 = b%bas_y%E(ix+1, iy, iz, 5)          Ezy_1 = b%bas_y%E(ix+1, iy, iz, 6)        ENDIF         c1 = EXP(- b%bas_y%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_y%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%bas_y%sigma(ix, iy, iz, 4)*g%dt/g%eps)        CALL compute_H_factor(g, b%bas_y%sigma(ix, iy, iz, 4), c3, c4)        b%bas_y%H(ix, iy, iz, 3) =     c1 *   b%bas_y%H(ix, iy, iz, 3)                     &                                     - c2 * ( b%bas_y%E(ix, iy, iz+1, 1)                   &                                            - b%bas_y%E(ix, iy, iz, 1)                     &                                            + b%bas_y%E(ix, iy, iz+1, 2)                   &                                            - b%bas_y%E(ix, iy, iz, 2))        b%bas_y%H(ix, iy, iz, 4) =     c3 *   b%bas_y%H(ix, iy, iz, 4)                     &                                     + c4 * ( Ezx_1                                        &                                            - b%bas_y%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%bas_y%E(ix, iy, iz, 6) )      ENDDO    ENDDO  ENDDO  ! top_y  DO ix = g%nxl, g%nxyh, 1    DO iy = g%nygh, b%max_yo-1, 1      DO iz = b%min_zo, b%max_zo-1, 1         IF (ix .EQ. g%nxyh) THEN          Ezx_1 = b%top_x%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_x%E(ix+1, iy, iz, 6)        ELSE          Ezx_1 = b%top_y%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_y%E(ix+1, iy, iz, 6)        ENDIF        c1 = EXP(- b%top_y%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%top_y%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%top_y%sigma(ix, iy, iz, 4)*g%dt/g%eps)        CALL compute_H_factor(g, b%top_y%sigma(ix, iy, iz, 4), c3, c4)        b%top_y%H(ix, iy, iz, 3) =     c1 *   b%top_y%H(ix, iy, iz, 3)                     &                                     - c2 * ( b%top_y%E(ix, iy, iz+1, 1)                   &                                            - b%top_y%E(ix, iy, iz, 1)                     &                                            + b%top_y%E(ix, iy, iz+1, 2)                   &                                            - b%top_y%E(ix, iy, iz, 2))        b%top_y%H(ix, iy, iz, 4) =     c3 *   b%top_y%H(ix, iy, iz, 4)                     &                                     + c4 * ( Ezx_1                                        &                                            - b%top_y%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%top_y%E(ix, iy, iz, 6) )      ENDDO    ENDDO  ENDDO  ! bas_z  DO ix = g%nxl, g%nxyh, 1    DO iy = g%nyl, g%nyyh, 1      DO iz = b%min_zo, g%nzl-1, 1         IF (iz .EQ. (g%nzl-1)) THEN          Exy_1 = g%E(ix, iy, iz+1, 1)          Exz_1 = 0.0d0        ELSE          Exy_1 = b%bas_z%E(ix, iy, iz+1, 1)          Exz_1 = b%bas_z%E(ix, iy, iz+1, 2)        ENDIF        IF (ix .EQ. g%nxyh) THEN          Ezx_1 = b%top_x%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_x%E(ix+1, iy, iz, 6)        ELSE          Ezx_1 = b%bas_z%E(ix+1, iy, iz, 5)          Ezy_1 = b%bas_z%E(ix+1, iy, iz, 6)        ENDIF        c1 = EXP(- b%bas_z%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_z%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%bas_z%sigma(ix, iy, iz, 4)*g%dt/g%eps)        CALL compute_H_factor(g, b%bas_z%sigma(ix, iy, iz, 4), c3, c4)        b%bas_z%H(ix, iy, iz, 3) =     c1 *   b%bas_z%H(ix, iy, iz, 3)                     &                                     - c2 * ( Exy_1                                        &                                            - b%bas_z%E(ix, iy, iz, 1)                     &                                            + Exz_1                                        &                                            - b%bas_z%E(ix, iy, iz, 2))        b%bas_z%H(ix, iy, iz, 4) =     c3 *   b%bas_z%H(ix, iy, iz, 4)                     &                                     + c4 * ( Ezx_1                                        &                                            - b%bas_z%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%bas_z%E(ix, iy, iz, 6))      ENDDO    ENDDO  ENDDO  ! top_z  DO ix = g%nxl, g%nxyh, 1    DO iy = g%nyl, g%nyyh, 1      DO iz = g%nzgh, b%max_zo-1, 1        IF (ix .EQ. g%nxyh) THEN          Ezx_1 = b%top_x%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_x%E(ix+1, iy, iz, 6)        ELSE          Ezx_1 = b%top_z%E(ix+1, iy, iz, 5)          Ezy_1 = b%top_z%E(ix+1, iy, iz, 6)        ENDIF        c1 = EXP(- b%top_z%sigma(ix, iy, iz, 6) * g%dt/g%eps)        CALL compute_H_factor(g, b%top_z%sigma(ix, iy, iz, 6), c1, c2)        c3 = EXP(- b%top_z%sigma(ix, iy, iz, 4)*g%dt/g%eps)        CALL compute_H_factor(g, b%top_z%sigma(ix, iy, iz, 4), c3, c4)        b%top_z%H(ix, iy, iz, 3) =     c1 *   b%top_z%H(ix, iy, iz, 3)                     &                                     - c2 * ( b%top_z%E(ix, iy, iz+1, 1)                   &                                            - b%top_z%E(ix, iy, iz, 1)                     &                                            + b%top_z%E(ix, iy, iz+1, 2)                   &                                            - b%top_z%E(ix, iy, iz, 2))        b%top_z%H(ix, iy, iz, 4) =     c3 *   b%top_z%H(ix, iy, iz, 4)                     &                                     + c4 * ( Ezx_1                                        &                                            - b%top_z%E(ix, iy, iz, 5)                     &                                            + Ezy_1                                        &                                            - b%top_z%E(ix, iy, iz, 6))      ENDDO    ENDDO  ENDDOEND SUBROUTINE PML_update_HySUBROUTINE PML_update_Hz(g, b)  TYPE(gitter), INTENT(IN)                                      :: g  TYPE(pml_boundary), INTENT(INOUT)                             :: b  INTEGER                                                       :: ix, iy, iz  DOUBLE PRECISION                                              :: c1, c2, c3, c4  DOUBLE PRECISION                                              :: Eyz_1, Eyx_1  DOUBLE PRECISION                                              :: Exy_1, Exz_1  DOUBLE PRECISION                                              :: modif_1, modif_2    ! bas_x  DO ix = b%min_xo, g%nxl-1, 1    DO iy = b%min_yo, b%max_yo-1, 1      DO iz = b%min_zo, b%max_zo-1, 1         IF (ix .EQ. (g%nxl-1)) THEN          IF (iy < g%nyl) THEN            Eyz_1 = b%bas_y%E(ix+1, iy, iz, 3)            Eyx_1 = b%bas_y%E(ix+1, iy, iz, 4)          ELSEIF(iy > g%nyyh) THEN            Eyz_1 = b%top_y%E(ix+1, iy, iz, 3)            Eyx_1 = b%top_y%E(ix+1, iy, iz, 4)          ELSEIF (iz < g%nzl) THEN            Eyz_1 = b%bas_z%E(ix+1, iy, iz, 3)            Eyx_1 = b%bas_z%E(ix+1, iy, iz, 4)          ELSEIF (iz > g%nzyh) THEN            Eyz_1 = b%top_z%E(ix+1, iy, iz, 3)            Eyx_1 = b%top_z%E(ix+1, iy, iz, 4)          ELSE            Eyz_1 = g%E(ix+1, iy, iz, 2)            Eyx_1 = 0.0d0          ENDIF        ELSE          Eyz_1 = b%bas_x%E(ix+1, iy, iz, 3)          Eyx_1 = b%bas_x%E(ix+1, iy, iz, 4)        ENDIF        c1 = EXP(- b%bas_x%sigma(ix, iy, iz, 4) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_x%sigma(ix, iy, iz, 4), c1, c2)        c3 = EXP(- b%bas_x%sigma(ix, iy, iz, 5) * g%dt/g%eps)        CALL compute_H_factor(g, b%bas_x%sigma(ix, iy, iz, 5), c3, c4)        b%bas_x%H(ix, iy, iz, 5) =     c1 *   b%bas_x%H(ix, iy, iz, 5)                     &                                     - c2 * ( Eyz_1                                        &                                            - b%bas_x%E(ix, iy, iz, 3)                     &                                            + Eyx_1                                        &                                            - b%bas_x%E(ix, iy, iz, 4))        b%bas_x%H(ix, iy, iz, 6) =     c3 *   b%bas_x%H(ix, iy, iz, 6)                     &                                     + c4 * ( b%bas_x%E(ix, iy+1, iz, 1)                   &                                            - b%bas_x%E(ix, iy, iz, 1)                     &                                            + b%bas_x%E(ix, iy+1, iz, 2)                   &                                            - b%bas_x%E(ix, iy, iz, 2))      ENDDO    ENDDO  ENDDO  ! top_x  DO ix = g%nxgh, b%max_xo-1, 1    DO iy = b%min_yo

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -