General Operations

From LIBISIS
Jump to navigation Jump to search

These are generic subroutines which should be valid for every class


IXFcreate

This is a generic interface to the IXFcreate_class method.

The Create operation strictly takes all the elements required to define a class and creates the resulting object. If an element of the object is another class then it requires that the structure element is already valid. If you wish to define a class with a fewer number of elements than are in the structure, or if you wish to implicitly define a sub-object in the create operation then it will be necessary to overload the IXFcreate interface with your new subroutine. For example if you wish to create a dataset_1d object from just an x, signal and error array then you will have to write a subroutine for eg IXFcreate_xse_d1d and interface it to IXFcreate at the top of the IXMdataset_1d module.


F90 syntax

 use IXMclass
 type(IXTclass)::object
 
 various :: element_1,element_2,...,element_N
 
 call IXFcreate(object,element_1,element_2,...,element_N,status)


for example with class=datum_array

 use IXMdatum_array
 type(IXTdatum_array)::datumarray
 
 real(dp)::signal(30),error(30)

where signal and error are filled arrays

 ! using generic interface
 call IXFcreate(datumarray,signal,error,status)

 ! using class specific method
 call IXFcreate_datum_array(datumarray,signal,error,status)

IXFset

This is a generic interface to the IXFset_class method.


The Set operation can only be performed on a properly filled or 'valid' object. It takes an optional number of arguments to modify the object contents. IXFcheck is called at the end to determine that the edited structure is correctly formed. Error flags are raised if there is any inconsistency. The optional arguments must always be specified by keywords.


The general calling syntax of the subroutine is: call IXFset_class(object,status,option_1=arg_1...,option_N=arg_N,ref=reference_object)


The 'ref' argument is used to copy the values of a reference object to another. In this case the object being modified does not have to be initialised, but the refence object must be valid, otherwise the subroutine will fail.


This operation is valid for all classes.


F90 syntax

 use IXMclass
 
 type(IXTclass):: object1, object_ref
 
 integer(i4b):: arg_1
 
 real(dp):: arg_2
 
 type(IXTstatus)::status
 
 call IXFset(object1,status,option_1=arg_1,option_2=arg_2)
 
 call IXFset(object1,status,ref=object_ref)


if a ref argument is passed as well as other arguments, the object will initially take on the attributes of the reference object, and then the other arguments will be changed


 call IXFset(object1,option_1=arg_1,status,ref=object_ref)


For example with class=dataset_1d where w1 and w1ref are existing dataset_1d objects


 use IXMdataset_1d
 
 type(IXTdataset_1d):: w1, w1ref
 
 character(len=short_len)::newx_units='meV' 
 
 type(IXTstatus)::status
 
 !using generic interface
 call IXFset(w1,status,x_units=newx_units)
 
 !using class specific method
 
 call IXFset_dataset_1d(w1,status,ref=w1ref)

IXFcheck

IXFget

IXFget_alloc

IXFget_ptr

IXFdestroy

IXFcopy

Arithmetic Operations

These are specific subroutines which are valid on certain classes only

BinaryOperations

IXFplus

This is a generic interface to the IXFplus_class method.

This subroutine will add together two objects, an object to a scalar array of the same dimensionality (ie a 2d array to an IXTdataset_2d object) or an object to a scalar.

In the special case of an IXTdataset_2d object, it will add an array of IXTdataset_1d objects.

F90 syntax

use IXMclass
type(IXTclass)::class1,class2,result
real(dp)::scalar
type(IXTstatus)::status
:
call IXFplus(result,class1,class2,status)
call IXFplus(result,class1,scalar,status)
call IXFplus(result,scalar,class1,status)


For example with class=dataset_2d where w2,w2 are appropriately filled IXTdataset_2d objects and arrayd1d is an appropriately filled array of IXTdataset_1d objects.

use IXMdataset_2d 
use IXMdataset_1d
type(IXTdataset_2d):: w1,w2, wres
type(IXTdataset_1d):: arrayd1d(:)
real(dp)::scalar,scalar2d(:,:)
type(IXTstatus)::status
!using generic interface
! types/types and types/scalars
call IXFplus(wres,w1,w2,status) ! wres=w1+w2
call IXFplus(wres,scalar,w1,status) ! wres=scalar+w1
call IXFplus(wres,w1,scalar,status) ! wres=w1+scalar
! types/arrays
call IXFplus(wres,scalar2d,w1,status) ! wres=scalar2d+w1
call IXFplus(wres,w1,scalar2d,status) ! wres=w1+scalar2d
! types/arrays of types
call IXFplus(wres,arrayd1d,w2,status) ! wres=w2+arrayd1d
call IXFplus(wres,w2,arrayd1d,status) ! wres=arrayd1d+w2 

!using class specific method

