📄 mur.f90
字号:
! mur.f90! ! Mur ABC 1. und 2. Ordnung! ! (adapted Mur 2. order from the DR. RAYMOND J. LUEBBERS code)! Copyright (C) 2007 Paul Panserrieu, < peutetre@cs.tu-berlin.de >!! This program is free software: you can redistribute it and/or modify! it under the terms of the GNU General Public License as published by! the Free Software Foundation, either version 3 of the License.! ! last modified: 30-08-2007 11:28:01 AM CESTMODULE murUSE fdtd_gitterIMPLICIT NONETYPE rand ! Speicherung paralleler elektrischer Feldvektoren ! an den Raendern "obj%faceXl(1,2,Ey or Ez)" DOUBLE PRECISION, POINTER, DIMENSION(:, :, :) :: faceXl, faceXh ! (Ey oder Ez) DOUBLE PRECISION, POINTER, DIMENSION(:, :, :) :: faceYl, faceYh ! (Ex oder Ez) DOUBLE PRECISION, POINTER, DIMENSION(:, :, :) :: faceZl, faceZh ! (Ex oder Ey)END TYPE randTYPE MurBound DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EYSX1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EZSX1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EZSY1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EXSY1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EXSZ1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EYSZ1 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EYSX2 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EZSX2 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EZSY2 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EXSY2 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EXSZ2 DOUBLE PRECISION, POINTER, DIMENSION(:,:,:) :: EYSZ2 DOUBLE PRECISION :: CD, CXDD, CFDDEND TYPE MurBoundCONTAINS SUBROUTINE init_rand(g, b) TYPE(gitter), INTENT(IN) :: g TYPE(rand), INTENT(INOUT) :: b ALLOCATE( b%faceXl(g%nyl:g%nygh, g%nzl:g%nzgh, 1:2), & b%faceXh(g%nyl:g%nygh, g%nzl:g%nzgh, 1:2), & b%faceYl(g%nxl:g%nxgh, g%nzl:g%nzgh, 1:2), & b%faceYh(g%nxl:g%nxgh, g%nzl:g%nzgh, 1:2), & b%faceZl(g%nxl:g%nxgh, g%nyl:g%nygh, 1:2), & b%faceZh(g%nxl:g%nxgh, g%nyl:g%nygh, 1:2) & ) b%faceXl(g%nyl:g%nygh, g%nzl:g%nzgh, 1:2) = 0.0d0 b%faceXh(g%nyl:g%nygh, g%nzl:g%nzgh, 1:2) = 0.0d0 b%faceYl(g%nxl:g%nxgh, g%nzl:g%nzgh, 1:2) = 0.0d0 b%faceYh(g%nxl:g%nxgh, g%nzl:g%nzgh, 1:2) = 0.0d0 b%faceZl(g%nxl:g%nxgh, g%nyl:g%nygh, 1:2) = 0.0d0 b%faceZh(g%nxl:g%nxgh, g%nyl:g%nygh, 1:2) = 0.0d0END SUBROUTINE init_randSUBROUTINE init_mur_2(g, MB) TYPE(gitter), INTENT(IN) :: g TYPE(MurBound), INTENT(INOUT) :: MB ALLOCATE( MB%EYSX1(1:4,g%nyl:g%nyyh,g%nzl:g%nzyh) & , MB%EZSX1(1:4,g%nyl:g%nyyh,g%nzl:g%nzyh) & , MB%EZSY1(g%nxl:g%nxyh,1:4,g%nzl:g%nzyh) & , MB%EXSY1(g%nxl:g%nxyh,1:4,g%nzl:g%nzyh) & , MB%EXSZ1(g%nxl:g%nxyh,g%nyl:g%nyyh,1:4) & , MB%EYSZ1(g%nxl:g%nxyh,g%nyl:g%nyyh,1:4) ) MB%EYSX1(:,:,:) = 0.0d0 MB%EZSX1(:,:,:) = 0.0d0 MB%EZSY1(:,:,:) = 0.0d0 MB%EXSY1(:,:,:) = 0.0d0 MB%EXSZ1(:,:,:) = 0.0d0 MB%EYSZ1(:,:,:) = 0.0d0 ALLOCATE( MB%EYSX2(1:4,g%nyl:g%nyyh,g%nzl:g%nzyh) & , MB%EZSX2(1:4,g%nyl:g%nyyh,g%nzl:g%nzyh) & , MB%EZSY2(g%nxl:g%nxyh,1:4,g%nzl:g%nzyh) & , MB%EXSY2(g%nxl:g%nxyh,1:4,g%nzl:g%nzyh) & , MB%EXSZ2(g%nxl:g%nxyh,g%nyl:g%nyyh,1:4) & , MB%EYSZ2(g%nxl:g%nxyh,g%nyl:g%nyyh,1:4) ) MB%EYSX2(:,:,:) = 0.0d0 MB%EZSX2(:,:,:) = 0.0d0 MB%EZSY2(:,:,:) = 0.0d0 MB%EXSY2(:,:,:) = 0.0d0 MB%EXSZ2(:,:,:) = 0.0d0 MB%EYSZ2(:,:,:) = 0.0d0 MB%CD=(C*g%dt-g%dx)/(C*g%dt+g%dx) MB%CXDD=2.0d0*g%dx/(C*g%dt+g%dx) MB%CFDD=C*g%dt*C*g%dt/(2.0d0*g%dx*(C*g%dt+g%dx))END SUBROUTINE init_mur_2SUBROUTINE load_mur(g, b_uno, mb, boundary_type) TYPE(gitter), INTENT(IN) :: g TYPE(rand), INTENT(INOUT) :: b_uno TYPE(MurBound), INTENT(INOUT) :: mb INTEGER, INTENT(IN) :: boundary_type IF ((boundary_type .EQ. 1) .OR. (boundary_type .EQ. 2)) THEN CALL init_rand(g, b_uno) ENDIF IF ((boundary_type .EQ. 2)) THEN CALL init_mur_2(g, mb) ENDIFEND SUBROUTINE load_murSUBROUTINE store_mur_first(g, b) TYPE(gitter), INTENT(IN) :: g TYPE(rand), INTENT(INOUT) :: b INTEGER :: ix, iy, iz DOUBLE PRECISION :: cst cst = (C * g%dt - g%dx) / (C * g%dt + g%dx) ! x Ebene DO iy = g%nyl, g%nyyh, 1 DO iz = g%nzl+1, g%nzyh, 1 !E_y b%faceXl(iy, iz, 1) = g%E(g%nxl + 1, iy, iz, 2) - cst * g%E(g%nxl, iy, iz, 2) b%faceXh(iy, iz, 1) = g%E(g%nxyh, iy, iz, 2) - cst * g%E(g%nxgh, iy, iz, 2) ENDDO ENDDO DO iy = g%nyl+1, g%nygh-1, 1 DO iz = g%nzl, g%nzyh, 1 ! E_z b%faceXl(iy, iz, 2) = g%E(g%nxl + 1, iy, iz, 3) - cst * g%E(g%nxl, iy, iz, 3) b%faceXh(iy, iz, 2) = g%E(g%nxyh, iy, iz, 3) - cst * g%E(g%nxgh, iy, iz, 3) ENDDO ENDDO ! y DO ix = g%nxl, g%nxyh, 1 DO iz = g%nzl+1, g%nzyh, 1 ! Ex b%faceYl(ix, iz, 1) = g%E(ix, g%nyl + 1, iz, 1) - cst * g%E(ix, g%nyl, iz, 1) b%faceYh(ix, iz, 1) = g%E(ix, g%nyyh, iz, 1) - cst * g%E(ix, g%nygh, iz, 1) ENDDO ENDDO DO ix = g%nxl, g%nxgh, 1 DO iz = g%nzl, g%nzyh, 1 ! Ez b%faceYl(ix, iz, 2) = g%E(ix, g%nyl + 1, iz, 3) - cst * g%E(ix, g%nyl, iz, 3) b%faceYh(ix, iz, 2) = g%E(ix, g%nyyh, iz, 3) - cst * g%E(ix, g%nygh, iz, 3) ENDDO ENDDO ! und z DO ix = g%nxl, g%nxyh, 1 DO iy = g%nyl, g%nygh, 1 ! Ex b%faceZl(ix, iy, 1) = g%E(ix, iy, g%nzl + 1, 1) - cst * g%E(ix, iy, g%nzl, 1) b%faceZh(ix, iy, 1) = g%E(ix, iy, g%nzyh, 1) - cst * g%E(ix, iy, g%nzgh, 1) ENDDO ENDDO DO ix = g%nxl, g%nxgh, 1 DO iy = g%nyl, g%nyyh, 1 ! Ey b%faceZl(ix, iy, 2) = g%E(ix, iy, g%nzl + 1, 2) - cst * g%E(ix, iy, g%nzl, 2) b%faceZh(ix, iy, 2) = g%E(ix, iy, g%nzyh , 2) - cst * g%E(ix, iy, g%nzgh, 2) ENDDO ENDDOEND SUBROUTINE store_mur_firstSUBROUTINE add_mur_first(g, b) TYPE(gitter), INTENT(INOUT) :: g TYPE(rand), INTENT(IN) :: b INTEGER :: ix, iy, iz DOUBLE PRECISION :: cst cst = (C * g%dt - g%dx) / (C * g%dt + g%dx) ! x Ebene DO iy = g%nyl, g%nyyh, 1 DO iz = g%nzl+1, g%nzyh, 1 ! E_y g%E(g%nxl, iy, iz, 2) = b%faceXl(iy, iz, 1) + cst * g%E(g%nxl + 1, iy, iz, 2) g%E(g%nxgh, iy, iz, 2) = b%faceXh(iy, iz, 1) + cst * g%E(g%nxyh, iy, iz, 2) ENDDO ENDDO DO iy = g%nyl+1, g%nyyh, 1 DO iz = g%nzl, g%nzyh, 1 ! E_z g%E(g%nxl, iy, iz, 3) = b%faceXl(iy, iz, 2) + cst * g%E(g%nxl + 1, iy, iz, 3) g%E(g%nxgh, iy, iz, 3) = b%faceXh(iy, iz, 2) + cst * g%E(g%nxyh, iy, iz, 3) ENDDO ENDDO ! y DO ix = g%nxl, g%nxyh, 1 DO iz = g%nzl+1, g%nzyh, 1 ! E_x g%E(ix, g%nyl, iz, 1) = b%faceYl(ix, iz, 1) + cst * g%E(ix, g%nyl + 1, iz, 1) g%E(ix, g%nygh, iz, 1) = b%faceYh(ix, iz, 1) + cst * g%E(ix, g%nyyh, iz, 1) ENDDO ENDDO DO ix = g%nxl, g%nxgh, 1 DO iz = g%nzl, g%nzyh, 1 ! E_z g%E(ix, g%nyl, iz, 3) = b%faceYl(ix, iz, 2) + cst * g%E(ix, g%nyl + 1, iz, 3) g%E(ix, g%nygh, iz, 3) = b%faceYh(ix, iz, 2) + cst * g%E(ix, g%nyyh, iz, 3) ENDDO ENDDO ! und z DO ix = g%nxl, g%nxyh, 1 DO iy = g%nyl, g%nygh, 1 ! E_x g%E(ix, iy, g%nzl, 1) = b%faceZl(ix, iy, 1) + cst * g%E(ix, iy, g%nzl + 1, 1) g%E(ix, iy, g%nzgh, 1) = b%faceZh(ix, iy, 1) + cst * g%E(ix, iy, g%nzyh, 1) ENDDO ENDDO DO ix = g%nxl, g%nxgh, 1 DO iy = g%nyl, g%nyyh, 1 ! E_y g%E(ix, iy, g%nzl, 2) = b%faceZl(ix, iy, 2) + cst * g%E(ix, iy, g%nzl + 1, 2) g%E(ix, iy, g%nzgh, 2) = b%faceZh(ix, iy, 2) + cst * g%E(ix, iy, g%nzyh, 2) ENDDO ENDDOEND SUBROUTINE add_mur_first! Mur ABC 2. order code from FDTDA adapted for Sfdtd! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!! PENN STATE UNIVERSITY FINITE DIFFERENCE TIME DOMAIN! ELECTROMAGNETIC ANALYSIS COMPUTER CODE--VERSION A!! VERSION A: AUGUST 25, 1992!! DR. RAYMOND J. LUEBBERS! 203 E E EAST BLDG.! UNIVERSITY PARK, PA 16802! INTERNET: LU4@PSUVM.PSU.EDU, BITNET: LU4@PSUVM.BITNETSUBROUTINE mur_2_Ezx(g, r) TYPE(gitter), INTENT(INOUT) :: g TYPE(MurBound), INTENT(INOUT) :: r INTEGER :: I, J, K !DO EDGES WITH FIRST ORDER ORBC DO K=g%nzl, g%nzyh, 1 J = g%nyl+1 g%E(g%nxl, J, K, 3) = r%EZSX1(2,J,K)+r%CD*(g%E(g%nxl+1, J, K, 3)-r%EZSX1(1,J,K)) g%E(g%nxgh, J, K, 3)= r%EZSX1(3,J,K)+r%CD*(g%E(g%nxyh, J, K, 3)-r%EZSX1(4,J,K)) J=g%nyyh g%E(g%nxl, J, K, 3) = r%EZSX1(2,J,K)+r%CD*(g%E(g%nxl+1, J, K, 3)-r%EZSX1(1,J,K)) g%E(g%nxgh, J, K, 3)= r%EZSX1(3,J,K)+r%CD*(g%E(g%nxyh, J, K, 3)-r%EZSX1(4,J,K)) ENDDO DO J=g%nyl+2,g%nyyh-1, 1 K=g%nzl g%E(g%nxl, J, K, 3) = r%EZSX1(2,J,K)+r%CD*(g%E(g%nxl+1, J, K, 3)-r%EZSX1(1,J,K)) g%E(g%nxgh, J, K, 3)= r%EZSX1(3,J,K)+r%CD*(g%E(g%nxyh, J, K, 3)-r%EZSX1(4,J,K)) K=g%nzyh g%E(g%nxl, J, K, 3) = r%EZSX1(2,J,K)+r%CD*(g%E(g%nxl+1, J, K, 3)-r%EZSX1(1,J,K)) g%E(g%nxgh, J, K, 3)= r%EZSX1(3,J,K)+r%CD*(g%E(g%nxyh, J, K, 3)-r%EZSX1(4,J,K)) ENDDO !NOW DO 2ND ORDER ORBC ON REMAINING PORTIONS OF FACES DO K=g%nzl+1,g%nzyh-1, 1 DO J=g%nyl+2,g%nyyh-1, 1 g%E(g%nxl,J,K,3)= - r%EZSX2(2,J,K)+r%CD*(g%E(g%nxl+1,J,K,3)+r%EZSX2(1,J,K)) & + r%CXDD*(r%EZSX1(1,J,K)+r%EZSX1(2,J,K)) & + r%CFDD*(r%EZSX1(1,J+1,K)-2.0d0*r%EZSX1(1,J,K)+r%EZSX1(1,J-1,K) & + r%EZSX1(2,J+1,K)-2.0d0*r%EZSX1(2,J,K)+r%EZSX1(2,J-1,K)) & + r%CFDD*(r%EZSX1(1,J,K+1)-2.0d0*r%EZSX1(1,J,K)+r%EZSX1(1,J,K-1) & + r%EZSX1(2,J,K+1)-2.0d0*r%EZSX1(2,J,K)+r%EZSX1(2,J,K-1)) g%E(g%nxgh,J,K,3)= - r%EZSX2(3,J,K)+r%CD*(g%E(g%nxyh,J,K,3)+r%EZSX2(4,J,K)) & + r%CXDD*(r%EZSX1(4,J,K)+r%EZSX1(3,J,K)) & + r%CFDD*(r%EZSX1(4,J+1,K)-2.0d0*r%EZSX1(4,J,K)+r%EZSX1(4,J-1,K) & + r%EZSX1(3,J+1,K)-2.0d0*r%EZSX1(3,J,K)+r%EZSX1(3,J-1,K)) & + r%CFDD*(r%EZSX1(4,J,K+1)-2.0d0*r%EZSX1(4,J,K)+r%EZSX1(4,J,K-1) & + r%EZSX1(3,J,K+1)-2.0d0*r%EZSX1(3,J,K)+r%EZSX1(3,J,K-1)) ENDDO ENDDO !NOW SAVE PAST VALUES DO K=g%nzl,g%nzyh, 1 DO J=g%nyl+1,g%nyyh, 1 r%EZSX2(1,J,K)=r%EZSX1(1,J,K) r%EZSX2(2,J,K)=r%EZSX1(2,J,K) r%EZSX2(3,J,K)=r%EZSX1(3,J,K) r%EZSX2(4,J,K)=r%EZSX1(4,J,K) r%EZSX1(1,J,K)=g%E(g%nxl,J,K,3) r%EZSX1(2,J,K)=g%E(g%nxl+1,J,K,3) r%EZSX1(3,J,K)=g%E(g%nxyh,J,K,3) r%EZSX1(4,J,K)=g%E(g%nxgh,J,K,3) ENDDO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -