5

Witam Mam problem z nałożeniem warunków brzegowych na dwuwymiarowy problem dyskretyzacji w fortran. Moja siatka dyskretyzacji to dwuwymiarowy kwadrat, który przechodzi od -L do L w kierunkach x, y.Warunki brzegowe 2D w Fortranie

Chcę narzucić warunek brzegowy, aby na linii granicznej na x = L, wartość funkcji została określona. Chcę również określić warunek brzegowy na linii granicznej y = L. Następnie wykonaj to samo dla x, y = -L.

Podstawowa próba poprawnej składni znajduje się poniżej. Zastanawiam się, czy ta składnia jest poprawna i/lub najszybszy sposób robienia tego, co robię. Zakładam, że istnieje sposób, aby to zrobić bez pętli również przy użyciu notacji dwukropka po prostu nie wiem jak.

Moja składnia może być niepoprawna, ponieważ nie jestem pewien, jak poprawnie użyć notacji u (:) lub: co naprawdę robi dla mnie. Dzięki!

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

Dlaczego używasz pętli i lub j i nie używasz zmiennej pętli we wszystkich pętlach? Powinieneś * albo * użyć w tym przypadku notacji dwukropka * lub * pętli. – Ross

+0

@Ross Pętlę I w pierwszej pętli, i używając zmiennej pętli, I, w pierwszym wierszu, ponieważ x jest zdefiniowany jako i. Również w pętli nad j, używam zmiennej pętli w pierwszym wierszu, gdy definiuję y. Czy to nie jest poprawne, czy nie? Jak to zrobić za pomocą zapisu dwukropka? Czy notacja dwukropka działa w notacji pętli? (Wydaje się, że miksuję oba). Dzięki za pomoc! –

+1

Brakowało mi, że x jest wartością punktową. Wtedy myślę, że jesteś blisko, ale musisz ustawić 'u (i, ny)' zamiast 'u (:, ny)'. Dwukropek wskazuje "wszystkie lokalizacje w tym wierszu/kolumnie", a chcesz ustawić tylko jeden na raz na podstawie wartości x. – Ross

Odpowiedz

4

Colons są tu niepotrzebne i, jak podkreśla arclight, często mylą problem dla początkujących. Pętla nad granicą z wartością indeksu (albo i lub j), co jest poprawne. Musisz tylko ustawić odpowiednią wartość indeksu z wartością indeksu. Na przykład, dla pętli na 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 

Okrężnicy jest przydatny w innych miejscach, a nie odwołuje się podzbiór tablicy. u(:,ny) jest taki sam jak u(-nx:nx,ny), który jest tablicą 1D dla każdego możliwego indeksu i na j-indeksie ny. Więc ustawiłeś cały warunek brzegowy naraz na jedną wartość.

Kolejna szybka porada: pamiętaj, aby wykonać wcięcia w pętle i inne struktury. Kod jest znacznie bardziej czytelny w ten sposób.