Files compile but there is no linking in mesh module

This commit is contained in:
Jorge Gonzalez 2026-02-24 20:03:36 +01:00
commit 135f1f464c
7 changed files with 57 additions and 51 deletions

View file

@ -17,7 +17,8 @@ OBJECTS = $(OBJDIR)/moduleMesh.o $(OBJDIR)/moduleMeshCommon.o $(OBJDIR)/moduleCo
$(OBJDIR)/moduleMesh1DCart.o \ $(OBJDIR)/moduleMesh1DCart.o \
$(OBJDIR)/moduleMesh0D.o \ $(OBJDIR)/moduleMesh0D.o \
$(OBJDIR)/moduleSolver.o \ $(OBJDIR)/moduleSolver.o \
$(OBJDIR)/modulePusher.o $(OBJDIR)/modulePusher.o \
$(OBJDIR)/velocityDistribution.o
all: $(OUTPUT) all: $(OUTPUT)

View file

@ -800,20 +800,20 @@ MODULE moduleInput
IMPLICIT NONE IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config TYPE(json_file), INTENT(inout):: config
integer:: b, s integer:: b
character(2):: iString character(2):: iString
character(:), allocatable:: object character(:), allocatable:: object
character(len=100), allocatable:: speciesNames(:) character(len=100), allocatable:: speciesNames(:)
LOGICAL:: found LOGICAL:: found
! Read models of particles ! Read models of particles
CALL config%info('boundaries.particles.models', found, n_children = nBoundary) CALL config%info('boundaries.particles.models', found, n_children = nBoundariesParticle)
ALLOCATE(boundaries(1:nBoundary)) ALLOCATE(boundariesParticle(1:nBoundariesParticle))
DO b = 1, nBoundary DO b = 1, nBoundariesParticle
WRITE(iString, '(i2)') b WRITE(iString, '(i2)') b
object = 'boundary.particles.models(' // TRIM(iString) // ')' object = 'boundary.particles.models(' // TRIM(iString) // ')'
call boundaries(i)%init(config, object, b) call boundariesParticle(b)%obj%init(config, object, b)
END DO END DO
@ -827,14 +827,14 @@ MODULE moduleInput
USE moduleOutput USE moduleOutput
USE moduleErrors USE moduleErrors
USE moduleEM USE moduleEM
USE moduleSpecies USE moduleSpecies, only: nSpecies
USE json_module USE json_module
IMPLICIT NONE IMPLICIT NONE
TYPE(json_file), INTENT(inout):: config TYPE(json_file), INTENT(inout):: config
CHARACTER(:), ALLOCATABLE:: object CHARACTER(:), ALLOCATABLE:: object
LOGICAL:: found LOGICAL:: found
INTEGER:: b INTEGER:: b, s
CHARACTER(2):: bString CHARACTER(2):: bString
character(len=100), allocatable:: modelName(:) character(len=100), allocatable:: modelName(:)
@ -845,11 +845,11 @@ MODULE moduleInput
END IF END IF
do b = 1, nBoundaryEM do b = 1, nBoundariesEM
write(bString, '(I2)') b write(bString, '(I2)') b
object = 'boundaries.EM.models(' // TRIM(bString) // ')' object = 'boundaries.EM.models(' // TRIM(bString) // ')'
call boundariesEM(b)%init(config, object, b) call boundariesEM(b)%obj%init(config, object, b)
end do end do
@ -879,10 +879,10 @@ MODULE moduleInput
character(:), allocatable:: object character(:), allocatable:: object
logical:: found logical:: found
integer:: ps integer:: ps
character(2):: psString character(2):: psString, sSTring
integer:: nParticleModels integer:: nParticleModels
character(len=100), allocatable:: particleModels(:) character(:), allocatable:: particleModel
character(len=100):: EMModel character(:), allocatable:: EMModel
integer:: s, boundaryIndex integer:: s, boundaryIndex
call config%info('physicalSurfaces', found, n_children = nPhysicalSurfaces) call config%info('physicalSurfaces', found, n_children = nPhysicalSurfaces)
@ -895,8 +895,8 @@ MODULE moduleInput
end if end if
do ps = 1, nPhysicalSurfaces do ps = 1, nPhysicalSurfaces
write(ps, '(I2)') ps write(psString, '(I2)') ps
object = 'physicalSurfaces(' // TRIM(bString) // ')' object = 'physicalSurfaces(' // trim(psString) // ')'
allocate(physicalSurfaces(ps)%nodes(0)) allocate(physicalSurfaces(ps)%nodes(0))
allocate(physicalSurfaces(ps)%edges(0)) allocate(physicalSurfaces(ps)%edges(0))
@ -913,18 +913,19 @@ MODULE moduleInput
call criticalError('Not enough models for particles provided', 'readPhysicalSurfaces') call criticalError('Not enough models for particles provided', 'readPhysicalSurfaces')
end if end if
call config%get(object // '.particles', particleModels, found)
allocate(physicalSurfaces(ps)%particles(1:nSpecies)) allocate(physicalSurfaces(ps)%particles(1:nSpecies))
do s = 1, nSpecies do s = 1, nSpecies
boundaryIndex = boundaryParticlesName_to_Index(particleModels(s)) write(sString, '(I2)') s
physicalSurfaces(ps)%particles(s)%obj => boundaryParticles(boundaryIndex)%obj call config%get(object // '.particles(' // trim(sSTring) // ')', particleModel, found)
boundaryIndex = boundaryParticleName_to_Index(particleModel)
physicalSurfaces(ps)%particles(s)%obj => boundariesParticle(boundaryIndex)%obj
end do end do
! Link electromagnetic boundary condition ! Link electromagnetic boundary condition
call config%get(object // '.EM', EMModel, found) call config%get(object // '.EM', EMModel, found)
if (found) then if (found) then
bouondaryIndex = boundaryEMName_to_Index(EMModel) boundaryIndex = boundaryEMName_to_Index(EMModel)
physicalSurfaces(ps)%EM => boundariesEM(boundaryIndex)%obj physicalSurfaces(ps)%EM => boundariesEM(boundaryIndex)%obj
end if end if
@ -957,6 +958,10 @@ MODULE moduleInput
LOGICAL:: found LOGICAL:: found
CHARACTER(:), ALLOCATABLE:: meshFormat, meshFile CHARACTER(:), ALLOCATABLE:: meshFormat, meshFile
REAL(8):: volume REAL(8):: volume
integer:: b, ps, s
integer:: e
integer:: nVolColl
integer:: boundaryIndex
object = 'geometry' object = 'geometry'
@ -1170,7 +1175,7 @@ MODULE moduleInput
! Loop over all species ! Loop over all species
do s = 1, nSpecies do s = 1, nSpecies
! If the boundary for the species is linked to the one analysing, add the edges ! If the boundary for the species is linked to the one analysing, add the edges
if (associated(physicalSurfaces(ps)%particles(s), bound)) then if (associated(physicalSurfaces(ps)%particles(s)%obj, bound)) then
bound%edges = [bound%edges, physicalSurfaces(ps)%edges] bound%edges = [bound%edges, physicalSurfaces(ps)%edges]
end if end if

View file

@ -324,8 +324,7 @@ MODULE moduleMesh
ABSTRACT INTERFACE ABSTRACT INTERFACE
SUBROUTINE initCell_interface(self, n, p, nodes) SUBROUTINE initCell_interface(self, n, p, nodes)
IMPORT:: meshCell IMPORT:: meshCell, meshNodeCont
IMPORT meshNodeCont
CLASS(meshCell), INTENT(out):: self CLASS(meshCell), INTENT(out):: self
INTEGER, INTENT(in):: n INTEGER, INTENT(in):: n
INTEGER, INTENT(in):: p(:) INTEGER, INTENT(in):: p(:)
@ -630,7 +629,7 @@ MODULE moduleMesh
END INTERFACE END INTERFACE
!Logical to indicate if an specific mesh for MC Collisions is used !Logical to indicate if an specific mesh for MC Collisions is used
LOGICAL:: doubleMesh LOGICAL:: doubleMesh = .false.
!Logical to indicate if MCC collisions are performed !Logical to indicate if MCC collisions are performed
LOGICAL:: doMCCollisions = .FALSE. LOGICAL:: doMCCollisions = .FALSE.
!Logical to indicate if Coulomb scattering is performed !Logical to indicate if Coulomb scattering is performed
@ -737,7 +736,7 @@ MODULE moduleMesh
! Ensures quasi-neutrality by changing the reflection coefficient ! Ensures quasi-neutrality by changing the reflection coefficient
type, public, extends(boundaryParticleGeneric):: boundaryQuasiNeutrality type, public, extends(boundaryParticleGeneric):: boundaryQuasiNeutrality
real(8):: alpha ! Reflection parameter real(8):: alpha ! Reflection parameter
integer, allocatable:: edges(:) !Array with edges type(meshEdgePointer), allocatable:: edges(:) !Array with edges
contains contains
procedure, pass:: apply => quasiNeutrality procedure, pass:: apply => quasiNeutrality

View file

@ -1,6 +1,6 @@
submodule(moduleMesh) boundaryEM submodule(moduleMesh) boundaryEM
CONTAINS CONTAINS
function boundaryEMName_to_Index(boundaryName) result(bp) module function boundaryEMName_to_Index(boundaryName) result(bp)
use moduleErrors use moduleErrors
implicit none implicit none
@ -73,7 +73,7 @@ submodule(moduleMesh) boundaryEM
end subroutine initBoundaryEM end subroutine initBoundaryEM
! Initialize Dirichlet boundary condition ! Initialize Dirichlet boundary condition
SUBROUTINE initDirichlet(self, config, object) module SUBROUTINE initDirichlet(self, config, object)
use json_module use json_module
USE moduleRefParam, ONLY: Volt_ref USE moduleRefParam, ONLY: Volt_ref
use moduleErrors use moduleErrors
@ -100,7 +100,7 @@ submodule(moduleMesh) boundaryEM
end subroutine initDirichlet end subroutine initDirichlet
! Initialize Dirichlet boundary condition ! Initialize Dirichlet boundary condition
subroutine initDirichletTime(self, config, object) module subroutine initDirichletTime(self, config, object)
use json_module use json_module
use moduleRefParam, ONLY: Volt_ref, ti_ref use moduleRefParam, ONLY: Volt_ref, ti_ref
use moduleErrors use moduleErrors
@ -142,7 +142,7 @@ submodule(moduleMesh) boundaryEM
END SUBROUTINE initDirichletTime END SUBROUTINE initDirichletTime
!Apply Dirichlet boundary condition to the poisson equation !Apply Dirichlet boundary condition to the poisson equation
SUBROUTINE applyDirichlet(self, vectorF) module SUBROUTINE applyDirichlet(self, vectorF)
USE moduleMesh USE moduleMesh
IMPLICIT NONE IMPLICIT NONE
@ -159,7 +159,7 @@ submodule(moduleMesh) boundaryEM
END SUBROUTINE applyDirichlet END SUBROUTINE applyDirichlet
!Apply Dirichlet boundary condition with time temporal profile !Apply Dirichlet boundary condition with time temporal profile
SUBROUTINE applyDirichletTime(self, vectorF) module SUBROUTINE applyDirichletTime(self, vectorF)
USE moduleMesh USE moduleMesh
USE moduleCaseParam, ONLY: timeStep, tauMin USE moduleCaseParam, ONLY: timeStep, tauMin
IMPLICIT NONE IMPLICIT NONE

View file

@ -1,7 +1,7 @@
!moduleMeshBoundary: Boundary functions for the mesh edges !moduleMeshBoundary: Boundary functions for the mesh edges
submodule(moduleMesh) boundaryParticle submodule(moduleMesh) boundaryParticle
contains contains
function boundaryParticleName_to_Index(boundaryName) result(bp) module function boundaryParticleName_to_Index(boundaryName) result(bp)
use moduleErrors use moduleErrors
implicit none implicit none
@ -209,6 +209,7 @@ submodule(moduleMesh) boundaryParticle
select type(boundary) select type(boundary)
type is(boundaryQuasiNeutrality) type is(boundaryQuasiNeutrality)
boundary%alpha = 0.d0 boundary%alpha = 0.d0
allocate(boundary%edges(0))
end select end select
@ -241,7 +242,7 @@ submodule(moduleMesh) boundaryParticle
END SUBROUTINE reflection END SUBROUTINE reflection
!Absoption in a surface !Absoption in a surface
SUBROUTINE absorption(self, edge, part) module SUBROUTINE absorption(self, edge, part)
USE moduleCaseParam USE moduleCaseParam
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -278,7 +279,7 @@ submodule(moduleMesh) boundaryParticle
END SUBROUTINE absorption END SUBROUTINE absorption
!Transparent boundary condition !Transparent boundary condition
SUBROUTINE transparent(self, edge, part) module SUBROUTINE transparent(self, edge, part)
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -294,7 +295,7 @@ submodule(moduleMesh) boundaryParticle
!Symmetry axis. Reflects particles. !Symmetry axis. Reflects particles.
!Although this function should never be called, it is set as a reflective boundary !Although this function should never be called, it is set as a reflective boundary
!to properly deal with possible particles reaching a corner and selecting this boundary. !to properly deal with possible particles reaching a corner and selecting this boundary.
SUBROUTINE symmetryAxis(self, edge, part) module SUBROUTINE symmetryAxis(self, edge, part)
USE moduleSpecies USE moduleSpecies
IMPLICIT NONE IMPLICIT NONE
@ -307,7 +308,7 @@ submodule(moduleMesh) boundaryParticle
END SUBROUTINE symmetryAxis END SUBROUTINE symmetryAxis
!Wall with temperature !Wall with temperature
SUBROUTINE wallTemperature(self, edge, part) module SUBROUTINE wallTemperature(self, edge, part)
USE moduleSpecies USE moduleSpecies
USE moduleRandom USE moduleRandom
IMPLICIT NONE IMPLICIT NONE
@ -329,7 +330,7 @@ submodule(moduleMesh) boundaryParticle
!Ionization surface: an electron will pass through the surface !Ionization surface: an electron will pass through the surface
! and create an ion-electron pair based on a neutral background ! and create an ion-electron pair based on a neutral background
SUBROUTINE ionization(self, edge, part) module SUBROUTINE ionization(self, edge, part)
USE moduleList USE moduleList
USE moduleSpecies USE moduleSpecies
USE moduleMesh USE moduleMesh
@ -426,7 +427,7 @@ submodule(moduleMesh) boundaryParticle
END SUBROUTINE ionization END SUBROUTINE ionization
subroutine quasiNeutrality(self, edge, part) module subroutine quasiNeutrality(self, edge, part)
use moduleRandom use moduleRandom
implicit none implicit none
@ -483,7 +484,7 @@ submodule(moduleMesh) boundaryParticle
end subroutine genericReflection end subroutine genericReflection
subroutine genericTransparent(edge, part) module subroutine genericTransparent(edge, part)
use moduleSpecies use moduleSpecies
implicit none implicit none

View file

@ -1,7 +1,7 @@
submodule(moduleMesh) elements submodule(moduleMesh) elements
CONTAINS CONTAINS
!Reset the output of node !Reset the output of node
PURE SUBROUTINE resetOutput(self) PURE module SUBROUTINE resetOutput(self)
USE moduleSpecies USE moduleSpecies
USE moduleOutput USE moduleOutput
IMPLICIT NONE IMPLICIT NONE
@ -18,7 +18,7 @@ submodule(moduleMesh) elements
END SUBROUTINE resetOutput END SUBROUTINE resetOutput
subroutine meshNodePointerAdd(self, node) module subroutine meshNodePointerAdd(self, node)
implicit none implicit none
class(meshNodePointer), allocatable, intent(inout):: self(:) class(meshNodePointer), allocatable, intent(inout):: self(:)
@ -49,7 +49,7 @@ submodule(moduleMesh) elements
end subroutine meshNodePointerAdd end subroutine meshNodePointerAdd
function meshNodePointer_equal_type_type(self, other) result(isEqual) module function meshNodePointer_equal_type_type(self, other) result(isEqual)
implicit none implicit none
class(meshNodePointer), intent(in):: self, other class(meshNodePointer), intent(in):: self, other
@ -59,7 +59,7 @@ submodule(moduleMesh) elements
end function meshNodePointer_equal_type_type end function meshNodePointer_equal_type_type
function meshNodePointer_equal_type_int(self, other) result(isEqual) module function meshNodePointer_equal_type_int(self, other) result(isEqual)
implicit none implicit none
class(meshNodePointer), intent(in):: self class(meshNodePointer), intent(in):: self
@ -70,7 +70,7 @@ submodule(moduleMesh) elements
end function meshNodePointer_equal_type_int end function meshNodePointer_equal_type_int
function meshEdgePointer_equal_type_type(self, other) result(isEqual) module function meshEdgePointer_equal_type_type(self, other) result(isEqual)
implicit none implicit none
class(meshEdgePointer), intent(in):: self, other class(meshEdgePointer), intent(in):: self, other
@ -80,7 +80,7 @@ submodule(moduleMesh) elements
end function meshEdgePointer_equal_type_type end function meshEdgePointer_equal_type_type
subroutine meshEdgePointer_add(self, edge) module subroutine meshEdgePointer_add(self, edge)
implicit none implicit none
class(meshEdgePointer), allocatable, intent(inout):: self(:) class(meshEdgePointer), allocatable, intent(inout):: self(:)
@ -111,7 +111,7 @@ submodule(moduleMesh) elements
end subroutine meshEdgePointer_add end subroutine meshEdgePointer_add
function meshEdgePointer_equal_type_int(self, other) result(isEqual) module function meshEdgePointer_equal_type_int(self, other) result(isEqual)
implicit none implicit none
class(meshEdgePointer), intent(in):: self class(meshEdgePointer), intent(in):: self
@ -123,7 +123,7 @@ submodule(moduleMesh) elements
end function meshEdgePointer_equal_type_int end function meshEdgePointer_equal_type_int
!Constructs the global K matrix !Constructs the global K matrix
SUBROUTINE constructGlobalK(self) module SUBROUTINE constructGlobalK(self)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshParticles), INTENT(inout):: self CLASS(meshParticles), INTENT(inout):: self
@ -189,7 +189,7 @@ submodule(moduleMesh) elements
END SUBROUTINE constructGlobalK END SUBROUTINE constructGlobalK
! Gather the value of valNodes at position Xi of an edge ! Gather the value of valNodes at position Xi of an edge
pure function gatherF_edge_scalar(self, Xi, nNodes, valNodes) RESULT(f) pure module function gatherF_edge_scalar(self, Xi, nNodes, valNodes) RESULT(f)
implicit none implicit none
class(meshEdge), intent(in):: self class(meshEdge), intent(in):: self
@ -205,7 +205,7 @@ submodule(moduleMesh) elements
end function gatherF_edge_scalar end function gatherF_edge_scalar
!Gather the value of valNodes (scalar) at position Xi !Gather the value of valNodes (scalar) at position Xi
PURE FUNCTION gatherF_cell_scalar(self, Xi, nNodes, valNodes) RESULT(f) PURE module FUNCTION gatherF_cell_scalar(self, Xi, nNodes, valNodes) RESULT(f)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self CLASS(meshCell), INTENT(in):: self
@ -221,7 +221,7 @@ submodule(moduleMesh) elements
END FUNCTION gatherF_cell_scalar END FUNCTION gatherF_cell_scalar
!Gather the value of valNodes (array) at position Xi !Gather the value of valNodes (array) at position Xi
PURE FUNCTION gatherF_cell_array(self, Xi, nNodes, valNodes) RESULT(f) PURE module FUNCTION gatherF_cell_array(self, Xi, nNodes, valNodes) RESULT(f)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self CLASS(meshCell), INTENT(in):: self
@ -237,7 +237,7 @@ submodule(moduleMesh) elements
END FUNCTION gatherF_cell_array END FUNCTION gatherF_cell_array
!Gather the spatial derivative of valNodes (scalar) at position Xi !Gather the spatial derivative of valNodes (scalar) at position Xi
PURE FUNCTION gatherDF_cell_scalar(self, Xi, nNodes, valNodes) RESULT(df) PURE module FUNCTION gatherDF_cell_scalar(self, Xi, nNodes, valNodes) RESULT(df)
IMPLICIT NONE IMPLICIT NONE
CLASS(meshCell), INTENT(in):: self CLASS(meshCell), INTENT(in):: self
@ -262,7 +262,7 @@ submodule(moduleMesh) elements
END FUNCTION gatherDF_cell_scalar END FUNCTION gatherDF_cell_scalar
!Scatters particle properties into cell nodes !Scatters particle properties into cell nodes
SUBROUTINE scatter(self, nNodes, part) module SUBROUTINE scatter(self, nNodes, part)
USE moduleMath USE moduleMath
USE moduleSpecies USE moduleSpecies
USE OMP_LIB USE OMP_LIB

View file

@ -1,6 +1,6 @@
submodule(moduleMesh) surfaces submodule(moduleMesh) surfaces
contains contains
function physicalSurface_to_index(ps) result(index) module function physicalSurface_to_index(ps) result(index)
implicit none implicit none
integer:: ps integer:: ps