! types/types and types/scalars
call IXFplus_dataset_2d(wres,w1,w2,status) ! wres=w1+w2
call IXFplus_dataset_2d(wres,scalar,w1,status) ! wres=scalar+w1
call IXFplus_dataset_2d(wres,w1,scalar,status) ! wres=w1+scalar
! types/arrays
call IXFplus_dataset_2d(wres,scalar2d,w1,status) ! wres=scalar2d+w1
call IXFplus_dataset_2d(wres,w1,scalar2d,status) ! wres=w1+scalar2d
! types/arrays of types
call IXFplus_dataset_2d(wres,arrayd1d,w2,status) ! wres=w2+arrayd1d
call IXFplus_dataset_2d(wres,w2,arrayd1d,status) ! wres=arrayd1d+w2 

IXFminus

This is a generic interface to the IXFminus_class method.

This subroutine will subtract two objects, an object from a scalar array of the same dimensionality (ie a 2d array to an IXTdataset_2d object) or an object from a scalar.

In the special case of an IXTdataset_2d object, it will subtract an array of IXTdataset_1d objects.

F90 syntax

use IXMclass
type(IXTclass)::class1,class2,result
real(dp)::scalar
type(IXTstatus)::status
:
call IXFminus(result,class1,class2,status)
call IXFminus(result,class1,scalar,status)
call IXFminus(result,scalar,class1,status)


For example with class=dataset_2d where w2,w2 are appropriately filled IXTdataset_2d objects and arrayd1d is an appropriately filled array of IXTdataset_1d objects.

use IXMdataset_2d
use IXMdataset_1d
type(IXTdataset_2d):: w1,w2, wres
type(IXTdataset_1d):: arrayd1d(:)
real(dp)::scalar,scalar2d(:,:)
type(IXTstatus)::status
:
!using generic interface
! types/types and types/scalars
call IXFminus(wres,w1,w2,status) ! wres=w1-w2
call IXFminus(wres,scalar,w1,status) ! wres=scalar-w1
call IXFminus(wres,w1,scalar,status) ! wres=w1-scalar
! types/arrays
call IXFminus(wres,scalar2d,w1,status) ! wres=scalar2d-w1
call IXFminus(wres,w1,scalar2d,status) ! wres=w1-scalar2d
! types/arrays of types
call IXFminus(wres,arrayd1d,w2,status) ! wres=w2-arrayd1d
call IXFminus(wres,w2,arrayd1d,status) ! wres=arrayd1d-w2 

!using class specific method
! types/types and types/scalars
call IXFminus_dataset_2d(wres,w1,w2,status) ! wres=w1-w2
call IXFminus_dataset_2d(wres,scalar,w1,status) ! wres=scalar-w1
call IXFminus_dataset_2d(wres,w1,scalar,status) ! wres=w1-scalar
! types/arrays
call IXFminus_dataset_2d(wres,scalar2d,w1,status) ! wres=scalar2d-w1
call IXFminus_dataset_2d(wres,w1,scalar2d,status) ! wres=w1-scalar2d
! types/arrays of types
call IXFminus_dataset_2d(wres,arrayd1d,w2,status) ! wres=w2-arrayd1d
call IXFminus_dataset_2d(wres,w2,arrayd1d,status) ! wres=arrayd1d-w2 


IXFtimes

This is a generic interface to the IXFtimes_class method.

This subroutine will multiply together two objects, an object with a scalar array of the same dimensionality (ie a 2d array with an IXTdataset_2d object) or an object with a scalar.

In the special case of an IXTdataset_2d object, it will multiply an array of IXTdataset_1d objects.

F90 syntax

use IXMclass
type(IXTclass)::class1,class2,result
real(dp)::scalar
type(IXTstatus)::status
:
call IXFtimes(result,class1,class2,status)
call IXFtimes(result,class1,scalar,status)
call IXFtimes(result,scalar,class1,status)


For example with class=dataset_2d where w2,w2 are appropriately filled IXTdataset_2d objects and arrayd1d is an appropriately filled array of IXTdataset_1d objects.


use IXMdataset_2d 
use IXMdataset_1d
type(IXTdataset_2d):: w1,w2, wres
type(IXTdataset_1d):: arrayd1d(:)
real(dp)::scalar,scalar2d(:,:)
type(IXTstatus)::status
:
!using generic interface
! types/types and types/scalars
call IXFtimes(wres,w1,w2,status) ! wres=w1*w2
call IXFtimes(wres,scalar,w1,status) ! wres=scalar*w1
call IXFtimes(wres,w1,scalar,status) ! wres=w1*scalar
! types/arrays
call IXFtimes(wres,scalar2d,w1,status) ! wres=scalar2d*w1
call IXFtimes(wres,w1,scalar2d,status) ! wres=w1*scalar2d
! types/arrays of types
call IXFtimes(wres,arrayd1d,w2,status) ! wres=w2*arrayd1d
call IXFtimes(wres,w2,arrayd1d,status) ! wres=arrayd1d*w2 

!using class specific method
! types/types and types/scalars
call IXFtimes_dataset_2d(wres,w1,w2,status) ! wres=w1*w2
call IXFtimes_dataset_2d(wres,scalar,w1,status) ! wres=scalar*w1
call IXFtimes_dataset_2d(wres,w1,scalar,status) ! wres=w1*scalar
! types/arrays
call IXFtimes_dataset_2d(wres,scalar2d,w1,status) ! wres=scalar2d*w1
call IXFtimes_dataset_2d(wres,w1,scalar2d,status) ! wres=w1*scalar2d
! types/arrays of types
call IXFtimes_dataset_2d(wres,arrayd1d,w2,status) ! wres=w2*arrayd1d
call IXFtimes_dataset_2d(wres,w2,arrayd1d,status) ! wres=arrayd1d*w2 


