Merge IEPC2025 #54

Merged
JorgeGonz merged 19 commits from IEPC2025 into development 2025-09-23 18:42:06 +02:00
3 changed files with 94 additions and 7 deletions
Showing only changes of commit a3bdf8230a - Show all commits

Implementation of Boltzmann electrons

Still not working, just saving code.
Jorge Gonzalez 2024-05-19 10:55:20 +02:00

View file

@ -273,6 +273,10 @@ MODULE moduleInput
!Read BC !Read BC
CALL readEMBoundary(config) CALL readEMBoundary(config)
CASE("ElectrostaticBoltzmann")
!Read BC
CALL readEMBoundary(config)
CASE("ConstantB") CASE("ConstantB")
!Read BC !Read BC
CALL readEMBoundary(config) CALL readEMBoundary(config)

View file

@ -49,7 +49,7 @@ MODULE moduleEM
END SUBROUTINE END SUBROUTINE
!Assemble the source vector based on the charge density to solve Poisson's equation !Assemble the source vector based on the charge density to solve Poisson's equation
SUBROUTINE assembleSourceVector(vectorF) SUBROUTINE assembleSourceVector(vectorF, n_e)
USE moduleMesh USE moduleMesh
USE moduleRefParam USE moduleRefParam
IMPLICIT NONE IMPLICIT NONE
@ -58,15 +58,16 @@ MODULE moduleEM
REAL(8), ALLOCATABLE:: localF(:) REAL(8), ALLOCATABLE:: localF(:)
INTEGER, ALLOCATABLE:: nodes(:) INTEGER, ALLOCATABLE:: nodes(:)
REAL(8), ALLOCATABLE:: rho(:) REAL(8), ALLOCATABLE:: rho(:)
REAL(8), INTENT(in), OPTIONAL:: n_e(1:mesh%numNodes)
INTEGER:: nNodes INTEGER:: nNodes
INTEGER:: e, i, ni INTEGER:: e, i, ni
CLASS(meshNode), POINTER:: node CLASS(meshNode), POINTER:: node
!$OMP SINGLE ! !$OMP SINGLE
vectorF = 0.D0 vectorF = 0.D0
!$OMP END SINGLE ! !$OMP END SINGLE
!$OMP DO REDUCTION(+:vectorF) ! !$OMP DO REDUCTION(+:vectorF)
DO e = 1, mesh%numCells DO e = 1, mesh%numCells
nNodes = mesh%cells(e)%obj%nNodes nNodes = mesh%cells(e)%obj%nNodes
nodes = mesh%cells(e)%obj%getNodes(nNodes) nodes = mesh%cells(e)%obj%getNodes(nNodes)
@ -77,6 +78,10 @@ MODULE moduleEM
ni = nodes(i) ni = nodes(i)
node => mesh%nodes(ni)%obj node => mesh%nodes(ni)%obj
rho(i) = DOT_PRODUCT(qSpecies(:), node%output(:)%den/(vol_ref*node%v*n_ref)) rho(i) = DOT_PRODUCT(qSpecies(:), node%output(:)%den/(vol_ref*node%v*n_ref))
IF (PRESENT(n_e)) THEN
rho(i) = rho(i) - n_e(i)
END IF
END DO END DO
@ -94,10 +99,10 @@ MODULE moduleEM
DEALLOCATE(nodes, rho) DEALLOCATE(nodes, rho)
END DO END DO
!$OMP END DO ! !$OMP END DO
!Apply boundary conditions !Apply boundary conditions
!$OMP DO ! !$OMP DO
DO i = 1, mesh%numNodes DO i = 1, mesh%numNodes
node => mesh%nodes(i)%obj node => mesh%nodes(i)%obj
@ -108,7 +113,7 @@ MODULE moduleEM
END SELECT END SELECT
END DO END DO
!$OMP END DO ! !$OMP END DO
END SUBROUTINE assembleSourceVector END SUBROUTINE assembleSourceVector
@ -156,4 +161,80 @@ MODULE moduleEM
END SUBROUTINE solveElecField END SUBROUTINE solveElecField
FUNCTION BoltzmannElectron(phi, n) RESULT(n_e)
USE moduleRefParam
USE moduleConstParam
IMPLICIT NONE
INTEGER, INTENT(in):: n
REAL(8), INTENT(in):: phi(1:n)
REAL(8):: n_e(1:n)
REAL(8):: n_e0 = 1.0D16, phi_0 = -520.0D0, T_e = 11604.0
n_e = n_e0 / n_ref * EXP(-qe * (phi*Volt_ref - phi_0) / (kb * T_e))
RETURN
END FUNCTION BoltzmannElectron
SUBROUTINE solveElecFieldBoltzmann
USE moduleMesh
USE moduleErrors
IMPLICIT NONE
INTEGER, SAVE:: INFO
INTEGER:: n
REAL(8), ALLOCATABLE, SAVE:: tempF(:)
REAL(8), ALLOCATABLE:: n_e(:), phi_old(:)
INTEGER:: k
EXTERNAL:: dgetrs
!$OMP SINGLE
ALLOCATE(tempF(1:mesh%numNodes))
ALLOCATE(n_e(1:mesh%numNodes))
ALLOCATE(phi_old(1:mesh%numNodes))
DO n = 1, mesh%numNodes
tempF(n) = mesh%nodes(n)%obj%emData%phi
END DO
n_e = BoltzmannElectron(tempF, mesh%numNodes)
!$OMP END SINGLE
CALL assembleSourceVector(tempF, n_e)
!$OMP SINGLE
DO k = 1, 5
phi_old = tempF
CALL dgetrs('N', mesh%numNodes, 1, mesh%K, mesh%numNodes, &
mesh%IPIV, tempF, mesh%numNodes, info)
PRINT*, k, "diff = ", MAXVAL(ABS(tempF - phi_old))
n_e = BoltzmannElectron(tempF, mesh%numNodes)
CALL assembleSourceVector(tempF, n_e)
END DO
!$OMP END SINGLE
IF (info == 0) THEN
!Suscessful resolution of Poission equation
!$OMP DO
DO n = 1, mesh%numNodes
mesh%nodes(n)%obj%emData%phi = tempF(n)
END DO
!$OMP END DO
ELSE
!$OMP SINGLE
CALL criticalError('Poisson equation failed', 'solveElecFieldBoltzmann')
!$OMP END SINGLE
END IF
!$OMP SINGLE
DEALLOCATE(tempF)
!$OMP END SINGLE
END SUBROUTINE solveElecFieldBoltzmann
END MODULE moduleEM END MODULE moduleEM

View file

@ -138,6 +138,8 @@ MODULE moduleSolver
CASE('Electrostatic','ConstantB') CASE('Electrostatic','ConstantB')
self%solveEM => solveElecField self%solveEM => solveElecField
CASE('ElectrostaticBoltzmann')
self%solveEM => solveElecFieldBoltzmann
END SELECT END SELECT
END SUBROUTINE initEM END SUBROUTINE initEM