包含基于射线追踪的任意复杂界面计算

这个提交包含在:
2026-08-14 08:00:47 +08:00
父节点 d1a709985d
当前提交 b4cf75ce78
修改 91 个文件,包含 1612224 行新增515 行删除
+164 -102
查看文件
@@ -9,154 +9,216 @@ SUBROUTINE GET_NON_UNIFORMGRID
INTEGER II
INTEGER MID_P,LEFT_P,RIGHT_P,UP_P,DOWN_P
REAL(KIND=8) CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
WRITE(*,*)'Non-uniform grid meshing: core cells = ',GridSize,' m, expansion ratio SCALE_PAR = ',SCALE_PAR
! -------------------------mesh-z-------------------------------------------!
Coordiz3(nzs)=-GridSize; Coordiz3(nzs+1)=0
do ii=nzs-20,nzs+20,1
GridSize_MAX=GridSize*MAX_RATIO
do ii=nzs-UniGridNumZ1,nzs+UniGridNumZ2,1
Cdelz(ii)=GridSize
end do !Uniform mesh in an area equal to source length
do ii=nzs-21,1,-1
do ii=nzs-UniGridNumZ1-1,1,-1
Cdelz(ii)=Cdelz(ii+1)*scale_par
if(Cdelz(ii).gt.200)then
Cdelz(ii)=200
if(Cdelz(ii).gt.GridSize_MAX)then
Cdelz(ii)=GridSize_MAX
end if
end do !Ununiform mesh in the air.
do ii=nzs+21,nz,1
do ii=nzs+UniGridNumZ2+1,nz,1
Cdelz(ii)=Cdelz(ii-1)*scale_par
if(Cdelz(ii).gt.200)then
Cdelz(ii)=200
if(Cdelz(ii).gt.GridSize_MAX)then
Cdelz(ii)=GridSize_MAX
end if
end do !Ununiform mesh underground
do ii=nzs-1,1,-1
Coordiz3(ii)=Coordiz3(ii+1)-Cdelz(ii)
end do
do ii=nzs+2,nz,1
Coordiz3(ii)=Coordiz3(ii-1)+Cdelz(ii)
end do !Record the coordination information of each grid.
! ----------------------------end of mesh------------------------------------!
! -------------------------------mesh x----------------------------------------!
if(SourceLength/GridSize.gt.51)then
IF(Logi_Sourcelenth) THEN !The number of grids occupied by the source is odd
if(SourceLength/GridSize.gt.51)then
do ii=nxs-(SourceLength/GridSize-1)/2,nxs+(SourceLength/GridSize-1)/2,1
Cdelx(ii)=GridSize
end do
do ii=nxs-(SourceLength/GridSize-1)/2-1,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
do ii=nxs+(SourceLength/GridSize-1)/2+1,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
else
do ii=nxs-50,nxs+50,1
else
do ii=nxs-UniGridNumX1,nxs+UniGridNumX2,1
Cdelx(ii)=GridSize
end do
do ii=nxs-51,1,-1
do ii=nxs-UniGridNumX1-1,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
do ii=nxs+51,nx,1
do ii=nxs+UniGridNumX2+1,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
endif
end do
end if
Coordix3(nxs)=0
do ii=nxs-1,1,-1
Coordix3(ii)=Coordix3(ii+1)-(Cdelx(ii)+Cdelx(ii+1))/2
end do
do ii=nxs+1,nx,1
Coordix3(ii)=Coordix3(ii-1)+(Cdelx(ii-1)+Cdelx(ii))/2
end do
ENDIF
ELSE !The number of grids occupied by the source is even
if(SourceLength/GridSize.gt.51)then
do ii=nxs-(SourceLength/GridSize-1)/2,nxs+1+(SourceLength/GridSize-1)/2,1
Cdelx(ii)=GridSize
end do
do ii=nxs-(SourceLength/GridSize-1)/2-1,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
do ii=nxs+(SourceLength/GridSize-1)/2+2,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
else
do ii=nxs-UniGridNumX1-1,nxs+UniGridNumX2,1
Cdelx(ii)=GridSize
end do
do ii=nxs-UniGridNumX1,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
end if
end do
do ii=nxs+UniGridNumX2+1,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.GridSize_MAX)then
Cdelx(ii)=GridSize_MAX
endif
end do
ENDIF
ENDIF
! -----------------------------end of mesh------------------------------------!
! --------------------------------mesh y----------------------------------------!
if(SourceLength/GridSize.gt.51)then
do ii=nys-(SourceLength/GridSize-1)/2,nys+(SourceLength/GridSize-1)/2,1
Cdely(ii)=GridSize
enddo
do ii=nys-(SourceLength/GridSize-1)/2-1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
do ii=nys+(SourceLength/GridSize-1)/2+1,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
endif
end do
else
do ii=nys-25,nys+25,1
Cdely(ii)=GridSize
end do
do ii=nys-26,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
do ii=nys+26,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
end if
Coordiy3(nys)=-(GridSize/2); Coordiy3(nys+1)=GridSize/2
do ii=nys-1,1,-1
Coordiy3(ii)=Coordiy3(ii+1)-(Cdely(ii)+Cdely(ii+1))/2
end do
do ii=nys+1,ny,1
Coordiy3(ii)=Coordiy3(ii-1)+(Cdely(ii)+Cdely(ii-1))/2
end do
IF(Logi_Sourcelenth) THEN !The number of grids occupied by the source is odd
IF(SourceLength/GridSize.gt.51)then
do ii=nys-(SourceLength/GridSize-1)/2,nys+(SourceLength/GridSize-1)/2,1
Cdely(ii)=GridSize
enddo
do ii=nys-(SourceLength/GridSize-1)/2-1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
do ii=nys+(SourceLength/GridSize-1)/2+1,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
endif
end do
else
do ii=nys-UniGridNumY1,nys+UniGridNumY2,1
Cdely(ii)=GridSize
end do
do ii=nys-UniGridNumY1-1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
do ii=nys+UniGridNumY2+1,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
end if
ELSE !The number of grids occupied by the source is even
IF(SourceLength/GridSize.gt.51)then
do ii=nys-(SourceLength/GridSize-1)/2,nys+1+(SourceLength/GridSize-1)/2,1
Cdely(ii)=GridSize
enddo
do ii=nys-(SourceLength/GridSize-1)/2-1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
do ii=nys+(SourceLength/GridSize-1)/2+2,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
endif
end do
else
do ii=nys-UniGridNumY1-1,nys+UniGridNumY2,1
Cdely(ii)=GridSize
end do
do ii=nys-UniGridNumY1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
do ii=nys+UniGridNumY2+1,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.GridSize_MAX)then
Cdely(ii)=GridSize_MAX
end if
end do
end if
ENDIF
! ------------------------------end of mesh-----------------------------------!
! ------------------------------record coordinate----------------------------!
open(10006,file='HzCoordinate.dat') !You can find the coordination information of each grid in this file.
write(10006,*)nx,ny,nz
write(10006,*)'!---------------------------------X part--------------------------------!'
do ii=1,nx,1
write(10006,*)ii,Coordix3(ii)
end do
write(10006,*)'!----------------------------end of X part----------------------------!'
write(10006,*)'!---------------------------------Y part---------------------------------!'
do ii=1,ny,1
write(10006,*)ii,Coordiy3(ii)
end do
write(10006,*)'!----------------------------end of Y part----------------------------!'
write(10006,*)'!---------------------------------Z part---------------------------------!'
do ii=1,nz,1
write(10006,*)ii,Coordiz3(ii)
end do
write(10006,*)'!----------------------------end of Z part----------------------------!'
close(10006)
!----------------------------end of recording-------------------------------!
CDELX_LENGTH=SUM(CDELX)
CDELY_LENGTH=SUM(CDELY)
CDELZ_LENGTH=SUM(CDELZ)
WRITE(10005,*)'设置的模型尺寸为:'
WRITE(10005,*)'õģͳߴΪ'
WRITE(10005,*)'SUM_X=',CDELX_LENGTH
WRITE(10005,*)'SUM_Y=',CDELY_LENGTH
WRITE(10005,*)'SUM_Z=',CDELZ_LENGTH
WRITE(10005,*)'相邻网格放大系数=',SCALE_PAR
WRITE(10005,*)'最大网格尺寸与最小网格尺寸之比<=',MAX_RATIO
WRITE(10005,*)'X方向的非均匀网格尺寸为:'
WRITE(10005,*)'Ŵϵ=',SCALE_PAR
WRITE(10005,*)'ߴСߴ֮<=',MAX_RATIO
WRITE(10005,*)'XķǾߴΪ'
WRITE(10005,'(5F18.8)')CDELX
WRITE(10005,*)'Y方向的非均匀网格尺寸为:'
WRITE(10005,*)'YķǾߴΪ'
WRITE(10005,'(5F18.8)')CDELY
WRITE(10005,*)'Z方向的非均匀网格尺寸为:'
WRITE(10005,*)'ZķǾߴΪ'
WRITE(10005,'(5F18.8)')CDELZ
WRITE(*,*)'Model size:',CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
ENDSUBROUTINE GET_NON_UNIFORMGRID
!===============================================================================================!
! GET_UNIFORM_GRID: 均匀网格剖分,用于 CPML 吸收边界。
! 参考实现(tem3dfdtd_第二版)中 CPML 采用的是均匀网格(SCALE_PAR=1.0,
! 扩展循环全部注释),因此这里按 Logic_PML 分流:Logic_PML=1 时调用本子程序
! (均匀网格 + CPML),Logic_PML=0 时调用 GET_NON_UNIFORMGRID(非均匀网格 + Dirichlet)。
!===============================================================================================!
SUBROUTINE GET_UNIFORM_GRID
USE CONSTANTPARAMETERS
IMPLICIT NONE
INTEGER II
REAL(KIND=8) CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
WRITE(*,*)'Uniform grid meshing: all cells = ',GridSize,' m (required by the CPML absorbing boundary)'
! 均匀网格:所有网格尺寸均等于 GridSize
Cdelx=GridSize
Cdely=GridSize
Cdelz=GridSize
CDELX_LENGTH=SUM(CDELX)
CDELY_LENGTH=SUM(CDELY)
CDELZ_LENGTH=SUM(CDELZ)
WRITE(10005,*)'采用均匀网格剖分(配合 CPML 吸收边界):'
WRITE(10005,*)'SUM_X=',CDELX_LENGTH
WRITE(10005,*)'SUM_Y=',CDELY_LENGTH
WRITE(10005,*)'SUM_Z=',CDELZ_LENGTH
WRITE(10005,*)'均匀网格尺寸=',GridSize
WRITE(*,*)'Model size:',CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
OPEN(400,FILE='CDELX.DAT',STATUS='UNKNOWN')
DO II=1,NX
@@ -173,4 +235,4 @@ SUBROUTINE GET_NON_UNIFORMGRID
WRITE(400,'(E13.6)')CDELZ(II)
ENDDO
CLOSE(400)
ENDSUBROUTINE GET_NON_UNIFORMGRID
ENDSUBROUTINE GET_UNIFORM_GRID