%	arakawa.s
%
%	Purpose:	Arakawa grid conversion
%	Copyright:	R.A. van Engelen, Leiden University, 1997
%
%	Use after importing fdm.s

include fdm.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	Convertable operators (operator result can be converted)
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

- X isa convertable_op_for(grid).
X + Y isa convertable_op_for(grid).
X - Y isa convertable_op_for(grid).
X * Y isa convertable_op_for(grid).
X / Y isa convertable_op_for(grid).
X ^ Y isa convertable_op_for(grid).
X max Y isa convertable_op_for(grid).
X min Y isa convertable_op_for(grid).
log(X) isa convertable_op_for(grid).

protect((X :: T)) :: T := X.

protect(X) latex precedence(none); "\overbrace", X, "^{\rm protect}".

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%	Arakawa grid conversion
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ave((_G2512 :: real ~ Unit), (_G2515 :: coordinate)) :: real ~ Unit.

ave arity 2 is (stencil_op and
linear and
abstraction_of(grid, choices = ( ave_g
, ave_h
, ave_c
))
).
ave(E, X) latex precedence(none); "\overline{", E, "}^", X. ave_g arity 2 is stencil_op and linear and self_commuting. ave_h arity 2 is stencil_op and linear and self_commuting. ave_c arity 2 is stencil_op and linear and self_commuting. ave_g(_G2509, x) is converter_of(grid). ave_g(_G2509, y) is converter_of(grid). ave_g(_G2509, z) is converter_of(grid). ave_h(_G2509, x) is converter_of(grid). ave_h(_G2509, y) is converter_of(grid). ave_h(_G2509, z) is converter_of(grid). ave_g((_G2513 :: field x(grid)), x) :: field x(half). ave_h((_G2513 :: field x(half)), x) :: field x(grid). ave_c((_G2513 :: field x(grid)), x) :: field x(grid). ave_g((_G2513 :: field y(grid)), y) :: field y(half). ave_h((_G2513 :: field y(half)), y) :: field y(grid). ave_c((_G2513 :: field y(grid)), y) :: field y(grid). ave_g((_G2513 :: field z(grid)), z) :: field z(half). ave_h((_G2513 :: field z(half)), z) :: field z(grid). ave_c((_G2513 :: field z(grid)), z) :: field z(grid). (ave_g((E :: real ~ Unit), X) ::
real ~ Unit := 1 / 2 * (E + E @ (X = X + 1)))
.
(ave_h((E :: real ~ Unit), X) ::
real ~ Unit := 1 / 2 * (E @ (X = X - 1) + E))
.
(ave_c((E :: real ~ Unit), X) ::
real ~ Unit := 1 / 2 * (E @ (X = X - 1) + E @ (X = X + 1)))
.
ave_g(E, X) latex precedence(none); "\overline{", E, "}^{", X, "_+}". ave_h(E, X) latex precedence(none); "\overline{", E, "}^{", X, "_-}". ave_c(E, X) latex precedence(none); "\overline{", E, "}^{2", X, "}".