From 5509332980ff6bcdb2e23325eafbda3ef895b415 Mon Sep 17 00:00:00 2001 From: Jorge Gonzalez Date: Thu, 15 Dec 2022 11:40:24 +0100 Subject: [PATCH] Output of standard deviation The output for the standard deviation (still Gmsh2 only) was added. Change in the output routines to reduce code repetition. --- src/modules/makefile | 2 +- .../inout/gmsh2/moduleMeshOutputGmsh2.f90 | 295 +++++++++--------- src/modules/moduleAverage.f90 | 63 ++-- src/modules/moduleInput.f90 | 9 +- src/modules/moduleOutput.f90 | 60 +++- src/modules/moduleSolver.f90 | 19 +- 6 files changed, 256 insertions(+), 192 deletions(-) diff --git a/src/modules/makefile b/src/modules/makefile index d3931f4..f1545dc 100644 --- a/src/modules/makefile +++ b/src/modules/makefile @@ -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 diff --git a/src/modules/mesh/inout/gmsh2/moduleMeshOutputGmsh2.f90 b/src/modules/mesh/inout/gmsh2/moduleMeshOutputGmsh2.f90 index 106480a..2dcb7f6 100644 --- a/src/modules/mesh/inout/gmsh2/moduleMeshOutputGmsh2.f90 +++ b/src/modules/mesh/inout/gmsh2/moduleMeshOutputGmsh2.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 diff --git a/src/modules/moduleAverage.f90 b/src/modules/moduleAverage.f90 index bbea577..8d705d5 100644 --- a/src/modules/moduleAverage.f90 +++ b/src/modules/moduleAverage.f90 @@ -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 diff --git a/src/modules/moduleInput.f90 b/src/modules/moduleInput.f90 index 3463f9e..348edf3 100644 --- a/src/modules/moduleInput.f90 +++ b/src/modules/moduleInput.f90 @@ -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 diff --git a/src/modules/moduleOutput.f90 b/src/modules/moduleOutput.f90 index 9cb23a7..18fbb7f 100644 --- a/src/modules/moduleOutput.f90 +++ b/src/modules/moduleOutput.f90 @@ -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 diff --git a/src/modules/moduleSolver.f90 b/src/modules/moduleSolver.f90 index 4d0ec0d..be78420 100644 --- a/src/modules/moduleSolver.f90 +++ b/src/modules/moduleSolver.f90 @@ -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