Quantcast
Channel: Intel® Software - Intel® Fortran Compiler for Linux* and macOS*
Viewing all articles
Browse latest Browse all 2746

Initilization of Allocatble arrays ifort?

$
0
0

Hi Friends

I have a module which contains two subroutines in which (first subroutine) i use the allocatable attribute to allocate the space for arrays then do some computations and deallocate them at the end. My first subroutine is called more than 1000 times. My question (problem) is when i initilize the allocatable arrays to zero i get a different result and when i don't initilize them to zero i get a different results?.

First of all is it right to initilize the allocatable arrays to zero?. I have seen some threads but iam not able to come to clear conclusion.

I am compiling it in ifort version 12.1.3 Any help is highly appreciated. Below is my code for reference

subroutine rho_z
!===============
implicit none
  integer :: i,actual_particle,nrot
  integer :: max_pos
  real    :: ord_xx,ord_yy,ord_zz
  real    :: ord_xy,ord_xz,ord_yz

  integer, dimension(:), allocatable :: index,jndex,counter
 
  real, dimension(:), allocatable :: value_N,value_O,ord_z
  real, dimension(:), allocatable :: local_order,help_dip

  real, dimension(3,3)            :: Q,eigen_vector_glob
  real, dimension(  3)            :: eigen_value_glob

  allocate(index   (N_particle)); allocate(local_order   (N_particle))
  allocate(value_N (N_particle)); allocate(value_O       (N_particle))
  allocate(ord_z   (N_particle))

  allocate(jndex     (maxchannel_rho));allocate(help_dip(maxchannel_rho))
  allocate(counter   (maxchannel_rho))
 
  index=0; jndex=0; counter=0    ! Initilizing the allocatable arrays to zero

  value_N=0.;value_O=0.;ord_z=0. ! Initilizing the allocatable arrays to zero
  local_order=0.;help_dip=0.         ! Initilizing the allocatable arrays to zero

  Q=0.;eigen_vector_glob=0.
  eigen_value_glob=0.

  ord_xx=0.0; ord_yy=0.0; ord_zz=0.0
  ord_xy=0.0; ord_xz=0.0; ord_yz=0.0
  nrot=0
 
  do i=1,N_particle
    actual_particle=living_particles%item(i)
    
    index  (i)=int((molecule(actual_particle)%z+0.5)/delta_rho)+1
    ord_z  (i)=molecule(actual_particle)%u_z  
    value_N(i)=1.0
    value_O(i)=0.5*(3.*molecule(actual_particle)%u_z&
                      *molecule(actual_particle)%u_z  -1.)
  end do

  call av_add_hist(local_density,N_particle,index,value_N)
 
  call av_add_hist(S_local      ,N_particle,index,value_O)

  call av_add_hist(local_order_z,N_particle,index, ord_z)  !Binning the histogram order wrt wall normal

  do i=1,N_particle
    actual_particle=living_particles%item(i)

    ord_xx=ord_xx+0.5*(3.*molecule(actual_particle)%u_x*molecule(actual_particle)%u_x -1.)
    ord_yy=ord_yy+0.5*(3.*molecule(actual_particle)%u_y*molecule(actual_particle)%u_y -1.)
    ord_zz=ord_zz+0.5*(3.*molecule(actual_particle)%u_z*molecule(actual_particle)%u_z -1.)
    ord_xy=ord_xy+1.5*    molecule(actual_particle)%u_x*molecule(actual_particle)%u_y
    ord_xz=ord_xz+1.5*    molecule(actual_particle)%u_x*molecule(actual_particle)%u_z
    ord_yz=ord_yz+1.5*    molecule(actual_particle)%u_y*molecule(actual_particle)%u_z
  end do
   
  ord_xx=ord_xx/N_particle
  ord_yy=ord_yy/N_particle
  ord_zz=ord_zz/N_particle
  ord_xy=ord_xy/N_particle
  ord_xz=ord_xz/N_particle
  ord_yz=ord_yz/N_particle

  Q(1,1)=ord_xx
  Q(2,2)=ord_yy
  Q(3,3)=ord_zz
  Q(1,2)=ord_xy
  Q(2,1)=ord_xy
  Q(1,3)=ord_xz
  Q(3,1)=ord_xz
  Q(2,3)=ord_yz
  Q(3,2)=ord_yz

  call Jacobi(Q,3,eigen_value_glob,eigen_vector_glob,nrot)

  max_pos = maxloc(eigen_value_glob,1)
 
  do i=1,N_particle
     actual_particle=living_particles%item(i)
    
     index           (i)=int((molecule(actual_particle)%z+0.5)/delta_rho)+1
     
     local_order     (i)=molecule(actual_particle)%u_x*eigen_vector_glob(1,max_pos)+&
                         molecule(actual_particle)%u_y*eigen_vector_glob(2,max_pos)+&
                 molecule(actual_particle)%u_z*eigen_vector_glob(3,max_pos)
             
     help_dip (index(i))=help_dip(index(i))+local_order(i)
 
     counter (index(i))=counter(index(i)) + 1        !Counter for no.of particles in a bin
    
   !write(*,*)help_dip(i),counter(i)
  end do
 
  do i=1,maxchannel_rho

     jndex(i)=i

     if(counter(i).gt.0) then

     help_dip(i)=abs(help_dip(i))/float(counter(i))
   
    else

    help_dip(i)=0.
   
    endif
    
     !write(6,*)counter(i)
  end do
 
  call av_add_hist(local_dipol_or,maxchannel_rho,jndex,help_dip)    !Binning the histogram local dipolar parameter
 
  deallocate(index)   ;deallocate(jndex)

  deallocate(value_N) ;deallocate(value_O)

  deallocate(help_dip);deallocate(ord_z)

  deallocate(counter);deallocate(local_order)

  return  
 
end subroutine rho_z


Viewing all articles
Browse latest Browse all 2746

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>