diff --git a/src/modules/mesh/inout/vtk/moduleMeshOutputVTK.f90 b/src/modules/mesh/inout/vtk/moduleMeshOutputVTK.f90 index 9b1a442..203de0c 100644 --- a/src/modules/mesh/inout/vtk/moduleMeshOutputVTK.f90 +++ b/src/modules/mesh/inout/vtk/moduleMeshOutputVTK.f90 @@ -1,22 +1,44 @@ MODULE moduleMeshOutputVTK + CHARACTER(LEN=6):: prefix = 'OUTPUT' + CONTAINS - SUBROUTINE writeFileHeader(self, fileID) + PURE FUNCTION formatFileName(prefix, suffix, extension, t) RESULT(fileName) + USE moduleOutput + IMPLICIT NONE + + CHARACTER(*), INTENT(in):: prefix, suffix, extension + INTEGER, INTENT(in), OPTIONAL:: t + CHARACTER (LEN=iterationDigits):: tString + CHARACTER(:), ALLOCATABLE:: fileName + + IF (PRESENT(t)) THEN + WRITE(tString, iterationFormat) t + fileName = prefix // '_' // tString // '_' // suffix // '.' // extension + + ELSE + fileName = prefix // '_' // suffix // '.' // extension + + END IF + + END FUNCTION formatFileName + + SUBROUTINE writeHeader(nNodes, nCells, fileID) USE moduleMesh IMPLICIT NONE - CLASS(meshParticles), INTENT(in):: self + 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)") '' + WRITE(fileID,"(6X, A, I10, A, I10, A)") '' - END SUBROUTINE writeFileHeader + END SUBROUTINE writeHeader - SUBROUTINE writeFileFooter(fileID) + SUBROUTINE writeFooter(fileID) IMPLICIT NONE INTEGER, INTENT(in):: fileID @@ -25,7 +47,7 @@ MODULE moduleMeshOutputVTK WRITE(fileID,"(4X, A)") '' WRITE(fileID,"(2X, A)") '' - END SUBROUTINE writeFileFooter + END SUBROUTINE writeFooter FUNCTION getCellType(cell) RESULT(indexType) USE moduleMesh3DCart @@ -74,12 +96,12 @@ MODULE moduleMeshOutputVTK END FUNCTION getCellType - SUBROUTINE writeFileMesh(self, fileID) + SUBROUTINE writeMesh(self, fileID) USE moduleMesh USE moduleRefParam IMPLICIT NONE - CLASS(meshParticles), INTENT(in):: self + CLASS(meshGeneric), INTENT(in):: self INTEGER, INTENT(in):: fileID CHARACTER(LEN=25):: nodeFormat CHARACTER(LEN=25):: cellFormat @@ -123,104 +145,252 @@ MODULE moduleMeshOutputVTK WRITE(fileID, "(10X, A)") '' WRITE(fileID, "(8X, A)") '' - END SUBROUTINE writeFileMesh + END SUBROUTINE writeMesh - SUBROUTINE writeNodeData(self, fileID, output) + 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) CHARACTER(LEN=25):: nodeFormat INTEGER:: n - WRITE(fileID,"(A)") '' - WRITE(fileID,"(A)") '' + 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(fileID,"(8X,A)") '' + WRITE(fileID,"(10X,A)") '' WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(1(ES20.6E3)))" WRITE(fileID,nodeFormat) (output(n)%density, n = 1, self%numNodes) - WRITE(fileID,"(A)") '' - WRITE(fileID,"(A)") '' + WRITE(fileID,"(10X,A)") '' + WRITE(fileID,"(10X,A)") '' WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(3(ES20.6E3)))" WRITE(fileID,nodeFormat) (output(n)%velocity(1:3), n = 1, self%numNodes) - WRITE(fileID,"(A)") '' - WRITE(fileID,"(A)") '' + WRITE(fileID,"(10X,A)") '' + WRITE(fileID,"(10X,A)") '' WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(1(ES20.6E3)))" WRITE(fileID,nodeFormat) (output(n)%pressure, n = 1, self%numNodes) - WRITE(fileID,"(A)") '' - WRITE(fileID,"(A)") '' + WRITE(fileID,"(10X,A)") '' + WRITE(fileID,"(10X,A)") '' WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(1(ES20.6E3)))" WRITE(fileID,nodeFormat) (output(n)%temperature, n = 1, self%numNodes) - WRITE(fileID,"(A)") '' - WRITE(fileID,"(A)") '' + WRITE(fileID,"(10X,A)") '' + WRITE(fileID,"(8X,A)") '' - END SUBROUTINE writeNodeData + 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 + CHARACTER(LEN=25):: cellFormat + + 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(cellFormat, "(A,I10, A)") "(", self%numCells, "(I10))" + WRITE(fileID, cellFormat) (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 + CHARACTER(LEN=25):: nodeFormat + CHARACTER(LEN=25):: cellFormat + INTEGER:: n + REAL(8):: Xi(1:3) + + Xi = (/ 0.D0, 0.D0, 0.D0 /) + + !Points in nodes + WRITE(fileID,"(8X,A)") '' + !Electric potential + WRITE(fileID,"(10X,A)") '' + WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(1(ES20.6E3)))" + WRITE(fileID,nodeFormat) (self%nodes(n)%obj%emData%phi*Volt_ref, n = 1, self%numNodes) + WRITE(fileID,"(10X,A)") '' + !Magnetic Field + WRITE(fileID,"(10X,A)") '' + WRITE(nodeFormat, "(A,I10, A)") "(", self%numNodes, "(3(ES20.6E3)))" + WRITE(fileID,nodeFormat) (self%nodes(n)%obj%emData%B*B_ref, n = 1, self%numNodes) + WRITE(fileID,"(10X,A)") '' + WRITE(fileID,"(8X,A)") '' + + !Cell Data + WRITE(fileID,"(8X,A)") '' + !Electric field + WRITE(fileID,"(10X,A, A, A)") '' + WRITE(cellFormat, "(A,I10, A)") "(", self%numCells, "(3(ES20.6E3)))" + WRITE(fileID, cellFormat) (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 printOutputVTK(self,t) USE moduleMesh - USE moduleRefParam USE moduleSpecies - USE moduleOutput - USE moduleCaseParam IMPLICIT NONE CLASS(meshParticles), INTENT(in):: self INTEGER, INTENT(in):: t INTEGER:: n, i, fileID CHARACTER(:), ALLOCATABLE:: fileName, fileNameCollection - CHARACTER (LEN=iterationDigits):: tstring TYPE(outputFormat):: output(1:self%numNodes) fileID = 60 DO i = 1, nSpecies - WRITE(tstring, iterationFormat) t - fileName= 'OUTPUT_' // tstring// '_' // species(i)%obj%name // '.vtu' - + fileName = formatFileName(prefix, species(i)%obj%name, 'vtu', t) WRITE(*, "(6X,A15,A)") "Creating file: ", fileName OPEN (fileID, file = path // folder // '/' // fileName) - fileNameCollection = 'OUTPUT_Collection_' // species(i)%obj%name // '.pvd' - 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) + CALL writeHeader(self%numNodes, self%numCells, fileID) - END IF + CALL writeMesh(self, fileID) - !Write iteration file in collection - OPEN (fileID + 1, file = path // folder // '/' // fileNameCollection, ACCESS='APPEND') - WRITE(fileID + 1, "(4X, A, ES20.6E3, A, A, A)"), '' + CALL writeSpeciesOutput(self, fileID, i) - !Close collection file - IF (t == tFinal) THEN - WRITE (fileID + 1, "(2X, A)") '' - WRITE (fileID + 1, "(A)") '' - - END IF - CLOSE(fileID + 1) - - CALL writeFileHeader(self, fileID) - - CALL writeFileMesh(self, fileID) - - DO n = 1, self%numNodes - CALL calculateOutput(self%nodes(n)%obj%output(i), output(n), self%nodes(n)%obj%v, species(i)%obj) - - END DO - - CALL writeNodeData(self, fileID, output) - - CALL writeFileFooter(fileID) + CALL writeFooter(fileID) CLOSE(fileID) + !Write collection file for time plotting + fileNameCollection = formatFileName(prefix, 'Collection_' // species(i)%obj%name, 'pvd') + CALL writeCollection(fileID, t, fileName, filenameCollection) + END DO END SUBROUTINE printOutputVTK + SUBROUTINE printCollVTK(self,t) + USE moduleMesh + USE moduleOutput + IMPLICIT NONE + + CLASS(meshGeneric), INTENT(in):: self + INTEGER, INTENT(in):: t + INTEGER:: n, i, fileID + CHARACTER(:), ALLOCATABLE:: fileName, fileNameCollection + CHARACTER (LEN=iterationDigits):: tstring + TYPE(outputFormat):: output(1:self%numNodes) + + 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(prefix, 'Collection_Collisions', 'pvd') + CALL writeCollection(fileID, t, fileName, filenameCollection) + + END IF + + END SUBROUTINE printCollVTK + + SUBROUTINE printEMVTK(self, t) + USE moduleMesh + 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(prefix, 'Collection_EMField', 'pvd') + CALL writeCollection(fileID, t, fileName, filenameCollection) + + END IF + + END SUBROUTINE printEMVTK + END MODULE moduleMeshOutputVTK diff --git a/src/modules/solver/moduleSolver.f90 b/src/modules/solver/moduleSolver.f90 index 813aeb3..def5ca4 100644 --- a/src/modules/solver/moduleSolver.f90 +++ b/src/modules/solver/moduleSolver.f90 @@ -528,9 +528,11 @@ MODULE moduleSolver CALL outputProbes(t) CALL mesh%printOutput(t) - CALL printOutputVTK(mesh, t) + CALL printOutputVTK(mesh, t) !TEMPORARY TO TEST VTK OUTPUT IF (ASSOCIATED(meshForMCC)) CALL meshForMCC%printColl(t) + IF (ASSOCIATED(meshForMCC)) CALL printCollVTK(meshForMCC,t) !TEMPORARY TO TEST VTK OUTPUT CALL mesh%printEM(t) + CALL printEMVTK(mesh, t) !TEMPORARY TO TEST VTK OUTPUT WRITE(*, "(5X,A21,I10,A1,I10)") "t/tFinal: ", t, "/", tFinal WRITE(*, "(5X,A21,I10)") "Particles: ", nPartOld IF (t == 0) THEN