Modification to Probes to use all particles

Now, probes check all particles in the domain.
This is done only when probes are outputed to save CPU time.
However, still some issues and distribution functions are not properly
being calculated.
This commit is contained in:
Jorge Gonzalez 2021-10-18 16:00:28 +02:00
commit e683c66ff8
4 changed files with 132 additions and 83 deletions

View file

@ -55,6 +55,9 @@ PROGRAM fpakc
!Checks if a species needs to me moved in this iteration !Checks if a species needs to me moved in this iteration
CALL solver%updatePushSpecies(t) CALL solver%updatePushSpecies(t)
!Checks if probes need to be calculated this iteration
CALL resetProbes(t)
tPush = omp_get_wtime() tPush = omp_get_wtime()
!$OMP END SINGLE !$OMP END SINGLE
@ -85,9 +88,6 @@ PROGRAM fpakc
!$OMP SINGLE !$OMP SINGLE
tCoul = omp_get_wTime() - tCoul tCoul = omp_get_wTime() - tCoul
!Do probing
CALL doProbes(t)
!Reset particles !Reset particles
tReset = omp_get_wtime() tReset = omp_get_wtime()
!$OMP END SINGLE !$OMP END SINGLE

View file

@ -22,7 +22,7 @@ moduleInject.o: moduleRandom.o moduleSpecies.o moduleSolver.o moduleInject.f90
moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90 moduleList.o: moduleSpecies.o moduleErrors.o moduleList.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleOutput.o: moduleMath.o moduleSpecies.o moduleRefParam.o moduleOutput.f90 moduleOutput.o: moduleMath.o moduleSpecies.o moduleRefParam.o moduleProbe.o moduleOutput.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleRandom.o: moduleConstParam.o moduleRandom.f90 moduleRandom.o: moduleConstParam.o moduleRandom.f90
@ -34,7 +34,7 @@ moduleRefParam.o: moduleConstParam.o moduleRefParam.f90
moduleSpecies.o: moduleErrors.o moduleCaseParam.o moduleSpecies.f90 moduleSpecies.o: moduleErrors.o moduleCaseParam.o moduleSpecies.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleSolver.o: mesh.o moduleList.o moduleEM.o moduleSpecies.o moduleRefParam.o moduleOutput.o moduleSolver.f90 moduleSolver.o: mesh.o moduleList.o moduleEM.o moduleSpecies.o moduleRefParam.o moduleProbe.o moduleOutput.o moduleSolver.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleTable.o: moduleErrors.o moduleTable.f90 moduleTable.o: moduleErrors.o moduleTable.f90

View file

