Output of standard deviation
The output for the standard deviation (still Gmsh2 only) was added. Change in the output routines to reduce code repetition.
This commit is contained in:
parent
38d28887ff
commit
5509332980
6 changed files with 256 additions and 192 deletions
|
|
@ -7,7 +7,7 @@ OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o \
|
|||
|
||||
all: $(OBJS)
|
||||
|
||||
mesh.o: moduleCollisions.o moduleBoundary.o
|
||||
mesh.o: moduleCollisions.o moduleBoundary.o moduleAverage.o
|
||||
$(MAKE) -C mesh all
|
||||
|
||||
moduleCollisions.o: moduleList.o moduleMath.o moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90
|
||||
|
|
|
|||
|
|
@ -1,6 +1,84 @@
|
|||
MODULE moduleMeshOutputGmsh2
|
||||
|
||||
CONTAINS
|
||||
!Header for mesh format
|
||||
SUBROUTINE writeGmsh2HeaderMesh(fileID)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: fileID
|
||||
|
||||
WRITE(fileID, "(A)") '$MeshFormat'
|
||||
WRITE(fileID, "(A)") '2.2 0 8'
|
||||
WRITE(fileID, "(A)") '$EndMeshFormat'
|
||||
|
||||
END SUBROUTINE writeGmsh2HeaderMesh
|
||||
|
||||
!Node data subroutines
|
||||
!Header
|
||||
SUBROUTINE writeGmsh2HeaderNodeData(fileID, title, iteration, time, dimensions, nNodes)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: fileID
|
||||
CHARACTER(*), INTENT(in):: title
|
||||
INTEGER, INTENT(in):: iteration, dimensions, nNodes
|
||||
REAL(8), INTENT(in):: time
|
||||
|
||||
|
||||
WRITE(fileID, "(A)") '$NodeData'
|
||||
WRITE(fileID, "(I10)") 1
|
||||
WRITE(fileID, "(A1, A, A1)") '"' , title , '"'
|
||||
WRITE(fileID, "(I10)") 1
|
||||
WRITE(fileID, "(ES20.6E3)") time
|
||||
WRITE(fileID, "(I10)") 3
|
||||
WRITE(fileID, "(I10)") iteration
|
||||
WRITE(fileID, "(I10)") dimensions
|
||||
WRITE(fileID, "(I10)") nNodes
|
||||
|
||||
END SUBROUTINE writeGmsh2HeaderNodeData
|
||||
|
||||
!Footer
|
||||
SUBROUTINE writeGmsh2FooterNodeData(fileID)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: fileID
|
||||
|
||||
WRITE(fileID, "(A)") '$EndNodeData'
|
||||
|
||||
END SUBROUTINE writeGmsh2FooterNodeData
|
||||
|
||||
!Element data subroutines
|
||||
!Header
|
||||
SUBROUTINE writeGmsh2HeaderElementData(fileID, title, iteration, time, dimensions, nVols)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: fileID
|
||||
CHARACTER(*), INTENT(in):: title
|
||||
INTEGER, INTENT(in):: iteration, dimensions, nVols
|
||||
REAL(8), INTENT(in):: time
|
||||
|
||||
|
||||
WRITE(fileID, "(A)") '$ElementData'
|
||||
WRITE(fileID, "(I10)") 1
|
||||
WRITE(fileID, "(A1, A, A1)") '"' , title , '"'
|
||||
WRITE(fileID, "(I10)") 1
|
||||
WRITE(fileID, "(ES20.6E3)") time
|
||||
WRITE(fileID, "(I10)") 3
|
||||
WRITE(fileID, "(I10)") iteration
|
||||
WRITE(fileID, "(I10)") dimensions
|
||||
WRITE(fileID, "(I10)") nVols
|
||||
|
||||
END SUBROUTINE writeGmsh2HeaderElementData
|
||||
|
||||
!Footer
|
||||
SUBROUTINE writeGmsh2FooterElementData(fileID)
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: fileID
|
||||
|
||||
WRITE(fileID, "(A)") '$EndElementData'
|
||||
|
||||
END SUBROUTINE writeGmsh2FooterElementData
|
||||
|
||||
!Prints the scattered properties of particles into the nodes
|
||||
SUBROUTINE printOutputGmsh2(self, t)
|
||||
USE moduleMesh
|
||||
|
|
@ -24,62 +102,33 @@ MODULE moduleMeshOutputGmsh2
|
|||
fileName= 'OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh'
|
||||
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
||||
OPEN (60, file = path // folder // '/' // fileName)
|
||||
WRITE(60, "(A)") '$MeshFormat'
|
||||
WRITE(60, "(A)") '2.2 0 8'
|
||||
WRITE(60, "(A)") '$EndMeshFormat'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' density (m^-3)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) time
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) t
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
|
||||
CALL writeGmsh2HeaderMesh(60)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' density (m^-3)', t, time, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
CALL calculateOutput(self%nodes(n)%obj%output(i), output(n), self%nodes(n)%obj%v, species(i)%obj)
|
||||
WRITE(60, "(I6,ES20.6E3)") n, output(n)%density
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' velocity (m s^-1)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) time
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) t
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(60)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' velocity (m s^-1)', t, time, 3, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' pressure (Pa)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) time
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) t
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(60)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' Pressure (Pa)', t, time, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' temperature (K)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) time
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) t
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(60)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' Temperature (K)', t, time, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
CALL writeGmsh2FooterNodeData(60)
|
||||
CLOSE (60)
|
||||
|
||||
END DO
|
||||
|
|
@ -103,6 +152,7 @@ MODULE moduleMeshOutputGmsh2
|
|||
REAL(8):: time
|
||||
CHARACTER(:), ALLOCATABLE:: fileName
|
||||
CHARACTER (LEN=iterationDigits):: tstring
|
||||
CHARACTER(:), ALLOCATABLE:: title
|
||||
|
||||
SELECT TYPE(self)
|
||||
TYPE IS(meshParticles)
|
||||
|
|
@ -123,25 +173,20 @@ MODULE moduleMeshOutputGmsh2
|
|||
fileName='OUTPUT_' // tstring// '_Collisions.msh'
|
||||
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
||||
OPEN (60, file = path // folder // '/' // fileName)
|
||||
WRITE(60, "(A)") '$MeshFormat'
|
||||
WRITE(60, "(A)") '2.2 0 8'
|
||||
WRITE(60, "(A)") '$EndMeshFormat'
|
||||
|
||||
CALL writeGmsh2HeaderMesh(60)
|
||||
|
||||
DO k = 1, nCollPairs
|
||||
DO c = 1, interactionMatrix(k)%amount
|
||||
WRITE(60, "(A)") '$ElementData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(5A,I2)") '"Pair ', interactionMatrix(k)%sp_i%name, '-', interactionMatrix(k)%sp_j%name, ' collision ', c
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) time
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) t
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numVols
|
||||
WRITE(title, "(5A,I2)") '"Pair ', interactionMatrix(k)%sp_i%name, '-', interactionMatrix(k)%sp_j%name, ' collision ', c
|
||||
CALL writeGmsh2HeaderElementData(60, title, t, time, 1, self%numVols)
|
||||
DO n=1, self%numVols
|
||||
WRITE(60, "(I6,I10)") n + numEdges, self%vols(n)%obj%tallyColl(k)%tally(c)
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndElementData'
|
||||
CALL writeGmsh2FooterElementData(60)
|
||||
|
||||
END DO
|
||||
|
||||
END DO
|
||||
|
||||
CLOSE(60)
|
||||
|
|
@ -175,50 +220,26 @@ MODULE moduleMeshOutputGmsh2
|
|||
fileName='OUTPUT_' // tstring// '_EMField.msh'
|
||||
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
||||
OPEN (20, file = path // folder // '/' // fileName)
|
||||
WRITE(20, "(A)") '$MeshFormat'
|
||||
WRITE(20, "(A)") '2.2 0 8'
|
||||
WRITE(20, "(A)") '$EndMeshFormat'
|
||||
WRITE(20, "(A)") '$NodeData'
|
||||
WRITE(20, "(A)") '1'
|
||||
WRITE(20, "(A)") '"Potential (V)"'
|
||||
WRITE(20, *) 1
|
||||
WRITE(20, *) time
|
||||
WRITE(20, *) 3
|
||||
WRITE(20, *) t
|
||||
WRITE(20, *) 1
|
||||
WRITE(20, *) self%numNodes
|
||||
|
||||
CALL writeGmsh2HeaderMesh(20)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(20, 'Potential (V)', t, time, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(20, *) n, self%nodes(n)%obj%emData%phi*Volt_ref
|
||||
END DO
|
||||
WRITE(20, "(A)") '$EndNodeData'
|
||||
CALL writeGmsh2FooterNodeData(20)
|
||||
|
||||
WRITE(20, "(A)") '$ElementData'
|
||||
WRITE(20, "(A)") '1'
|
||||
WRITE(20, "(A)") '"Electric Field (V m^-1)"'
|
||||
WRITE(20, *) 1
|
||||
WRITE(20, *) time
|
||||
WRITE(20, *) 3
|
||||
WRITE(20, *) t
|
||||
WRITE(20, *) 3
|
||||
WRITE(20, *) self%numVols
|
||||
CALL writeGmsh2HeaderElementData(20, 'Electric Field (V m^-1)', t, time, 3, self%numVols)
|
||||
DO e=1, self%numVols
|
||||
WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref
|
||||
END DO
|
||||
WRITE(20, "(A)") '$EndElementData'
|
||||
CALL writeGmsh2FooterElementData(20)
|
||||
|
||||
WRITE(20, "(A)") '$NodeData'
|
||||
WRITE(20, "(A)") '1'
|
||||
WRITE(20, "(A)") '"Magnetic Field (T)"'
|
||||
WRITE(20, *) 1
|
||||
WRITE(20, *) time
|
||||
WRITE(20, *) 3
|
||||
WRITE(20, *) t
|
||||
WRITE(20, *) 3
|
||||
WRITE(20, *) self%numNodes
|
||||
CALL writeGmsh2HeaderNodeData(20, 'Magnetic Field (T)', t, time, 3, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(20, *) n, self%nodes(n)%obj%emData%B * B_ref
|
||||
END DO
|
||||
WRITE(20, "(A)") '$EndNodeData'
|
||||
CALL writeGmsh2FooterNodeData(20)
|
||||
|
||||
CLOSE(20)
|
||||
|
||||
|
|
@ -237,70 +258,62 @@ MODULE moduleMeshOutputGmsh2
|
|||
|
||||
CLASS(meshParticles), INTENT(in):: self
|
||||
INTEGER:: n, i
|
||||
TYPE(outputFormat):: output(1:self%numNodes)
|
||||
TYPE(outputFormat), DIMENSION(1:self%numNodes):: outputMean, outputDeviation
|
||||
CHARACTER(:), ALLOCATABLE:: fileName
|
||||
INTEGER:: fileMean=10, fileDeviation=20
|
||||
|
||||
DO i = 1, nSpecies
|
||||
fileName= 'Average_mean_OUTPUT_' // species(i)%obj%name // '.msh'
|
||||
fileName= 'Average_mean_' // species(i)%obj%name // '.msh'
|
||||
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
||||
OPEN (60, file = path // folder // '/' // fileName)
|
||||
WRITE(60, "(A)") '$MeshFormat'
|
||||
WRITE(60, "(A)") '2.2 0 8'
|
||||
WRITE(60, "(A)") '$EndMeshFormat'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' density (m^-3)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) 0.D0
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) 0
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
OPEN (fileMean, file = path // folder // '/' // fileName)
|
||||
|
||||
fileName= 'Average_deviation_' // species(i)%obj%name // '.msh'
|
||||
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
|
||||
OPEN (filedeviation, file = path // folder // '/' // fileName)
|
||||
|
||||
CALL writeGmsh2HeaderMesh(fileMean)
|
||||
CALL writeGmsh2HeaderMesh(fileDeviation)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' density, mean (m^-3)', 0, 0.D0, 1, self%numNodes)
|
||||
CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' density, sd (m^-3)', 0, 0.D0, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
CALL calculateOutput(averageScheme%mean(n)%output(i), output(n), self%nodes(n)%obj%v, species(i)%obj)
|
||||
WRITE(60, "(I6,ES20.6E3)") n, output(n)%density
|
||||
CALL calculateOutput(averageScheme(n)%mean%output(i), outputMean(n), self%nodes(n)%obj%v, species(i)%obj)
|
||||
WRITE(fileMean, "(I6,ES20.6E3)") n, outputMean(n)%density
|
||||
CALL calculateOutput(averageScheme(n)%deviation%output(i), outputDeviation(n), self%nodes(n)%obj%v, species(i)%obj)
|
||||
WRITE(fileDeviation, "(I6,ES20.6E3)") n, outputDeviation(n)%density
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' velocity (m s^-1)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) 0.D0
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) 0
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(fileMean)
|
||||
CALL writeGmsh2FooterNodeData(fileDeviation)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' velocity, mean (m s^-1)', 0, 0.D0, 3, self%numNodes)
|
||||
CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' velocity, sd (m s^-1)', 0, 0.D0, 3, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity
|
||||
WRITE(fileMean, "(I6,3(ES20.6E3))") n, outputMean(n)%velocity
|
||||
WRITE(fileDeviation, "(I6,3(ES20.6E3))") n, outputDeviation(n)%velocity
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' pressure (Pa)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) 0.D0
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) 0
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(fileMean)
|
||||
CALL writeGmsh2FooterNodeData(fileDeviation)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' Pressure, mean (Pa)', 0, 0.D0, 1, self%numNodes)
|
||||
CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' Pressure, sd (Pa)', 0, 0.D0, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure
|
||||
WRITE(fileMean, "(I6,3(ES20.6E3))") n, outputMean(n)%pressure
|
||||
WRITE(fileDeviation, "(I6,3(ES20.6E3))") n, outputDeviation(n)%pressure
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
WRITE(60, "(A)") '$NodeData'
|
||||
WRITE(60, "(A)") '1'
|
||||
WRITE(60, "(A)") '"' // species(i)%obj%name // ' temperature (K)"'
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) 0.D0
|
||||
WRITE(60, *) 3
|
||||
WRITE(60, *) 0
|
||||
WRITE(60, *) 1
|
||||
WRITE(60, *) self%numNodes
|
||||
CALL writeGmsh2FooterNodeData(fileMean)
|
||||
CALL writeGmsh2FooterNodeData(fileDeviation)
|
||||
|
||||
CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' Temperature, mean (K)', 0, 0.D0, 1, self%numNodes)
|
||||
CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' Temperature, sd (K)', 0, 0.D0, 1, self%numNodes)
|
||||
DO n=1, self%numNodes
|
||||
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature
|
||||
WRITE(fileMean, "(I6,3(ES20.6E3))") n, outputMean(n)%temperature
|
||||
WRITE(fileDeviation, "(I6,3(ES20.6E3))") n, outputDeviation(n)%temperature
|
||||
END DO
|
||||
WRITE(60, "(A)") '$EndNodeData'
|
||||
CLOSE (60)
|
||||
CALL writeGmsh2FooterNodeData(fileMean)
|
||||
CALL writeGmsh2FooterNodeData(fileDeviation)
|
||||
|
||||
CLOSE (fileMean)
|
||||
CLOSE(fileDeviation)
|
||||
|
||||
END DO
|
||||
|
||||
|
|
|
|||
|
|
@ -9,60 +9,63 @@ MODULE moduleAverage
|
|||
|
||||
!Generic type for average scheme
|
||||
TYPE, PUBLIC:: averageGeneric
|
||||
INTEGER:: tStart = 1 !Starting iteartion for average scheme
|
||||
TYPE(averageData), ALLOCATABLE:: mean(:)
|
||||
TYPE(averageData), ALLOCATABLE:: deviation(:)
|
||||
TYPE(averageData):: mean
|
||||
TYPE(averageData):: deviation
|
||||
CONTAINS
|
||||
PROCEDURE, PASS:: firstAverage
|
||||
PROCEDURE, PASS:: updateAverage
|
||||
|
||||
END TYPE averageGeneric
|
||||
|
||||
TYPE(averageGeneric):: averageScheme
|
||||
TYPE(averageGeneric), ALLOCATABLE:: averageScheme(:)
|
||||
|
||||
!Logical to determine if average scheme must be used
|
||||
LOGICAL:: useAverage = .FALSE.
|
||||
INTEGER:: tAverageStart = 1 !Starting iteartion for average scheme
|
||||
|
||||
CONTAINS
|
||||
!Based on Welford's online algorithm
|
||||
SUBROUTINE updateAverage(self, t)
|
||||
USE moduleMesh
|
||||
USE moduleSpecies
|
||||
PURE SUBROUTINE firstAverage(self, output)
|
||||
USE moduleOutput
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(averageGeneric), INTENT(inout):: self
|
||||
INTEGER, INTENT(in):: t
|
||||
INTEGER:: tAverage
|
||||
INTEGER:: n, s
|
||||
TYPE(averageData):: newAverage
|
||||
TYPE(outputNode), INTENT(in):: output(:)
|
||||
|
||||
tAverage = t - self%tStart
|
||||
!Copy current data as mean
|
||||
self%mean%output(:) = output(:)
|
||||
|
||||
IF (tAverage == 1) THEN
|
||||
!First iteration in which average scheme is used
|
||||
DO n = 1, mesh%numNodes
|
||||
!Copy current data as mean
|
||||
self%mean(n)%output(:) = mesh%nodes(n)%obj%output(:)
|
||||
!Set deviation at 0
|
||||
self%deviation%output(:) = 0.D0
|
||||
|
||||
END DO
|
||||
END SUBROUTINE firstAverage
|
||||
|
||||
ELSEIF (tAverage > 1) THEN
|
||||
ALLOCATE(newAverage%output(1:nSpecies))
|
||||
|
||||
!Normal average step
|
||||
DO n = 1, mesh%numNodes
|
||||
DO s = 1, nSpecies
|
||||
newAverage%output(s) = self%mean(n)%output(s) + (mesh%nodes(n)%obj%output(s) - self%mean(n)%output(s))/tAverage
|
||||
!Based on Welford's online algorithm
|
||||
SUBROUTINE updateAverage(self, output, tAverage)
|
||||
USE moduleOutput
|
||||
USE moduleSpecies, ONLY: nSpecies
|
||||
IMPLICIT NONE
|
||||
|
||||
END DO
|
||||
CLASS(averageGeneric), INTENT(inout):: self
|
||||
TYPE(outputNode), INTENT(in):: output(:)
|
||||
INTEGER, INTENT(in):: tAverage
|
||||
TYPE(averageData):: newMean, newDeviation
|
||||
|
||||
self%mean(n)%output(:) = newAverage%output(:)
|
||||
ALLOCATE(newMean%output(1:nSpecies))
|
||||
ALLOCATE(newDeviation%output(1:nSpecies))
|
||||
|
||||
END DO
|
||||
newMean%output(:) = self%mean%output(:) + (output(:) - self%mean%output(:))/tAverage
|
||||
|
||||
DEALLOCATE(newAverage%output)
|
||||
newDeviation%output(:) = self%deviation%output(:) + ((output(:) - self%mean%output(:)) * &
|
||||
(output(:) - newMean%output(:)) - &
|
||||
self%deviation%output(:))/tAverage
|
||||
|
||||
END IF
|
||||
self%mean%output(:) = newMean%output(:)
|
||||
|
||||
self%deviation%output(:) = newDeviation%output(:)
|
||||
|
||||
DEALLOCATE(newMean%output)
|
||||
DEALLOCATE(newDeviation%output)
|
||||
|
||||
END SUBROUTINE updateAverage
|
||||
|
||||
|
|
|
|||
|
|
@ -1203,12 +1203,15 @@ MODULE moduleInput
|
|||
CALL config%get('average.startTime', tStart, found)
|
||||
|
||||
IF (found) THEN
|
||||
averageScheme%tStart = INT(tStart / tauMin)
|
||||
tAverageStart = INT(tStart / tauMin)
|
||||
|
||||
END IF
|
||||
ALLOCATE(averageScheme%mean(1:mesh%numNodes))
|
||||
|
||||
ALLOCATE(averageScheme(1:mesh%numNodes))
|
||||
|
||||
DO n = 1, mesh%numNodes
|
||||
ALLOCATE(averageScheme%mean(n)%output(1:nSpecies))
|
||||
ALLOCATE(averageScheme(n)%mean%output(1:nSpecies))
|
||||
ALLOCATE(averageScheme(n)%deviation%output(1:nSpecies))
|
||||
|
||||
END DO
|
||||
|
||||
|
|
|
|||
|
|
@ -6,14 +6,17 @@ MODULE moduleOutput
|
|||
TYPE, PUBLIC:: outputNode
|
||||
REAL(8):: den = 0.D0, mom(1:3) = 0.D0, tensorS(1:3,1:3) = 0.D0
|
||||
CONTAINS
|
||||
PROCEDURE, PASS(self), PRIVATE:: copyOutputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: addOutputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: subOutputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: divOutputNode_int
|
||||
GENERIC, PUBLIC :: ASSIGNMENT(=) => copyOutputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(+) => addOutputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(-) => subOutputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(/) => divOutputNode_int
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_equal_outputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_equal_real
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_add_outputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_sub_outputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_mul_outputNode
|
||||
PROCEDURE, PASS(self), PRIVATE:: outputNode_div_int
|
||||
GENERIC, PUBLIC :: ASSIGNMENT(=) => outputNode_equal_outputNode, outputNode_equal_real
|
||||
GENERIC, PUBLIC :: OPERATOR(+) => outputNode_add_outputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(-) => outputNode_sub_outputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(*) => outputNode_mul_outputNode
|
||||
GENERIC, PUBLIC :: OPERATOR(/) => outputNode_div_int
|
||||
|
||||
END TYPE
|
||||
|
||||
|
|
@ -42,7 +45,7 @@ MODULE moduleOutput
|
|||
LOGICAL:: emOutput = .FALSE.
|
||||
|
||||
CONTAINS
|
||||
PURE SUBROUTINE copyOutputNode(self, from)
|
||||
PURE SUBROUTINE outputNode_equal_outputNode(self, from)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(inout):: self
|
||||
|
|
@ -52,9 +55,21 @@ MODULE moduleOutput
|
|||
self%mom = from%mom
|
||||
self%tensorS = from%tensorS
|
||||
|
||||
END SUBROUTINE copyOutputNode
|
||||
END SUBROUTINE outputNode_equal_outputNode
|
||||
|
||||
PURE FUNCTION addOutputNode(self, that) RESULT(total)
|
||||
PURE ELEMENTAL SUBROUTINE outputNode_equal_real(self, from)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(inout):: self
|
||||
REAL(8), INTENT(in):: from
|
||||
|
||||
self%den = from
|
||||
self%mom = from
|
||||
self%tensorS = from
|
||||
|
||||
END SUBROUTINE outputNode_equal_real
|
||||
|
||||
PURE ELEMENTAL FUNCTION outputNode_add_outputNode(self, that) RESULT(total)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(in):: self
|
||||
|
|
@ -65,9 +80,9 @@ MODULE moduleOutput
|
|||
total%mom = self%mom + that%mom
|
||||
total%tensorS = self%tensorS + that%tensorS
|
||||
|
||||
END FUNCTION addOutputNode
|
||||
END FUNCTION outputNode_add_outputNode
|
||||
|
||||
PURE FUNCTION subOutputNode(self, that) RESULT(total)
|
||||
PURE ELEMENTAL FUNCTION outputNode_sub_outputNode(self, that) RESULT(total)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(in):: self
|
||||
|
|
@ -78,9 +93,22 @@ MODULE moduleOutput
|
|||
total%mom = self%mom - that%mom
|
||||
total%tensorS = self%tensorS - that%tensorS
|
||||
|
||||
END FUNCTION subOutputNode
|
||||
END FUNCTION outputNode_sub_outputNode
|
||||
|
||||
PURE FUNCTION divOutputNode_int(self, that) RESULT(total)
|
||||
PURE ELEMENTAL FUNCTION outputNode_mul_outputNode(self, that) RESULT(total)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(in):: self
|
||||
CLASS(outputNode), INTENT(in):: that
|
||||
TYPE(outputNode):: total
|
||||
|
||||
total%den = self%den * that%den
|
||||
total%mom = self%mom * that%mom
|
||||
total%tensorS = self%tensorS * that%tensorS
|
||||
|
||||
END FUNCTION outputNode_mul_outputNode
|
||||
|
||||
PURE ELEMENTAL FUNCTION outputNode_div_int(self, that) RESULT(total)
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(outputNode), INTENT(in):: self
|
||||
|
|
@ -91,7 +119,7 @@ MODULE moduleOutput
|
|||
total%mom = self%mom / REAL(that)
|
||||
total%tensorS = self%tensorS / REAL(that)
|
||||
|
||||
END FUNCTION divOutputNode_int
|
||||
END FUNCTION outputNode_div_int
|
||||
|
||||
SUBROUTINE calculateOutput(rawValues, formatValues, nodeVol, speciesIn)
|
||||
USE moduleConstParam
|
||||
|
|
|
|||
|
|
@ -828,12 +828,29 @@ MODULE moduleSolver
|
|||
|
||||
SUBROUTINE doAverage(t)
|
||||
USE moduleAverage
|
||||
USE moduleMesh
|
||||
IMPLICIT NONE
|
||||
|
||||
INTEGER, INTENT(in):: t
|
||||
INTEGER:: tAverage, n
|
||||
|
||||
|
||||
IF (useAverage) THEN
|
||||
CALL averageScheme%updateAverage(t)
|
||||
tAverage = t - tAverageStart
|
||||
|
||||
IF (tAverage == 1) THEN
|
||||
!First iteration in which average scheme is used
|
||||
DO n = 1, mesh%numNodes
|
||||
CALL averageScheme(n)%firstAverage(mesh%nodes(n)%obj%output)
|
||||
|
||||
END DO
|
||||
ELSEIF (tAverage > 1) THEN
|
||||
DO n = 1, mesh%numNodes
|
||||
CALL averageScheme(n)%updateAverage(mesh%nodes(n)%obj%output, tAverage)
|
||||
|
||||
END DO
|
||||
|
||||
END IF
|
||||
|
||||
END IF
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue