!/===========================================================================/
! Copyright (c) 2007, The University of Massachusetts Dartmouth 
! Produced at the School of Marine Science & Technology 
! Marine Ecosystem Dynamics Modeling group
! All rights reserved.
!
! FVCOM has been developed by the joint UMASSD-WHOI research team. For 
! details of authorship and attribution of credit please see the FVCOM
! technical manual or contact the MEDM group.
!
! 
! This file is part of FVCOM. For details, see http://fvcom.smast.umassd.edu 
! The full copyright notice is contained in the file COPYRIGHT located in the 
! root directory of the FVCOM code. This original header must be maintained
! in all distributed versions.
!
! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
! AND ANY EXPRESS OR  IMPLIED WARRANTIES, INCLUDING,  BUT NOT  LIMITED TO,
! THE IMPLIED WARRANTIES OF MERCHANTABILITY AND  FITNESS FOR A PARTICULAR
! PURPOSE ARE DISCLAIMED.  
!
!/---------------------------------------------------------------------------/
! CVS VERSION INFORMATION
! $Id$
! $Name$
! $Revision$
!/===========================================================================/

!==============================================================================|
!  CALCULATE FLUXES OF FREE SURFACE ELEVATION (CONTINUITY) EQUATION            |
!==============================================================================|
   SUBROUTINE EXTEL_EDGE(K)       
# if !defined (SEMI_IMPLICIT)
!==============================================================================|
   USE ALL_VARS
   USE BCS
   USE MOD_OBCS

#  if defined (SPHERICAL)
   USE MOD_NORTHPOLE
#  endif        

#  if defined (BALANCE_2D)
   USE MOD_BALANCE_2D
#  endif

!  ggao 0903/2007
#  if defined (ICE)
   use mod_ice,only : isicen  !,fresh,RHOW
#  endif

#  if defined (THIN_DAM)
   use mod_dam
#  endif


   IMPLICIT NONE
   INTEGER, INTENT(IN) :: K
   REAL(SP) :: XFLUX(0:MT)
   REAL(SP) :: DIJ,UIJ,VIJ,DTK,UN,EXFLUX
   INTEGER  :: I,J,I1,IA,IB,JJ,J1,J2

#  if defined (BALANCE_2D)
   REAL(SP), DIMENSION(0:MT) :: XFLUXU,XFLUXV
   REAL(SP), DIMENSION(0:NT) :: XFLUXU1,XFLUXV1
   REAL(SP) :: EXFLUX_U,EXFLUX_V
#  endif

#  if defined (THIN_DAM)
   INTEGER :: JN
#  endif
!==============================================================================|
   IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: extel_edge.F",K
!----------INITIALIZE FLUX ARRAY ----------------------------------------------!

   XFLUX = 0.0_SP

#  if defined (BALANCE_2D)
   XFLUXU= 0.0_SP
   XFLUXV= 0.0_SP
   XFLUXU1= 0.0_SP
   XFLUXV1= 0.0_SP
#  endif
!---------ACCUMULATE FLUX BY LOOPING OVER CONTROL VOLUME HALF EDGES------------!

   DO I=1,NCV
     I1  = NTRG(I)
     IA  = NIEC(I,1)
     IB  = NIEC(I,2)
     DIJ = D1(I1)

     UIJ = UA(I1)
     VIJ = VA(I1)
     EXFLUX = DIJ*(-UIJ*DLTYE(I) + VIJ*DLTXE(I))  

#    if defined (PLBC)
     EXFLUX = DIJ*(-UIJ*DLTYE(I) + 0.0_SP*DLTXE(I)) 
#    endif

     XFLUX(IA) = XFLUX(IA)-EXFLUX
     XFLUX(IB) = XFLUX(IB)+EXFLUX

#  if defined (BALANCE_2D)
     EXFLUX_U = -DIJ*UIJ*DLTYE(I)
     EXFLUX_V =  DIJ*VIJ*DLTXE(I)
     XFLUXU(IA) = XFLUXU(IA)-EXFLUX_U
     XFLUXU(IB) = XFLUXU(IB)+EXFLUX_U
     XFLUXV(IA) = XFLUXV(IA)-EXFLUX_V
     XFLUXV(IB) = XFLUXV(IB)+EXFLUX_V
#  endif

   END DO

!   write(ipt,*) "after control volume flux",maxval(xflux),minval(xflux)
!   write(ipt,*) "after control volume flux",maxloc(xflux),minloc(xflux)

#  if defined (SPHERICAL)
   CALL EXTEL_EDGE_XY(K,XFLUX)
#  endif

!--ADD EVAPORATION AND PRECIPITATION TERMS-------------------------------------!
   IF (PRECIPITATION_ON) THEN
#  if defined (ICE)
      WHERE(ISICEN==1)
         QPREC2=QPREC
         QEVAP2=QEVAP
      END WHERE

!!$       DO I=1,M
!!$        IF(ISICEN(i)==1) THEN
!!$          QPREC2(I)= QPREC3(I)
!!$          QEVAP2(I)= QEVAP3(I)
!!$        END IF
!!$       END DO
#  endif

