rkiss05_generator_utilities.f90 Source File

This module includes the definition of a class called rkiss05_generator that is used to generate random numbers with an uniform disitribution using the rkiss approach


This file depends on

sourcefile~~rkiss05_generator_utilities.f90~~EfferentGraph sourcefile~rkiss05_generator_utilities.f90 rkiss05_generator_utilities.f90 sourcefile~precision_utilities.f90 precision_utilities.f90 sourcefile~rkiss05_generator_utilities.f90->sourcefile~precision_utilities.f90 sourcefile~random_generator_base_utilities.f90 random_generator_base_utilities.f90 sourcefile~rkiss05_generator_utilities.f90->sourcefile~random_generator_base_utilities.f90 sourcefile~random_generator_base_utilities.f90->sourcefile~precision_utilities.f90

Files dependent on this one

sourcefile~~rkiss05_generator_utilities.f90~~AfferentGraph sourcefile~rkiss05_generator_utilities.f90 rkiss05_generator_utilities.f90 sourcefile~kohonen_layer_utilities.f90 kohonen_layer_utilities.f90 sourcefile~kohonen_layer_utilities.f90->sourcefile~rkiss05_generator_utilities.f90 sourcefile~multilayer_self_organizing_map_utilities.f90 multilayer_self_organizing_map_utilities.f90 sourcefile~multilayer_self_organizing_map_utilities.f90->sourcefile~rkiss05_generator_utilities.f90 sourcefile~self_organizing_map_utilities.f90 self_organizing_map_utilities.f90 sourcefile~self_organizing_map_utilities.f90->sourcefile~rkiss05_generator_utilities.f90 sourcefile~two_level_self_organizing_map_utilities.f90 two_level_self_organizing_map_utilities.f90 sourcefile~two_level_self_organizing_map_utilities.f90->sourcefile~rkiss05_generator_utilities.f90 sourcefile~two_level_som_estimate_variables.f90 two_level_som_estimate_variables.f90 sourcefile~two_level_som_estimate_variables.f90->sourcefile~rkiss05_generator_utilities.f90 sourcefile~two_level_som_estimate_variables.f90->sourcefile~two_level_self_organizing_map_utilities.f90 sourcefile~som_predict_variables.f90 som_predict_variables.f90 sourcefile~som_predict_variables.f90->sourcefile~self_organizing_map_utilities.f90 sourcefile~som_train_variables.f90 som_train_variables.f90 sourcefile~som_train_variables.f90->sourcefile~self_organizing_map_utilities.f90 sourcefile~two_level_som_train_variables.f90 two_level_som_train_variables.f90 sourcefile~two_level_som_train_variables.f90->sourcefile~two_level_self_organizing_map_utilities.f90

Source Code

!! author: Oscar Garcia-Cabrejo
!! date: 06/06/2023
!! version: 0.1
!!  This module includes the definition of a class called rkiss05_generator 
!!  that is used to generate random numbers with an uniform disitribution
!!  using the rkiss approach
!!
module rkiss05_generator_utilities
!!  Define the class rkiss05_generator that represents a random number generator
!!  based on the rkiss method
    use precision_utilities, only: wp;
    use random_generator_base_utilities,only: random_generator_base;
    !
    implicit none;
    !
    private;

    type,extends(random_generator_base) :: rkiss05_generator
      private
!! Class to represent a random number generator that implements the rkiss method
        integer :: seed
        integer :: x,y,w,z
      contains
    !  * constructor  
        procedure,public :: create => create_rkiss05_generator
    !  * destructor    
        procedure,public :: destroy => destroy_rkiss05_generator
    !  * generate    
        procedure,public :: generate => generate_rkiss05_generator
    !
    end type rkiss05_generator
    !*****
    public :: rkiss05_generator;
    !
    contains
!========================================================================================
     subroutine create_rkiss05_generator(generator,iseed)
!========================================================================================
!! Constructor of the rkiss05_generator class. In this class random seed is assigned to the 
!! random number generator and the internal state of the corresponding generator  is 
!! initialized.
        class(rkiss05_generator) :: generator
!!  generator: A rkiss05_generator object
     integer,intent(in),optional :: iseed
!! iseed: An integer with the seed of the random number generator
     if(present(iseed)) then
       generator%seed=iseed;
     else 
       generator%seed=12345;
     endif
     generator%x=iseed;
     generator%y=iseed+1;
     generator%z=iseed+2;
     generator%w=iseed+3;   
    ! 
    end subroutine create_rkiss05_generator
!========================================================================================
    subroutine destroy_rkiss05_generator(generator)
!======================================================================================== 
!! Destructor of the rkiss05_generator class. In this class, the random seed is set to 0 
        class(rkiss05_generator) :: generator
!! generator: A rkiss05_generator object
     if(generator%seed > 0) then
       generator%seed=0;
     endif
    !  
    end subroutine destroy_rkiss05_generator
!========================================================================================
    function generate_rkiss05_generator(generator) result(r)
!========================================================================================
!!  Function used to generate realizations of the random numbers with the rkiss05_generator class.       
        class(rkiss05_generator) :: generator
!! generator: A rkiss05_generator object
        real(kind=wp),parameter    :: am=4.656612873077392578d-10       ! multiplier 1/2^31
!! Multiplier
        real(kind=wp) :: r
!! r: A real variable with the generated random number     
          real(kind=wp)             :: rkiss05  
          integer          :: kiss
!          integer          :: x,y,z,w              ! working variables for the four generators
          !common /kisscom/x,y,z,w 
    !      
          generator%x = 69069 * generator%x + 1327217885
          generator%y= ieor (generator%y, ishft (generator%y, 13)); 
          generator%y= ieor (generator%y, ishft (generator%y, -17)); 
          generator%y= ieor (generator%y, ishft (generator%y, 5))
          generator%z = 18000 * iand (generator%z, 65535) + ishft (generator%z, - 16)
          generator%w = 30903 * iand (generator%w, 65535) + ishft (generator%w, - 16)
          kiss = ishft(generator%x + generator%y + ishft (generator%z, 16) + generator%w , -1)
          rkiss05=kiss*am
          r=rkiss05
    
     end function generate_rkiss05_generator
    !
    end module rkiss05_generator_utilities