全要素電荷を点電荷近似で総和し、softening付きで観測点 r の電場ベクトルを返す。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_type), | intent(in) | :: | mesh |
要素重心 |
||
| real(kind=dp), | intent(in) | :: | r(3) | |||
| real(kind=dp), | intent(in) | :: | softening |
特異点回避のために距離2乗へ加える softening 長さ [m]。 |
||
| real(kind=dp), | intent(out) | :: | e(3) |
subroutine electric_field_at(mesh, r, softening, e) type(mesh_type), intent(in) :: mesh real(dp), intent(in) :: r(3) real(dp), intent(in) :: softening real(dp), intent(out) :: e(3) integer(i32) :: i real(dp) :: soft2, r2, inv_r3, ex, ey, ez real(dp) :: rx, ry, rz, dx, dy, dz, qi ex = 0.0d0 ey = 0.0d0 ez = 0.0d0 soft2 = softening*softening rx = r(1) ry = r(2) rz = r(3) !$omp simd reduction(+:ex,ey,ez) private(dx,dy,dz,r2,inv_r3,qi) do i = 1, mesh%nelem dx = rx - mesh%center_x(i) dy = ry - mesh%center_y(i) dz = rz - mesh%center_z(i) r2 = dx*dx + dy*dy + dz*dz + soft2 inv_r3 = 1.0d0/(sqrt(r2)*r2) qi = mesh%q_elem(i) ex = ex + qi*inv_r3*dx ey = ey + qi*inv_r3*dy ez = ez + qi*inv_r3*dz end do e(1) = k_coulomb*ex e(2) = k_coulomb*ey e(3) = k_coulomb*ez end subroutine electric_field_at