MODULE moduleMeshOutputVTU CONTAINS SUBROUTINE writeHeader(nNodes, nCells, fileID) USE moduleMesh IMPLICIT NONE INTEGER, INTENT(in):: nNodes, nCells INTEGER, INTENT(in):: fileID WRITE(fileID,"(A)") '' WRITE(fileID,"(2X, A)") '' WRITE(fileID,"(4X, A,ES20.6E3,A)") '' WRITE(fileID,"(6X, A, I10, A, I10, A)") '' END SUBROUTINE writeHeader SUBROUTINE writeFooter(fileID) IMPLICIT NONE INTEGER, INTENT(in):: fileID WRITE(fileID,"(6X, A)") '' WRITE(fileID,"(4X, A)") '' WRITE(fileID,"(2X, A)") '' END SUBROUTINE writeFooter FUNCTION getCellType(cell) RESULT(indexType) USE moduleMesh3DCart USE moduleMesh2DCyl USE moduleMesh2DCart USE moduleMesh1DRad USE moduleMesh1DCart USE moduleMesh0D USE moduleErrors IMPLICIT NONE CLASS(meshCell), INTENT(in):: cell INTEGER:: indexType indexType = 0 SELECT TYPE(cell) TYPE IS(meshCell3DCartTetra) indexType = 10 TYPE IS(meshCell2DCylQuad) indexType = 9 TYPE IS(meshCell2DCartQuad) indexType = 9 TYPE IS(meshCell2DCylTria) indexType = 5 TYPE IS(meshCell2DCartTria) indexType = 5 TYPE IS(meshCell1DRadSegm) indexType = 3 TYPE IS(meshCell1DCartSegm) indexType = 3 TYPE IS(meshCell0D) indexType = 1 CLASS DEFAULT CALL criticalError('Cell not valid for VTU output', 'getCellType') END SELECT END FUNCTION getCellType SUBROUTINE writeMesh(self, fileID) USE moduleMesh USE moduleRefParam IMPLICIT NONE CLASS(meshGeneric), INTENT(in):: self INTEGER, INTENT(in):: fileID INTEGER:: e INTEGER:: offset(1:self%numCells), types(1:self%numCells) !Write nodes coordinates WRITE(fileID, "(8X, A)") '' WRITE(fileID, "(10X,A)") '' WRITE(fileID, "(6(ES20.6E3))") (self%nodes(e)%obj%getCoordinates()*L_ref, e = 1, self%numNodes) WRITE(fileID, "(10X, A)") '' WRITE(fileID, "(8X, A)") '' WRITE(fileID, "(8X, A)") '' !Write nodes connectivity of each cell WRITE(fileID, "(10X,A)") '' WRITE(fileID, "(6(I10))") (self%cells(e)%obj%getNodes(self%cells(e)%obj%nNodes) - 1, e = 1, self%numCells) !Array starts on 0 WRITE(fileID, "(10X, A)") '' !Write offset of each cell offset(1) = self%cells(1)%obj%nNodes WRITE(fileID, "(10X,A)") '' DO e = 2, self%numCells offset(e) = offset(e - 1) + self%cells(e)%obj%nNodes END DO WRITE(fileID, "(6(I10))") offset WRITE(fileID, "(10X, A)") '' !Write type of each cell WRITE(fileID, "(10X,A)") '' DO e = 1, self%numCells types(e) = getCellType(self%cells(e)%obj) END DO WRITE(fileID, "(6(I10))") types WRITE(fileID, "(10X, A)") '' WRITE(fileID, "(8X, A)") '' END SUBROUTINE writeMesh SUBROUTINE writeSpeciesOutput(self, fileID, speciesIndex) USE moduleMesh USE moduleOutput IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: fileID INTEGER, INTENT(in):: speciesIndex TYPE(outputFormat):: output(1:self%numNodes) INTEGER:: n DO n = 1, self%numNodes CALL calculateOutput(self%nodes(n)%obj%output(speciesIndex), output(n), self%nodes(n)%obj%v, species(speciesIndex)%obj) END DO !Write node data WRITE(fileID,"(8X,A)") '' !Write density WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (output(n)%density, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' !Write velocity WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (output(n)%velocity, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' !Write pressure WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (output(n)%pressure, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' !Write temperature WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (output(n)%temperature, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' !End node data WRITE(fileID,"(8X,A)") '' END SUBROUTINE writeSpeciesOutput SUBROUTINE writeCollOutput(self,fileID) USE moduleMesh USE moduleCollisions IMPLICIT NONE CLASS(meshGeneric), INTENT(in):: self INTEGER, INTENT(in):: fileID INTEGER:: k, c, n CHARACTER(:), ALLOCATABLE:: title CHARACTER (LEN=2):: cString WRITE(fileID,"(8X,A)") '' DO k = 1, nCollPairs DO c = 1, interactionMatrix(k)%amount WRITE(cString, "(I2)") c title = 'Pair ' // interactionMatrix(k)%sp_i%name // '-' // interactionMatrix(k)%sp_j%name // ' collision ' // cString WRITE(fileID,"(10X,A, A, A)") '' WRITE(fileID, "(6(I10))") (self%cells(n)%obj%tallyColl(k)%tally(c), n = 1, self%numCells) WRITE(fileID, "(10X, A)") '' END DO END DO WRITE(fileID,"(8X,A)") '' END SUBROUTINE writeCollOutput SUBROUTINE writeEM(self, fileID) USE moduleMesh USE moduleRefParam IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: fileID INTEGER:: n REAL(8):: Xi(1:3) !Points in nodes WRITE(fileID,"(8X,A)") '' !Electric potential WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (self%nodes(n)%obj%emData%phi*Volt_ref, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' !Magnetic Field WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(6(ES20.6E3))") (self%nodes(n)%obj%emData%B*B_ref, n = 1, self%numNodes) WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(8X,A)") '' !Cell Data Xi = (/ 0.D0, 0.D0, 0.D0 /) WRITE(fileID,"(8X,A)") '' !Electric field WRITE(fileID,"(10X,A, A, A)") '' WRITE(fileID,"(6(ES20.6E3))") (self%cells(n)%obj%gatherElectricField(Xi)*EF_ref, n = 1, self%numCells) WRITE(fileID,"(10X,A)") '' WRITE(fileID,"(8X,A)") '' END SUBROUTINE writeEM SUBROUTINE writeCollection(fileID, t, fileNameStep, fileNameCollection) USE moduleCaseParam USE moduleOutput USE moduleRefParam IMPLICIT NONE INTEGER:: fileID INTEGER, INTENT(in):: t CHARACTER(*):: fileNameStep, fileNameCollection IF (t == tInitial) THEN !Create collection file WRITE(*, "(6X,A15,A)") "Creating file: ", fileNameCollection OPEN (fileID + 1, file = path // folder // '/' // fileNameCollection) WRITE (fileID + 1, "(A)") '' WRITE (fileID + 1, "(2X, A)") '' CLOSE(fileID + 1) END IF !Write iteration file in collection OPEN (fileID + 1, file = path // folder // '/' // fileNameCollection, ACCESS='APPEND') WRITE(fileID + 1, "(4X, A, ES20.6E3, A, A, A)") '' !Close collection file IF (t == tFinal) THEN WRITE (fileID + 1, "(2X, A)") '' WRITE (fileID + 1, "(A)") '' END IF CLOSE(fileID + 1) END SUBROUTINE writeCollection SUBROUTINE writeAverage(self, fileIDMean, fileIDDeviation, speciesIndex) USE moduleMesh USE moduleOutput USE moduleAverage IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: fileIDMean, fileIDDeviation INTEGER, INTENT(in):: speciesIndex TYPE(outputFormat):: outputMean(1:self%numNodes) TYPE(outputFormat):: outputDeviation(1:self%numNodes) INTEGER:: n DO n = 1, self%numNodes CALL calculateOutput(averageScheme(n)%mean%output(speciesIndex), outputMean(n), & self%nodes(n)%obj%v, species(speciesIndex)%obj) CALL calculateOutput(averageScheme(n)%deviation%output(speciesIndex), outputDeviation(n), & self%nodes(n)%obj%v, species(speciesIndex)%obj) END DO !Write node data WRITE(fileIDMean, "(8X,A)") '' WRITE(fileIDDeviation,"(8X,A)") '' !Write density WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' WRITE(fileIDMean, "(6(ES20.6E3))") (outputMean(n)%density, n = 1, self%numNodes) WRITE(fileIDDeviation,"(6(ES20.6E3))") (outputDeviation(n)%density, n = 1, self%numNodes) WRITE(fileIDMean,"(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' !Write velocity WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' WRITE(fileIDMean, "(6(ES20.6E3))") (outputMean(n)%velocity, n = 1, self%numNodes) WRITE(fileIDDeviation,"(6(ES20.6E3))") (outputDeviation(n)%velocity, n = 1, self%numNodes) WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' !Write pressure WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' WRITE(fileIDMean, "(6(ES20.6E3))") (outputMean(n)%pressure, n = 1, self%numNodes) WRITE(fileIDDeviation,"(6(ES20.6E3))") (outputDeviation(n)%pressure, n = 1, self%numNodes) WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' !Write temperature WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' WRITE(fileIDMean, "(6(ES20.6E3))") (outputMean(n)%temperature, n = 1, self%numNodes) WRITE(fileIDDeviation,"(6(ES20.6E3))") (outputDeviation(n)%temperature, n = 1, self%numNodes) WRITE(fileIDMean, "(10X,A)") '' WRITE(fileIDDeviation,"(10X,A)") '' !End node data WRITE(fileIDMean, "(8X,A)") '' WRITE(fileIDDeviation,"(8X,A)") '' END SUBROUTINE writeAverage SUBROUTINE printOutputVTU(self,t) USE moduleMesh USE moduleSpecies USE moduleMeshInoutCommon IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: t INTEGER:: i, fileID CHARACTER(:), ALLOCATABLE:: fileName, fileNameCollection fileID = 60 DO i = 1, nSpecies fileName = formatFileName(prefix, species(i)%obj%name, 'vtu', t) WRITE(*, "(6X,A15,A)") "Creating file: ", fileName OPEN (fileID, file = path // folder // '/' // fileName) CALL writeHeader(self%numNodes, self%numCells, fileID) CALL writeMesh(self, fileID) CALL writeSpeciesOutput(self, fileID, i) CALL writeFooter(fileID) CLOSE(fileID) !Write collection file for time plotting fileNameCollection = formatFileName('Collection', species(i)%obj%name, 'pvd') CALL writeCollection(fileID, t, fileName, filenameCollection) END DO END SUBROUTINE printOutputVTU SUBROUTINE printCollVTU(self,t) USE moduleMesh USE moduleOutput USE moduleMeshInoutCommon IMPLICIT NONE CLASS(meshGeneric), INTENT(in):: self INTEGER, INTENT(in):: t INTEGER:: fileID CHARACTER(:), ALLOCATABLE:: fileName, fileNameCollection CHARACTER (LEN=iterationDigits):: tstring fileID = 62 IF (collOutput) THEN fileName = formatFileName(prefix, 'Collisions', 'vtu', t) WRITE(*, "(6X,A15,A)") "Creating file: ", fileName OPEN (fileID, file = path // folder // '/' // fileName) CALL writeHeader(self%numNodes, self%numCells, fileID) CALL writeMesh(self, fileID) CALL writeCollOutput(self, fileID) CALL writeFooter(fileID) CLOSE(fileID) !Write collection file for time plotting fileNameCollection = formatFileName('Collection', 'Collisions', 'pvd') CALL writeCollection(fileID, t, fileName, filenameCollection) END IF END SUBROUTINE printCollVTU SUBROUTINE printEMVTU(self, t) USE moduleMesh USE moduleMeshInoutCommon IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: t INTEGER:: fileID CHARACTER(:), ALLOCATABLE:: fileName, fileNameCollection fileID = 64 IF (emOutput) THEN fileName = formatFileName(prefix, 'EMField', 'vtu', t) WRITE(*, "(6X,A15,A)") "Creating file: ", fileName OPEN (fileID, file = path // folder // '/' // fileName) CALL writeHeader(self%numNodes, self%numCells, fileID) CALL writeMesh(self, fileID) CALL writeEM(self, fileID) CALL writeFooter(fileID) CLOSE(fileID) !Write collection file for time plotting fileNameCollection = formatFileName('Collection', 'EMField', 'pvd') CALL writeCollection(fileID, t, fileName, filenameCollection) END IF END SUBROUTINE printEMVTU SUBROUTINE printAverageVTU(self) USE moduleMesh USE moduleSpecies USE moduleMeshInoutCommon IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER:: i, fileIDMean, fileIDDeviation CHARACTER(:), ALLOCATABLE:: fileNameMean, fileNameDeviation fileIDMean = 66 fileIDDeviation = 67 DO i = 1, nSpecies fileNameMean = formatFileName('Average_mean', species(i)%obj%name, 'vtu') WRITE(*, "(6X,A15,A)") "Creating file: ", fileNameMean OPEN (fileIDMean, file = path // folder // '/' // fileNameMean) fileNameDeviation = formatFileName('Average_deviation', species(i)%obj%name, 'vtu') WRITE(*, "(6X,A15,A)") "Creating file: ", fileNameDeviation OPEN (fileIDDeviation, file = path // folder // '/' // fileNameDeviation) CALL writeHeader(self%numNodes, self%numCells, fileIDMean) CALL writeHeader(self%numNodes, self%numCells, fileIDDeviation) CALL writeMesh(self, fileIDMean) CALL writeMesh(self, fileIDDeviation) CALL writeAverage(self, fileIDMean, fileIDDeviation, i) CALL writeFooter(fileIDMean) CALL writeFooter(fileIDDeviation) CLOSE(fileIDMean) CLOSE(fileIDDeviation) END DO END SUBROUTINE printAverageVTU END MODULE moduleMeshOutputVTU