readzincoord Subroutine

public subroutine readzincoord()

Uses

  • proc~~readzincoord~~UsesGraph proc~readzincoord readzincoord module~modglobal modglobal proc~readzincoord->module~modglobal module~modmpi modmpi proc~readzincoord->module~modmpi mpi mpi module~modmpi->mpi

Arguments

None

Calls

proc~~readzincoord~~CallsGraph proc~readzincoord readzincoord mpi_bcast mpi_bcast proc~readzincoord->mpi_bcast

Called by

proc~~readzincoord~~CalledByGraph proc~readzincoord readzincoord proc~initinlet initinlet proc~initinlet->proc~readzincoord

Namelists

Namelist INFO


Variables

Name Type Default Description
nprocsinl integer None
jgtotinl integer None
kmaxin integer None
dtin real None
wtop real 0.
totalreadu real None

Source Code

  subroutine readzincoord
  use modglobal,   only :  kb,ke,kh,ifinput,zf,zh,ylen,jb,je,dy
  use modmpi,      only :  myid, mpi_integer,comm3d,mpierr,my_real,nprocs
  implicit none
  character(72) chmess
  character(20) namezinlet
  character(20) namezinfo
  integer ierr,k,kk,kmaxin,j,jj
  real ysizeproc

      namelist/INFO/nprocsinl,jgtotinl,kmaxin,dtin,wtop,totalreadu

  namezinlet = 'zgrid.inl'
  namezinfo  = 'zgrid.inf'

    if (myid==0) then


      open(ifinput,file=namezinfo,status='old',iostat=ierr)
        if (ierr /= 0) then
          write(0, *) 'ERROR: zgrid.inf does not exist'
          stop 1
        end if
        read (ifinput,INFO,iostat=ierr)
        if (ierr > 0) then
          write(0, *) 'Problem in zgrid.inf INFO'
          write(0, *) 'iostat error: ', ierr
          stop 1
        endif
        write(6,INFO)
      close(ifinput)
    end if
    kbin = 0
    kein = kmaxin-1
    call MPI_BCAST(nprocsinl,1,MPI_INTEGER,0,comm3d,mpierr)
    call MPI_BCAST(jgtotinl ,1,MPI_INTEGER,0,comm3d,mpierr)
    call MPI_BCAST(kbin     ,1,MPI_INTEGER,0,comm3d,mpierr)
    call MPI_BCAST(kein     ,1,MPI_INTEGER,0,comm3d,mpierr)
    call MPI_BCAST(dtin     ,1,MY_REAL,0,comm3d,mpierr)
    call MPI_BCAST(wtop     ,1,MY_REAL,0,comm3d,mpierr)
    call MPI_BCAST(totalreadu ,1,MY_REAL,0,comm3d,mpierr)
    allocate(zhin(kbin   :kein+1))
    allocate(zfin(kbin   :kein+1))
    allocate(dzfin(kbin-1:kein+1))
    allocate(dzhin(kbin  :kein+1))

    if (myid==0) then
      write(6,*) 'loading ',namezinlet
      open (ifinput,file=namezinlet)
      read(ifinput,'(a72)') chmess
      read(ifinput,'(a72)') chmess

      do k=kbin,kein
        read(ifinput,*) zfin(k)
      end do
      close(ifinput)

      zhin(kbin) = 0.0
      do k=kbin,kein
        zhin(k+1) = zhin(k) + 2.0*(zfin(k)-zhin(k))
      end do
      zfin(kein+kh)  = zfin(kein)+ 2.0*(zhin(kein+kh)-zfin(kein))

      do  k=kbin,kein
        dzfin(k) = zhin(k+1) - zhin(k)
      end do
      dzfin(kein+1) = dzfin(kein)
      dzfin(kbin-1) = dzfin(kbin)

      dzhin(kbin) = 2*zfin(kbin)
      do k=kbin+1,kein+kh
        dzhin(k) = zfin(k) - zfin(k-1)
      end do

    ! check if the inlet mesh and the simulation mesh differ
    do k=kb,min(ke,kein)
      if(abs(zfin(k)-zf(k)) > 1e-7) then
        lzinzsim = .false.
      end if
    enddo

    end if ! myid==0

  ! MPI broadcast kmax elements from zf
    call MPI_BCAST( zfin,kein-kbin+2,MY_REAL   ,0,comm3d,mpierr)
    call MPI_BCAST( zhin,kein-kbin+2,MY_REAL   ,0,comm3d,mpierr)
    call MPI_BCAST(dzfin,kein-kbin+3,MY_REAL   ,0,comm3d,mpierr)
    call MPI_BCAST(dzhin,kein-kbin+2,MY_REAL   ,0,comm3d,mpierr)
    call MPI_BCAST(lzinzsim,1,MPI_INTEGER      ,0,comm3d,mpierr)


    if (.not.lzinzsim) then
      if (myid==0) then
        write(6,*) 'zgrid.inl does not equal zgrid.inp: Inlet will be interpolated in z'
      end if
