23 use,
intrinsic :: iso_fortran_env
40 logical :: local_basis
44 real(real64) :: min_mesh_scaling_product
46 generic :: vector_from_cartesian => dvector_from_cartesian, zvector_from_cartesian
52 generic :: covector_to_cartesian => dcovector_to_cartesian, zcovector_to_cartesian
66 procedure(coordinate_system_to_cartesian),
deferred :: to_cartesian
68 procedure(coordinate_system_from_cartesian),
deferred :: from_cartesian
70 procedure(coordinate_system_write_info),
deferred :: write_info
72 procedure(coordinates_surface_element),
deferred :: surface_element
74 procedure(coordinate_system_jacobian),
deferred :: jacobian
76 procedure(coordinate_system_jacobian_inverse),
deferred :: jacobian_inverse
87 class(coordinate_system_t),
target,
intent(in) :: this
88 real(real64),
intent(in) :: chi(:)
89 real(real64) :: xx(1:this%dim)
97 class(coordinate_system_t),
target,
intent(in) :: this
98 real(real64),
intent(in) :: xx(:)
99 real(real64) :: chi(1:this%dim)
106 class(coordinate_system_t),
intent(in) :: this
107 integer,
optional,
intent(in) :: iunit
108 type(namespace_t),
optional,
intent(in) :: namespace
112 real(real64) function coordinates_surface_element(this, idir) result(ds)
115 class(coordinate_system_t),
intent(in) :: this
116 integer,
intent(in) :: idir
123 class(coordinate_system_t),
intent(in) :: this
124 real(real64),
intent(in) :: chi(:)
125 real(real64) :: jacobian(1:this%dim, 1:this%dim)
132 class(coordinate_system_t),
intent(in) :: this
133 real(real64),
intent(in) :: chi(:)
134 real(real64) :: jacobian_inverse(1:this%dim, 1:this%dim)
142 real(real64),
intent(in) :: chi(:)
143 real(real64) :: metric(1:this%dim, 1:this%dim)
145 real(real64) :: jacobian(1:this%dim, 1:this%dim)
147 jacobian = this%jacobian(chi)
148 metric = matmul(transpose(jacobian), jacobian)
154 real(real64),
intent(in) :: chi(:)
155 real(real64) :: metric_inverse(1:this%dim, 1:this%dim)
157 real(real64) :: jacobian_inverse(1:this%dim, 1:this%dim)
159 jacobian_inverse = this%jacobian_inverse(chi)
160 metric_inverse = matmul(jacobian_inverse, transpose(jacobian_inverse))
166 real(real64),
intent(in) :: chi(:)
167 real(real64) :: jacobian_determinant
169 real(real64) :: jacobian(1:this%dim, 1:this%dim)
171 jacobian = this%jacobian(chi)
172 jacobian_determinant = lalg_determinant(this%dim, jacobian, preserve_mat=.false.)
178 real(real64),
intent(in) :: chi(:)
179 real(real64) :: trace_hessian(1:this%dim)
182 if (this%local_basis)
then
184 call messages_not_implemented(
"Trace of Hessian for the coordinate system in use")
186 trace_hessian(:) = m_zero
192#include "coordinate_system_inc.F90"
195#include "complex.F90"
196#include "coordinate_system_inc.F90"
Convert Cartesian coordinates to coordinates in this coordinate system.
Convert coordinates given in this coordinate system to Cartesian coordinates.
real(real64) function, dimension(1:this%dim) coordinate_system_trace_hessian(this, chi)
subroutine dcoordinate_system_covector_to_cartesian(this, chi, cv, src)
subroutine zcoordinate_system_covector_to_cartesian(this, chi, cv, src)
real(real64) function coordinate_system_jacobian_determinant(this, chi)
subroutine zcoordinate_system_vector_from_cartesian(this, chi, vv, src)
real(real64) function, dimension(1:this%dim, 1:this%dim) coordinate_system_metric_inverse(this, chi)
real(real64) function, dimension(1:this%dim, 1:this%dim) coordinate_system_metric(this, chi)
subroutine dcoordinate_system_vector_from_cartesian(this, chi, vv, src)
abstract class to describe coordinate systems