punstructuredvtkB_mpi Subroutine

public subroutine punstructuredvtkB_mpi(qunit)

Uses

  • proc~~punstructuredvtkb_mpi~~UsesGraph proc~punstructuredvtkb_mpi punstructuredvtkB_mpi module~mod_calculate_xw mod_calculate_xw proc~punstructuredvtkb_mpi->module~mod_calculate_xw module~mod_forest mod_forest proc~punstructuredvtkb_mpi->module~mod_forest module~mod_global_parameters mod_global_parameters proc~punstructuredvtkb_mpi->module~mod_global_parameters module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: qunit

Calls

proc~~punstructuredvtkb_mpi~~CallsGraph proc~punstructuredvtkb_mpi punstructuredvtkB_mpi proc~calc_grid calc_grid proc~punstructuredvtkb_mpi->proc~calc_grid proc~calc_x calc_x proc~punstructuredvtkb_mpi->proc~calc_x proc~getheadernames getheadernames proc~punstructuredvtkb_mpi->proc~getheadernames proc~write_pvtu write_pvtu proc~punstructuredvtkb_mpi->proc~write_pvtu phys_to_primitive phys_to_primitive proc~calc_grid->phys_to_primitive proc~mpistop mpistop proc~calc_grid->proc~mpistop proc~to_cartesian to_cartesian proc~calc_grid->proc~to_cartesian proc~getheadernames->proc~mpistop proc~write_pvtu->proc~getheadernames mpi_abort mpi_abort proc~mpistop->mpi_abort

Called by

proc~~punstructuredvtkb_mpi~~CalledByGraph proc~punstructuredvtkb_mpi punstructuredvtkB_mpi proc~generate_plotfile generate_plotfile proc~generate_plotfile->proc~punstructuredvtkb_mpi proc~main main proc~main->proc~generate_plotfile proc~timeintegration timeintegration proc~main->proc~timeintegration proc~saveamrfile saveamrfile proc~saveamrfile->proc~generate_plotfile proc~timeintegration->proc~saveamrfile program~agile agile program~agile->proc~main

