C===================================================== C This subroutine initializes fields and masks arrays C===================================================== SUBROUTINE INI_FIELDS implicit none #include "SIZE.h" #include "SWE.h" #include "MASKS.h" integer i,j integer len_of_rec len_of_rec = nx*8 C First set everything to 0. This will take care of default C no normal flow BC do j=0,ny+1 do i=0,nx+1 u(i,j)=0.d0 v(i,j)=0.d0 eta(i,j)=0.d0 H(i,j)=0.d0 enddo enddo C Read initial u, v, and eta from files open(unit=22,file=uiniFile,status='old',access='direct', & recl=len_of_rec) open(unit=23,file=viniFile,status='old',access='direct', & recl=len_of_rec) open(unit=24,file=etainiFile,status='old',access='direct', & recl=len_of_rec) write(*,*)'Initial u, v, and eta read from:' write(*,*)uiniFile,viniFile,etainiFile C Read bathymetry (water depth) open(unit=25,file=BathyFile,status='old',access='direct', & recl=len_of_rec) write(*,*)'Bathymetry (H) read from' write(*,*)BathyFile do j=1,ny call read_r8seg(nx,u(1,j),22,j) call read_r8seg(nx,v(1,j),23,j) call read_r8seg(nx,eta(1,j),24,j) call read_r8seg(nx,H(1,j),25,j) enddo close(22) close(23) close(24) close(25) if (PeriodicInX) then write(*,*) 'Setting periodic in X...' do j=0,ny+1 H(0,j)=H(nx,j) H(nx+1,j)=H(1,j) eta(0,j)=eta(nx,j) u(nx+1,j)=u(1,j) ! actual periodic BC v(0,j)=v(nx,j) ! for coriolis enddo endif if (PeriodicInY) then write(*,*) 'Setting periodic in Y...' do i=0,nx+1 H(i,0)=H(i,ny) H(i,ny+1)=H(i,1) eta(i,0)=eta(i,ny) u(i,0)=u(i,ny) ! for coriolis v(i,ny+1)=v(i,1) ! actual periodic BC enddo endif C Precompute H on u and v grid: (i,j) below is associated with C eta(i,j). Hup1(i,j) <-> u(i+1,j), Hum1(i,j) <-> u(i,j), C Hvp1(i,j) <-> v(i,j+1), Hvm1(i,j) <-> v(i,j) do j=1,ny do i=1,nx Hup1(i,j) = min(H(i,j),H(i+1,j)) Hum1(i,j) = min(H(i,j),H(i-1,j)) Hvp1(i,j) = min(H(i,j),H(i,j+1)) Hvm1(i,j) = min(H(i,j),H(i,j-1)) enddo enddo end