如何在Fortran 90中创建圆形网格?

时间:2016-06-23 20:16:10

标签: grid fortran

我必须使用圆圈等式x² + y² = 1创建一个圆形网格,其中xy-11,增加0.1在每一步中。

我尝试了许多不同的事情,但失败了,所以如果有人能帮助我,我会很高兴。

我的一次尝试是:attempt one

PROGRAM cir
    IMPLICIT real*8(a-h, o-z)

    real  :: x(20,20), py(20,20), ny(20,20)

    delx = -1.1
    dely = -1.1

    DO i=1,20
        delx = delx + 0.1

        DO j=1.20

            x(i,j) = delx

            ny(i,j)= -1.0 * SQRT ( 1.0 - ( x(i,j)**2 ) )
            py(i,j)= SQRT ( 1.0 - ( x(i,j)**2)  )

            PRINT*, x(i,j), ny(i,j), py(i,j)

        END DO


    END DO

    STOP

END PROGRAM cir

另一个:attempt two

PROGRAM circle

    IMPLICIT real*8(a-h,o-z)

    real*8 :: x(20,20), y(20,20), z(20,20)

    delx = -1.0
    dely = -1.0

        DO i = 1, 20
        delx = delx + 0.1

        DO j = 1 , 20
            dely = dely + 0.1
            x(i,j) = delx
            y(i,j) = dely


            z(i,j) = x(i,j)**2 + y(i,j)**2 -1.0


        END DO
        delx = -1.0
        dely = -1.0

        PRINT*, x(i,j), y(i,j)


    END DO

    STOP

END PROGRAM circle

1 个答案:

答案 0 :(得分:2)

我们很难理解你想要达到的目标。目前,有两种可能性:

可能性1:您希望在x和{{1}之间以y为增量的0.1-1.0值对应的网格告诉我们这个网格点是在半径为1的圆的内部还是外部。

这是一个这样的程序可能是什么样子的例子,它的输出是:

1.0

输出:

program my_circle
    implicit none
    logical :: cir(-10:10, -10:10)
    real :: x, y
    integer :: i, j

    do i = -10, 10
        do j = -10, 10
            x = i / 10.0
            y = j / 10.0
            cir(j, i) = ((x**2 + y**2) <= 1.0)
        end do
    end do

    write(*, '(21A2)') print_cir(cir)

contains

    elemental function print_cir(c)
        ! returns " X" if true, " ." otherwise
        implicit none
        logical, intent(in) :: c
        character(len=2) :: print_cir

        if (c) then
            print_cir = " X"
        else
            print_cir = " ."
        end if
    end function print_cir

end program my_circle

可能性2:您需要一个描述圆圈本身的x / y坐标列表。在这种情况下, . . . . . . . . . . X . . . . . . . . . . . . . . . . X X X X X X X X X . . . . . . . . . . X X X X X X X X X X X X X . . . . . . . X X X X X X X X X X X X X X X . . . . . X X X X X X X X X X X X X X X X X . . . . X X X X X X X X X X X X X X X X X . . . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . X X X X X X X X X X X X X X X X X X X X X . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . . X X X X X X X X X X X X X X X X X X X . . . X X X X X X X X X X X X X X X X X . . . . X X X X X X X X X X X X X X X X X . . . . . X X X X X X X X X X X X X X X . . . . . . . X X X X X X X X X X X X X . . . . . . . . . . X X X X X X X X X . . . . . . . . . . . . . . . . X . . . . . . . . . . 的增量没有多大意义,因为每个象限只有3个点在你的网格和圆上:( 1.0 / 0.0),(0.8 / 0.6),和(0.6 / 0.8)。

所以对于这种可能性,我创建了一个小程序,打印出圆圈周围给定数量(当前为36)的点,用三角函数计算x和y:

0.1

输出:

program my_circle2
    implicit none
    integer, parameter :: num_points = 36
    real, parameter :: pi = 4.0 * ATAN(1.0) ! Best way to calculate PI

    integer :: i
    real :: r
    real, dimension(2, num_points) :: cir

    do i = 1, num_points
        r = 2.0 * pi * real(i) / real(num_points)
        cir(1, i) = sin(r)
        cir(2, i) = cos(r)
    end do

    do i = 1, num_points
        write(*, '(I5, 3F8.4)') i, cir(:, i), my_dist(cir(:, i))
    end do

contains

    function my_dist(c)
        ! Calculates the distance of (c(1)/c(2)) from origin
        ! for verification
        implicit none
        real, dimension(2), intent(in) :: c
        real :: my_dist
        my_dist = sqrt(c(1)**2 + c(2)**2)
    end function my_dist

end program my_circle2

这些是你想要的吗?