Skeleton of functions
This commit is contained in:
parent
2c49e47712
commit
1b864d6bed
2 changed files with 137 additions and 45 deletions
|
|
@ -990,6 +990,7 @@ MODULE moduleMesh
|
|||
end interface
|
||||
|
||||
! Extended types
|
||||
! Dirichlet: Constant potential value
|
||||
TYPE, EXTENDS(boundaryEMGeneric):: boundaryEMDirichlet
|
||||
REAL(8):: potential
|
||||
CONTAINS
|
||||
|
|
@ -1016,6 +1017,7 @@ MODULE moduleMesh
|
|||
|
||||
end interface
|
||||
|
||||
! Dirichlet time: time-dependent potential value
|
||||
TYPE, EXTENDS(boundaryEMGeneric):: boundaryEMDirichletTime
|
||||
real(8):: potential
|
||||
real(8):: timeFactor
|
||||
|
|
@ -1044,6 +1046,33 @@ MODULE moduleMesh
|
|||
|
||||
end interface
|
||||
|
||||
! Floating: Floating surface, ie, zero net current
|
||||
type, extends(boundaryEMGeneric):: boundaryEMFloating
|
||||
real(8):: potential
|
||||
contains
|
||||
! boundaryEMGeneric DEFERRED PROCEDURES
|
||||
procedure, pass:: apply => applyFloating
|
||||
|
||||
end type boundaryEMFloating
|
||||
|
||||
interface
|
||||
module subroutine initFloating(self, config, object)
|
||||
use json_module
|
||||
|
||||
class(boundaryEMGeneric), allocatable, intent(inout):: self
|
||||
type(json_file), intent(inout):: config
|
||||
character(:), allocatable, intent(in):: object
|
||||
|
||||
end subroutine initFloating
|
||||
|
||||
module subroutine applyFloating(self, vectorF)
|
||||
class(boundaryEMFloating), intent(in):: self
|
||||
real(8), intent(inout):: vectorF(:)
|
||||
|
||||
end subroutine applyFloating
|
||||
|
||||
end interface
|
||||
|
||||
! Container for boundary conditions
|
||||
TYPE:: boundaryEMCont
|
||||
CLASS(boundaryEMGeneric), ALLOCATABLE:: obj
|
||||
|
|
|
|||
|
|
@ -1,30 +1,7 @@
|
|||
submodule(moduleMesh) boundaryEM
|
||||
CONTAINS
|
||||
module function boundaryEMName_to_Index(boundaryName) result(bp)
|
||||
use moduleErrors
|
||||
implicit none
|
||||
|
||||
character(:), allocatable:: boundaryName
|
||||
integer:: bp
|
||||
integer:: b
|
||||
|
||||
bp = 0
|
||||
do b = 1, nBoundariesEM
|
||||
if (boundaryName == boundariesEM(b)%obj%name) then
|
||||
bp = boundariesEM(b)%obj%n
|
||||
|
||||
end if
|
||||
|
||||
end do
|
||||
|
||||
if (bp == 0) then
|
||||
call criticalError('Boundary ' // boundaryName // ' not found', 'boundaryEMName_to_Index')
|
||||
|
||||
end if
|
||||
|
||||
end function boundaryEMName_to_Index
|
||||
|
||||
! Initialize Dirichlet boundary condition
|
||||
! Dirichlet boundary condition
|
||||
! Init
|
||||
module SUBROUTINE initDirichlet(self, config, object)
|
||||
use json_module
|
||||
USE moduleRefParam, ONLY: Volt_ref
|
||||
|
|
@ -51,7 +28,25 @@ submodule(moduleMesh) boundaryEM
|
|||
|
||||
end subroutine initDirichlet
|
||||
|
||||
! Initialize Dirichlet boundary condition
|
||||
! Apply
|
||||
module SUBROUTINE applyDirichlet(self, vectorF)
|
||||
USE moduleMesh
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(boundaryEMDirichlet), INTENT(in):: self
|
||||
REAL(8), INTENT(inout):: vectorF(:)
|
||||
integer:: n
|
||||
|
||||
DO n = 1, self%nNodes
|
||||
self%nodes(n)%obj%emData%phi = self%potential
|
||||
vectorF(self%nodes(n)%obj%n) = self%nodes(n)%obj%emData%phi
|
||||
|
||||
END DO
|
||||
|
||||
END SUBROUTINE applyDirichlet
|
||||
|
||||
! Dirichlet time-dependent boundary condition
|
||||
! Init
|
||||
module subroutine initDirichletTime(self, config, object)
|
||||
use json_module
|
||||
use moduleRefParam, ONLY: Volt_ref, ti_ref
|
||||
|
|
@ -96,24 +91,7 @@ submodule(moduleMesh) boundaryEM
|
|||
|
||||
END SUBROUTINE initDirichletTime
|
||||
|
||||
!Apply Dirichlet boundary condition to the poisson equation
|
||||
module SUBROUTINE applyDirichlet(self, vectorF)
|
||||
USE moduleMesh
|
||||
IMPLICIT NONE
|
||||
|
||||
CLASS(boundaryEMDirichlet), INTENT(in):: self
|
||||
REAL(8), INTENT(inout):: vectorF(:)
|
||||
integer:: n
|
||||
|
||||
DO n = 1, self%nNodes
|
||||
self%nodes(n)%obj%emData%phi = self%potential
|
||||
vectorF(self%nodes(n)%obj%n) = self%nodes(n)%obj%emData%phi
|
||||
|
||||
END DO
|
||||
|
||||
END SUBROUTINE applyDirichlet
|
||||
|
||||
!Apply Dirichlet boundary condition with time temporal profile
|
||||
! Apply
|
||||
module SUBROUTINE applyDirichletTime(self, vectorF)
|
||||
USE moduleMesh
|
||||
USE moduleCaseParam, ONLY: timeStep, tauMin
|
||||
|
|
@ -131,7 +109,8 @@ submodule(moduleMesh) boundaryEM
|
|||
|
||||
END SUBROUTINE applyDirichletTime
|
||||
|
||||
module subroutine updateDirichletTime(self)
|
||||
! Update
|
||||
subroutine updateDirichletTime(self)
|
||||
implicit none
|
||||
|
||||
class(boundaryEMGeneric), intent(inout):: self
|
||||
|
|
@ -144,6 +123,90 @@ submodule(moduleMesh) boundaryEM
|
|||
|
||||
end subroutine updateDirichletTime
|
||||
|
||||
! Floating surface
|
||||
! Init
|
||||
module subroutine initFloating(self, config, object)
|
||||
use json_module
|
||||
use moduleRefParam, only: Volt_ref
|
||||
use moduleErrors
|
||||
implicit none
|
||||
|
||||
class(boundaryEMGeneric), allocatable, intent(inout):: self
|
||||
type(json_file), intent(inout):: config
|
||||
character(:), allocatable, intent(in):: object
|
||||
real(8):: potential
|
||||
logical:: found
|
||||
|
||||
select type(self)
|
||||
type is(boundaryEMFloating)
|
||||
call config%get(object // '.potential', potential, found)
|
||||
if (.not. found) then
|
||||
call criticalError('Required parameter "potential" for Floating boundary condition not found', &
|
||||
'readBoundaryEM')
|
||||
|
||||
end if
|
||||
|
||||
self%potential = potential / Volt_ref
|
||||
|
||||
self%update => updateFloating
|
||||
|
||||
end select
|
||||
|
||||
end subroutine initFloating
|
||||
|
||||
! Apply
|
||||
module subroutine applyFloating(self, vectorF)
|
||||
use moduleMesh
|
||||
implicit none
|
||||
|
||||
class(boundaryEMFloating), intent(in):: self
|
||||
real(8), intent(inout):: vectorF(:)
|
||||
integer:: n
|
||||
|
||||
do n = 1, self%nNodes
|
||||
self%nodes(n)%obj%emData%phi = self%potential
|
||||
vectorF(self%nodes(n)%obj%n) = self%nodes(n)%obj%emData%phi
|
||||
|
||||
end do
|
||||
|
||||
end subroutine applyFloating
|
||||
|
||||
! Update
|
||||
subroutine updateFloating(self)
|
||||
class(boundaryEMGeneric), intent(inout):: self
|
||||
select type(self)
|
||||
type is(boundaryEMFloating)
|
||||
|
||||
end select
|
||||
|
||||
end subroutine updateFloating
|
||||
|
||||
! Get the index of the boundary based on the name
|
||||
module function boundaryEMName_to_Index(boundaryName) result(bp)
|
||||
use moduleErrors
|
||||
implicit none
|
||||
|
||||
character(:), allocatable:: boundaryName
|
||||
integer:: bp
|
||||
integer:: b
|
||||
|
||||
bp = 0
|
||||
do b = 1, nBoundariesEM
|
||||
if (boundaryName == boundariesEM(b)%obj%name) then
|
||||
bp = boundariesEM(b)%obj%n
|
||||
|
||||
end if
|
||||
|
||||
end do
|
||||
|
||||
if (bp == 0) then
|
||||
call criticalError('Boundary ' // boundaryName // ' not found', 'boundaryEMName_to_Index')
|
||||
|
||||
end if
|
||||
|
||||
end function boundaryEMName_to_Index
|
||||
|
||||
! Update all EM boundaries
|
||||
module subroutine boundariesEM_update()
|
||||
implicit none
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue