elementcopy Interface

public interface elementcopy

Module Procedures

private subroutine elementcopy_real128(a1, a2)

Arguments

Type IntentOptional Attributes Name
real(kind=real128), intent(in) :: a1(..)
real(kind=real128) :: a2(..)

private subroutine elementcopy_real64(a1, a2)

Arguments

Type IntentOptional Attributes Name
real(kind=real64), intent(in) :: a1(..)
real(kind=real64) :: a2(..)

private subroutine elementcopy_real32(a1, a2)

NAME

elementcopy(3f) - [M_LA] copy elements from IN to OUT regardless
of rank until hit end of one of them

SYNOPSIS

 Subroutine elementcopy (IN, OUT)

  ${TYPE} (kind=${KIND}), Intent (In) :: IN(..)
  ${TYPE} (kind=${KIND})              :: OUT(..)

Where ${TYPE}(kind=${KIND}) may be

   o Real(kind=real32)
   o Real(kind=real64)
   o Real(kind=real128)
   o Integer(kind=int8)
   o Integer(kind=int16)
   o Integer(kind=int32)
   o Integer(kind=int64)

DESCRIPTION

Copy the elements from scalar or array IN to array or scalar OUT
until either the end of IN or OUT is reached, regardless of rank
of the arguments.

OPTIONS

 IN          input array or scalar
 OUT         output array or scalar

EXAMPLES

Sample program:

program demo_elementcopy
use m_la, only : elementcopy
implicit none
character(len=*),parameter :: g='(*(g0:,","))'
real :: b, b1(3), b2(2,3), b3(2,2,2)
real :: c8(8), c6(6), c3(3), c
integer :: ib, ib1(3), ib2(2,3), ib3(2,2,2)
integer :: ic8(8), ic6(6), ic3(3), ic
   ! default real
   call elementcopy(100.0,b)
   write(*,g)'b',b
   call elementcopy([1.0,2.0,3.0],b1)
   write(*,g)'b1',b1
   call elementcopy(reshape([1.0,2.0,3.0,4.0,5.0,6.0],[2,3]),b2)
   write(*,g)'b2',b2
   call elementcopy(reshape([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0],[2,2,2]),b3)
   write(*,g)'b3',b3
   call elementcopy(b3,c8) ! pack
   write(*,g)'c8',c8
   call elementcopy(b3*10,c3) ! smaller
   write(*,g)'c3',c3
   call elementcopy(pack(b3*111.0,.true.),b) ! to scalar
   write(*,g)'b',b
   c6=-999.0
   call elementcopy(b1*10,c6) ! bigger
   write(*,g)'c6',c6
   call elementcopy(b3(2:,2,2),c) !  to scalar from vector
   write(*,g)'c',c
   call elementcopy(b3(2,1,1),c) !  to scalar from element
   write(*,g)'c',c
   call elementcopy(b3,c) !  to scalar
   write(*,g)'c',c
   ! default integer
   call elementcopy(100,ib)
   write(*,g)'ib',ib
   call elementcopy([1,2,3],ib1)
   write(*,g)'ib1',ib1
   call elementcopy(reshape([1,2,3,4,5,6],[2,3]),ib2)
   write(*,g)'ib2',ib2
   call elementcopy(reshape([1,2,3,4,5,6,7,8],[2,2,2]),ib3)
   write(*,g)'ib3',ib3
   call elementcopy(ib3,ic8) ! pack
   write(*,g)'ic8',ic8
   call elementcopy(ib3*10,ic3) ! smaller
   write(*,g)'ic3',ic3
   call elementcopy(pack(ib3*111,.true.),ib) ! to scalar
   write(*,g)'ib',ib
   ic6=-999
   call elementcopy(ib1*10,ic6) ! bigger
   write(*,g)'ic6',ic6
   call elementcopy(ib3(2:,2,2),ic) !  to scalar from vector
   write(*,g)'ic',ic
   call elementcopy(ib3(2,1,1),ic) !  to scalar from element
   write(*,g)'ic',ic
   call elementcopy(ib3,ic) !  to scalar
   write(*,g)'ic',ic
   !
   tesseract: block
   integer :: box(2,3,4,5)
   integer :: i
      call elementcopy([(i,i=1,size(box))],box)
      write(*,g)'box',box
   endblock tesseract
end program demo_elementcopy

Results:

b,100.0000
b1,1.00000,2.00000,3.00000
b2,1.00000,2.00000,3.00000,4.00000,5.00000,6.00000
b3,1.00000,2.00000,3.00000,4.00000,5.00000,6.00000,7.00000,8.00000
c8,1.00000,2.00000,3.00000,4.00000,5.00000,6.00000,7.00000,8.00000
c3,10.0000,20.0000,30.0000
b,111.0000
c6,10.00000,20.00000,30.00000,-999.0000,-999.0000,-999.0000
c,8.000000
c,2.000000
c,1.000000
ib,100
ib1,1,2,3
ib2,1,2,3,4,5,6
ib3,1,2,3,4,5,6,7,8
ic8,1,2,3,4,5,6,7,8
ic3,10,20,30
ib,111
ic6,10,20,30,-999,-999,-999
ic,8
ic,2
ic,1
box,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,
36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,
53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,
87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,
103,104,105,106,107,108,109,110,111,112,113,114,115,116,
117,118,119,120

AUTHOR

John S. Urban, 2022.05.07

LICENSE

CC0-1.0

Arguments

Type IntentOptional Attributes Name
real(kind=real32), intent(in) :: a1(..)
real(kind=real32) :: a2(..)

private subroutine elementcopy_int64(a1, a2)

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(in) :: a1(..)
integer(kind=int64) :: a2(..)

private subroutine elementcopy_int32(a1, a2)

Arguments

Type IntentOptional Attributes Name
integer(kind=int32), intent(in) :: a1(..)
integer(kind=int32) :: a2(..)

private subroutine elementcopy_int16(a1, a2)

Arguments

Type IntentOptional Attributes Name
integer(kind=int16), intent(in) :: a1(..)
integer(kind=int16) :: a2(..)

private subroutine elementcopy_int8(a1, a2)

Arguments

Type IntentOptional Attributes Name
integer(kind=int8), intent(in) :: a1(..)
integer(kind=int8) :: a2(..)