!qxu   XFLUX = XFLUX+(QEVAP2-QPREC2)*ROFVROS*ART1 
!qxu---the evap is negative for evaporating in ocean
      XFLUX = XFLUX-(QEVAP2+QPREC2)*ROFVROS*ART1 
   END IF
    
!--ADD GROUND WATER TERM-------------------------------------------------------!

   IF(GROUNDWATER_ON) THEN
      XFLUX = XFLUX - BFWDIS2
   END IF

!--SAVE ACCUMULATED FLUX ON OPEN BOUNDARY NODES AND ZERO OUT OPEN BOUNDARY FLUX!

   IF(IOBCN > 0) THEN  
     DO I=1,IOBCN
       XFLUX_OBCN(I)=XFLUX(I_OBC_N(I))
       XFLUX(I_OBC_N(I)) = 0.0_SP
     END DO
   END IF


!---------ADJUST FLUX FOR FRESH WATER DISCHARGE--------------------------------!

   IF(NUMQBC >= 1) THEN   
     IF(RIVER_INFLOW_LOCATION == 'node') THEN
       DO J=1,NUMQBC
         JJ=INODEQ(J)
         XFLUX(JJ)=XFLUX(JJ)-QDIS(J)
       END DO
     ELSE IF(RIVER_INFLOW_LOCATION == 'edge') THEN
       DO J=1,NUMQBC
         J1=N_ICELLQ(J,1)
         J2=N_ICELLQ(J,2)
         XFLUX(J1)=XFLUX(J1)-QDIS(J)*RDISQ(J,1)
         XFLUX(J2)=XFLUX(J2)-QDIS(J)*RDISQ(J,2)
       END DO
     END IF
   END IF


!----------PERFORM UPDATE ON ELF-----------------------------------------------!

   DTK = ALPHA_RK(K)*DTE
   ELF = ELRK - DTK*XFLUX/ART1
!!#  if defined (THIN_DAM)
!!   DO I=1,NODE_DAM1_N
!!     JN=I_NODE_DAM1_N(I,1)
!!     ELF(JN)=ELRK(JN)-DTK*(XFLUX(JN)+XFLUX(I_NODE_DAM1_N(I,2)))&
!!          &/(ART1(JN)+ART1(I_NODE_DAM1_N(I,2)))
!!     ELF(I_NODE_DAM1_N(I,2))=ELF(JN)
!!   END DO
!!   DO I=1,NODE_DAM2_N
!!     JN=I_NODE_DAM2_N(I,1)
!!     ELF(JN)=ELRK(JN)-DTK*(XFLUX(JN)+XFLUX(I_NODE_DAM2_N(I,2))&
!!          &+XFLUX(I_NODE_DAM2_N(I,3)) )&
!!          &/(ART1(JN)+ART1(I_NODE_DAM2_N(I,2))+ART1(I_NODE_DAM2_N(I,3)))
!!     ELF(I_NODE_DAM2_N(I,2))=ELF(JN)
!!     ELF(I_NODE_DAM2_N(I,3))=ELF(JN)
!!   END DO
!!   DO I=1,NODE_DAM3_N
!!     JN=I_NODE_DAM3_N(I,1)
!!     ELF(JN)=ELRK(JN)-DTK*(XFLUX(JN)+XFLUX(I_NODE_DAM3_N(I,2))&
!!          &+XFLUX(I_NODE_DAM3_N(I,3))+XFLUX(I_NODE_DAM3_N(I,4)) )&
!!          &/(ART1(JN)+ART1(I_NODE_DAM3_N(I,2))+ART1(I_NODE_DAM3_N(I&
!!          &,3))+ART1(I_NODE_DAM3_N(I,4)))
!!     ELF(I_NODE_DAM3_N(I,2))=ELF(JN)
!!     ELF(I_NODE_DAM3_N(I,3))=ELF(JN)
!!     ELF(I_NODE_DAM3_N(I,4))=ELF(JN)
!!   END DO
!!#  endif

!
!--STORE VARIABLES FOR MOMENTUM BALANCE CHECK----------------------------------|
!
#  if defined (BALANCE_2D)

   DO I=1,N
     XFLUXU1(I)=ONE_THIRD*(XFLUXU(NV(I,1))+ XFLUXU(NV(I,2))+ XFLUXU(NV(I,3)))
     XFLUXV1(I)=ONE_THIRD*(XFLUXV(NV(I,1))+ XFLUXV(NV(I,2))+ XFLUXV(NV(I,3)))
   END DO
   
   IF(K == 4) THEN
     DIVX2D2 = DIVX2D2 + XFLUXU1/ART/FLOAT(ISPLIT)            !dUD/dx
     DIVY2D2 = DIVY2D2 + XFLUXV1/ART/FLOAT(ISPLIT)            !dVD/dy
     DEDT2   = DEDT2 + (ELF1-ELRK1*(H1+ELRK1)/(H1+ELF1))/DTE/FLOAT(ISPLIT)    
   END IF     
#  endif
  
   IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "END: extel_edge.F"

#  endif
   RETURN
   END SUBROUTINE EXTEL_EDGE
!==============================================================================|