fortran计算频率域地下垂直长导线源的电磁场
时间: 2023-07-11 12:09:14 浏览: 49
要计算频率域地下垂直长导线源的电磁场,可以使用有限元法(FEM)。在这里,我们将介绍如何使用FEM在Fortran中计算电磁场。
以下是一个简单的Fortran程序示例,用于计算频率域地下垂直长导线源的电磁场。在这个例子中,假设导线长度为L,电流为I,导线距离地面为h,导线距离观测点为r,观测频率为f。
```fortran
program fem
implicit none
integer, parameter :: N = 100 ! 网格数
real, parameter :: L = 100.0, h = 10.0, I = 1.0, f = 1.0e6 ! 导线长度、距离、电流、观测频率
real, parameter :: c = 3.0e8 ! 光速
real :: dx, dy, dz, r, k, alpha, beta, gamma ! 离散步长、距离、波数、阻抗、传播常数
real :: Ex(N, N), Ey(N, N), Ez(N, N), Hx(N, N), Hy(N, N), Hz(N, N) ! 电场和磁场
real :: A(N, N), B(N, N), C(N, N), D(N, N), E(N, N), F(N, N), G(N, N), H(N, N), I(N, N), J(N, N) ! 系数矩阵和右手边向量
integer :: i, j ! 网格索引
! 计算离散步长
dx = L / N
dy = dx
dz = dx
! 计算波数、阻抗和传播常数
k = 2.0 * PI * f / c
alpha = sqrt((1.0j * k * h) ^ 2 + 1.0)
beta = sqrt((1.0j * k * r) ^ 2 + 1.0)
gamma = alpha * beta
! 初始化电场和磁场
Ex = 0.0
Ey = 0.0
Ez = 0.0
Hx = 0.0
Hy = 0.0
Hz = 0.0
! 计算系数矩阵和右手边向量
do i = 1, N
do j = 1, N
! 计算系数矩阵
A(i, j) = (1.0j * k * mu * dx) ^ -1
B(i, j) = (1.0j * k * mu * dy) ^ -1
C(i, j) = (1.0j * k * mu * dz) ^ -1
D(i, j) = (1.0j * k * epsilon * dx) ^ -1
E(i, j) = (1.0j * k * epsilon * dy) ^ -1
F(i, j) = (1.0j * k * epsilon * dz) ^ -1
G(i, j) = (1.0j * k * mu * h) * A(i, j) / alpha
H(i, j) = (1.0j * k * mu * r) * B(i, j) / beta
I(i, j) = G(i, j) * exp(-1.0j * k * h)
J(i, j) = (I(i, j) * gamma - I(i, j + 1)) / dz
! 计算右手边向量
if (i == N / 2 .and. j == N / 2) then
F(i, j) = F(i, j) + (1.0j * k * epsilon) ^ -1
else if (j == N / 2) then
J(i, j) = J(i, j) + I(i, j) / dz
end if
end do
end do
! 解线性方程组
! 这里使用共轭梯度法(CG)求解
call cg_solver(N * N, A, B, C, D, E, F, G, H, I, J, Ex, Ey, Ez, Hx, Hy, Hz)
! 在导线上施加电流
do i = 1, N
Ex(i, N / 2) = Ex(i, N / 2) + I / (epsilon * dx)
Ey(i, N / 2) = Ey(i, N / 2) + I / (epsilon * dy)
Ez(i, N / 2) = Ez(i, N / 2) + I / (epsilon * dz) * exp(-1.0j * k * r) / gamma
end do
! 在观测点计算电场和磁场
! 这里假设观测点在导线正下方,距离为h
Ex(N / 2, N / 2) = Ex(N / 2, N / 2) + I / (epsilon * dx) * exp(-1.0j * k * h) / alpha
Ey(N / 2, N / 2) = Ey(N / 2, N / 2) + I / (epsilon * dy) * exp(-1.0j * k * h) / alpha
Ez(N / 2, N / 2) = Ez(N / 2, N / 2) + I / (epsilon * dz) * exp(-1.0j * k * h) / gamma
! 保存结果
end program fem
subroutine cg_solver(n, A, B, C, D, E, F, G, H, I, J, Ex, Ey, Ez, Hx, Hy, Hz)
implicit none
integer, intent(in) :: n ! 矩阵和向量大小
real, dimension(n, n), intent(in) :: A, B, C, D, E, G, H ! 系数矩阵
real, dimension(n, n), intent(in) :: F ! 对角矩阵
real, dimension(n, n), intent(in) :: I ! 上三角矩阵
real, dimension(n, n), intent(in) :: J ! 右手边向量
real, dimension(n, n), intent(out) :: Ex, Ey, Ez, Hx, Hy, Hz ! 解向量
real, dimension(n, n) :: r, p, Ap ! 中间向量
real :: alpha, beta, r0, r1 ! 缩放因子和误差
Ex = 0.0
Ey = 0.0
Ez = 0.0
Hx = 0.0
Hy = 0.0
Hz = 0.0
r = J - A * Ex * D - B * Ey * E - C * Ez * F - G * Hx * D - H * Hy * E - I * Hz * F
p = r
do while (r1 > r0 * 1.0e-6)
Ap = A * p * D + B * p * E + C * p * F + G * p * H * D + H * p * Hy * E + I * p * Hz * F
alpha = dot_product(r, r) / dot_product(p, Ap)
Ex = Ex + alpha * p
Ey = Ey + alpha * p
Ez = Ez + alpha * p
Hx = Hx + alpha * p
Hy = Hy + alpha * p
Hz = Hz + alpha * p
r = r - alpha * Ap
beta = dot_product(r, r) / dot_product(p, Ap)
p = r + beta * p
r0 = r1
r1 = dot_product(r, r)
end do
end subroutine cg_solver
```
这个程序将在二维平面中计算电磁场,并在导线上施加电流,在观测点计算电场和磁场。您可以通过更改导线的长度、