Time variable Dirichlet condition #52
2 changed files with 92 additions and 46 deletions
NOT WORKING: Compilation okay, but not Dirichlet BC
The code compiles but the right BC is not being applied to the vectorF. I'll check this tomorrow.
commit
10dee05922
|
|
@ -1148,8 +1148,8 @@ MODULE moduleInput
|
||||||
CHARACTER(:), ALLOCATABLE:: typeEM
|
CHARACTER(:), ALLOCATABLE:: typeEM
|
||||||
REAL(8):: potential
|
REAL(8):: potential
|
||||||
INTEGER:: physicalSurface
|
INTEGER:: physicalSurface
|
||||||
CHARACTER(:), ALLOCATABLE:: timeProfile
|
CHARACTER(:), ALLOCATABLE:: temporalProfile
|
||||||
INTEGER:: b, e, s, n, ni
|
INTEGER:: b, s, n, ni
|
||||||
CHARACTER(2):: bString
|
CHARACTER(2):: bString
|
||||||
INTEGER:: info
|
INTEGER:: info
|
||||||
EXTERNAL:: dgetrf
|
EXTERNAL:: dgetrf
|
||||||
|
|
@ -1187,12 +1187,20 @@ MODULE moduleInput
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
CALL config%get(object // '.temporalProfile', temporalProfile, found)
|
||||||
|
IF (.NOT. found) THEN
|
||||||
|
CALL criticalError('Required parameter "potential" for Dirichlet boundary condition not found', 'readEMBoundary')
|
||||||
|
|
||||||
|
END IF
|
||||||
|
|
||||||
CALL config%get(object // '.physicalSurface', physicalSurface, found)
|
CALL config%get(object // '.physicalSurface', physicalSurface, found)
|
||||||
IF (.NOT. found) THEN
|
IF (.NOT. found) THEN
|
||||||
CALL criticalError('Required parameter "physicalSurface" for Dirichlet boundary condition not found', 'readEMBoundary')
|
CALL criticalError('Required parameter "physicalSurface" for Dirichlet boundary condition not found', 'readEMBoundary')
|
||||||
|
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
CALL initDirichletTime(boundaryEM(b)%obj, physicalSurface, potential, temporalProfile)
|
||||||
|
|
||||||
CASE DEFAULT
|
CASE DEFAULT
|
||||||
CALL criticalError('Boundary type ' // typeEM // ' not yet supported', 'readEMBoundary')
|
CALL criticalError('Boundary type ' // typeEM // ' not yet supported', 'readEMBoundary')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,28 +66,17 @@ MODULE moduleEM
|
||||||
REAL(8), ALLOCATABLE:: qSpecies(:)
|
REAL(8), ALLOCATABLE:: qSpecies(:)
|
||||||
|
|
||||||
CONTAINS
|
CONTAINS
|
||||||
! Initialize Dirichlet boundary condition
|
SUBROUTINE findNodes(self, physicalSurface)
|
||||||
SUBROUTINE initDirichlet(self, physicalSurface, potential)
|
|
||||||
USE moduleMesh
|
USE moduleMesh
|
||||||
USE moduleRefParam, ONLY: Volt_ref
|
|
||||||
IMPLICIT NONE
|
IMPLICIT NONE
|
||||||
|
|
||||||
CLASS(boundaryEMGeneric), ALLOCATABLE, INTENT(out):: self
|
CLASS(boundaryEMGeneric), INTENT(inout):: self
|
||||||
INTEGER:: physicalSurface
|
INTEGER, INTENT(in):: physicalSurface
|
||||||
REAL(8), INTENT(in):: potential
|
|
||||||
CLASS(meshEdge), POINTER:: edge
|
CLASS(meshEdge), POINTER:: edge
|
||||||
INTEGER, ALLOCATABLE:: nodes(:), nodesEdge(:)
|
INTEGER, ALLOCATABLE:: nodes(:), nodesEdge(:)
|
||||||
INTEGER:: nNodes, nodesNew
|
INTEGER:: nNodes, nodesNew
|
||||||
INTEGER:: e, n
|
INTEGER:: e, n
|
||||||
|
|
||||||
! Allocate boundary edge
|
|
||||||
ALLOCATE(boundaryEMDirichlet:: self)
|
|
||||||
|
|
||||||
SELECT TYPE(self)
|
|
||||||
TYPE IS(boundaryEMDirichlet)
|
|
||||||
self%potential = potential / Volt_ref
|
|
||||||
|
|
||||||
!TODO: This is going into a function
|
|
||||||
!Temporal array to hold nodes
|
!Temporal array to hold nodes
|
||||||
ALLOCATE(nodes(0))
|
ALLOCATE(nodes(0))
|
||||||
|
|
||||||
|
|
@ -125,10 +114,57 @@ MODULE moduleEM
|
||||||
|
|
||||||
END DO
|
END DO
|
||||||
|
|
||||||
|
END SUBROUTINE findNodes
|
||||||
|
|
||||||
|
! Initialize Dirichlet boundary condition
|
||||||
|
SUBROUTINE initDirichlet(self, physicalSurface, potential)
|
||||||
|
USE moduleRefParam, ONLY: Volt_ref
|
||||||
|
IMPLICIT NONE
|
||||||
|
|
||||||
|
CLASS(boundaryEMGeneric), ALLOCATABLE, INTENT(out):: self
|
||||||
|
INTEGER, INTENT(in):: physicalSurface
|
||||||
|
REAL(8), INTENT(in):: potential
|
||||||
|
|
||||||
|
! Allocate boundary edge
|
||||||
|
ALLOCATE(boundaryEMDirichlet:: self)
|
||||||
|
|
||||||
|
SELECT TYPE(self)
|
||||||
|
TYPE IS(boundaryEMDirichlet)
|
||||||
|
self%potential = potential / Volt_ref
|
||||||
|
|
||||||
|
CALL findNodes(self, physicalSurface)
|
||||||
|
|
||||||
END SELECT
|
END SELECT
|
||||||
|
|
||||||
END SUBROUTINE initDirichlet
|
END SUBROUTINE initDirichlet
|
||||||
|
|
||||||
|
! Initialize Dirichlet boundary condition
|
||||||
|
SUBROUTINE initDirichletTime(self, physicalSurface, potential, temporalProfile)
|
||||||
|
USE moduleRefParam, ONLY: Volt_ref, ti_ref
|
||||||
|
IMPLICIT NONE
|
||||||
|
|
||||||
|
CLASS(boundaryEMGeneric), ALLOCATABLE, INTENT(out):: self
|
||||||
|
INTEGER, INTENT(in):: physicalSurface
|
||||||
|
REAL(8), INTENT(in):: potential
|
||||||
|
CHARACTER(:), ALLOCATABLE, INTENT(in):: temporalProfile
|
||||||
|
|
||||||
|
! Allocate boundary edge
|
||||||
|
ALLOCATE(boundaryEMDirichletTime:: self)
|
||||||
|
|
||||||
|
SELECT TYPE(self)
|
||||||
|
TYPE IS(boundaryEMDirichletTime)
|
||||||
|
self%potential = potential / Volt_ref
|
||||||
|
|
||||||
|
CALL findNodes(self, physicalSurface)
|
||||||
|
|
||||||
|
CALL self%temporalProfile%init(temporalProfile)
|
||||||
|
|
||||||
|
CALL self%temporalProfile%convert(1.D0/ti_ref, 1.D0)
|
||||||
|
|
||||||
|
END SELECT
|
||||||
|
|
||||||
|
END SUBROUTINE initDirichletTime
|
||||||
|
|
||||||
!Apply Dirichlet boundary condition to the poisson equation
|
!Apply Dirichlet boundary condition to the poisson equation
|
||||||
SUBROUTINE applyDirichlet(self, vectorF)
|
SUBROUTINE applyDirichlet(self, vectorF)
|
||||||
USE moduleMesh
|
USE moduleMesh
|
||||||
|
|
@ -140,6 +176,7 @@ MODULE moduleEM
|
||||||
|
|
||||||
DO n = 1, self%nNodes
|
DO n = 1, self%nNodes
|
||||||
self%nodes(n)%obj%emData%phi = self%potential
|
self%nodes(n)%obj%emData%phi = self%potential
|
||||||
|
vectorF(self%nodes(n)%obj%n) = self%nodes(n)%obj%emData%phi
|
||||||
|
|
||||||
END DO
|
END DO
|
||||||
|
|
||||||
|
|
@ -156,7 +193,8 @@ MODULE moduleEM
|
||||||
INTEGER:: n, ni
|
INTEGER:: n, ni
|
||||||
|
|
||||||
DO n = 1, self%nNodes
|
DO n = 1, self%nNodes
|
||||||
self%nodes(n)%obj%emData%phi = self%potential
|
self%nodes(n)%obj%emData%phi = self%potential !TODO: Correct for time
|
||||||
|
vectorF(self%nodes(n)%obj%n) = self%nodes(n)%obj%emData%phi
|
||||||
|
|
||||||
END DO
|
END DO
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue