5

Привет, У меня возникают проблемы с наложением граничных условий на двумерную проблему дискретизации в fortran. Моя сетка дискретизации представляет собой двумерный квадрат, который идет от -L до L в направлениях x, y.2D граничные условия в Fortran

Я хочу наложить граничное условие, чтобы на граничной линии при x = L задано значение функции. Я также хочу указать граничное условие на границе y = L. Тогда сделайте то же самое для x, y = -L.

Ниже приведена основная попытка правильного синтаксиса. Мне интересно, правильный ли этот синтаксис и/или самый быстрый способ делать то, что я делаю. Я предполагаю, что есть способ сделать это, не делая циклов, также используя нотацию двоеточия, просто не уверен, как это сделать.

Мое синтаксис может быть неправильным, так как я не уверен, как правильно использовать нотацию u (:) или что: действительно делает для меня. Благодаря!

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 
+0

Почему вы зацикливаете на i или j и не используете переменную цикла внутри внутри цикла? Вы должны * либо * использовать двоеточие нотации * или * петли в этом случае. – Ross

+0

@Ross Я перебираю i в первом цикле и использую переменную цикла i в первой строке, так как x определяется в терминах i. Также в цикле над j я использую переменную цикла в первой строке, когда я определяю y. Разве это не правильно или нет? Как мне это сделать с использованием двоеточия? Обозначает ли нотация двоеточия внутри нотации цикла? (Кажется, я смешиваю оба). Спасибо за вашу помощь! –

+1

Я пропустил, что x - это точечное значение. Тогда, я думаю, вы близки, но вам нужно установить 'u (i, ny)' вместо 'u (:, ny)'. Двоеточие указывает «все местоположения в этой строке/столбце», и вы хотите только установить один за раз на основе значения x. – Ross

ответ

4

Здесь не нужны колонии и, как указывает арка, часто путают проблему для новичков. Вы перебираете границу с индексом (либо i, либо j), что верно. Вам просто нужно установить соответствующее значение u, проиндексированное вашей индексной переменной. Например, для контура над 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 

двоеточие полезно и в других местах, и он ссылается на подмножество массива. u(:,ny) - это то же, что и u(-nx:nx,ny), что является 1-мерным массивом для каждого возможного i-индекса при j-индексе ny. Таким образом, вы сразу установили полное граничное условие на одно значение.

Еще один быстрый совет: обязательно отступы и другие конструкции. Код гораздо читабельнее.

Смежные вопросы