Source Code

  subroutine punstructuredvtkB_mpi(qunit)
    ! Write one pvtu and vtu files for each processor
    ! Otherwise like unstructuredvtk_mpi
    ! output for vtu format to paraview, binary version output
    ! uses calc_grid to compute nwauxio variables
    ! allows renormalizing using convert factors
    use mod_forest, only: Morton_start, Morton_stop, sfc_to_igrid
    use mod_global_parameters
    use mod_calculate_xw

    integer, intent(in) ::    qunit

    double precision ::  x_VTK(1:3)
    double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,&
       ixMlo3-1:ixMhi3,ndim) :: xC_TMP
    double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3,&
       ndim)   :: xCC_TMP
    double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,&
       ixMlo3-1:ixMhi3,ndim) :: xC
    double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3,&
       ndim)   :: xCC
    double precision, dimension(ixMlo1-1:ixMhi1,ixMlo2-1:ixMhi2,&
       ixMlo3-1:ixMhi3,nw+nwauxio)   :: wC_TMP
    double precision, dimension(ixMlo1:ixMhi1,ixMlo2:ixMhi2,ixMlo3:ixMhi3,&
       nw+nwauxio)     :: wCC_TMP
    integer :: igrid,iigrid,level,igonlevel,icel,ixCmin1,ixCmin2,ixCmin3,&
       ixCmax1,ixCmax2,ixCmax3,ixCCmin1,ixCCmin2,ixCCmin3,ixCCmax1,ixCCmax2,&
       ixCCmax3,Morton_no
    integer ::               NumGridsOnLevel(1:nlevelshi)
    integer :: nx1,nx2,nx3,nxC1,nxC2,nxC3,nodesonlevel,elemsonlevel,nc,np,&
       VTK_type,ix1,ix2,ix3
    double precision :: normconv(0:nw+nwauxio)
    character(len=80) :: pfilename
    character(len=name_len) :: wnamei(1:nw+nwauxio),&
       xandwnamei(1:ndim+nw+nwauxio)
    character(len=1024) :: outfilehead
    integer*8 :: offset
    integer::  recsep,k,iw,filenr
    integer::  length,lengthcc,offset_points,offset_cells, length_coords,&
       length_conn,length_offsets
    character::  buf
    character(len=6)::  bufform
    logical ::   fileopen

    ! Write pvtu-file:
    if (mype==0) then
      call write_pvtu(qunit)
    end if
    ! Now write the Source files:
    inquire(qunit,opened=fileopen)
    if(.not.fileopen)then
      ! generate filename
      filenr=snapshotnext-1
      if (autoconvert) filenr=snapshotnext
      ! Open the file for the header part
      write(pfilename,'(a,i4.4,a,i4.4,a)') TRIM(base_filename),filenr,"p",mype,&
         ".vtu"
      open(qunit,file=pfilename,status='unknown',form='formatted')
    end if
    ! generate xml header
    write(qunit,'(a)')'<?xml version="1.0"?>'
    write(qunit,'(a)',advance='no') '<VTKFile type="UnstructuredGrid"'
    write(qunit,'(a)')' version="0.1" byte_order="LittleEndian">'
    write(qunit,'(a)')'  <UnstructuredGrid>'
    write(qunit,'(a)')'<FieldData>'
    write(qunit,'(2a)')'<DataArray type="Float32" Name="TIME" ',&
       'NumberOfTuples="1" format="ascii">'
    write(qunit,*) real(global_time*time_convert_factor)
    write(qunit,'(a)')'</DataArray>'
    write(qunit,'(a)')'</FieldData>'
    offset=0
    recsep=4

    call getheadernames(wnamei,xandwnamei,outfilehead)

    ! number of cells, number of corner points, per grid.
    nx1=ixMhi1-ixMlo1+1;nx2=ixMhi2-ixMlo2+1;nx3=ixMhi3-ixMlo3+1;
    nxC1=nx1+1;nxC2=nx2+1;nxC3=nx3+1;
    nc=nx1*nx2*nx3
    np=nxC1*nxC2*nxC3

    length=np*size_real
    lengthcc=nc*size_real

    length_coords=3*length
    length_conn=2**3*size_int*nc
    length_offsets=nc*size_int

    ! Note: using the w_write, writelevel, writespshift
    ! we can clip parts of the grid away, select variables, levels etc.
    do level=levmin,levmax
     if (writelevel(level)) then
       do Morton_no=Morton_start(mype),Morton_stop(mype)
        igrid=sfc_to_igrid(Morton_no)
        if (node(plevel_,igrid)/=level) cycle
        ! only output a grid when fully within clipped region selected
        ! by writespshift array
        if ((rnode(rpxmin1_,igrid)>=xprobmin1+&
           (xprobmax1-xprobmin1)*writespshift(1,1).and.rnode(rpxmin2_,&
           igrid)>=xprobmin2+(xprobmax2-xprobmin2)*writespshift(2,&
           1).and.rnode(rpxmin3_,igrid)>=xprobmin3+&
           (xprobmax3-xprobmin3)*writespshift(3,1)).and.(rnode(rpxmax1_,&
           igrid)<=xprobmax1-(xprobmax1-xprobmin1)*writespshift(1,&
           2).and.rnode(rpxmax2_,igrid)<=xprobmax2-(xprobmax2-&
           xprobmin2)*writespshift(2,2).and.rnode(rpxmax3_,&
           igrid)<=xprobmax3-(xprobmax3-xprobmin3)*writespshift(3,2))) then
          select case(convert_type)
           case('pvtuBmpi')
             ! we write out every grid as one VTK PIECE
             write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
                '" NumberOfCells="',nc,'">'
             write(qunit,'(a)')'<PointData>'
             do iw=1,nw
                if(.not.w_write(iw))cycle

                write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
                   TRIM(wnamei(iw)), '" format="appended" offset="',offset,&
                   '">'
                write(qunit,'(a)')'</DataArray>'
                offset=offset+length+size_int
             enddo
             do iw=nw+1,nw+nwauxio

                write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
                   TRIM(wnamei(iw)), '" format="appended" offset="',offset,&
                   '">'
                write(qunit,'(a)')'</DataArray>'
                offset=offset+length+size_int
             enddo
             write(qunit,'(a)')'</PointData>'

             write(qunit,'(a)')'<Points>'
             write(qunit,'(a,i16,a)')&
