```
TALK=T;RUN(1,1)

DISPLAY

In-Form is used to supply, at the boundaries of a 2D box with x
horizontal and y vertical, boundary conditions of pressure and
velocity which correspond to an ideal-fluid travelling gravity
wave in moderately deep water.

Within the box, the pressure and velocity are computed from the
momentum and energy equations in the usual way.

It is interesting to compare their values with those
corresponding to the ideal-fluid wave, namely: pdif, udif and vdif

If OBSTCL=T, an obstacle appears on the the sea-bed.
If STRA  =T, the stresses and strains in it are computed

ENDDIS

Constants used for connecting p1, u1, v1 with ppot, upot and vpot
at the boundaries.
Declarations:
real(pcow,ucow,vcow,pcoe,ucoe,vcoe)
integer(lstepw)  ! duration of whole-field patches
boolean(obstcl)
Settings
STRA   = F
obstcl = f
obstcl = t
ucow=1.e10; vcow=1.e10; pcow=1.e10
ucoe=1.e10; vcoe=1.e10; pcoe=1.e5

lstepw=2 ! flow field is fixed to potential for first 2 time steps

nx=50      ! discretization in space
ny=50
nx=5
ny=5
lstep=50   ! and time
lstep=5   ! and time

lstep=100
! surface-wave-defining constants
real(lamda,aa,m,h,sig,g,arg,speed,const,twopi,tim1)
g=9.81       ! gravitational acceleration
h=40.0       ! total depth of water
lamda=120    ! wave-length
lamda=1200    ! wave-length
twopi=2.0*3.1416
m=twopi/lamda
arg=m*h
const=tanh(arg)
sig=(g*m*const)**0.5
speed=sig/m
tlast=lamda/speed
tlast=tlast*lstep/100

tim1=tlast/lstep ! time after first time interval
sig
speed
tlast
tim1
aa=3.0           ! amplitude of wave
aa=0.3         ! amplitude of wave

xulast=lamda ! extent of domain in wave-travel direction
yvlast=0.75*h ! domain extent above ocean floor
resfac=0.
resref(1)=0.0
endit(1) =0.0
resref(3)=0.0
endit(3) =0.0
resref(5)=0.0
endit(5) =0.0
isg21=lsweep
#unigrid   ! use uniform grid
solve(p1,u1,v1)
rho1=1.000e3
rho1=1.
liter(p1)=1000
store(imb1,pcor,min1)
(stored var udif is u1-upot )
(stored var vdif is v1-vpot )
(stored var pdif is p1-ppot )
store(pdcx)
relax(u1,falsdt,1.e6)
relax(v1,falsdt,1.e6)

!!!! patches !!!!!
!!!! for inform-created variables !!!!!
patch(whole,phasem,1,nx,1,ny,1,nz,1,lstep)   ! for pot, ppot, upot, vpot
! and initial values
!!!! zero-pressure outer patches
patch(p1x,phasem,1,1,1,ny,1,nz,1,lstep)      ! west edge
coval(p1x,p1,fixval,0.0)

patch(pny,phasem,1,nx,ny,ny,1,nz,1,lstep)    ! north edge
coval(pny,p1,fixval,0.0)

patch(pnx,phasem,nx,nx,1,ny,1,nz,1,lstep)    ! east edge
coval(pnx,p1,fixval,0.0)

!!!! next-inner pressure patches
patch(>ppot2x,phasem,2,2,1,ny-1,1,nz,1,lstep)        ! near west edge
coval(>ppot2x,p1,pcoe,1)

patch(>ppotny1,phasem,2,nx-1,ny-1,ny-1,1,nz,1,lstep) ! near north edge
coval(>ppotny1,p1,pcoe,1)

patch(>ppotnx1,phasem,nx-1,nx-1,1,ny-1,1,nz,1,lstep)   ! near east edge
coval(>ppotnx1,p1,pcoe,1)

!!!! velocity patches near boundaries
patch(>upot1x,phasem,1,1,1,ny,1,nz,1,lstep)          ! near west edge
coval(>upot1x,u1,ucoe,1)

patch(>vpot1x,phasem,1,1,1,ny-1,1,nz,1,lstep)
coval(>vpot1x,v1,vcoe,1)

patch(>upotny,phasem,1,nx,ny,ny,1,nz,1,lstep)        ! near north edge
coval(>upotny,u1,ucoe,1)

patch(>vpotny1,phasem,1,nx,ny-1,ny-1,1,nz,1,lstep)
coval(>vpotny1,v1,vcoe,1)       ! edges

patch(>upotnx1,phasem,nx-1,nx-1,1,ny-1,1,nz,1,lstep) ! near east edge
coval(>upotnx1,u1,ucoe,1)

patch(>vpotnx,phasem,nx,nx,1,ny-1,1,nz,1,lstep)
coval(>vpotnx,v1,vcoe,1)

!!!! whole-field patches for lstepw time steps
patch(>ppotw,phasem,1,nx,1,ny,1,nz,1,lstepw)
coval(>ppotw,p1,pcow ,1)

patch(>upotw,phasem,1,nx,1,ny,1,nz,1,lstepw)
coval(>upotw,u1,ucow,1)        ! whole domain

patch(>vpotw,phasem,1,nx,1,ny-1,1,nz,1,lstepw)
coval(>vpotw,v1,vcow,1)        ! whole domain

! defining the velocity potential and derived quantities
char(form)     ! declare character variable

Formula for the potential as function of space and time
form=aa*(cosh(m*yg))*cos(m*xg-sig*tim)
(stored var pot is :form:)
form=aa*(cosh(m*yg))*cos(m*xg-sig*tim1)  ! note use of tim1
(initial of pot at whole is :form:)

Formula for the potential-derived u velocity =
- d pot/dx     Note: d/dx of cos mx = - m*sin ; so plus is OK
form = aa*m*(cosh(m*yg))*sin(m*xu-sig*tim) ! for all times
(stored var upot at whole is :form:)
form = aa*m*(cosh(m*yg))*sin(m*xu-sig*tim1) ! note use of tim1 here
(initial of upot at whole is :form:)
(initial of u1 at whole is :form:)

Formula for the potential-derived v velocity, =
- d pot / dy  Note: d/dy of cosh my is sinh my ; so minus is appropriate
form = - aa*m*(sinh(m*yv))*cos(m*xg-sig*tim)
(stored var vpot at whole is :form:)
form = - aa*m*(sinh(m*yv))*cos(m*xg-sig*tim1)  ! note use of tim1
(initial of vpot at whole is :form:)
(initial of v1 at whole is :form:)

Formula for potential-derived  pressure =
d pot / dt     Note: d/dt of cos mx - sig t = -(-sig)*sin ; so plus is OK
const=sig*aa*rho1
form = const*(cosh(m*yg))*sin(m*xg-sig*tim)
(stored var ppot at whole is :form:)
form = const*(cosh(m*yg))*sin(m*xg-sig*tim1) ! note use of tim1
(initial of ppot at whole is :form:)
(initial of p1 at whole is :form:)
if(nz.eq.1) then
idispa=lstep/50       ! for dumping to parphi
endif
text(p :pcow: :pcoe: u :ucow: :ucoe:

obstacle to u1 on floor
patch(obstcl1,phasem,nx/2,nx/2,1,ny/2,1,1,1,lstep)
patch(obstcl1,phasem,nx/2,nx/2,1,ny/2,1,1,1,lstep)
coval(obstcl1,u1,1.e10,0.0)

structure on ocean floor
__________
C        !  ____  !
B        !  !//!  !
!  !//!  !
!  !//!  !
!  !//!  !
A        !  !//!  !
!//!  !
--------------------------!//!--!-----------------------------------
1  2  3  4

integer(ix1,ix2,ix3,ix4,iyA,iyB,iyC)
ix1=nx/2
ix2=ix1+2
ix3=ix2
ix4=ix3+2
iyA=5
iyB=iyA+10
iyC=iyB+5

store(prps)
fiinit(prps)= -1
if(obstcl) then
iya=1
patch(wall11,inival,ix1,ix1,iyA,iyC,1,1,1,lstep)
init(wall11,prps,0,100)

patch(wall23,inival,ix2,ix3,1,iyB,1,1,1,lstep)
init(wall23,prps,0,100)

patch(wall44,inival,ix4,ix4,1,iyC,1,1,1,lstep)
init(wall44,prps,0,100)

patch(topC,inival,ix1,ix4,iyC+1,iyC+1,1,1,1,lstep)
init(topC,prps,0,100)

patch(bottom,phasem,ix3,ix4,1,1,1,1,1,lstep)
coval(bottom,p1,fixval,0.0)
endif
#maxabs

# the number of spedat special-print commands
SPEDAT(PRINT,NUMBER,I,3)

# the command to print minimum and maximum values
SPEDAT(PRINT,COMMAND1,C,MINMAX_p1)
SPEDAT(PRINT,COMMAND2,C,MINMAX_u1)
SPEDAT(PRINT,COMMAND3,C,MINMAX_v1)
SPEDAT(PRINT,COMMAND4,C,MINMAX_v1sl)
SPEDAT(PRINT,COMMAND6,C,MINMAX_imb1)
SPEDAT(PRINT,COMMAND7,C,MINMAX_pcor)
-----------------------------------------
if(stra) then
STORE(EPSZ,EPSY,EPSX,STRZ,STRY,STRX,DRH1,DVO1,ENUL,DEN1,PRPS)
PATCH(BOTTOM11,SOUTH ,   ix1,   ix1,   1,   1,   1,   1,   1,  50)
COVAL(BOTTOM11,U1  , 1.000000E+10, 0.000000E+00)
COVAL(BOTTOM11,V1  , 1.000000E+10, 0.000000E+00)

PATCH(BOTTOM23,SOUTH ,   ix2,   ix3,   1,   1,   1,   1,   1,  50)
COVAL(BOTTOM23,U1  , 1.000000E+10, 0.000000E+00)
COVAL(BOTTOM23,V1  , 1.000000E+10, 0.000000E+00)

PATCH(BOTTOM44,SOUTH ,   ix4,   ix4,   1,   1,   1,   1,   1,  50)
COVAL(BOTTOM44,U1  , 1.000000E+10, 0.000000E+00)
COVAL(BOTTOM44,V1  , 1.000000E+10, 0.000000E+00)
SPEDAT(SET,RLXFAC,RLXU1D,R,7.50000E-01)
SPEDAT(SET,LONGNAME,P1,C,PRESSURE_OR_DILATATION)
SPEDAT(SET,LONGNAME,ENUL,C,VISCOSITY_OR_LPLUS2G*1.E11)
SPEDAT(SET,LONGNAME,DRH1,C,COMPRESSIBILITY_OR_LPLUSG*1.E11)
SPEDAT(SET,LONGNAME,DVO1,C,TH.EXP.CO_R_OR_H*1.E11)
SPEDAT(SET,LONGNAME,U1,C,X-DIRECTION_VELOCITY_OR_DISPLACEM\$)
SPEDAT(SET,LONGNAME,U1,C,ENT)
SPEDAT(SET,LONGNAME,EPSX,C,X-DIRECTION_STRAIN)
SPEDAT(SET,LONGNAME,STRX,C,X-DIRECTION_STRESS)
SPEDAT(SET,LONGNAME,V1,C,Y-DIRECTION_VELOCITY_OR_DISPLACEM\$)
SPEDAT(SET,LONGNAME,V1,C,ENT)
SPEDAT(SET,LONGNAME,EPSY,C,Y-DIRECTION_STRAIN)
SPEDAT(SET,LONGNAME,STRY,C,Y-DIRECTION_STRESS)
SPEDAT(SET,LONGNAME,U1,C,X-DIRECTION_VELOCITY_OR_DISPLACEM\$)
SPEDAT(SET,LONGNAME,U1,C,ENT)
SPEDAT(SET,LONGNAME,V1,C,Y-DIRECTION_VELOCITY_OR_DISPLACEM\$)
SPEDAT(SET,LONGNAME,V1,C,ENT)
SPEDAT(SET,LONGNAME,EPSZ,C,Z-DIRECTION_STRAIN)
SPEDAT(SET,LONGNAME,STRZ,C,Z-DIRECTION_STRESS)
SPEDAT(SET,LONGNAME,EPST,C,LINEARTHERMALEXPANSION)
SPEDAT(SET,PRINT,NUMBER,I,7)
SPEDAT(SET,PRINT,COMMAND1,C,MINMAX_P1)
SPEDAT(SET,PRINT,COMMAND2,C,MINMAX_U1)
SPEDAT(SET,PRINT,COMMAND3,C,MINMAX_V1)
SPEDAT(SET,PRINT,COMMAND3,C,MINMAX_strx)
SPEDAT(SET,PRINT,COMMAND3,C,MINMAX_stry)
SPEDAT(SET,PRINT,COMMAND3,C,MINMAX_epsx)
SPEDAT(SET,PRINT,COMMAND3,C,MINMAX_epsy)
endif                    ! end of stress additions
difcut=0
ixmon=nx/2;iymon=ny/2;izmon=nz/2
tstswp=-1
nxprin=1
nyprin=1
iyprf=1;iyprl=iyc
ixprf=ix1-2;ixprl=ix4-2
ntprin=lstep/5
nprint=1

informbegin
debug t
initial f
store t
formula t
informend

debug=t
lsweep=25
lsweep=10
lsweep=1
lstep=3
ntprin=1
istprf=3
istdb1=3
istdb2=3
iyprf=1
iyprl=2
ixprf=1;ixprl=4
dbindx=t
search=t;idbf0=108591
dbcomp=t
dbsoda=t
dbcmpn=t
dbcmpe=t
dbsol2=t
dbgphi(1)=t
dbgphi(3)=t
dbgphi(5)=t
dbgphi(9)=t
dbflux=t
dbconv=t
stop
```