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:
Jorge Gonzalez 2022-12-15 11:40:24 +01:00
commit 5509332980
6 changed files with 256 additions and 192 deletions

View file

@ -7,7 +7,7 @@ OBJS = moduleCaseParam.o moduleCompTime.o moduleList.o \
all: $(OBJS) all: $(OBJS)
mesh.o: moduleCollisions.o moduleBoundary.o mesh.o: moduleCollisions.o moduleBoundary.o moduleAverage.o
$(MAKE) -C mesh all $(MAKE) -C mesh all
moduleCollisions.o: moduleList.o moduleMath.o moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90 moduleCollisions.o: moduleList.o moduleMath.o moduleRandom.o moduleTable.o moduleSpecies.o moduleRefParam.o moduleConstParam.o moduleCollisions.f90

View file

@ -1,6 +1,84 @@
MODULE moduleMeshOutputGmsh2 MODULE moduleMeshOutputGmsh2
CONTAINS 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 !Prints the scattered properties of particles into the nodes
SUBROUTINE printOutputGmsh2(self, t) SUBROUTINE printOutputGmsh2(self, t)
USE moduleMesh USE moduleMesh
@ -24,62 +102,33 @@ MODULE moduleMeshOutputGmsh2
fileName= 'OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh' fileName= 'OUTPUT_' // tstring// '_' // species(i)%obj%name // '.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
OPEN (60, file = path // folder // '/' // fileName) OPEN (60, file = path // folder // '/' // fileName)
WRITE(60, "(A)") '$MeshFormat'
WRITE(60, "(A)") '2.2 0 8' CALL writeGmsh2HeaderMesh(60)
WRITE(60, "(A)") '$EndMeshFormat'
WRITE(60, "(A)") '$NodeData' CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' density (m^-3)', t, time, 1, self%numNodes)
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
DO n=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) 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 WRITE(60, "(I6,ES20.6E3)") n, output(n)%density
END DO END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(60)
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1' CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' velocity (m s^-1)', t, time, 3, self%numNodes)
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
DO n=1, self%numNodes DO n=1, self%numNodes
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%velocity
END DO END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(60)
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1' CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' Pressure (Pa)', t, time, 1, self%numNodes)
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
DO n=1, self%numNodes DO n=1, self%numNodes
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%pressure
END DO END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(60)
WRITE(60, "(A)") '$NodeData'
WRITE(60, "(A)") '1' CALL writeGmsh2HeaderNodeData(60, species(i)%obj%name // ' Temperature (K)', t, time, 1, self%numNodes)
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
DO n=1, self%numNodes DO n=1, self%numNodes
WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature WRITE(60, "(I6,3(ES20.6E3))") n, output(n)%temperature
END DO END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(60)
CLOSE (60) CLOSE (60)
END DO END DO
@ -103,6 +152,7 @@ MODULE moduleMeshOutputGmsh2
REAL(8):: time REAL(8):: time
CHARACTER(:), ALLOCATABLE:: fileName CHARACTER(:), ALLOCATABLE:: fileName
CHARACTER (LEN=iterationDigits):: tstring CHARACTER (LEN=iterationDigits):: tstring
CHARACTER(:), ALLOCATABLE:: title
SELECT TYPE(self) SELECT TYPE(self)
TYPE IS(meshParticles) TYPE IS(meshParticles)
@ -123,25 +173,20 @@ MODULE moduleMeshOutputGmsh2
fileName='OUTPUT_' // tstring// '_Collisions.msh' fileName='OUTPUT_' // tstring// '_Collisions.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
OPEN (60, file = path // folder // '/' // fileName) OPEN (60, file = path // folder // '/' // fileName)
WRITE(60, "(A)") '$MeshFormat'
WRITE(60, "(A)") '2.2 0 8' CALL writeGmsh2HeaderMesh(60)
WRITE(60, "(A)") '$EndMeshFormat'
DO k = 1, nCollPairs DO k = 1, nCollPairs
DO c = 1, interactionMatrix(k)%amount DO c = 1, interactionMatrix(k)%amount
WRITE(60, "(A)") '$ElementData' WRITE(title, "(5A,I2)") '"Pair ', interactionMatrix(k)%sp_i%name, '-', interactionMatrix(k)%sp_j%name, ' collision ', c
WRITE(60, "(A)") '1' CALL writeGmsh2HeaderElementData(60, title, t, time, 1, self%numVols)
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
DO n=1, self%numVols DO n=1, self%numVols
WRITE(60, "(I6,I10)") n + numEdges, self%vols(n)%obj%tallyColl(k)%tally(c) WRITE(60, "(I6,I10)") n + numEdges, self%vols(n)%obj%tallyColl(k)%tally(c)
END DO END DO
WRITE(60, "(A)") '$EndElementData' CALL writeGmsh2FooterElementData(60)
END DO END DO
END DO END DO
CLOSE(60) CLOSE(60)
@ -175,50 +220,26 @@ MODULE moduleMeshOutputGmsh2
fileName='OUTPUT_' // tstring// '_EMField.msh' fileName='OUTPUT_' // tstring// '_EMField.msh'
WRITE(*, "(6X,A15,A)") "Creating file: ", fileName WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
OPEN (20, file = path // folder // '/' // fileName) OPEN (20, file = path // folder // '/' // fileName)
WRITE(20, "(A)") '$MeshFormat'
WRITE(20, "(A)") '2.2 0 8' CALL writeGmsh2HeaderMesh(20)
WRITE(20, "(A)") '$EndMeshFormat'
WRITE(20, "(A)") '$NodeData' CALL writeGmsh2HeaderNodeData(20, 'Potential (V)', t, time, 1, self%numNodes)
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
DO n=1, self%numNodes DO n=1, self%numNodes
WRITE(20, *) n, self%nodes(n)%obj%emData%phi*Volt_ref WRITE(20, *) n, self%nodes(n)%obj%emData%phi*Volt_ref
END DO END DO
WRITE(20, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(20)
WRITE(20, "(A)") '$ElementData' CALL writeGmsh2HeaderElementData(20, 'Electric Field (V m^-1)', t, time, 3, self%numVols)
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
DO e=1, self%numVols DO e=1, self%numVols
WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref WRITE(20, *) e+self%numEdges, self%vols(e)%obj%gatherEF(xi)*EF_ref
END DO END DO
WRITE(20, "(A)") '$EndElementData' CALL writeGmsh2FooterElementData(20)
WRITE(20, "(A)") '$NodeData' CALL writeGmsh2HeaderNodeData(20, 'Magnetic Field (T)', t, time, 3, self%numNodes)
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
DO n=1, self%numNodes DO n=1, self%numNodes
WRITE(20, *) n, self%nodes(n)%obj%emData%B * B_ref WRITE(20, *) n, self%nodes(n)%obj%emData%B * B_ref
END DO END DO
WRITE(20, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(20)
CLOSE(20) CLOSE(20)
@ -237,70 +258,62 @@ MODULE moduleMeshOutputGmsh2
CLASS(meshParticles), INTENT(in):: self CLASS(meshParticles), INTENT(in):: self
INTEGER:: n, i INTEGER:: n, i
TYPE(outputFormat):: output(1:self%numNodes) TYPE(outputFormat), DIMENSION(1:self%numNodes):: outputMean, outputDeviation
CHARACTER(:), ALLOCATABLE:: fileName CHARACTER(:), ALLOCATABLE:: fileName
INTEGER:: fileMean=10, fileDeviation=20
DO i = 1, nSpecies 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 WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
OPEN (60, file = path // folder // '/' // fileName) OPEN (fileMean, file = path // folder // '/' // fileName)
WRITE(60, "(A)") '$MeshFormat'
WRITE(60, "(A)") '2.2 0 8' fileName= 'Average_deviation_' // species(i)%obj%name // '.msh'
WRITE(60, "(A)") '$EndMeshFormat' WRITE(*, "(6X,A15,A)") "Creating file: ", fileName
WRITE(60, "(A)") '$NodeData' OPEN (filedeviation, file = path // folder // '/' // fileName)
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"' // species(i)%obj%name // ' density (m^-3)"' CALL writeGmsh2HeaderMesh(fileMean)
WRITE(60, *) 1 CALL writeGmsh2HeaderMesh(fileDeviation)
WRITE(60, *) 0.D0
WRITE(60, *) 3 CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' density, mean (m^-3)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 0 CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' density, sd (m^-3)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 1
WRITE(60, *) self%numNodes
DO n=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) CALL calculateOutput(averageScheme(n)%mean%output(i), outputMean(n), self%nodes(n)%obj%v, species(i)%obj)
WRITE(60, "(I6,ES20.6E3)") n, output(n)%density 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 END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(fileMean)
WRITE(60, "(A)") '$NodeData' CALL writeGmsh2FooterNodeData(fileDeviation)
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"' // species(i)%obj%name // ' velocity (m s^-1)"' CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' velocity, mean (m s^-1)', 0, 0.D0, 3, self%numNodes)
WRITE(60, *) 1 CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' velocity, sd (m s^-1)', 0, 0.D0, 3, self%numNodes)
WRITE(60, *) 0.D0
WRITE(60, *) 3
WRITE(60, *) 0
WRITE(60, *) 3
WRITE(60, *) self%numNodes
DO n=1, 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 END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(fileMean)
WRITE(60, "(A)") '$NodeData' CALL writeGmsh2FooterNodeData(fileDeviation)
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"' // species(i)%obj%name // ' pressure (Pa)"' CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' Pressure, mean (Pa)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 1 CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' Pressure, sd (Pa)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 0.D0
WRITE(60, *) 3
WRITE(60, *) 0
WRITE(60, *) 1
WRITE(60, *) self%numNodes
DO n=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 END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(fileMean)
WRITE(60, "(A)") '$NodeData' CALL writeGmsh2FooterNodeData(fileDeviation)
WRITE(60, "(A)") '1'
WRITE(60, "(A)") '"' // species(i)%obj%name // ' temperature (K)"' CALL writeGmsh2HeaderNodeData(fileMean, species(i)%obj%name // ' Temperature, mean (K)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 1 CALL writeGmsh2HeaderNodeData(fileDeviation, species(i)%obj%name // ' Temperature, sd (K)', 0, 0.D0, 1, self%numNodes)
WRITE(60, *) 0.D0
WRITE(60, *) 3
WRITE(60, *) 0
WRITE(60, *) 1
WRITE(60, *) self%numNodes
DO n=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 END DO
WRITE(60, "(A)") '$EndNodeData' CALL writeGmsh2FooterNodeData(fileMean)
CLOSE (60) CALL writeGmsh2FooterNodeData(fileDeviation)
CLOSE (fileMean)
CLOSE(fileDeviation)
END DO END DO

View file

@ -9,60 +9,63 @@ MODULE moduleAverage
!Generic type for average scheme !Generic type for average scheme
TYPE, PUBLIC:: averageGeneric TYPE, PUBLIC:: averageGeneric
INTEGER:: tStart = 1 !Starting iteartion for average scheme TYPE(averageData):: mean
TYPE(averageData), ALLOCATABLE:: mean(:) TYPE(averageData):: deviation
TYPE(averageData), ALLOCATABLE:: deviation(:)
CONTAINS CONTAINS
PROCEDURE, PASS:: firstAverage
PROCEDURE, PASS:: updateAverage PROCEDURE, PASS:: updateAverage
END TYPE averageGeneric END TYPE averageGeneric
TYPE(averageGeneric):: averageScheme TYPE(averageGeneric), ALLOCATABLE:: averageScheme(:)
!Logical to determine if average scheme must be used !Logical to determine if average scheme must be used
LOGICAL:: useAverage = .FALSE. LOGICAL:: useAverage = .FALSE.
INTEGER:: tAverageStart = 1 !Starting iteartion for average scheme
CONTAINS CONTAINS
!Based on Welford's online algorithm PURE SUBROUTINE firstAverage(self, output)
SUBROUTINE updateAverage(self, t)
USE moduleMesh
USE moduleSpecies
USE moduleOutput USE moduleOutput
IMPLICIT NONE IMPLICIT NONE
CLASS(averageGeneric), INTENT(inout):: self CLASS(averageGeneric), INTENT(inout):: self
INTEGER, INTENT(in):: t TYPE(outputNode), INTENT(in):: output(:)
INTEGER:: tAverage
INTEGER:: n, s
TYPE(averageData):: newAverage
tAverage = t - self%tStart !Copy current data as mean
self%mean%output(:) = output(:)
IF (tAverage == 1) THEN !Set deviation at 0
!First iteration in which average scheme is used self%deviation%output(:) = 0.D0
DO n = 1, mesh%numNodes
!Copy current data as mean
self%mean(n)%output(:) = mesh%nodes(n)%obj%output(:)
END DO END SUBROUTINE firstAverage
ELSEIF (tAverage > 1) THEN
ALLOCATE(newAverage%output(1:nSpecies))
!Normal average step !Based on Welford's online algorithm
DO n = 1, mesh%numNodes SUBROUTINE updateAverage(self, output, tAverage)
DO s = 1, nSpecies USE moduleOutput
newAverage%output(s) = self%mean(n)%output(s) + (mesh%nodes(n)%obj%output(s) - self%mean(n)%output(s))/tAverage 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 END SUBROUTINE updateAverage

View file

@ -1203,12 +1203,15 @@ MODULE moduleInput
CALL config%get('average.startTime', tStart, found) CALL config%get('average.startTime', tStart, found)
IF (found) THEN IF (found) THEN
averageScheme%tStart = INT(tStart / tauMin) tAverageStart = INT(tStart / tauMin)
END IF END IF
ALLOCATE(averageScheme%mean(1:mesh%numNodes))
ALLOCATE(averageScheme(1:mesh%numNodes))
DO n = 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 END DO

View file

@ -6,14 +6,17 @@ MODULE moduleOutput
TYPE, PUBLIC:: outputNode TYPE, PUBLIC:: outputNode
REAL(8):: den = 0.D0, mom(1:3) = 0.D0, tensorS(1:3,1:3) = 0.D0 REAL(8):: den = 0.D0, mom(1:3) = 0.D0, tensorS(1:3,1:3) = 0.D0
CONTAINS CONTAINS
PROCEDURE, PASS(self), PRIVATE:: copyOutputNode PROCEDURE, PASS(self), PRIVATE:: outputNode_equal_outputNode
PROCEDURE, PASS(self), PRIVATE:: addOutputNode PROCEDURE, PASS(self), PRIVATE:: outputNode_equal_real
PROCEDURE, PASS(self), PRIVATE:: subOutputNode PROCEDURE, PASS(self), PRIVATE:: outputNode_add_outputNode
PROCEDURE, PASS(self), PRIVATE:: divOutputNode_int PROCEDURE, PASS(self), PRIVATE:: outputNode_sub_outputNode
GENERIC, PUBLIC :: ASSIGNMENT(=) => copyOutputNode PROCEDURE, PASS(self), PRIVATE:: outputNode_mul_outputNode
GENERIC, PUBLIC :: OPERATOR(+) => addOutputNode PROCEDURE, PASS(self), PRIVATE:: outputNode_div_int
GENERIC, PUBLIC :: OPERATOR(-) => subOutputNode GENERIC, PUBLIC :: ASSIGNMENT(=) => outputNode_equal_outputNode, outputNode_equal_real
GENERIC, PUBLIC :: OPERATOR(/) => divOutputNode_int 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 END TYPE
@ -42,7 +45,7 @@ MODULE moduleOutput
LOGICAL:: emOutput = .FALSE. LOGICAL:: emOutput = .FALSE.
CONTAINS CONTAINS
PURE SUBROUTINE copyOutputNode(self, from) PURE SUBROUTINE outputNode_equal_outputNode(self, from)
IMPLICIT NONE IMPLICIT NONE
CLASS(outputNode), INTENT(inout):: self CLASS(outputNode), INTENT(inout):: self
@ -52,9 +55,21 @@ MODULE moduleOutput
self%mom = from%mom self%mom = from%mom
self%tensorS = from%tensorS 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 IMPLICIT NONE
CLASS(outputNode), INTENT(in):: self CLASS(outputNode), INTENT(in):: self
@ -65,9 +80,9 @@ MODULE moduleOutput
total%mom = self%mom + that%mom total%mom = self%mom + that%mom
total%tensorS = self%tensorS + that%tensorS 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 IMPLICIT NONE
CLASS(outputNode), INTENT(in):: self CLASS(outputNode), INTENT(in):: self
@ -78,9 +93,22 @@ MODULE moduleOutput
total%mom = self%mom - that%mom total%mom = self%mom - that%mom
total%tensorS = self%tensorS - that%tensorS 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 IMPLICIT NONE
CLASS(outputNode), INTENT(in):: self CLASS(outputNode), INTENT(in):: self
@ -91,7 +119,7 @@ MODULE moduleOutput
total%mom = self%mom / REAL(that) total%mom = self%mom / REAL(that)
total%tensorS = self%tensorS / REAL(that) total%tensorS = self%tensorS / REAL(that)
END FUNCTION divOutputNode_int END FUNCTION outputNode_div_int
SUBROUTINE calculateOutput(rawValues, formatValues, nodeVol, speciesIn) SUBROUTINE calculateOutput(rawValues, formatValues, nodeVol, speciesIn)
USE moduleConstParam USE moduleConstParam

View file

@ -828,12 +828,29 @@ MODULE moduleSolver
SUBROUTINE doAverage(t) SUBROUTINE doAverage(t)
USE moduleAverage USE moduleAverage
USE moduleMesh
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
INTEGER:: tAverage, n
IF (useAverage) THEN 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 END IF