Split velocity distribution function. Still don't know how to deal with injects

This commit is contained in:
Jorge Gonzalez 2026-02-18 20:38:45 +01:00
commit 21b112a591
4 changed files with 94 additions and 85 deletions

View file

@ -1,6 +1,7 @@
OBJS = moduleCompTime.o moduleCaseParam.o moduleConstParam.o \ OBJS = moduleCompTime.o moduleCaseParam.o moduleConstParam.o \
moduleErrors.o moduleMath.o moduleParallel.o \ moduleErrors.o moduleMath.o moduleParallel.o \
moduleRandom.o moduleRefParam.o moduleTable.o moduleRandom.o moduleRefParam.o moduleTable.o \
velocityDistribution.o
all: $(OBJS) all: $(OBJS)

View file

@ -0,0 +1,88 @@
! Functions that return a random velocity based on the distribution function
module velocityDistribution
use moduleRandom
!Generic type for velocity distribution function
type, abstract:: velDistGeneric
contains
!Returns random velocity from distribution function
procedure(randomVel_interface), deferred, pass:: randomVel
end type velDistGeneric
abstract interface
function randomVel_interface(self) result(v)
import velDistGeneric
class(velDistGeneric), intent(in):: self
real(8):: v
end function randomVel_interface
end interface
!Container for velocity distributions
type:: velDistCont
class(velDistGeneric), allocatable:: obj
end type velDistCont
!Maxwellian distribution function
type, extends(velDistGeneric):: velDistMaxwellian
real(8):: vTh !Thermal Velocity
contains
procedure, pass:: randomVel => randomVelMaxwellian
end type velDistMaxwellian
type, extends(velDistGeneric):: velDistHalfMaxwellian
real(8):: vTh !Thermal Velocity
contains
procedure, pass:: randomVel => randomVelHalfMaxwellian
end type velDistHalfMaxwellian
!Dirac's delta distribution function
type, extends(velDistGeneric):: velDistDelta
contains
procedure, pass:: randomVel => randomVelDelta
end type velDistDelta
contains
!Random velocity from Maxwellian distribution
function randomVelMaxwellian(self) result (v)
use moduleRandom
implicit none
class(velDistMaxwellian), intent(in):: self
real(8):: v
v = 0.D0
v = self%vTh*randomMaxwellian()/sqrt(2.d0)
end function randomVelMaxwellian
!Random velocity from Half Maxwellian distribution
function randomVelHalfMaxwellian(self) result (v)
implicit none
class(velDistHalfMaxwellian), intent(in):: self
real(8):: v
v = 0.D0
v = self%vTh*randomHalfMaxwellian()
end function randomVelHalfMaxwellian
!Random velocity from Dirac's delta distribution
PURE function randomVelDelta(self) result(v)
implicit none
class(velDistDelta), intent(in):: self
real(8):: v
v = 0.D0
end function randomVelDelta
end module velocityDistribution

View file

@ -35,6 +35,9 @@ moduleProbe.o: mesh.o moduleProbe.f90
moduleSpecies.o: common.o moduleSpecies.f90 moduleSpecies.o: common.o moduleSpecies.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
moduleInject.o: common.o moduleInject.f90
$(FC) $(FCFLAGS) -c $(subst .o,.f90,$@) -o $(OBJDIR)/$@
%.o: %.f90 %.o: %.f90
$(FC) $(FCFLAGS) -c $< -o $(OBJDIR)/$@ $(FC) $(FCFLAGS) -c $< -o $(OBJDIR)/$@

View file

@ -1,53 +1,7 @@
!injection of particles !injection of particles
MODULE moduleInject MODULE moduleInject
USE moduleSpecies USE moduleSpecies
use velocityDistribution
!Generic type for velocity distribution function
TYPE, ABSTRACT:: velDistGeneric
CONTAINS
!Returns random velocity from distribution function
PROCEDURE(randomVel_interface), DEFERRED, PASS:: randomVel
END TYPE velDistGeneric
ABSTRACT INTERFACE
FUNCTION randomVel_interface(self) RESULT(v)
IMPORT velDistGeneric
CLASS(velDistGeneric), INTENT(in):: self
REAL(8):: v
END FUNCTION randomVel_interface
END INTERFACE
!Container for velocity distributions
TYPE:: velDistCont
CLASS(velDistGeneric), ALLOCATABLE:: obj
END TYPE velDistCont
!Maxwellian distribution function
TYPE, EXTENDS(velDistGeneric):: velDistMaxwellian
REAL(8):: vTh !Thermal Velocity
CONTAINS
PROCEDURE, PASS:: randomVel => randomVelMaxwellian
END TYPE velDistMaxwellian
TYPE, EXTENDS(velDistGeneric):: velDistHalfMaxwellian
REAL(8):: vTh !Thermal Velocity
CONTAINS
PROCEDURE, PASS:: randomVel => randomVelHalfMaxwellian
END TYPE velDistHalfMaxwellian
!Dirac's delta distribution function
TYPE, EXTENDS(velDistGeneric):: velDistDelta
CONTAINS
PROCEDURE, PASS:: randomVel => randomVelDelta
END TYPE velDistDelta
!Generic injection of particles !Generic injection of particles
TYPE:: injectGeneric TYPE:: injectGeneric
@ -280,43 +234,6 @@ MODULE moduleInject
END SUBROUTINE initVelDistDelta END SUBROUTINE initVelDistDelta
!Random velocity from Maxwellian distribution
FUNCTION randomVelMaxwellian(self) RESULT (v)
USE moduleRandom
IMPLICIT NONE
CLASS(velDistMaxwellian), INTENT(in):: self
REAL(8):: v
v = 0.D0
v = self%vTh*randomMaxwellian()/sqrt(2.d0)
END FUNCTION randomVelMaxwellian
!Random velocity from Half Maxwellian distribution
FUNCTION randomVelHalfMaxwellian(self) RESULT (v)
USE moduleRandom
IMPLICIT NONE
CLASS(velDistHalfMaxwellian), INTENT(in):: self
REAL(8):: v
v = 0.D0
v = self%vTh*randomHalfMaxwellian()
END FUNCTION randomVelHalfMaxwellian
!Random velocity from Dirac's delta distribution
PURE FUNCTION randomVelDelta(self) RESULT(v)
IMPLICIT NONE
CLASS(velDistDelta), INTENT(in):: self
REAL(8):: v
v = 0.D0
END FUNCTION randomVelDelta
!Add particles for the injection !Add particles for the injection
SUBROUTINE addParticles(self) SUBROUTINE addParticles(self)
USE moduleSpecies USE moduleSpecies