Open the output files in VTK format.
This will open VTU files and if multiple processes are used a PVTU file. We always write unstructured meshes, so we also write the header for the unstructured mesh here already. The actual mesh data is then to be written by hvs_vtk_write_meshdata.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(hvs_vtk_file_type), | intent(inout) | :: | vtk_file |
The file description to open. |
||
logical, | intent(in) | :: | use_iter |
User specified settings for the output Whether to use iteration as part of filename |
||
type(tem_comm_env_type), | intent(in) | :: | proc |
Parallel environment to use for the output. |
||
type(tem_time_type), | intent(in), | optional | :: | time |
Time information. If this is present, the filename will be built with a time stamp and the time point information is written into the vtu file. |
subroutine hvs_vtk_open(vtk_file, use_iter, proc, time) !> The file description to open. type(hvs_vtk_file_type), intent(inout) :: vtk_file !> User specified settings for the output ! type(hvs_vtk_config_type), intent(in) :: vtk_config !> Whether to use iteration as part of filename logical, intent(in) :: use_iter !> Parallel environment to use for the output. type(tem_comm_env_type), intent(in) :: proc !> Time information. !! !! If this is present, the filename will be built with a time stamp and !! the time point information is written into the vtu file. type(tem_time_type), intent(in), optional :: time ! ----------------------------------------------------------------------! character(len=PathLen) :: filename character(len=PathLen) :: headerline character :: linebreak integer :: pos character(len=labelLen) :: byte_order ! ----------------------------------------------------------------------! if ( isLittleEndian ) then byte_order = 'LittleEndian' else byte_order = 'BigEndian' end if if (proc%comm_size > 1) then write(filename,'(a,i6.6)') trim(vtk_file%basename) // '_p', proc%rank else write(filename,'(a)') trim(vtk_file%basename) end if vtk_file%timestamp = '' if (present(time)) then if ( use_iter ) then write(vtk_file%timestamp, '(a)') & & '_t' // trim(tem_time_iter_stamp(time)) else write(vtk_file%timestamp, '(a)') & & '_t' // trim(tem_time_sim_stamp(time)) end if end if write(filename,'(a)') trim(filename) // trim(vtk_file%timestamp) // '.vtu' if (.not.vtk_file%write_pvtu) then write(logunit(3),*) 'Opening VTU file: ' // trim(filename) vtk_file%last_opened_file = trim(filename) end if ! Open the file (always unformatted stream, for ascii output numbers will ! be converted to strings before writing). call tem_open( newunit = vtk_file%outunit, & & file = trim(filename), & & action = 'write', & & status = 'replace', & & form = 'unformatted', & & access = 'stream' ) linebreak = new_line('x') ! Writing the header to the VTU file: write(headerline,'(a)') '<?xml version="1.0"?>' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '<VTKFile type="UnstructuredGrid" version="0.1"' & & // ' byte_order="'& & //trim(byte_order)//'">' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') ' <UnstructuredGrid>' write(vtk_file%outunit) trim(headerline)//linebreak ! Add point in time information to the VTU file. if (present(time)) then write(headerline,'(a)') '<FieldData>' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '<DataArray type="Float64" Name="TIME" '// & & 'NumberOfTuples="1" format="ascii">' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,*) time%sim write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '</DataArray>' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '<DataArray type="Int32" Name="CYCLE" '// & & 'NumberOfTuples="1" format="ascii">' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,*) time%iter write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '</DataArray>' write(vtk_file%outunit) trim(headerline)//linebreak write(headerline,'(a)') '</FieldData>' write(vtk_file%outunit) trim(headerline)//linebreak end if ! Open the PVTU file if necessary if (vtk_file%write_pvtu) then write(filename,'(a)') trim(vtk_file%basename) & & //trim(vtk_file%timestamp)//'.pvtu' write(logunit(3),*) 'Opening PVTU file: ' // trim(filename) vtk_file%last_opened_file = trim(filename) call tem_open( newunit = vtk_file%punit, & & file = trim(filename), & & action = 'write', & & status = 'replace', & & form = 'unformatted', & & access = 'stream' ) write(headerline,'(a)') '<?xml version="1.0"?>' write(vtk_file%punit) trim(headerline)//linebreak write(headerline,'(a)') '<VTKFile type="PUnstructuredGrid" ' & & // 'version="0.1" byte_order="'& & //trim(byte_order)//'">' write(vtk_file%punit) trim(headerline)//linebreak write(headerline,'(a)') ' <PUnstructuredGrid GhostLevel="0">' write(vtk_file%punit) trim(headerline)//linebreak write(vtk_file%punit) linebreak end if ! Append current filename in pvd file. ! if pvtu is present, write pvtu filename else vtu filename if ( vtk_file%write_pvd ) then pos = INDEX(trim(filename), pathSep, .true.) write(headerline,'(a)') ' <DataSet timestep="' & & //trim(tem_time_sim_stamp(time))//'" file="' & & //trim(filename(pos+1:))//'"/>' write(vtk_file%pvdunit) trim(headerline)//linebreak flush(vtk_file%pvdunit) end if end subroutine hvs_vtk_open