IXFdivide

This is a generic interface to the IXFdivide_class method.

This subroutine will divide one objects by another, an object by a scalar array of the same dimensionality (ie a 2d array by an IXTdataset_2d object) or an object by a scalar.

In the special case of an IXTdataset_2d object, it will divide an array of IXTdataset_1d objects.

F90 syntax


use IXMclass
type(IXTclass)::class1,class2,result
real(dp)::scalar
type(IXTstatus)::status
:
call IXFdivide(result,class1,class2,status)
call IXFdivide(result,class1,scalar,status)
call IXFdivide(result,scalar,class1,status)

For example with class=dataset_2d where w2,w2 are appropriately filled IXTdataset_2d objects and arrayd1d is an appropriately filled array of IXTdataset_1d objects.

use IXMdataset_2d 
use IXMdataset_1d
type(IXTdataset_2d):: w1,w2, wres
type(IXTdataset_1d):: arrayd1d(:)
real(dp)::scalar,scalar2d(:,:)
type(IXTstatus)::status
:
!using generic interface
! types/types and types/scalars
call IXFdivide(wres,w1,w2,status) ! wres=w1/w2
call IXFdivide(wres,scalar,w1,status) ! wres=scalar/w1
call IXFdivide(wres,w1,scalar,status) ! wres=w1/scalar
! types/arrays
call IXFdivide(wres,scalar2d,w1,status) ! wres=scalar2d/w1
call IXFdivide(wres,w1,scalar2d,status) ! wres=w1/scalar2d
! types/arrays of types
call IXFdivide(wres,arrayd1d,w2,status) ! wres=w2/arrayd1d
call IXFdivide(wres,w2,arrayd1d,status) ! wres=arrayd1d/w2 

!using class specific method
! types/types and types/scalars
call IXFdivide_dataset_2d(wres,w1,w2,status) ! wres=w1/w2
call IXFdivide_dataset_2d(wres,scalar,w1,status) ! wres=scalar/w1
call IXFdivide_dataset_2d(wres,w1,scalar,status) ! wres=w1/scalar
! types/arrays
call IXFdivide_dataset_2d(wres,scalar2d,w1,status) ! wres=scalar2d/w1
call IXFdivide_dataset_2d(wres,w1,scalar2d,status) ! wres=w1/scalar2d
! types/arrays of types
call IXFdivide_dataset_2d(wres,arrayd1d,w2,status) ! wres=w2/arrayd1d
call IXFdivide_dataset_2d(wres,w2,arrayd1d,status) ! wres=arrayd1d/w2 


IXFpower

This is a generic interface to the IXFpower_class method.


This subroutine will raise one object to the power of another object or an object to the power of a scalar.


F90 syntax

use IXMclass
type(IXTclass)::class1,class2,result
real(dp)::scalar
type(IXTstatus)::status
:
call IXFpower(result,class1,class2,status)
call IXFpower(result,class1,scalar,status)
call IXFpower(result,scalar,class1,status)
For example with class=dataset_2d where w2,w2 are appropriately filled IXTdataset_2d objects 
use IXMdataset_2d
type(IXTdataset_2d):: w1,w2, wres
real(dp)::scalar
type(IXTstatus)::status
:

!using generic interface

! types/types and types/scalars
call IXFpower(wres,w1,w2,status) ! wres=w1^w2
call IXFpower(wres,scalar,w1,status) ! wres=scalar^w1
call IXFpower(wres,w1,scalar,status) ! wres=w1^scalar

!using class specific method

! types/types and types/scalars
call IXFpower_dataset_2d(wres,w1,w2,status) ! wres=w1^w2
call IXFpower_dataset_2d(wres,scalar,w1,status) ! wres=scalar^w1
call IXFpower_dataset_2d(wres,w1,scalar,status) ! wres=w1^scalar 

UnaryOperations

There are eight different unary operations which can be performed on an object

The general calling syntax of the subroutine is (see below for further details):

call IXFoperation_class(result, object, status)

Each of these subroutines can also be called through the Unary Operations Interface.

Operations:

  • log - takes the natural logarithm of an object
  • exp - takes the exponential of an object
  • sin - takes the sine of an object
  • cos - takes the cosine of an object
  • tan - takes the tangent of an object
  • sinh - takes the hyperbolic sine of an object
  • cosh - takes the hyperbolic cosine of an object
  • tanh - takes the hyperbolic tangent of an object


Classes for which operations are valid:


F90 syntax

use IXMclass
type(IXTclass):: object, result
type(IXTstatus)::status
call IXFoperation_class(result,object,status)

For example with operation=sinh class=dataset_1d

use IXMdataset_1d

type(IXTdataset_1d):: w1, wres
type(IXTstatus)::status

call IXFsinh_dataset_1d(wres,w1,status)