Analytic free-space P0 triangle potential, field, principal value, and jump.
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| integer(kind=i32), | public, | parameter | :: | panel_side_principal_value | = | 0_i32 | |
| integer(kind=i32), | public, | parameter | :: | panel_side_normal_plus | = | 1_i32 | |
| integer(kind=i32), | public, | parameter | :: | panel_side_normal_minus | = | -1_i32 |
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(panel_geometry_type), | intent(in) | :: | geometry | |||
| real(kind=dp), | intent(in) | :: | charge | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| integer(kind=i32), | intent(in) | :: | side | |||
| real(kind=dp), | intent(out) | :: | potential | |||
| real(kind=dp), | intent(out) | :: | field(3) |
Principal-value potential and field of geometry translated by shift, without copying it.
The arithmetic is the same as panel_potential_field applied to a geometry whose vertices were
translated, evaluated once per vertex distance instead of once per edge end, so the result is
bitwise identical. A target on the panel plane falls back to that routine.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(panel_geometry_type), | intent(in) | :: | geometry | |||
| real(kind=dp), | intent(in) | :: | shift(3) | |||
| real(kind=dp), | intent(in) | :: | charge | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| real(kind=dp), | intent(out) | :: | potential | |||
| real(kind=dp), | intent(out) | :: | field(3) |
Principal-value field at target of count translated panels given as component arrays
(translated vertex x/y/z per vertex, normal, edge lengths, outward edge normals, area), accumulated
into ex, ey, ez divided by k_coulomb as the FMM near field stores it. Entry k carries
charge(index(k)); geometry(index(k)) is only read for the on-plane fallback. The SIMD loop
performs the operations of panel_potential_field_translated in the same order and the
contributions are added in list order, so the sum matches a loop over that routine bit for bit;
zero charges are skipped as that loop skips them.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | count | |||
| real(kind=dp), | intent(in) | :: | vx(3,*) | |||
| real(kind=dp), | intent(in) | :: | vy(3,*) | |||
| real(kind=dp), | intent(in) | :: | vz(3,*) | |||
| real(kind=dp), | intent(in) | :: | nx(*) | |||
| real(kind=dp), | intent(in) | :: | ny(*) | |||
| real(kind=dp), | intent(in) | :: | nz(*) | |||
| real(kind=dp), | intent(in) | :: | edge(3,*) | |||
| real(kind=dp), | intent(in) | :: | ox(3,*) | |||
| real(kind=dp), | intent(in) | :: | oy(3,*) | |||
| real(kind=dp), | intent(in) | :: | oz(3,*) | |||
| real(kind=dp), | intent(in) | :: | area(*) | |||
| integer(kind=i32), | intent(in) | :: | index(*) | |||
| real(kind=dp), | intent(in) | :: | charge(:) | |||
| type(panel_geometry_type), | intent(in) | :: | geometry(:) | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| real(kind=dp), | intent(inout) | :: | ex | |||
| real(kind=dp), | intent(inout) | :: | ey | |||
| real(kind=dp), | intent(inout) | :: | ez |
Principal-value potential counterpart of panel_field_sum_translated, accumulated into phi
divided by k_coulomb.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | count | |||
| real(kind=dp), | intent(in) | :: | vx(3,*) | |||
| real(kind=dp), | intent(in) | :: | vy(3,*) | |||
| real(kind=dp), | intent(in) | :: | vz(3,*) | |||
| real(kind=dp), | intent(in) | :: | nx(*) | |||
| real(kind=dp), | intent(in) | :: | ny(*) | |||
| real(kind=dp), | intent(in) | :: | nz(*) | |||
| real(kind=dp), | intent(in) | :: | edge(3,*) | |||
| real(kind=dp), | intent(in) | :: | ox(3,*) | |||
| real(kind=dp), | intent(in) | :: | oy(3,*) | |||
| real(kind=dp), | intent(in) | :: | oz(3,*) | |||
| real(kind=dp), | intent(in) | :: | area(*) | |||
| integer(kind=i32), | intent(in) | :: | index(*) | |||
| real(kind=dp), | intent(in) | :: | charge(:) | |||
| type(panel_geometry_type), | intent(in) | :: | geometry(:) | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| real(kind=dp), | intent(inout) | :: | phi |
Single-precision counterpart of panel_field_sum_translated. The component tables hold the panels
translated by their image shift and relative to the leaf center; target_local is the target in the
same frame (double, rounded here) and target the absolute target for the on-plane fallback, which
still runs the double-precision kernel on geometry(index(k)) translated by shift1(k), shift2(k)
along axes. Eight panels per AVX2 vector; the field error is around 1e-6 relative.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | count | |||
| real(kind=sp), | intent(in) | :: | vx(3,*) | |||
| real(kind=sp), | intent(in) | :: | vy(3,*) | |||
| real(kind=sp), | intent(in) | :: | vz(3,*) | |||
| real(kind=sp), | intent(in) | :: | nx(*) | |||
| real(kind=sp), | intent(in) | :: | ny(*) | |||
| real(kind=sp), | intent(in) | :: | nz(*) | |||
| real(kind=sp), | intent(in) | :: | edge(3,*) | |||
| real(kind=sp), | intent(in) | :: | ox(3,*) | |||
| real(kind=sp), | intent(in) | :: | oy(3,*) | |||
| real(kind=sp), | intent(in) | :: | oz(3,*) | |||
| real(kind=sp), | intent(in) | :: | area(*) | |||
| integer(kind=i32), | intent(in) | :: | index(*) | |||
| real(kind=dp), | intent(in) | :: | charge(:) | |||
| type(panel_geometry_type), | intent(in) | :: | geometry(:) | |||
| integer(kind=i32), | intent(in) | :: | axes(2) | |||
| real(kind=dp), | intent(in) | :: | shift1(*) | |||
| real(kind=dp), | intent(in) | :: | shift2(*) | |||
| real(kind=dp), | intent(in) | :: | target_local(3) | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| real(kind=dp), | intent(inout) | :: | ex | |||
| real(kind=dp), | intent(inout) | :: | ey | |||
| real(kind=dp), | intent(inout) | :: | ez |
Single-precision counterpart of panel_potential_sum_translated; see panel_field_sum_translated_sp.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=i32), | intent(in) | :: | count | |||
| real(kind=sp), | intent(in) | :: | vx(3,*) | |||
| real(kind=sp), | intent(in) | :: | vy(3,*) | |||
| real(kind=sp), | intent(in) | :: | vz(3,*) | |||
| real(kind=sp), | intent(in) | :: | nx(*) | |||
| real(kind=sp), | intent(in) | :: | ny(*) | |||
| real(kind=sp), | intent(in) | :: | nz(*) | |||
| real(kind=sp), | intent(in) | :: | edge(3,*) | |||
| real(kind=sp), | intent(in) | :: | ox(3,*) | |||
| real(kind=sp), | intent(in) | :: | oy(3,*) | |||
| real(kind=sp), | intent(in) | :: | oz(3,*) | |||
| real(kind=sp), | intent(in) | :: | area(*) | |||
| integer(kind=i32), | intent(in) | :: | index(*) | |||
| real(kind=dp), | intent(in) | :: | charge(:) | |||
| type(panel_geometry_type), | intent(in) | :: | geometry(:) | |||
| integer(kind=i32), | intent(in) | :: | axes(2) | |||
| real(kind=dp), | intent(in) | :: | shift1(*) | |||
| real(kind=dp), | intent(in) | :: | shift2(*) | |||
| real(kind=dp), | intent(in) | :: | target_local(3) | |||
| real(kind=dp), | intent(in) | :: | target(3) | |||
| real(kind=dp), | intent(inout) | :: | phi |