!moduleMeshCylBoundary: Edge elements for Cylindrical mesh. MODULE moduleMeshCylBoundary USE moduleMeshCyl TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylRef CONTAINS PROCEDURE, PASS:: fBoundary => reflection END TYPE meshEdgeCylRef TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylAbs CONTAINS PROCEDURE, PASS:: fBoundary => absorption END TYPE meshEdgeCylAbs TYPE, PUBLIC, EXTENDS(meshEdgeCyl):: meshEdgeCylAxis CONTAINS PROCEDURE, PASS:: fBoundary => symmetryAxis END TYPE meshEdgeCylAxis CONTAINS SUBROUTINE reflection(self, part) USE moduleSpecies IMPLICIT NONE CLASS(meshEdgeCylRef), INTENT(inout):: self CLASS(particle), INTENT(inout):: part REAL(8):: edgeNorm, cosT, sinT, rp(1:2), rpp(1:2), vpp(1:2) edgeNorm = DSQRT((self%r(2)-self%r(1))**2 + (self%z(2)-self%z(1))**2) cosT = (self%z(2)-self%z(1))/edgeNorm sinT = DSQRT(1-cosT**2) rp(1) = part%r(1) - self%z(1); rp(2) = part%r(2) - self%r(1); rpp(1) = cosT*rp(1) - sinT*rp(2) rpp(2) = sinT*rp(1) + cosT*rp(2) rpp(2) = -rpp(2) vpp(1) = cosT*part%v(1) - sinT*part%v(2) vpp(2) = sinT*part%v(1) + cosT*part%v(2) vpp(2) = -vpp(2) part%r(1) = cosT*rpp(1) + sinT*rpp(2) + self%z(1); part%r(2) = -sinT*rpp(1) + cosT*rpp(2) + self%r(1); part%v(1) = cosT*vpp(1) + sinT*vpp(2) part%v(2) = -sinT*vpp(1) + cosT*vpp(2) part%n_in = .TRUE. END SUBROUTINE reflection !Absoption in a surface SUBROUTINE absorption(self, part) USE moduleSpecies IMPLICIT NONE CLASS(meshEdgeCylAbs), INTENT(inout):: self CLASS(particle), INTENT(inout):: part !TODO: Add scatter to mesh nodes part%n_in = .FALSE. END SUBROUTINE absorption SUBROUTINE symmetryAxis(self, part) USE moduleSpecies IMPLICIT NONE CLASS(meshEdgeCylAxis), INTENT(inout):: self CLASS(particle), INTENT(inout):: part END SUBROUTINE symmetryAxis END MODULE moduleMeshCylBoundary