44 real(real64),
allocatable :: lsize(:)
57 procedure curv_briggs_constructor
64 type(namespace_t),
intent(in) :: namespace
65 integer,
intent(in) :: dim
66 real(real64),
intent(in) :: lsize(1:dim)
67 real(real64),
intent(in) :: spacing(1:dim)
68 class(curv_briggs_t),
pointer :: briggs
76 briggs%local_basis = .
true.
77 briggs%orthogonal = .
true.
79 safe_allocate(briggs%lsize(1:dim))
80 briggs%lsize(1:dim) = lsize(1:dim)
91 if (briggs%beta <
m_zero .or. briggs%beta >
m_one)
then
92 message(1) =
'The parameter "CurvBriggsBeta" must lie between 0 and 1.'
96 briggs%min_mesh_scaling_product =
m_one
97 do idim = 1, briggs%dim
99 briggs%min_mesh_scaling_product = briggs%min_mesh_scaling_product * (
m_one / &
100 (
m_one - briggs%lsize(idim) * briggs%beta / (
m_pi * spacing(idim)) *
sin(
m_pi * spacing(idim) / briggs%lsize(idim))))
108 type(curv_briggs_t),
intent(inout) :: this
112 safe_deallocate_a(this%lsize)
119 type(curv_briggs_t),
intent(inout) :: this_out
120 type(curv_briggs_t),
intent(in) :: this_in
124 safe_allocate_source_a(this_out%lsize, this_in%lsize)
125 this_out%beta = this_in%beta
132 class(curv_briggs_t),
target,
intent(in) :: this
133 real(real64),
intent(in) :: chi(:)
134 real(real64) :: xx(1:this%dim)
145 real(real64),
intent(in) :: xx(:)
146 real(real64) :: chi(1:this%dim)
151 message(1) =
"Internal error in curv_briggs_from_cartesian"
159 integer,
optional,
intent(in) :: iunit
160 type(
namespace_t),
optional,
intent(in) :: namespace
164 write(
message(1),
'(a)')
' Curvilinear Method = briggs'
173 integer,
intent(in) :: idir
176 message(1) =
'Surface element with briggs curvilinear coordinates not implemented'
184 real(real64),
intent(in) :: chi(:)
185 real(real64) :: jacobian(1:this%dim, 1:this%dim)
190 jacobian(:, :) = m_zero
191 do idim = 1, this%dim
192 jacobian(idim, idim) = m_one - this%beta*
cos(m_two*m_pi*chi(idim)/this%lsize(idim))
200 real(real64),
intent(in) :: chi(:)
201 real(real64) :: jacobian_inverse(1:this%dim, 1:this%dim)
205 jacobian_inverse = this%jacobian(chi)
206 do idim = 1, this%dim
207 jacobian_inverse(idim, idim) = m_one/jacobian_inverse(idim, idim)
double sin(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
This module implements the curvilinear coordinates given in E.L. Briggs, D.J. Sullivan,...
real(real64) function, dimension(1:this%dim, 1:this%dim) curv_briggs_jacobian(this, chi)
class(curv_briggs_t) function, pointer curv_briggs_constructor(namespace, dim, lsize, spacing)
subroutine, public curv_briggs_copy(this_out, this_in)
real(real64) function curv_briggs_surface_element(this, idir)
real(real64) function, dimension(1:this%dim, 1:this%dim) curv_briggs_jacobian_inverse(this, chi)
subroutine curv_briggs_finalize(this)
pure real(real64) function, dimension(1:this%dim) curv_briggs_to_cartesian(this, chi)
subroutine curv_briggs_write_info(this, iunit, namespace)
real(real64) function, dimension(1:this%dim) curv_briggs_from_cartesian(this, xx)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
real(real64), parameter, public m_pi
some mathematical constants
real(real64), parameter, public m_half
real(real64), parameter, public m_one
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
abstract class to describe coordinate systems