@ -1,11 +1,9 @@
MODULE moduleProbe MODULE moduleProbe
USE moduleMesh
USE moduleSpecies USE moduleSpecies
TYPE:: probeDistFunc TYPE:: probeDistFunc
INTEGER:: id INTEGER:: id
REAL(8), DIMENSION(1:3):: r REAL(8), DIMENSION(1:3):: r
CLASS(meshVol), POINTER:: cell
CLASS(speciesGeneric), POINTER:: species CLASS(speciesGeneric), POINTER:: species
REAL(8), ALLOCATABLE, DIMENSION(:):: vi, vj, vk REAL(8), ALLOCATABLE, DIMENSION(:):: vi, vj, vk
REAL(8), ALLOCATABLE, DIMENSION(:,:,:):: f REAL(8), ALLOCATABLE, DIMENSION(:,:,:):: f
@ -13,6 +11,9 @@ MODULE moduleProbe
REAL(8), DIMENSION(1:3):: vrange REAL(8), DIMENSION(1:3):: vrange
REAL(8):: dvInv REAL(8):: dvInv
INTEGER:: every INTEGER:: every
LOGICAL:: update
INTEGER(KIND=OMP_LOCK_KIND):: lock
REAL(8):: maxR
CONTAINS CONTAINS
PROCEDURE, PASS:: init PROCEDURE, PASS:: init
PROCEDURE, PASS:: findLowerIndex PROCEDURE, PASS:: findLowerIndex
@ -41,7 +42,7 @@ MODULE moduleProbe
REAL(8), INTENT(in):: v1(1:2), v2(1:2), v3(1:2) REAL(8), INTENT(in):: v1(1:2), v2(1:2), v3(1:2)
INTEGER, INTENT(in):: points(1:3) INTEGER, INTENT(in):: points(1:3)
REAL(8), INTENT(in):: timeStep REAL(8), INTENT(in):: timeStep
INTEGER:: sp, e, i INTEGER:: sp, i
REAL(8):: dv(1:3) REAL(8):: dv(1:3)
!Assign id !Assign id
@ -53,9 +54,6 @@ MODULE moduleProbe
!Find cell !Find cell
self%r = r/L_ref self%r = r/L_ref
e = findCellBrute(mesh, self%r)
IF (e == 0) CALL criticalError("No cell found for position in probe", 'init')
self%cell => mesh%vols(e)%obj
!Allocates velocity grid !Allocates velocity grid
self%nv = points self%nv = points
@ -94,6 +92,13 @@ MODULE moduleProbe
!Number of iterations between output !Number of iterations between output
self%every = NINT(timeStep/ tauMin / ti_ref) self%every = NINT(timeStep/ tauMin / ti_ref)
!Maximum radius
!TODO: Make this an input parameter
self%maxR = 1.D-1/L_ref
!Init the probe lock
CALL OMP_INIT_LOCK(self%lock)
END SUBROUTINE init END SUBROUTINE init
@ -114,32 +119,28 @@ MODULE moduleProbe
END SUBROUTINE findLowerIndex END SUBROUTINE findLowerIndex
SUBROUTINE calculate(self) SUBROUTINE calculate(self, part)
USE moduleSpecies USE moduleSpecies
USE moduleList USE moduleList
IMPLICIT NONE IMPLICIT NONE
CLASS(probeDistFunc), INTENT(inout):: self CLASS(probeDistFunc), INTENT(inout):: self
TYPE(particle), POINTER:: part TYPE(particle), INTENT(in):: part
TYPE(lNode), POINTER:: node REAL(8):: deltaR
INTEGER:: i, j, k INTEGER:: i, j, k
LOGICAL:: inside LOGICAL:: inside
REAL(8):: weight
REAL(8):: fi, fi1 REAL(8):: fi, fi1
REAL(8):: fj, fj1 REAL(8):: fj, fj1
REAL(8):: fk, fk1 REAL(8):: fk, fk1
!Reset distribution function !If particle is of desired type, include in the distribution function
self%f = 0.D0 IF (part%species%n == self%species%n) THEN
!Calculate distance between particle and probe
deltaR = NORM2(self%r - part%r)
!Loop over particles in cell !Only include particle if it is inside the maximum radius
node => self%cell%listPart_in%head IF (deltaR < self%maxR) THEN
DO WHILE(ASSOCIATED(node))
!Selects particle on list
part => node%part
!If particle is of desired type, include in the distribution function
IF (part%species%n == self%species%n) THEN
!find lower index for all dimensions !find lower index for all dimensions
CALL self%findLowerIndex(part%v, i, j, k, inside) CALL self%findLowerIndex(part%v, i, j, k, inside)
@ -153,28 +154,31 @@ MODULE moduleProbe
fk = self%vk(k+1) - part%v(3) fk = self%vk(k+1) - part%v(3)
fk1 = part%v(3) - self%vk(k) fk1 = part%v(3) - self%vk(k)
! weight = part%weight * DEXP(deltaR/self%maxR)
weight = part%weight
!Lock the probe
CALL OMP_SET_LOCK(self%lock)
!Assign particle weight to distribution function !Assign particle weight to distribution function
self%f(i , j , k ) = fi * fj * fk * part%weight self%f(i , j , k ) = fi * fj * fk * weight
self%f(i+1, j , k ) = fi1 * fj * fk * part%weight self%f(i+1, j , k ) = fi1 * fj * fk * weight
self%f(i , j+1, k ) = fi * fj1 * fk * part%weight self%f(i , j+1, k ) = fi * fj1 * fk * weight
self%f(i+1, j+1, k ) = fi1 * fj1 * fk * part%weight self%f(i+1, j+1, k ) = fi1 * fj1 * fk * weight
self%f(i , j , k+1) = fi * fj * fk1 * part%weight self%f(i , j , k+1) = fi * fj * fk1 * weight
self%f(i+1, j , k+1) = fi1 * fj * fk1 * part%weight self%f(i+1, j , k+1) = fi1 * fj * fk1 * weight
self%f(i , j+1, k+1) = fi * fj1 * fk1 * part%weight self%f(i , j+1, k+1) = fi * fj1 * fk1 * weight
self%f(i+1, j+1, k+1) = fi1 * fj1 * fk1 * part%weight self%f(i+1, j+1, k+1) = fi1 * fj1 * fk1 * weight
!Unlock the probe
CALL OMP_UNSET_LOCK(self%lock)
END IF END IF
END IF END IF
!Move to next particle in the list END IF
node => node%next
END DO
!Divide by the velocity cube volume
self%f = self%f * self%dvInv
END SUBROUTINE calculate END SUBROUTINE calculate
SUBROUTINE output(self, t) SUBROUTINE output(self, t)
@ -182,13 +186,16 @@ MODULE moduleProbe
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
CLASS(probeDistFunc), INTENT(in):: self CLASS(probeDistFunc), INTENT(inout):: self
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
CHARACTER (LEN=iterationDigits):: tstring CHARACTER (LEN=iterationDigits):: tstring
CHARACTER (LEN=3):: pstring CHARACTER (LEN=3):: pstring
CHARACTER(:), ALLOCATABLE:: filename CHARACTER(:), ALLOCATABLE:: filename
INTEGER:: i, j, k INTEGER:: i, j, k
!Divide by the velocity cube volume
self%f = self%f * self%dvInv
WRITE(tstring, iterationFormat) t WRITE(tstring, iterationFormat) t
WRITE(pstring, "(I3.3)") self%id WRITE(pstring, "(I3.3)") self%id
fileName='OUTPUT_' // tstring// '_f_' // pstring // '.dat' fileName='OUTPUT_' // tstring// '_f_' // pstring // '.dat'
@ -215,18 +222,21 @@ MODULE moduleProbe
CLOSE(10) CLOSE(10)
!Reset distribution function
self%f = 0.D0
END SUBROUTINE output END SUBROUTINE output
SUBROUTINE doProbes(t) SUBROUTINE doProbes(part)
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(in):: t TYPE(particle), INTENT(in):: part
INTEGER:: i INTEGER:: i
DO i = 1, SIZE(probe) !Do it so they are only calculated when output
IF (MOD(t, probe(i)%every) == 0 .OR. t == tFinal) THEN DO i = 1, nProbes
CALL probe(i)%calculate() IF (probe(i)%update) THEN
CALL probe(i)%output(t) CALL probe(i)%calculate(part)
END IF END IF
@ -234,4 +244,34 @@ MODULE moduleProbe
END SUBROUTINE doProbes END SUBROUTINE doProbes
SUBROUTINE outputProbes(t)
IMPLICIT NONE
INTEGER, INTENT(in):: t
INTEGER:: i
DO i = 1, nProbes
IF (probe(i)%update) THEN
CALL probe(i)%output(t)
END IF
END DO
END SUBROUTINE outputProbes
SUBROUTINE resetProbes(t)
IMPLICIT NONE
INTEGER, INTENT(in):: t
INTEGER:: i
DO i = 1, nProbes
probe(i)%f = 0.D0
probe(i)%update = MOD(t, probe(i)%every) == 0 .OR. t == tFinal
END DO
END SUBROUTINE resetProbes
END MODULE moduleProbe END MODULE moduleProbe

