PlantNodeClass.f90 Source File


Contents

Source Code


Source Code

module PlantNodeClass
    use, intrinsic :: iso_fortran_env
    use KinematicClass
    use FEMDomainClass
    use StemClass
    use LeafClass
    use PetiClass
    use PodClass
    use FlowerClass
    use PlantRootClass
    implicit none
    
    type :: PlantNode_
        character(200)  :: crop_name
        logical         :: Reproductive
        type(Leaf_)     ,allocatable :: Leaf(:) 
        type(Peti_)     ,allocatable :: Peti(:)
        type(Flower_)   ,allocatable :: Flower(:)
        type(Pod_)      ,allocatable :: Pod(:)
        type(Stem_)     ,allocatable :: Stem(:)
        type(PlantRoot_)     ,allocatable :: Root(:)
    contains
        procedure :: init => initNode
        procedure :: export => exportNode
    end Type
contains


! ########################################
subroutine initNode(obj,regacy,PlantName,Stage,&
    LeafThickness,Leaflength,Leafwidth,LeafShapeFactor,&
    MaxLeafThickness,MaxLeaflength,MaxLeafwidth,PetiThickness,Petilength,Petiwidth,PetiShapeFactor,&
    MaxPetiThickness,MaxPetilength,MaxPetiwidth,StemThickness,Stemlength,Stemwidth,StemShapeFactor,&
    MaxStemThickness,MaxStemlength,MaxStemwidth,location)
    class(PlantNode_),intent(inout),target::obj
    character(*),intent(in) :: PlantName
    character(2),intent(in) :: Stage
    logical,optional,intent(in) :: regacy
    
    real(real64),optional,intent(in) :: LeafThickness,Leaflength,Leafwidth,LeafShapeFactor
    real(real64),optional,intent(in) :: MaxLeafThickness,MaxLeaflength,MaxLeafwidth
    real(real64),optional,intent(in) :: PetiThickness,Petilength,Petiwidth,PetiShapeFactor
    real(real64),optional,intent(in) :: MaxPetiThickness,MaxPetilength,MaxPetiwidth
    real(real64),optional,intent(in) :: StemThickness,Stemlength,Stemwidth,StemShapeFactor
    real(real64),optional,intent(in) :: MaxStemThickness,MaxStemlength,MaxStemwidth,location(3)
    real(real64) :: loc(3)



    if(present(regacy) )then
        if(regacy .eqv. .true.)then
            loc(:)=0.0d0
            if(present(location) )then
                loc(:)=location(:)
            endif
        
            if(trim(PlantName) == "soybean" .or. trim(PlantName) == "Soybean")then
                if(Stage == "VE")then
                    allocate(obj%Leaf(2) )
                    allocate(obj%Peti(2) )
                    allocate(obj%Flower(0) )
                    allocate(obj%Pod(0) )
                    allocate(obj%Stem(1) )
                    allocate(obj%Root(0) )

                
                    ! initialize leaf
                    call obj%Leaf(1)%init(ShapeFactor=LeafShapeFactor,&
                    Thickness=LeafThickness,length=Leaflength,&
                    width=Leafwidth,MaxThickness=MaxLeafThickness,&
                    Maxlength=MaxLeaflength,MaxWidth=MaxLeafWidth,&
                    location=location)
                    call obj%Leaf(2)%init(ShapeFactor=LeafShapeFactor,&
                    Thickness=LeafThickness,length=Leaflength,&
                    width=Leafwidth,MaxThickness=MaxLeafThickness,&
                    Maxlength=MaxLeaflength,MaxWidth=MaxLeafWidth,&
                    location=location)
                    ! initialize peti
                    call obj%Peti(1)%init(Thickness=PetiThickness,&
                    length=Petilength,&
                    width=Petiwidth,MaxThickness=MaxPetiThickness,&
                    Maxlength=MaxPetilength,MaxWidth=MaxPetiWidth,&
                    location=location)
                    call obj%Peti(2)%init(Thickness=PetiThickness,&
                    length=Petilength,&
                    width=Petiwidth,MaxThickness=MaxPetiThickness,&
                    Maxlength=MaxPetilength,MaxWidth=MaxPetiWidth,&
                    location=location)
                    ! initialize stem
                    call obj%Stem(1)%init(Thickness=StemThickness,&
                    length=Stemlength,&
                    width=Stemwidth,MaxThickness=MaxStemThickness,&
                    Maxlength=MaxStemlength,MaxWidth=MaxStemWidth,&
                    location=location)

                    ! joint leaves
                    obj%Leaf(1)%pPeti => obj%Peti(1)
                    obj%Leaf(2)%pPeti => obj%Peti(2)

                    ! joint peti
                    obj%Peti(1)%pStem => obj%Stem(1)
                    obj%Peti(2)%pStem => obj%Stem(1)
                
                    return
                else
                    return
                endif
            endif
        endif
    endif
end subroutine
! ########################################





! ########################################
subroutine exportNode(obj,FileName,ObjID)
    class(PlantNode_),intent(in) :: obj
    character(*),optional,intent(in) :: FileName
    integer(int32) :: i,max_num_of_peti_per_node,n
    integer(int32),intent(inout) :: objID

    max_num_of_peti_per_node=5

    do i=1,size(obj%Stem,1)
        call obj%Stem(i)%export(FileName=FileName//"_Stem"//trim(adjustl(fstring(i)))//".geo",StemID=objID)
    enddo

    do i=1,size(obj%Peti,1)
        call obj%Peti(i)%export(FileName=FileName//"_Peti"//trim(adjustl(fstring(i)))//".geo",PetiID=ObjID)
    enddo


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



end module