Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

2D boundary conditions in Fortran

Hi I am having trouble with imposing boundary conditions on a 2 dimensional discretization problem in fortran. My discretization grid is a 2 dimensional square that goes from -L to L in x,y directions.

I want to impose the boundary condition such that, on the boundary line at x=L , the value of the function is specified. I also want to specify the boundary condition at the boundary line y=L. Then do the same for x,y=-L.

A basic attempt at the correct syntax is below. I am wondering if this syntax is correct and/or the quickest way at doing what I am doing. I assume there is a way to do it without do loops also using the colon notation just not sure how.

My syntax may be incorrect as I am unsure how to properly use the u(:) notation, or what the : really is doing for me. Thanks!

integer :: i,j
integer, parameter :: nx=60, ny=60
real, parameter :: h=0.1 !step size
real, dimension(-nx:nx,-ny:ny) :: u
real :: L

L=h*nx

do i = -nx, nx

x = real(i)*h

u(:,ny) = cos(atan(L/x)) ! is this correct?
u(:,-ny) = cos(atan((-L)/x))

end do

do j = -ny, ny

y = real(j)*h

u(nx, :) = cos(atan(y/L))
u(-nx, :) = cos(atan(y/(-L)))

end do
like image 797
Jeff Faraci Avatar asked Sep 23 '16 19:09

Jeff Faraci


1 Answers

Colons are unnecessary here and, as arclight points out, often confuse the issue for beginners. You're looping over the boundary with an index value (either i or j), which is correct. You just have to set the corresponding u value indexed with your index variable. For example, for the loop over i:

do i = -nx, nx
   x = real(i)*h
   u(i,ny) = cos(atan(L/x))
   u(i,-ny) = cos(atan((-L)/x))
end do

A colon is useful in other places, and it references a subset of the array. u(:,ny) is the same as u(-nx:nx,ny), which is a 1D array for each possible i-index at j-index of ny. So you had been setting the entire boundary condition at once to a single value.

Another quick piece of advice: be sure to indent loops and other structures. Code is much more readable that way.

like image 127
Ross Avatar answered Nov 07 '22 14:11

Ross