'<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
                offset,'"/>'
             ! write cell corner coordinates in a backward dimensional loop, always 3D output
             offset=offset+length_coords+size_int
             write(qunit,'(a)')'</Points>'
           case('pvtuBCCmpi')
             ! we write out every grid as one VTK PIECE
             write(qunit,'(a,i7,a,i7,a)') '<Piece NumberOfPoints="',np,&
                '" NumberOfCells="',nc,'">'
             write(qunit,'(a)')'<CellData>'
             do iw=1,nw
                if(.not.w_write(iw))cycle

                write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
                   TRIM(wnamei(iw)), '" format="appended" offset="',offset,&
                   '">'
                write(qunit,'(a)')'</DataArray>'
                offset=offset+lengthcc+size_int
             enddo
             do iw=nw+1,nw+nwauxio

                write(qunit,'(a,a,a,i16,a)')'<DataArray type="Float32" Name="',&
                   TRIM(wnamei(iw)), '" format="appended" offset="',offset,&
                   '">'
                write(qunit,'(a)')'</DataArray>'
                offset=offset+lengthcc+size_int
             enddo
             write(qunit,'(a)')'</CellData>'
             write(qunit,'(a)')'<Points>'
             write(qunit,'(a,i16,a)')&
'<DataArray type="Float32" NumberOfComponents="3" format="appended" offset="',&
                offset,'"/>'
             ! write cell corner coordinates in a backward dimensional loop, always 3D output
             offset=offset+length_coords+size_int
             write(qunit,'(a)')'</Points>'
          end select
          write(qunit,'(a)')'<Cells>'
          ! connectivity part
          write(qunit,'(a,i16,a)'&
)'<DataArray type="Int32" Name="connectivity" format="appended" offset="',&
             offset,'"/>'
          offset=offset+length_conn+size_int
          ! offsets data array
          write(qunit,'(a,i16,a)')&
'<DataArray type="Int32" Name="offsets" format="appended" offset="',offset,&
             '"/>'
          offset=offset+length_offsets+size_int
          ! VTK cell type data array
          write(qunit,'(a,i16,a)')&