!      allocate(linlf(kbin:kein))
!      allocate(linuf(kbin:kein))
!      allocate(linlh(kbin:kein+1))
!      allocate(linuh(kbin:kein+1))
      allocate(linlf(kb:ke))
      allocate(linuf(kb:ke))
      allocate(linlh(kb:ke+1))
      allocate(linuh(kb:ke+1))
   ! zf
      do k=kb,ke
        do kk=kbin,kein
          if (zfin(kk) >= zf(k)) then
            linuf(k)  = kk
            linlf(k)  = kk-1
            exit
          elseif (kk==kein) then
            linuf(k)  = kein+1            ! this means extrapolation!
            linlf(k)  = kein-1            ! waarom niet ke? of wordt dit niet gebruikt?
          end if
        end do
      end do
   ! for w-components (zh)
      do k=kb,ke+1
        do kk=kbin,kein+1
          if (zhin(kk) >= zh(k)) then
            linuh(k)  = kk
            linlh(k) = kk-1
            exit
          elseif (kk==kein+1) then
            linuh(k)  = kein+2            ! this means extrapolation!
            linlh(k)  = kein
          end if
        end do
      end do

     else  ! lzinzsim  -> grids are equal
       if (myid==0) then
         write(6,*) 'zgrid.inl equals zgrid.inp: Inlet will not be interpolated in z'
       end if
     end if

! Now prepare everything for interpolation in y-direction
     jgbin = 1
     jgein = jgbin + jgtotinl -1
     jtotin = jgtotinl / nprocsinl
     jbin = 1
     jein = 1 + jtotin -1
     ysizeproc = ylen/nprocs
     dyin = ylen / jgtotinl
     jbdum = 1
     jtotdum = ceiling(ysizeproc/real(dyin))+1                    ! dummy indices
     jedum = jbdum + jtotdum-1

!     allocate(yf   (jb    :je))
     allocate(yf   (jb    :je+1))
     allocate(yh   (jb    :je+1))
     allocate(yfin (jgbin :jgein+1))
     allocate(yhin (jgbin-1 :jgein+1))
!     allocate(yfdum(jbdum :jedum))
     allocate(yfdum(jbdum :jedum+1))
     allocate(yhdum(jbdum :jedum+1))
     allocate(yloclowf(jb:je+1))
     allocate(ylocupf (jb:je+1))
     allocate(yloclowh(jb:je+1))
     allocate(ylocuph (jb:je+1))

    ! make global y-grid (equidistant) for inlet data

     do j = jgbin-1,jgein+1
       yhin(j) = (j-jgbin)*dyin
     end do
     do j = jgbin,jgein+1
       yfin(j) = yhin(j) + 0.5*dyin
     end do
    ! make new y-grid (equidistant)
     do j = jb,je+1
       yh(j) = myid*(ylen/nprocs) + (j-jb)*dy
       yf(j) = yh(j) + 0.5*dy
     end do

   ! check which original cells are needed for interpolation
      do j=jgein+1,jgbin,-1
        if (yhin(j)<= yh(jb)) then
          if (yfin(j)<= yf(jb)) then
            procinlo = floor(real(j-jgbin)/real(jtotin))      ! this is the first cell to consider
            filenumstart = procinlo
            jgbeg = j
            jbeg = j-(procinlo*jtotin)
!            jend = jbeg+jtotdum-1
            jj = j+jtotdum-1
!            procinup = floor((j-jgbin)/real(jtotin))
!            procinup = floor((j-jgbin+1)/real(jtotin))
            procinup = floor(real(jj-jgbin)/real(jtotin))
            filenumend = procinup
            jend = jj-(procinup*jtotin)
            procinup = procinup-floor(real(procinup)/real(nprocsinl))*nprocsinl  ! continue on first procinl again
          else
            if (j == jgbin) then
              jgbeg = j-1
              jbeg = jein
              procinlo = nprocsinl-1
              filenumstart = -1
              jj = j+jtotdum-2
              procinup = floor(real(jj-jgbin)/real(jtotin))
              filenumend = procinup
              jend = jj-(procinup*jtotin)
              procinup = procinup-floor(real(procinup)/real(nprocsinl))*nprocsinl  !continue on first procinl again
            else
              procinlo = floor(real(j-jgbin-1)/real(jtotin))    ! One cell lower is needed
              filenumstart = procinlo
              jgbeg = j-1
              jbeg = j-(procinlo*jtotin)-1
              jj = j+jtotdum-2
              procinup = floor(real(jj-jgbin)/real(jtotin))
              filenumend = procinup
              jend = jj-(procinup*jtotin)
              procinup = procinup-floor(real(procinup)/real(nprocsinl))*nprocsinl  ! continue on first procinl again
            end if ! j=jgbin
          end if
          exit
        end if
      end do

      write(6,*) '!! myid,procinlo,jbeg,procinup,jend,jgbeg = ',myid,procinlo,jbeg,procinup,jend,jgbeg


   ! make dummy y-grid (equidistant)
      do j = jbdum,jedum+1
        yhdum(j) = yhin(jgbeg) + (j-jbdum+1)*dyin
        yfdum(j) = yhdum(j) + 0.5*dyin
      end do
!      if (procoldup /= procoldlo) then
!        write(6,*) '!!! Start-cell and end-cell are not in the same file!!!'
!      end if
      filestoread = filenumend - filenumstart + 1 ! no. of files to be read
!      write(6,*) '!! procinlo,procinup = ',procinlo,procinup
!      write(6,*) '!! jbin,jein,jbeg,jend= ',jbin,jein,jbeg,jend

   ! for components defined on yf
    do j=jb,je
      do jj=jbdum+1,jedum+1
        if (yfdum(jj) >= yf(j)) then
          ylocupf(j)  = jj
          yloclowf(j) = jj-1
          exit
        end if
      end do
    end do
   ! for components defined on yh
    do j=jb,je+1
      do jj=jbdum+1,jedum+1
        if (yhdum(jj) >= yh(j)) then
          ylocuph(j)  = jj
          yloclowh(j) = jj-1
          exit
        end if
      end do
    end do

  end subroutine readzincoord