ex0010_CreateMeshEx2.f90 Source File


Source Code

module mesh_module
    use iso_fortran_env
    implicit none

contains

subroutine create2DRectMesh(NodCoord, ElemNod, ElemMat,xn, yn, lx, ly)
    real(real64),allocatable,intent(inout) :: NodCoord(:,:)
    integer(int32),allocatable,intent(inout) :: ElemNod(:,:)
    integer(int32),allocatable,intent(inout) :: ElemMat(:)

    integer(int32),intent(in) :: xn ! 要素分割数 for X方向
    integer(int32),intent(in) :: yn ! 要素分割数 for Y方向
    
    real(real64),intent(in) :: lx ! x方向長さ
    real(real64),intent(in) :: ly ! y方向長さ

    real(real64) :: unitx, unity

    integer(int32) :: i,j,n

    unitx=lx/dble(xn)
    unity=ly/dble(yn)
    
    ! creating rectangular mesh
    allocate(NodCoord( (xn+1)*(yn+1) , 2 ))
    allocate(ElemNod( xn*yn,4) )
    allocate(ElemMat(xn*yn) )

    n=0
    do j=1, yn+1
        do i=1, xn+1
            n=n+1
            NodCoord(n,1)=lx/dble(xn)*dble(i-1)
            NodCoord(n,2)=ly/dble(yn)*dble(j-1)
        enddo
    enddo
    
    n=1
    ElemNod(1,1)=1
    ElemNod(1,2)=2
    ElemNod(1,3)=yn+3
    ElemNod(1,4)=yn+2
    ElemNod(2,1)=2
    ElemNod(2,2)=3
    ElemNod(2,3)=yn+4
    ElemNod(2,4)=yn+3

    
    n=0
    do j=1, yn
        do i=1, xn
            n=n+1
            ElemNod(n,1)=i + (j-1)*(xn+1)
            ElemNod(n,2)=i+1 + (j-1)*(xn+1)
            ElemNod(n,3)=xn+2+i+ (j-1)*(xn+1)
            ElemNod(n,4)=xn+1+i + (j-1)*(xn+1)
            ElemMat(n)=1
        enddo
    enddo

end subroutine

end module 

program main
    use iso_fortran_env
    use plantfem
    use mesh_module
    implicit none

    real(real64),allocatable :: NodCoord(:,:)
    integer(int32),allocatable :: ElemNod(:,:)
    integer(int32),allocatable :: ElemMat(:)

    integer(int32) :: xn=2 ! 要素分割数 for X方向
    integer(int32) :: yn=2 ! 要素分割数 for Y方向
    
    real(real64) :: lx=2.0d0 ! x方向長さ
    real(real64) :: ly=2.0d0 ! y方向長さ


    call create2DRectMesh(NodCoord=NodCoord, ElemNod=ElemNod, ElemMat=ElemMat,&
        xn=xn, yn=yn, lx=lx, ly=ly)
    ! 材料番号のみ修正
    ElemMat(4)=2
    
    call print(Nodcoord)
    call print(ElemNod)
    call print(ElemMat)
    ! export
    ! ...略
    
end program main