44 type(basis_vectors_t),
public :: basis
58 procedure affine_coordinates_constructor
64 type(namespace_t),
intent(in) :: namespace
65 integer,
intent(in) :: dim
66 real(real64),
intent(in) :: basis_vectors(1:dim, 1:dim)
67 class(affine_coordinates_t),
pointer :: affine
74 affine%local_basis = .false.
76 affine%orthogonal = affine%basis%orthogonal
83 type(affine_coordinates_t),
intent(inout) :: this_out
84 type(affine_coordinates_t),
intent(in) :: this_in
88 this_out%dim = this_in%dim
89 this_out%local_basis = this_in%local_basis
90 this_out%basis = this_in%basis
91 this_out%orthogonal = this_in%orthogonal
98 class(affine_coordinates_t),
target,
intent(in) :: this
99 real(real64),
intent(in) :: chi(:)
100 real(real64) :: xx(1:this%dim)
104 xx(:) = this%basis%to_cartesian(chi(:))
110 class(affine_coordinates_t),
target,
intent(in) :: this
111 real(real64),
intent(in) :: xx(:)
112 real(real64) :: chi(1:this%dim)
116 chi(:) = this%basis%from_cartesian(xx(:))
121 real(real64) function affine_coordinates_det_jac(this, xx, chi) result(jdet)
122 class(affine_coordinates_t),
intent(in) :: this
123 real(real64),
intent(in) :: xx(:)
124 real(real64),
intent(in) :: chi(:)
126 real(real64) :: jac(1:this%dim, 1:this%dim)
130 jac(1:this%dim, 1:this%dim) = this%basis%vectors(1:this%dim,1:this%dim)
138 integer,
optional,
intent(in) :: iunit
139 type(namespace_t),
optional,
intent(in) :: namespace
141 integer :: idir1, idir2
145 write(message(1),
'(a)')
' Using affine coordinates'
146 write(message(2),
'(a,a,a)')
' Basis vectors [', trim(units_abbrev(units_out%length)),
']:'
147 call messages_info(2, iunit=iunit, namespace=namespace)
148 do idir1 = 1, this%dim
149 write(message(2),
'(4x,a,99(f8.3,1x),a)')
'(', &
150 (units_from_atomic(units_out%length, this%basis%vectors(idir2, idir1)), idir2 = 1, this%dim - 1), &
151 units_from_atomic(units_out%length, this%basis%vectors(this%dim, idir1)),
')'
152 call messages_info(1, iunit=iunit, namespace=namespace)
161 integer,
intent(in) :: idir
165 select case (this%dim)
169 ds = norm2(dcross_product(this%basis%vectors(1:3, 2), this%basis%vectors(1:3, 3)))
171 ds = norm2(dcross_product(this%basis%vectors(1:3, 3), this%basis%vectors(1:3, 1)))
173 ds = norm2(dcross_product(this%basis%vectors(1:3, 1), this%basis%vectors(1:3, 2)))
179 ds = this%basis%vectors(1, 1)*this%basis%vectors(2, 2) - this%basis%vectors(2, 1)*this%basis%vectors(1, 2)
195#include "affine_coordinates_inc.F90"
198#include "complex.F90"
199#include "affine_coordinates_inc.F90"
Note that lalg_determinant and lalg_inverse are just wrappers over the same routine.
pure subroutine zaffine_coordinates_vector_from_cartesian(this, xx, vv, src)
subroutine affine_coordinates_write_info(this, iunit, namespace)
pure subroutine zaffine_coordinates_covector_to_cartesian(this, xx, cv, src)
pure real(real64) function, dimension(1:this%dim) affine_coordinates_to_cartesian(this, chi)
pure subroutine daffine_coordinates_vector_from_cartesian(this, xx, vv, src)
class(affine_coordinates_t) function, pointer affine_coordinates_constructor(namespace, dim, basis_vectors)
subroutine, public affine_coordinates_copy(this_out, this_in)
pure real(real64) function, dimension(1:this%dim) affine_coordinates_from_cartesian(this, xx)
real(real64) function affine_coordinates_surface_element(this, idir)
pure subroutine daffine_coordinates_covector_to_cartesian(this, xx, cv, src)
real(real64) function affine_coordinates_det_jac(this, xx, chi)
This module is intended to contain "only mathematical" functions and procedures.
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
This module defines the unit system, used for input and output.
Vectors defining a basis in a vector space. This class provides methods to convert vector coordinates...
abstract class to describe coordinate systems