PetiClass.f90 Source File


Contents

Source Code


Source Code

module PetiClass
    use, intrinsic :: iso_fortran_env
    use KinematicClass
    use StemClass
    use FEMDomainClass

    implicit none

    type :: Peti_
        type(FEMDomain_)    ::  FEMDomain
        real(real64)             ::  Thickness,length,width
        real(real64)             ::  MaxThickness,Maxlength,Maxwidth
        real(real64)             ::  center_bottom(3),center_top(3)
        real(real64)             ::  radius_bottom(3),radius_top(3)
        real(real64)             ::  outer_normal_bottom(3),outer_normal_top(3)
        integer(int32)             ::  Division
        type(Stem_),pointer ::  pStem
    contains
        procedure, public :: Init => initPeti
        procedure, public :: export => exportPeti
    end type
contains


! ########################################
subroutine initPeti(obj,Thickness,length,width,MaxThickness,Maxlength,Maxwidth,rotx,roty,rotz,location)
    class(Peti_),intent(inout) :: obj
    real(real64),optional,intent(in)::  Thickness,length,width
    real(real64),optional,intent(in)::  MaxThickness,Maxlength,Maxwidth
    real(real64),optional,intent(in)::  rotx,roty,rotz,location(3)
    real(real64) :: loc(3)
    loc(:)=0.0d0
    if(present(location) )then
        loc(:)=location(:)
    endif
    obj%Thickness   = input(default=0.010d0,option= Thickness     )
    obj%length      = input(default=0.050d0,option= length      )
    obj%width       = input(default=0.010d0,option= width)

    obj%MaxThickness   = input(default=0.50d0  ,option= MaxThickness     )
    obj%Maxlength      = input(default=10.0d0  ,option= Maxlength      )
    obj%Maxwidth       = input(default=0.50d0  ,option= Maxwidth)

    obj%outer_normal_bottom(:)=0.0d0
    obj%outer_normal_bottom(1)=1.0d0
    obj%outer_normal_top(:)=0.0d0
    obj%outer_normal_top(1)=1.0d0
    ! rotate
    obj%outer_normal_Bottom(:) = Rotation3D(vector=obj%outer_normal_bottom,rotx=rotx,roty=roty,rotz=rotz)
    obj%outer_normal_top(:) = Rotation3D(vector=obj%outer_normal_top,rotx=rotx,roty=roty,rotz=rotz)

    obj%center_bottom(:)=loc(:)
    obj%center_top(:) = obj%center_bottom(:) + obj%length*obj%outer_normal_bottom(:)


end subroutine 
! ########################################


! ########################################
subroutine exportPeti(obj,FileName,PetiID)
    class(Peti_),intent(in)::obj
    character(*),intent(in) :: FileName
    integer(int32),optional,intent(inout) :: PetiID
    real(real64) :: radius
    
    radius=0.50d0*obj%width+0.50d0*obj%Thickness
    open(14,file=FileName)
    write(14,'(A)') "//+"
    write(14,'(A)') 'SetFactory("OpenCASCADE");'
    write(14,*) "Cylinder(",input(default=1,option=PetiID),") = {",&
    obj%center_bottom(1),",", obj%center_bottom(2),",", obj%center_bottom(3),",",&
    obj%center_top(1)-obj%center_bottom(1),",", obj%center_top(2)-obj%center_bottom(2),",",&
     obj%center_top(3)-obj%center_bottom(3),",",&
    radius,", 2*Pi};"
    close(14)
    PetiID=petiID+1


end subroutine
! ########################################




end module