View file

@ -497,17 +497,48 @@ MODULE moduleSolver
END SUBROUTINE push0D END SUBROUTINE push0D
!Takes the particles from a list and put them into an array
!nStart indicates the last fill index in the array
SUBROUTINE resetList(partList, partArray, nStart)
USE moduleSpecies
USE moduleList
USE moduleProbe
IMPLICIT NONE
TYPE(listNode), INTENT(inout):: partList
TYPE(particle), INTENT(inout), DIMENSION(1:):: partArray
INTEGER, INTENT(in):: nStart
TYPE(lNode), POINTER:: partCurr, partNext
INTEGER:: n
partCurr => partList%head
DO n = 1, partList%amount
partNext => partCurr%next
partArray(nStart + n) = partCurr%part
CALL doProbes(partArray(nStart+n))
DEALLOCATE(partCurr)
partCurr => partNext
END DO
!Resest head, tail and number of nodes in the list
IF (ASSOCIATED(partList%head)) NULLIFY(partList%head)
IF (ASSOCIATED(partList%tail)) NULLIFY(partList%tail)
partList%amount = 0
END SUBROUTINE resetList
SUBROUTINE doReset() SUBROUTINE doReset()
USE moduleSpecies USE moduleSpecies
USE moduleMesh USE moduleMesh
USE moduleList USE moduleList
USE moduleProbe
IMPLICIT NONE IMPLICIT NONE
INTEGER:: nn, n, e INTEGER:: nn, n, e
INTEGER, SAVE:: nPartNew INTEGER, SAVE:: nPartNew
INTEGER, SAVE:: nInjIn, nOldIn, nWScheme, nCollisions, nSurfaces INTEGER, SAVE:: nInjIn, nOldIn, nWScheme, nCollisions, nSurfaces
TYPE(particle), ALLOCATABLE, SAVE:: partTemp(:) TYPE(particle), ALLOCATABLE, SAVE:: partTemp(:)
TYPE(lNode), POINTER:: partCurr, partNext
!$OMP SECTIONS !$OMP SECTIONS
!$OMP SECTION !$OMP SECTION
@ -524,10 +555,13 @@ MODULE moduleSolver
END IF END IF
!$OMP SECTION !$OMP SECTION
nWScheme = partWScheme%amount nWScheme = partWScheme%amount
!$OMP SECTION !$OMP SECTION
nCollisions = partCollisions%amount nCollisions = partCollisions%amount
!$OMP SECTION !$OMP SECTION
nSurfaces = partSurfaces%amount nSurfaces = partSurfaces%amount
!$OMP END SECTIONS !$OMP END SECTIONS
!$OMP BARRIER !$OMP BARRIER
@ -546,6 +580,7 @@ MODULE moduleSolver
IF (partInj(n)%n_in) THEN IF (partInj(n)%n_in) THEN
nn = nn + 1 nn = nn + 1
partOld(nn) = partInj(n) partOld(nn) = partInj(n)
CALL doProbes(partOld(nn))
END IF END IF
@ -558,54 +593,26 @@ MODULE moduleSolver
IF (partTemp(n)%n_in) THEN IF (partTemp(n)%n_in) THEN
nn = nn + 1 nn = nn + 1
partOld(nn) = partTemp(n) partOld(nn) = partTemp(n)
CALL doProbes(partOld(nn))
END IF END IF
END DO END DO
!$OMP SECTION !$OMP SECTION
!Reset particles from weighting scheme !Reset particles from weighting scheme
nn = nInjIn + nOldIn nn = nInjIn + nOldIn
partCurr => partWScheme%head CALL resetList(partWScheme, partOld, nn)
DO n = 1, nWScheme
partNext => partCurr%next
partOld(nn+n) = partCurr%part
DEALLOCATE(partCurr)
partCurr => partNext
END DO
IF (ASSOCIATED(partWScheme%head)) NULLIFY(partWScheme%head)
IF (ASSOCIATED(partWScheme%tail)) NULLIFY(partWScheme%tail)
partWScheme%amount = 0
!$OMP SECTION !$OMP SECTION
!Reset particles from collisional process !Reset particles from collisional process
nn = nInjIn + nOldIn + nWScheme nn = nInjIn + nOldIn + nWScheme
partCurr => partCollisions%head CALL resetList(partCollisions, partOld, nn)
DO n = 1, nCollisions
partNext => partCurr%next
partOld(nn+n) = partCurr%part
DEALLOCATE(partCurr)
partCurr => partNext
END DO
IF (ASSOCIATED(partCollisions%head)) NULLIFY(partCollisions%head)
IF (ASSOCIATED(partCollisions%tail)) NULLIFY(partCollisions%tail)
partCollisions%amount = 0
!$OMP SECTION !$OMP SECTION
!Reset particles from surface process !Reset particles from surface process
nn = nInjIn + nOldIn + nWScheme + nCollisions nn = nInjIn + nOldIn + nWScheme + nCollisions
partCurr => partSurfaces%head CALL resetList(partSurfaces, partOld, nn)
DO n = 1, nSurfaces
partNext => partCurr%next
partOld(nn+n) = partCurr%part
DEALLOCATE(partCurr)
partCurr => partNext
END DO
IF (ASSOCIATED(partSurfaces%head)) NULLIFY(partSurfaces%head)
IF (ASSOCIATED(partSurfaces%tail)) NULLIFY(partSurfaces%tail)
partSurfaces%amount = 0
!$OMP SECTION !$OMP SECTION
!Reset output in nodes !Reset output in nodes
@ -827,6 +834,7 @@ MODULE moduleSolver
USE moduleOutput USE moduleOutput
USE moduleSpecies USE moduleSpecies
USE moduleCompTime USE moduleCompTime
USE moduleProbe
IMPLICIT NONE IMPLICIT NONE
INTEGER, INTENT(in):: t INTEGER, INTENT(in):: t
@ -838,6 +846,7 @@ MODULE moduleSolver
!Resets output counter !Resets output counter
counterOutput=0 counterOutput=0
CALL outputProbes(t)
CALL mesh%printOutput(t) CALL mesh%printOutput(t)
IF (ASSOCIATED(meshForMCC)) CALL meshForMCC%printColl(t) IF (ASSOCIATED(meshForMCC)) CALL meshForMCC%printColl(t)
CALL mesh%printEM(t) CALL mesh%printEM(t)