'<DataArray type="Int32" Name="types" format="appended" offset="',offset,&
             '"/>'
          offset=offset+size_int+nc*size_int
          write(qunit,'(a)')'</Cells>'
          write(qunit,'(a)')'</Piece>'
        end if
       end do
     end if
    end do

    write(qunit,'(a)')'</UnstructuredGrid>'
    write(qunit,'(a)')'<AppendedData encoding="raw">'
    close(qunit)
    ! next to make gfortran compiler happy, as it does not know
    ! form='binary' and produces error on compilation
    !bufform='binary'
    !open(qunit,file=pfilename,form=bufform,position='append')
    !This should in principle do also for gfortran (tested with gfortran 4.6.0 and Intel 11.1):
    open(qunit,file=pfilename,access='stream',form='unformatted',&
       position='append')
    buf='_'
    write(qunit) TRIM(buf)

    do level=levmin,levmax
     if (writelevel(level)) then
       do Morton_no=Morton_start(mype),Morton_stop(mype)
        igrid=sfc_to_igrid(Morton_no)
        if (node(plevel_,igrid)/=level) cycle
          ! only output a grid when fully within clipped region selected
          ! by writespshift array
          if ((rnode(rpxmin1_,igrid)>=xprobmin1+&
             (xprobmax1-xprobmin1)*writespshift(1,1).and.rnode(rpxmin2_,&
             igrid)>=xprobmin2+(xprobmax2-xprobmin2)*writespshift(2,&
             1).and.rnode(rpxmin3_,igrid)>=&
             xprobmin3+(xprobmax3-xprobmin3)*writespshift(3,&
             1)).and.(rnode(rpxmax1_,igrid)<=&
             xprobmax1-(xprobmax1-xprobmin1)*writespshift(1,&
             2).and.rnode(rpxmax2_,igrid)<=&
             xprobmax2-(xprobmax2-xprobmin2)*writespshift(2,&
             2).and.rnode(rpxmax3_,igrid)<=&
             xprobmax3-(xprobmax3-xprobmin3)*writespshift(3,2))) then
            call calc_x(igrid,xC,xCC)
            call calc_grid(qunit,igrid,xC,xCC,xC_TMP,xCC_TMP,wC_TMP,wCC_TMP,&
               normconv,ixCmin1,ixCmin2,ixCmin3,ixCmax1,ixCmax2,ixCmax3,&
               ixCCmin1,ixCCmin2,ixCCmin3,ixCCmax1,ixCCmax2,ixCCmax3,.true.)
            do iw=1,nw
              if(.not.w_write(iw))cycle
              select case(convert_type)
                case('pvtuBmpi')
                  write(qunit) length
                  write(qunit) (((real(wC_TMP(ix1,ix2,ix3,iw)*normconv(iw)),&
                     ix1=ixCmin1,ixCmax1),ix2=ixCmin2,ixCmax2),ix3=ixCmin3,&
                     ixCmax3)
                case('pvtuBCCmpi')
                  write(qunit) lengthcc
                  write(qunit) (((real(wCC_TMP(ix1,ix2,ix3,iw)*normconv(iw)),&
                     ix1=ixCCmin1,ixCCmax1),ix2=ixCCmin2,ixCCmax2),&
                     ix3=ixCCmin3,ixCCmax3)
              end select
            enddo
            do iw=nw+1,nw+nwauxio
              select case(convert_type)
                case('pvtuBmpi')
                  write(qunit) length
                  write(qunit) (((real(wC_TMP(ix1,ix2,ix3,iw)*normconv(iw)),&
                     ix1=ixCmin1,ixCmax1),ix2=ixCmin2,ixCmax2),ix3=ixCmin3,&
                     ixCmax3)
                case('pvtuBCCmpi')
                  write(qunit) lengthcc
                  write(qunit) (((real(wCC_TMP(ix1,ix2,ix3,iw)*normconv(iw)),&
                     ix1=ixCCmin1,ixCCmax1),ix2=ixCCmin2,ixCCmax2),&
                     ix3=ixCCmin3,ixCCmax3)
              end select
            enddo
            write(qunit) length_coords
            do ix3=ixCmin3,ixCmax3
            do ix2=ixCmin2,ixCmax2
            do ix1=ixCmin1,ixCmax1
               x_VTK(1:3)=zero;
               x_VTK(1:ndim)=xC_TMP(ix1,ix2,ix3,1:ndim)*normconv(0);
               do k=1,3
                 write(qunit) real(x_VTK(k))
               end do
            end do
            end do
            end do
            write(qunit) length_conn
            do ix3=1,nx3
            do ix2=1,nx2
            do ix1=1,nx1



            write(qunit)(ix3-1)*nxC2*nxC1+(ix2-1)*nxC1+ix1-1,&
                (ix3-1)*nxC2*nxC1+(ix2-1)*nxC1+ix1,&
               (ix3-1)*nxC2*nxC1+    ix2*nxC1+ix1-1,&
               (ix3-1)*nxC2*nxC1+    ix2*nxC1+ix1,&
               ix3*nxC2*nxC1+(ix2-1)*nxC1+ix1-1,ix3*nxC2*nxC1+(ix2-1)*nxC1+ix1,&
               ix3*nxC2*nxC1+    ix2*nxC1+ix1-1,ix3*nxC2*nxC1+    ix2*nxC1+ix1

            end do
            end do
            end do
            write(qunit) length_offsets
            do icel=1,nc
              write(qunit) icel*(2**3)
            end do


            VTK_type=11
            write(qunit) size_int*nc
            do icel=1,nc
              write(qunit) VTK_type
            end do
        end if
      end do
     end if
    end do

    close(qunit)
    open(qunit,file=pfilename,status='unknown',form='formatted',&
       position='append')
    write(qunit,'(a)')'</AppendedData>'
    write(qunit,'(a)')'</VTKFile>'
    close(qunit)

  end subroutine punstructuredvtkB_mpi