Octopus
field_transfer_oct_m Module Reference

This module implements the field transfer. More...

Detailed Description

This module implements the field transfer.

Idea: field_transfer_t is an abstract interaction that offers regridding and interpolation and can be subclassed for concrete implementations (currently current_to_mxll_field_oct_m::current_to_mxll_field_t and mxll_e_field_to_matter_oct_m::mxll_e_field_to_matter_t).

How to get quantities from a field transfer interaction using the interpolation

In order to get correctly interpolated values also when the systems have different timesteps, at the moment, one always needs to call the interpolate function to get the field at the requested time. As an example from the Maxwell system, this is how to get the current at a certain time:

! interpolate current from interaction
call iter%start(this%interactions)
do while (iter%has_next())
select type (interaction => iter%get_next())
class is (current_to_mxll_field_t)
call interaction%interpolate(time, current_density_ext)
call lalg_axpy(this%gr%np, 3, M_ONE, current_density_ext * this%hm%current_factor, current)
end select
end do

One can loop over all interactions, call the interpolate function and add the result to get the total current in this case.

Time interpolation

The time interpolation class (time_interpolation_t) offers a interpolation in time for each point of a field for an arbitrary depth. It uses the math_oct_m::interpolate function from the math_oct_m module that is based on Lagrange polynomial interpolation. The time interpolation class implements also functionality for reading and writing restart data which is needed to be able to restart consistently with the same history of past values.

Derived interactions

Data Types

type  field_transfer_t
 class defining the field_transfer interaction More...
 

Functions/Subroutines

subroutine, public field_transfer_init (this, gr, ndim)
 the system field is allocated and initialized to 0 More...
 
subroutine field_transfer_init_from_partner (this, partner_gr, partner_space, partner_namespace)
 the partner field is allocated and initialized to 0; moreover the regridding structure is initialized More...
 
subroutine field_transfer_init_interpolation (this, depth, label, cmplx)
 the time interpolation is initialized; it needs to know the depth which is usually given by the order of the propagator; thus it can only be called after the algorithm is known (this can be done in the system in new_algorithm) More...
 
subroutine field_transfer_end (this)
 
subroutine field_transfer_calculate (this)
 
subroutine field_transfer_do_mapping (this)
 perform the regridding and add the system field to the time interpolator using the time of the quantity at this point; More...
 
subroutine dfield_transfer_interpolate (this, time, field)
 return the interpolated field for a given time More...
 
subroutine zfield_transfer_interpolate (this, time, field)
 return the interpolated field for a given time More...
 
subroutine field_transfer_calculate_energy (this)
 
subroutine field_transfer_read_restart (this, mesh, space, restart, err)
 
subroutine field_transfer_write_restart (this, mesh, space, restart, err)
 

Function/Subroutine Documentation

◆ field_transfer_init()

subroutine, public field_transfer_oct_m::field_transfer_init ( class(field_transfer_t), intent(inout)  this,
type(grid_t), intent(in), target  gr,
integer, intent(in)  ndim 
)

the system field is allocated and initialized to 0

Definition at line 208 of file field_transfer.F90.

◆ field_transfer_init_from_partner()

subroutine field_transfer_oct_m::field_transfer_init_from_partner ( class(field_transfer_t), intent(inout)  this,
type(grid_t), intent(in)  partner_gr,
class(space_t), intent(in)  partner_space,
type(namespace_t), intent(in)  partner_namespace 
)
private

the partner field is allocated and initialized to 0; moreover the regridding structure is initialized

Definition at line 224 of file field_transfer.F90.

◆ field_transfer_init_interpolation()

subroutine field_transfer_oct_m::field_transfer_init_interpolation ( class(field_transfer_t), intent(inout)  this,
integer, intent(in)  depth,
character(len=*), intent(in)  label,
logical, intent(in), optional  cmplx 
)
private

the time interpolation is initialized; it needs to know the depth which is usually given by the order of the propagator; thus it can only be called after the algorithm is known (this can be done in the system in new_algorithm)

Definition at line 242 of file field_transfer.F90.

◆ field_transfer_end()

subroutine field_transfer_oct_m::field_transfer_end ( class(field_transfer_t), intent(inout)  this)
private

Definition at line 257 of file field_transfer.F90.

◆ field_transfer_calculate()

subroutine field_transfer_oct_m::field_transfer_calculate ( class(field_transfer_t), intent(inout)  this)
private

Definition at line 271 of file field_transfer.F90.

◆ field_transfer_do_mapping()

subroutine field_transfer_oct_m::field_transfer_do_mapping ( class(field_transfer_t), intent(inout)  this)
private

perform the regridding and add the system field to the time interpolator using the time of the quantity at this point;

it is called by the partner system when copying its data to the interaction because the system grid does not change Note: this needs an extra function call for each of the partner systems in their copy_quantities_to_interaction function

Definition at line 292 of file field_transfer.F90.

◆ dfield_transfer_interpolate()

subroutine field_transfer_oct_m::dfield_transfer_interpolate ( class(field_transfer_t), intent(in)  this,
real(real64), intent(in)  time,
real(real64), dimension(:, :), intent(out), contiguous  field 
)
private

return the interpolated field for a given time

Definition at line 311 of file field_transfer.F90.

◆ zfield_transfer_interpolate()

subroutine field_transfer_oct_m::zfield_transfer_interpolate ( class(field_transfer_t), intent(in)  this,
real(real64), intent(in)  time,
complex(real64), dimension(:, :), intent(out), contiguous  field 
)
private

return the interpolated field for a given time

Definition at line 325 of file field_transfer.F90.

◆ field_transfer_calculate_energy()

subroutine field_transfer_oct_m::field_transfer_calculate_energy ( class(field_transfer_t), intent(inout)  this)
private

Definition at line 338 of file field_transfer.F90.

◆ field_transfer_read_restart()

subroutine field_transfer_oct_m::field_transfer_read_restart ( class(field_transfer_t), intent(inout)  this,
class(mesh_t), intent(in)  mesh,
class(space_t), intent(in)  space,
type(restart_t), intent(in)  restart,
integer, intent(out)  err 
)
private

Definition at line 350 of file field_transfer.F90.

◆ field_transfer_write_restart()

subroutine field_transfer_oct_m::field_transfer_write_restart ( class(field_transfer_t), intent(inout)  this,
class(mesh_t), intent(in)  mesh,
class(space_t), intent(in)  space,
type(restart_t), intent(in)  restart,
integer, intent(out)  err 
)
private

Definition at line 364 of file field_transfer.F90.