MODULE advec_s_pw_mod !------------------------------------------------------------------------------! ! Actual revisions: ! ----------------- ! ! ! Former revisions: ! ----------------- ! $Log: advec_s_pw.f90,v $ ! Revision 1.12 2006/02/23 09:42:55 raasch ! nzb_2d replaced by nzb_s_inner ! ! Revision 1.11 2004/01/30 10:10:03 raasch ! Scalar lower k index nzb replaced by 2d-array nzb_2d ! ! Revision 1.10 2003/03/12 16:15:32 raasch ! Full code replaced in the call for all gridpoints instead of calling the ! _ij version (required by NEC, because otherwise no vectorization) ! ! Revision 1.9 2002/06/11 12:22:14 raasch ! Former subroutine changed to a module which allows to be called for all grid ! points of a single vertical column with index i,j or for all grid points by ! using function overloading. ! Array sk now declared as a pointer. ! ! Revision 1.8 2001/03/29 17:30:14 raasch ! Translation of remaining German identifiers (variables, subroutines, etc.) ! ! Revision 1.7 2001/01/22 04:41:39 raasch ! Module test_variables removed ! ! Revision 1.6 2000/01/20 09:13:33 letzel ! All comments translated into English ! ! Revision 1.5 1998/07/06 12:03:09 raasch ! + USE test_variables ! ! Revision 1.4 1998/04/21 15:51:53 raasch ! Galilei-Transformation eingebaut ! ! Revision 1.3 1998/02/10 14:57:53 raasch ! Es wird jetzt grundsaetzlich die Form C3 verwendet ! ! Revision 1.2 1997/09/09 08:27:10 raasch ! Kehrwerte der Gitterweiten implementiert ! ! Revision 1.1 1997/08/29 08:54:20 raasch ! Initial revision ! ! ! Description: ! ------------ ! Advection term for scalar variables using the Piacsek and Williams scheme ! (form C3). Contrary to PW itself, for reasons of accuracy their scheme is ! slightly modified as follows: the values of those scalars that are used for ! the computation of the flux divergence are reduced by the value of the ! relevant scalar at the location where the difference is computed (sk(k,j,i)). ! NOTE: at the first grid point above the surface computation still takes place! !------------------------------------------------------------------------------! PRIVATE PUBLIC advec_s_pw INTERFACE advec_s_pw MODULE PROCEDURE advec_s_pw MODULE PROCEDURE advec_s_pw_ij END INTERFACE CONTAINS !------------------------------------------------------------------------------! ! Call for all grid points !------------------------------------------------------------------------------! SUBROUTINE advec_s_pw( sk ) USE arrays_3d USE control_parameters USE grid_variables USE indices IMPLICIT NONE INTEGER :: i, j, k REAL, DIMENSION(:,:,:), POINTER :: sk DO i = nxl, nxr DO j = nys, nyn DO k = nzb_s_inner(j,i)+1, nzt-1 tend(k,j,i) = tend(k,j,i) & -0.5 * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) & - ( u(k,j,i) - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) & ) * ddx & -0.5 * ( ( v(k,j+1,i) - v_gtrans ) * ( sk(k,j+1,i) - sk(k,j,i) ) & - ( v(k,j,i) - v_gtrans ) * ( sk(k,j-1,i) - sk(k,j,i) ) & ) * ddy & - ( w(k,j,i) * ( sk(k+1,j,i) - sk(k,j,i) ) & - w(k-1,j,i) * ( sk(k-1,j,i) - sk(k,j,i) ) & ) * dd2zu(k) ENDDO ENDDO ENDDO END SUBROUTINE advec_s_pw !------------------------------------------------------------------------------! ! Call for grid point i,j !------------------------------------------------------------------------------! SUBROUTINE advec_s_pw_ij( i, j, sk ) USE arrays_3d USE control_parameters USE grid_variables USE indices IMPLICIT NONE INTEGER :: i, j, k REAL, DIMENSION(:,:,:), POINTER :: sk DO k = nzb_s_inner(j,i)+1, nzt-1 tend(k,j,i) = tend(k,j,i) & -0.5 * ( ( u(k,j,i+1) - u_gtrans ) * ( sk(k,j,i+1) - sk(k,j,i) ) & - ( u(k,j,i) - u_gtrans ) * ( sk(k,j,i-1) - sk(k,j,i) ) & ) * ddx & -0.5 * ( ( v(k,j+1,i) - v_gtrans ) * ( sk(k,j+1,i) - sk(k,j,i) ) & - ( v(k,j,i) - v_gtrans ) * ( sk(k,j-1,i) - sk(k,j,i) ) & ) * ddy & - ( w(k,j,i) * ( sk(k+1,j,i) - sk(k,j,i) ) & - w(k-1,j,i) * ( sk(k-1,j,i) - sk(k,j,i) ) & ) * dd2zu(k) ENDDO END SUBROUTINE advec_s_pw_ij END MODULE advec_s_pw_mod