!/===========================================================================/ ! 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$ !/===========================================================================/ MODULE MOD_NORTHPOLE USE ALL_VARS USE MOD_SPHERICAL USE MOD_PAR USE MOD_UTILS IMPLICIT NONE SAVE INTEGER :: NODE_NORTHPOLE !Node index at the north pole point INTEGER :: MP,NP,NPE,NPCV INTEGER, ALLOCATABLE :: NODE_NORTHAREA(:) INTEGER, ALLOCATABLE :: CELL_NORTHAREA(:) INTEGER, ALLOCATABLE :: NPEDGE_LST(:) INTEGER, ALLOCATABLE :: NCEDGE_LST(:) INTEGER, ALLOCATABLE :: MP_LST(:),NP_LST(:) REAL(DP), ALLOCATABLE :: A1U_XY(:,:),A2U_XY(:,:) REAL(DP), ALLOCATABLE :: AW0_XY(:,:),AWX_XY(:,:),AWY_XY(:,:) # if defined (SEMI_IMPLICIT) REAL(SP), ALLOCATABLE :: XFLUX3_NP(:,:), YFLUX3_NP(:,:) REAL(SP), ALLOCATABLE :: UBETA_NP(:,:),VBETA_NP(:,:) # endif CONTAINS !==============================================================================| SUBROUTINE FIND_NORTHPOLE IMPLICIT NONE INTEGER :: I,ITMP,NODE_NORTHPOLE_GL,IERR,NDOM INTEGER,ALLOCATABLE :: TMP(:) NODE_NORTHPOLE = 0 ! NODE_NORTHPOLE_GL = 0 NP = 0 MP = 0 NPE = 0 NPCV = 0 NDOM=0 DO I = 1,MT ! IF(ABS(VY(I)-90.0_SP) .LE. (NEAREST(90.0_SP,1.0_sp) - 90.0_SP))THEN IF(ABS(VY(I)-90.0_SP) .LE. 10E-4)THEN NODE_NORTHPOLE = I ndom=ndom+1 END IF END DO IF (nDOM .GT. 1) CALL Fatal_Error('Found more than one north pole node in the grid',& &'This should never happen, TGE should crash first?') ! SINCE SPHERICAL NOW ALWAYS LOOKS FOR A NORTH POLE, DO NOT CALL ! FATAL_ERROR IF WE DON'T FIND A NORTH POLE! NODE_NORTHPOLE_GL = NGID_X(NODE_NORTHPOLE) # if defined(MULTIPROCESSOR) IF (PAR) THEN ! GATHER THE NORTH POLE NODE GLOBAL ID TO ALL PROCS AND COMPARE RESULTS ALLOCATE(TMP(NPROCS)); tmp = 0 CALL MPI_ALLGATHER(NODE_NORTHPOLE_GL,1,MPI_INTEGER,TMP,1,MPI_INTEGER,MPI_FVCOM_GROUP,IERR) NDOM=0 DO I=1,NPROCS IF( (0 .LT. TMP(I)) .and. (TMP(I) .LE. MGL)) THEN NDOM=NDOM+1 IF(NODE_NORTHPOLE_GL.EQ.0) THEN ! Set the north pole global node NODE_NORTHPOLE_GL = TMP(I) ELSE ! Make sure it is the same as you global node number IF (NODE_NORTHPOLE_GL.NE.TMP(I)) CALL FATAL_ERROR & &("TWO DOMAINS REPORT DIFFERENT GLOBAL NORTH POLE NODES?") END IF END IF END DO DEALLOCATE(TMP) END IF # endif if(dbg_set(dbg_log)) THEN WRITE(IPT,*) "! //////////////////////////////////////////////" IF(ndom .eq.0) THEN WRITE(IPT,*) "! NO NORTH POLE FOUND; PROCEED WITH SPHERICAL MODEL!" ELSE WRITE(IPT,*) "! FOUND THE GLOBAL NORTH POLE NODE::", NODE_NORTHPOLE_GL IF(NDOM .gt. 1)THEN WRITE(IPT,*) "THE NORTH POLE IS ON A PROCESSOR BOUNDARY" WRITE(IPT,*) "Be afraid, be very afraid...." CALL FATAL_ERROR("THE NORTH POLE IS ON A PROCESSOR BOUNDARY") END IF END IF WRITE(IPT,*) "! //////////////////////////////////////////////" end if ! ! ALL OTHER PROCESSORS ESCAPE HERE ! IF (NODE_NORTHPOLE .EQ. 0) RETURN ALLOCATE(NODE_NORTHAREA(0:MT)); NODE_NORTHAREA = 0 ALLOCATE(CELL_NORTHAREA(0:NT)); CELL_NORTHAREA = 0 ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN ITMP = NODE_NORTHPOLE ALLOCATE(TMP(MT)); TMP = 0 MP = 0 DO I=1,NTSN(ITMP)-1 MP = MP + 1 TMP(MP) = NBSN(ITMP,I) NODE_NORTHAREA(NBSN(ITMP,I)) = 1 END DO MP = MP + 1 TMP(MP) = ITMP NODE_NORTHAREA(ITMP) = 1 ALLOCATE(MP_LST(MP)) MP_LST(1:MP) = TMP(1:MP) DEALLOCATE(TMP) ALLOCATE(TMP(NT)); TMP = 0 NP = 0 DO I=1,NTVE(ITMP) NP = NP + 1 TMP(NP) = NBVE(ITMP,I) CELL_NORTHAREA(NBVE(ITMP,I)) = 1 END DO ALLOCATE(NP_LST(NP)) NP_LST(1:NP) = TMP(1:NP) DEALLOCATE(TMP) RETURN END SUBROUTINE FIND_NORTHPOLE !==============================================================================| !==============================================================================| SUBROUTINE FIND_CELLSIDE IMPLICIT NONE INTEGER :: I,IA,IB INTEGER, ALLOCATABLE :: TEMP(:) ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN ALLOCATE(TEMP(NE)); TEMP = ZERO NPE = 0 DO I=1,NE IA = IEC(I,1) IB = IEC(I,2) IF(CELL_NORTHAREA(IA) == 1 .OR. CELL_NORTHAREA(IB) == 1)THEN NPE = NPE + 1 TEMP(NPE) = I END IF END DO ALLOCATE(NPEDGE_LST(NPE)) NPEDGE_LST(1:NPE) = TEMP(1:NPE) DEALLOCATE(TEMP) ALLOCATE(TEMP(NCV)); TEMP = ZERO NPCV = 0 DO I=1,NCV IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN NPCV = NPCV + 1 TEMP(NPCV) = I END IF END DO ALLOCATE(NCEDGE_LST(NPCV)) NCEDGE_LST(1:NPCV) = TEMP(1:NPCV) DEALLOCATE(TEMP) RETURN END SUBROUTINE FIND_CELLSIDE !==============================================================================| !==============================================================================| SUBROUTINE ADVAVE_EDGE_XY(XFLUX,YFLUX,IFCETA) USE MOD_OBCS IMPLICIT NONE INTEGER :: I,J,K,IA,IB,J1,J2,K1,K2,K3,I1,I2,II REAL(SP) :: DIJ,ELIJ,XIJ,YIJ,UIJ,VIJ REAL(SP) :: COFA1,COFA2,COFA3,COFA4,COFA5,COFA6,COFA7,COFA8 REAL(SP) :: XADV,YADV,TXXIJ,TYYIJ,TXYIJ REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP REAL(SP) :: XFLUX(0:NT),YFLUX(0:NT) REAL(SP) :: FACT,FM1,ISWETTMP REAL(SP) :: TPA,TPB REAL(SP) :: UIJ1_TMP,VIJ1_TMP,UIJ2_TMP,VIJ2_TMP,TXXIJ_TMP,TYYIJ_TMP REAL(SP) :: XADV_TMP,YADV_TMP,PSTX_TMP,PSTY_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,UN_TMP REAL(SP) :: DLTXC_TMP,DLTYC_TMP REAL(SP) :: VX1_TMP,VX2_TMP,VY1_TMP,VY2_TMP REAL(SP) :: UAIA,VAIA,UAIB,VAIB,UAK1,VAK1,UAK2,VAK2,UAK3,VAK3 REAL(SP) :: XIJC_TMP,YIJC_TMP,XCIA_TMP,YCIA_TMP,XCIB_TMP,YCIB_TMP REAL(SP) :: XIJ_TMP,YIJ_TMP REAL(SP) :: IFCETA # if defined (LIMITED_NO) REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY # else REAL(SP),ALLOCATABLE,DIMENSION(:) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY REAL(SP),ALLOCATABLE,DIMENSION(:) :: UALFA,VALFA REAL(SP) :: UALFA_TMP,VALFA_TMP INTEGER :: ERROR REAL(SP) :: EPS # endif !------------------------------------------------------------------------------! ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN if(dbg_set(dbg_sbr)) write(ipt,*) "Start: advave_edge_XY" SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !--Initialize Variables--------------------------------------------------------| ! DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) IF(CELL_NORTHAREA(IA) == 1)THEN XFLUX(IA) = 0.0_SP YFLUX(IA) = 0.0_SP PSTX(IA) = 0.0_SP PSTY(IA) = 0.0_SP END IF IF(CELL_NORTHAREA(IB) == 1)THEN XFLUX(IB) = 0.0_SP YFLUX(IB) = 0.0_SP PSTX(IB) = 0.0_SP PSTY(IB) = 0.0_SP END IF END DO ! !-------------------------ACCUMULATE FLUX OVER ELEMENT EDGES-------------------! ! # if !defined (LIMITED_NO) ALLOCATE(UIJ1(NPE),VIJ1(NPE),UIJ2(NPE),VIJ2(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UIJ1,VIJ1,UIJ2 and VIJ2 can not be allocated", & & "in SUBROUTINE ADVAVE_XY.") ALLOCATE(UALFA(0:NT),VALFA(0:NT),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UALFA,VALFA can not be allocated in SUBROUTINE ADVAVE_XY.") ALLOCATE(FXX(NPE),FYY(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays FXX,FYY can not be allocated in SUBROUTINE ADVAVE_XY.") UIJ1=0.0_SP;VIJ1=0.0_SP;UIJ2=0.0_SP;VIJ2=0.0_SP UALFA=1.0_SP;VALFA=1.0_SP FXX=0.0_SP;FYY=0.0_SP DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) # if !defined (SEMI_IMPLICIT) DIJ=0.5_SP*(D(J1)+D(J2)) # else DIJ=0.5_SP*(DT(J1)+DT(J2)) # endif ! FLUX FROM LEFT K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) UAIA = -VA(IA)*COS(XC(IA)*DEG2RAD)-UA(IA)*SIN(XC(IA)*DEG2RAD) VAIA = -VA(IA)*SIN(XC(IA)*DEG2RAD)+UA(IA)*COS(XC(IA)*DEG2RAD) UAIB = -VA(IB)*COS(XC(IB)*DEG2RAD)-UA(IB)*SIN(XC(IB)*DEG2RAD) VAIB = -VA(IB)*SIN(XC(IB)*DEG2RAD)+UA(IB)*COS(XC(IB)*DEG2RAD) UAK1 = -VA(K1)*COS(XC(K1)*DEG2RAD)-UA(K1)*SIN(XC(K1)*DEG2RAD) VAK1 = -VA(K1)*SIN(XC(K1)*DEG2RAD)+UA(K1)*COS(XC(K1)*DEG2RAD) UAK2 = -VA(K2)*COS(XC(K2)*DEG2RAD)-UA(K2)*SIN(XC(K2)*DEG2RAD) VAK2 = -VA(K2)*SIN(XC(K2)*DEG2RAD)+UA(K2)*COS(XC(K2)*DEG2RAD) UAK3 = -VA(K3)*COS(XC(K3)*DEG2RAD)-UA(K3)*SIN(XC(K3)*DEG2RAD) VAK3 = -VA(K3)*SIN(XC(K3)*DEG2RAD)+UA(K3)*COS(XC(K3)*DEG2RAD) COFA1=A1U_XY(IA,1)*UAIA+A1U_XY(IA,2)*UAK1 & +A1U_XY(IA,3)*UAK2+A1U_XY(IA,4)*UAK3 COFA2=A2U_XY(IA,1)*UAIA+A2U_XY(IA,2)*UAK1 & +A2U_XY(IA,3)*UAK2+A2U_XY(IA,4)*UAK3 COFA5=A1U_XY(IA,1)*VAIA+A1U_XY(IA,2)*VAK1 & +A1U_XY(IA,3)*VAK2+A1U_XY(IA,4)*VAK3 COFA6=A2U_XY(IA,1)*VAIA+A2U_XY(IA,2)*VAK1 & +A2U_XY(IA,3)*VAK2+A2U_XY(IA,4)*VAK3 XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XIJ_TMP = XIJC_TMP-XCIA_TMP YIJ_TMP = YIJC_TMP-YCIA_TMP UIJ1(II)=COFA1*XIJ_TMP+COFA2*YIJ_TMP VIJ1(II)=COFA5*XIJ_TMP+COFA6*XIJ_TMP UALFA_TMP=ABS(UAIA-UAIB)/ABS(UIJ1(II)+EPSILON(EPS)) VALFA_TMP=ABS(VAIA-VAIB)/ABS(VIJ1(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IA)=MIN(UALFA(IA),UALFA_TMP) VALFA(IA)=MIN(VALFA(IA),VALFA_TMP) ! FLUX FROM RIGHT K1=NBE(IB,1) K2=NBE(IB,2) K3=NBE(IB,3) ! UAIB = -VA(IB)*COS(XC(IB)*DEG2RAD)-UA(IB)*SIN(XC(IB)*DEG2RAD) ! VAIB = -VA(IB)*SIN(XC(IB)*DEG2RAD)+UA(IB)*COS(XC(IB)*DEG2RAD) UAK1 = -VA(K1)*COS(XC(K1)*DEG2RAD)-UA(K1)*SIN(XC(K1)*DEG2RAD) VAK1 = -VA(K1)*SIN(XC(K1)*DEG2RAD)+UA(K1)*COS(XC(K1)*DEG2RAD) UAK2 = -VA(K2)*COS(XC(K2)*DEG2RAD)-UA(K2)*SIN(XC(K2)*DEG2RAD) VAK2 = -VA(K2)*SIN(XC(K2)*DEG2RAD)+UA(K2)*COS(XC(K2)*DEG2RAD) UAK3 = -VA(K3)*COS(XC(K3)*DEG2RAD)-UA(K3)*SIN(XC(K3)*DEG2RAD) VAK3 = -VA(K3)*SIN(XC(K3)*DEG2RAD)+UA(K3)*COS(XC(K3)*DEG2RAD) COFA3=A1U_XY(IB,1)*UAIB+A1U_XY(IB,2)*UAK1 & +A1U_XY(IB,3)*UAK2+A1U_XY(IB,4)*UAK3 COFA4=A2U_XY(IB,1)*UAIB+A2U_XY(IB,2)*UAK1 & +A2U_XY(IB,3)*UAK2+A2U_XY(IB,4)*UAK3 COFA7=A1U_XY(IB,1)*VAIB+A1U_XY(IB,2)*VAK1 & +A1U_XY(IB,3)*VAK2+A1U_XY(IB,4)*VAK3 COFA8=A2U_XY(IB,1)*VAIB+A2U_XY(IB,2)*VAK1 & +A2U_XY(IB,3)*VAK2+A2U_XY(IB,4)*VAK3 XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJ_TMP = XIJC_TMP-XCIB_TMP YIJ_TMP = YIJC_TMP-YCIB_TMP UIJ2(II)=COFA3*XIJ_TMP+COFA4*YIJ_TMP VIJ2(II)=COFA7*XIJ_TMP+COFA8*YIJ_TMP UALFA_TMP=ABS(UAIA-UAIB)/ABS(UIJ2(II)+EPSILON(EPS)) VALFA_TMP=ABS(VAIA-VAIB)/ABS(VIJ2(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IB)=MIN(UALFA(IB),UALFA_TMP) VALFA(IB)=MIN(VALFA(IB),VALFA_TMP) ! VISCOSITY COEFFICIENT VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1) ! VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2) + FM1)/HPRNU ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP ! SHEAR STRESSES TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX(II)=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY(II)=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) ENDDO DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) # if !defined (SEMI_IMPLICIT) DIJ=0.5_SP*(D(J1)+D(J2)) ELIJ=0.5_SP*(EL(J1)+EL(J2)) ! ggao 0103-2007 consider the sea surface pressure change # if defined (AIR_PRESSURE) ELIJ =ELIJ-0.5_SP*(EL_AIR(J1)+EL_AIR(J2)) !*RAMP # endif ! change end # if defined (EQUI_TIDE) ELIJ=ELIJ-0.5_SP*(EL_EQI(J1)+EL_EQI(J2)) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2)) # endif # else DIJ= 0.5_SP*(DT(J1)+DT(J2)) ELIJ=0.5_SP*(ET(J1)+ET(J2)) # if defined (AIR_PRESSURE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_AIR(J1)+EL_AIR(J2))+IFCETA*0.5_SP*(ELF_AIR(J1)+ELF_AIR(J2)) ) !*RAMP # endif # if defined (EQUI_TIDE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_EQI(J1)+EL_EQI(J2))+IFCETA*0.5_SP*(ELF_EQI(J1)+ELF_EQI(J2)) ) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2))+IFCETA*0.5_SP*(ELF_ATMO(J1)+ELF_ATMO(J2)) ) # endif # endif UAIA = -VA(IA)*COS(XC(IA)*DEG2RAD)-UA(IA)*SIN(XC(IA)*DEG2RAD) VAIA = -VA(IA)*SIN(XC(IA)*DEG2RAD)+UA(IA)*COS(XC(IA)*DEG2RAD) UAIB = -VA(IB)*COS(XC(IB)*DEG2RAD)-UA(IB)*SIN(XC(IB)*DEG2RAD) VAIB = -VA(IB)*SIN(XC(IB)*DEG2RAD)+UA(IB)*COS(XC(IB)*DEG2RAD) VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP UIJ1(II)=UAIA+UALFA(IA)*UIJ1(II) VIJ1(II)=VAIA+VALFA(IA)*VIJ1(II) UIJ2(II)=UAIB+UALFA(IB)*UIJ2(II) VIJ2(II)=VAIB+VALFA(IB)*VIJ2(II) # if defined (LIMITED_1) IF(UIJ1(II) > MAX(UAIA,UAIB) .OR. UIJ1(II) < MIN(UAIA,UAIB) .OR. & UIJ2(II) > MAX(UAIA,UAIB) .OR. UIJ2(II) < MIN(UAIA,UAIB))THEN UIJ1(II)=UAIA UIJ2(II)=UAIB END IF IF(VIJ1(II) > MAX(VAIA,VAIB) .OR. VIJ1(II) < MIN(VAIA,VAIB) .OR. & VIJ2(II) > MAX(VAIA,VAIB) .OR. VIJ2(II) < MIN(VAIA,VAIB))THEN VIJ1(II)=VAIA VIJ2(II)=VAIB END IF # endif UIJ1_TMP = UIJ1(II) VIJ1_TMP = VIJ1(II) UIJ2_TMP = UIJ2(II) VIJ2_TMP = VIJ2(II) UIJ_TMP=0.5_SP*(UIJ1(II)+UIJ2(II)) VIJ_TMP=0.5_SP*(VIJ1(II)+VIJ2(II)) UN_TMP=-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP ! ADD CONVECTIVE AND VISCOUS FLUXES ! ACCUMULATE FLUX XADV_TMP=DIJ*UN_TMP*& ((1.0_SP-SIGN(1.0_SP,UN_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=DIJ*UN_TMP* & ((1.0_SP-SIGN(1.0_SP,UN_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN XFLUX(IA)=XFLUX(IA)+(XADV_TMP+FXX(II)*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) YFLUX(IA)=YFLUX(IA)+(YADV_TMP+FYY(II)*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) XFLUX(IB)=XFLUX(IB)-(XADV_TMP+FXX(II)*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) YFLUX(IB)=YFLUX(IB)-(YADV_TMP+FYY(II)*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN XFLUX(IA)=XFLUX(IA)+(XADV_TMP+FXX(II)*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) YFLUX(IA)=YFLUX(IA)+(YADV_TMP+FYY(II)*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN XFLUX(IB)=XFLUX(IB)-(XADV_TMP+FXX(II)*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) YFLUX(IB)=YFLUX(IB)-(YADV_TMP+FYY(II)*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) END IF ! ACCUMULATE BAROTROPIC FLUX ! VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) ! VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) ! VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) ! VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) ! DLTXC_TMP = VX2_TMP-VX1_TMP ! DLTYC_TMP = VY2_TMP-VY1_TMP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IA)=PSTX(IA)-GRAV_E(IA)*D1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*D1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*D1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*D1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # else PSTX(IA)=PSTX(IA)-GRAV_E(IA)*DT1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*DT1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*DT1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*DT1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # endif ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IA)=PSTX(IA)-GRAV_E(IA)*D1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*D1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) # else PSTX(IA)=PSTX(IA)-GRAV_E(IA)*DT1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*DT1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) # endif ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*D1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*D1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # else PSTX(IB)=PSTX(IB)+GRAV_E(IB)*DT1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*DT1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # endif END IF END DO DEALLOCATE(UIJ1,VIJ1,UIJ2,VIJ2,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UIJ1,VIJ1,UIJ2 and VIJ2", & & "in subroutine ADVAVE_XY.") DEALLOCATE(UALFA,VALFA,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UALFA,VALFA", & & "in subroutine ADVAVE_XY.") DEALLOCATE(FXX,FYY,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for FXX,FYY", & & "in subroutine ADVAVE_XY.") # else DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) # if !defined (SEMI_IMPLICIT) DIJ=0.5_SP*(D(J1)+D(J2)) ELIJ=0.5_SP*(EL(J1)+EL(J2)) ! ggao 0103-2007 consider the sea surface pressure change # if defined (AIR_PRESSURE) ELIJ =ELIJ-0.5_SP*(EL_AIR(J1)+EL_AIR(J2)) !*RAMP # endif ! change end # if defined (EQUI_TIDE) ELIJ=ELIJ-0.5_SP*(EL_EQI(J1)+EL_EQI(J2)) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2)) # endif # else DIJ= 0.5_SP*(DT(J1)+DT(J2)) ELIJ=0.5_SP*(ET(J1)+ET(J2)) # if defined (AIR_PRESSURE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_AIR(J1)+EL_AIR(J2))+IFCETA*0.5_SP*(ELF_AIR(J1)+ELF_AIR(J2)) ) !*RAMP # endif # if defined (EQUI_TIDE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_EQI(J1)+EL_EQI(J2))+IFCETA*0.5_SP*(ELF_EQI(J1)+ELF_EQI(J2)) ) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-( (1.0_SP-IFCETA)*0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2))+IFCETA*0.5_SP*(ELF_ATMO(J1)+ELF_ATMO(J2)) ) # endif # endif ! FLUX FROM LEFT K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) UAIA = -VA(IA)*COS(XC(IA)*DEG2RAD)-UA(IA)*SIN(XC(IA)*DEG2RAD) VAIA = -VA(IA)*SIN(XC(IA)*DEG2RAD)+UA(IA)*COS(XC(IA)*DEG2RAD) UAK1 = -VA(K1)*COS(XC(K1)*DEG2RAD)-UA(K1)*SIN(XC(K1)*DEG2RAD) VAK1 = -VA(K1)*SIN(XC(K1)*DEG2RAD)+UA(K1)*COS(XC(K1)*DEG2RAD) UAK2 = -VA(K2)*COS(XC(K2)*DEG2RAD)-UA(K2)*SIN(XC(K2)*DEG2RAD) VAK2 = -VA(K2)*SIN(XC(K2)*DEG2RAD)+UA(K2)*COS(XC(K2)*DEG2RAD) UAK3 = -VA(K3)*COS(XC(K3)*DEG2RAD)-UA(K3)*SIN(XC(K3)*DEG2RAD) VAK3 = -VA(K3)*SIN(XC(K3)*DEG2RAD)+UA(K3)*COS(XC(K3)*DEG2RAD) COFA1=A1U_XY(IA,1)*UAIA+A1U_XY(IA,2)*UAK1 & +A1U_XY(IA,3)*UAK2+A1U_XY(IA,4)*UAK3 COFA2=A2U_XY(IA,1)*UAIA+A2U_XY(IA,2)*UAK1 & +A2U_XY(IA,3)*UAK2+A2U_XY(IA,4)*UAK3 COFA5=A1U_XY(IA,1)*VAIA+A1U_XY(IA,2)*VAK1 & +A1U_XY(IA,3)*VAK2+A1U_XY(IA,4)*VAK3 COFA6=A2U_XY(IA,1)*VAIA+A2U_XY(IA,2)*VAK1 & +A2U_XY(IA,3)*VAK2+A2U_XY(IA,4)*VAK3 XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XIJ_TMP = XIJC_TMP-XCIA_TMP YIJ_TMP = YIJC_TMP-YCIA_TMP UIJ1=UAIA+COFA1*XIJ_TMP+COFA2*YIJ_TMP VIJ1=VAIA+COFA5*XIJ_TMP+COFA6*XIJ_TMP ! FLUX FROM RIGHT K1=NBE(IB,1) K2=NBE(IB,2) K3=NBE(IB,3) UAIB = -VA(IB)*COS(XC(IB)*DEG2RAD)-UA(IB)*SIN(XC(IB)*DEG2RAD) VAIB = -VA(IB)*SIN(XC(IB)*DEG2RAD)+UA(IB)*COS(XC(IB)*DEG2RAD) UAK1 = -VA(K1)*COS(XC(K1)*DEG2RAD)-UA(K1)*SIN(XC(K1)*DEG2RAD) VAK1 = -VA(K1)*SIN(XC(K1)*DEG2RAD)+UA(K1)*COS(XC(K1)*DEG2RAD) UAK2 = -VA(K2)*COS(XC(K2)*DEG2RAD)-UA(K2)*SIN(XC(K2)*DEG2RAD) VAK2 = -VA(K2)*SIN(XC(K2)*DEG2RAD)+UA(K2)*COS(XC(K2)*DEG2RAD) UAK3 = -VA(K3)*COS(XC(K3)*DEG2RAD)-UA(K3)*SIN(XC(K3)*DEG2RAD) VAK3 = -VA(K3)*SIN(XC(K3)*DEG2RAD)+UA(K3)*COS(XC(K3)*DEG2RAD) COFA3=A1U_XY(IB,1)*UAIB+A1U_XY(IB,2)*UAK1 & +A1U_XY(IB,3)*UAK2+A1U_XY(IB,4)*UAK3 COFA4=A2U_XY(IB,1)*UAIB+A2U_XY(IB,2)*UAK1 & +A2U_XY(IB,3)*UAK2+A2U_XY(IB,4)*UAK3 COFA7=A1U_XY(IB,1)*VAIB+A1U_XY(IB,2)*VAK1 & +A1U_XY(IB,3)*VAK2+A1U_XY(IB,4)*VAK3 COFA8=A2U_XY(IB,1)*VAIB+A2U_XY(IB,2)*VAK1 & +A2U_XY(IB,3)*VAK2+A2U_XY(IB,4)*VAK3 XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJ_TMP = XIJC_TMP-XCIB_TMP YIJ_TMP = YIJC_TMP-YCIB_TMP UIJ2=UAIB+COFA3*XIJ_TMP+COFA4*YIJ_TMP VIJ2=VAIB+COFA7*XIJ_TMP+COFA8*YIJ_TMP ! VISCOSITY COEFFICIENT VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) !VISCOF=HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP ! SHEAR STRESSES TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) UIJ1_TMP = UIJ1 VIJ1_TMP = VIJ1 UIJ2_TMP = UIJ2 VIJ2_TMP = VIJ2 UIJ_TMP=0.5_SP*(UIJ1+UIJ2) VIJ_TMP=0.5_SP*(VIJ1+VIJ2) UN_TMP=-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP ! ADD CONVECTIVE AND VISCOUS FLUXES ! ACCUMULATE FLUX XADV_TMP=DIJ*UN_TMP*& ((1.0_SP-SIGN(1.0_SP,UN_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=DIJ*UN_TMP* & ((1.0_SP-SIGN(1.0_SP,UN_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN XFLUX(IA)=XFLUX(IA)+(XADV_TMP+FXX*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) YFLUX(IA)=YFLUX(IA)+(YADV_TMP+FYY*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) XFLUX(IB)=XFLUX(IB)-(XADV_TMP+FXX*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) YFLUX(IB)=YFLUX(IB)-(YADV_TMP+FYY*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN XFLUX(IA)=XFLUX(IA)+(XADV_TMP+FXX*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) YFLUX(IA)=YFLUX(IA)+(YADV_TMP+FYY*EPOR(IA))*(1.0_SP-ISBC(I))*IUCP(IA) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN XFLUX(IB)=XFLUX(IB)-(XADV_TMP+FXX*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) YFLUX(IB)=YFLUX(IB)-(YADV_TMP+FYY*EPOR(IB))*(1.0_SP-ISBC(I))*IUCP(IB) END IF ! ACCUMULATE BAROTROPIC FLUX ! VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) ! VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) ! VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) ! VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & ! * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) ! DLTXC_TMP = VX2_TMP-VX1_TMP ! DLTYC_TMP = VY2_TMP-VY1_TMP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IA)=PSTX(IA)-GRAV_E(IA)*D1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*D1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*D1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*D1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # else PSTX(IA)=PSTX(IA)-GRAV_E(IA)*DT1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*DT1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*DT1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*DT1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # endif ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IA)=PSTX(IA)-GRAV_E(IA)*D1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*D1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) # else PSTX(IA)=PSTX(IA)-GRAV_E(IA)*DT1(IA)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY(IA)=PSTY(IA)+GRAV_E(IA)*DT1(IA)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) # endif ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN # if !defined (SEMI_IMPLICIT) PSTX(IB)=PSTX(IB)+GRAV_E(IB)*D1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*D1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # else PSTX(IB)=PSTX(IB)+GRAV_E(IB)*DT1(IB)*ELIJ*DLTYC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY(IB)=PSTY(IB)-GRAV_E(IB)*DT1(IB)*ELIJ*DLTXC_TMP/(2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) # endif END IF END DO # endif if(dbg_set(dbg_sbr)) write(ipt,*) "End: advave_edge_XY" RETURN END SUBROUTINE ADVAVE_EDGE_XY !==============================================================================| !==============================================================================| SUBROUTINE ADVECTION_EDGE_XY(XFLUX,YFLUX) IMPLICIT NONE ! REAL(SP), INTENT(OUT), DIMENSION(0:NT,KB) :: XFLUX,YFLUX REAL(SP) :: XFLUX(0:NT,KB),YFLUX(0:NT,KB) REAL(SP) :: DIJ REAL(SP) :: COFA1,COFA2,COFA3,COFA4,COFA5,COFA6,COFA7,COFA8 REAL(SP) :: XADV,YADV,TXXIJ,TYYIJ,TXYIJ,UN REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP,TPA,TPB REAL(SP) :: XIJA,YIJA,XIJB,YIJB,UIJ,VIJ REAL(SP) :: FACT,FM1 INTEGER :: I,IA,IB,J1,J2,K1,K2,K3,K4,K5,K6,K,II,J,I1,I2 REAL(SP) :: UIJ1_TMP,VIJ1_TMP,UIJ2_TMP,VIJ2_TMP,TXXIJ_TMP,TYYIJ_TMP REAL(SP) :: XADV_TMP,YADV_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,UN_TMP REAL(SP) :: DLTXC_TMP,DLTYC_TMP REAL(SP) :: VX1_TMP,VX2_TMP,VY1_TMP,VY2_TMP REAL(SP) :: UIA,VIA,UIB,VIB,UK1,VK1,UK2,VK2,UK3,VK3,UK4,VK4,UK5,VK5,UK6,VK6 REAL(SP) :: XIJC_TMP,YIJC_TMP,XCIA_TMP,YCIA_TMP,XCIB_TMP,YCIB_TMP # if defined (LIMITED_NO) REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY # else REAL(SP),ALLOCATABLE,DIMENSION(:) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY REAL(SP),ALLOCATABLE,DIMENSION(:) :: UALFA,VALFA REAL(SP) :: UALFA_TMP,VALFA_TMP INTEGER :: ERROR REAL(SP) :: EPS # endif !------------------------------------------------------------------------------| ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN if(dbg_set(dbg_sbr)) write(ipt,*) "Start: advection_edge_XY" SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !--Initialize Variables--------------------------------------------------------| ! DO K = 1,KBM1 DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) IF(CELL_NORTHAREA(IA) == 1)THEN XFLUX(IA,K) = 0.0_SP YFLUX(IA,K) = 0.0_SP END IF IF(CELL_NORTHAREA(IB) == 1)THEN XFLUX(IB,K) = 0.0_SP YFLUX(IB,K) = 0.0_SP END IF END DO END DO ! !--Loop Over Edges and Accumulate Fluxes-For Each Element----------------------| ! # if !defined (LIMITED_NO) ALLOCATE(UIJ1(NPE),VIJ1(NPE),UIJ2(NPE),VIJ2(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UIJ1,VIJ1,UIJ2 and VIJ2 can not be allocated", & & "in SUBROUTINE ADVECTION_XY.") ALLOCATE(UALFA(0:NT),VALFA(0:NT),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UALFA,VALFA can not be allocated", & & "in SUBROUTINE ADVECTION_XY.") ALLOCATE(FXX(NPE),FYY(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays FXX,FYY can not be allocated", & & "in SUBROUTINE ADVECTION_XY.") DO K=1,KBM1 UIJ1=0.0_SP;VIJ1=0.0_SP;UIJ2=0.0_SP;VIJ2=0.0_SP UALFA=1.0_SP;VALFA=1.0_SP FXX=0.0_SP;FYY=0.0_SP DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) ! DIJ= 0.5_SP*(DT(J1)+DT(J2)) K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) K4=NBE(IB,1) K5=NBE(IB,2) K6=NBE(IB,3) XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJA = XIJC_TMP-XCIA_TMP YIJA = YIJC_TMP-YCIA_TMP XIJB = XIJC_TMP-XCIB_TMP YIJB = YIJC_TMP-YCIB_TMP DIJ= 0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) UK1 = -V(K1,K)*COS(XC(K1)*DEG2RAD)-U(K1,K)*SIN(XC(K1)*DEG2RAD) VK1 = -V(K1,K)*SIN(XC(K1)*DEG2RAD)+U(K1,K)*COS(XC(K1)*DEG2RAD) UK2 = -V(K2,K)*COS(XC(K2)*DEG2RAD)-U(K2,K)*SIN(XC(K2)*DEG2RAD) VK2 = -V(K2,K)*SIN(XC(K2)*DEG2RAD)+U(K2,K)*COS(XC(K2)*DEG2RAD) UK3 = -V(K3,K)*COS(XC(K3)*DEG2RAD)-U(K3,K)*SIN(XC(K3)*DEG2RAD) VK3 = -V(K3,K)*SIN(XC(K3)*DEG2RAD)+U(K3,K)*COS(XC(K3)*DEG2RAD) UK4 = -V(K4,K)*COS(XC(K4)*DEG2RAD)-U(K4,K)*SIN(XC(K4)*DEG2RAD) VK4 = -V(K4,K)*SIN(XC(K4)*DEG2RAD)+U(K4,K)*COS(XC(K4)*DEG2RAD) UK5 = -V(K5,K)*COS(XC(K5)*DEG2RAD)-U(K5,K)*SIN(XC(K5)*DEG2RAD) VK5 = -V(K5,K)*SIN(XC(K5)*DEG2RAD)+U(K5,K)*COS(XC(K5)*DEG2RAD) UK6 = -V(K6,K)*COS(XC(K6)*DEG2RAD)-U(K6,K)*SIN(XC(K6)*DEG2RAD) VK6 = -V(K6,K)*SIN(XC(K6)*DEG2RAD)+U(K6,K)*COS(XC(K6)*DEG2RAD) !!FORM THE LEFT FLUX COFA1=A1U_XY(IA,1)*UIA+A1U_XY(IA,2)*UK1 & +A1U_XY(IA,3)*UK2+A1U_XY(IA,4)*UK3 COFA2=A2U_XY(IA,1)*UIA+A2U_XY(IA,2)*UK1 & +A2U_XY(IA,3)*UK2+A2U_XY(IA,4)*UK3 COFA5=A1U_XY(IA,1)*VIA+A1U_XY(IA,2)*VK1 & +A1U_XY(IA,3)*VK2+A1U_XY(IA,4)*VK3 COFA6=A2U_XY(IA,1)*VIA+A2U_XY(IA,2)*VK1 & +A2U_XY(IA,3)*VK2+A2U_XY(IA,4)*VK3 UIJ1(II)=COFA1*XIJA+COFA2*YIJA VIJ1(II)=COFA5*XIJA+COFA6*YIJA UALFA_TMP=ABS(UIA-UIB)/ABS(UIJ1(II)+EPSILON(EPS)) VALFA_TMP=ABS(VIA-VIB)/ABS(VIJ1(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IA)=MIN(UALFA(IA),UALFA_TMP) VALFA(IA)=MIN(VALFA(IA),VALFA_TMP) !!FORM THE RIGHT FLUX COFA3=A1U_XY(IB,1)*UIB+A1U_XY(IB,2)*UK4 & +A1U_XY(IB,3)*UK5+A1U_XY(IB,4)*UK6 COFA4=A2U_XY(IB,1)*UIB+A2U_XY(IB,2)*UK4 & +A2U_XY(IB,3)*UK5+A2U_XY(IB,4)*UK6 COFA7=A1U_XY(IB,1)*VIB+A1U_XY(IB,2)*VK4 & +A1U_XY(IB,3)*VK5+A1U_XY(IB,4)*VK6 COFA8=A2U_XY(IB,1)*VIB+A2U_XY(IB,2)*VK4 & +A2U_XY(IB,3)*VK5+A2U_XY(IB,4)*VK6 UIJ2(II)=COFA3*XIJB+COFA4*YIJB VIJ2(II)=COFA7*XIJB+COFA8*YIJB UALFA_TMP=ABS(UIA-UIB)/ABS(UIJ2(II)+EPSILON(EPS)) VALFA_TMP=ABS(VIA-VIB)/ABS(VIJ2(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IB)=MIN(UALFA(IB),UALFA_TMP) VALFA(IB)=MIN(VALFA(IB),VALFA_TMP) !! VISCOSITY COEFFICIENT EDGE VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) ! VISCOF = HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1) ! VISCOF = HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2) + FM1)/HPRNU ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX(II)=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY(II)=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) ENDDO DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) DIJ= 0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP UIJ1(II)=UIA+UALFA(IA)*UIJ1(II) VIJ1(II)=VIA+VALFA(IA)*VIJ1(II) UIJ2(II)=UIB+UALFA(IB)*UIJ2(II) VIJ2(II)=VIB+VALFA(IB)*VIJ2(II) # if defined (LIMITED_1) IF(UIJ1(II) > MAX(UIA,UIB) .OR. UIJ1(II) < MIN(UIA,UIB) .OR. & UIJ2(II) > MAX(UIA,UIB) .OR. UIJ2(II) < MIN(UIA,UIB))THEN UIJ1(II)=UIA UIJ2(II)=UIB END IF IF(VIJ1(II) > MAX(VIA,VIB) .OR. VIJ1(II) < MIN(VIA,VIB) .OR. & VIJ2(II) > MAX(VIA,VIB) .OR. VIJ2(II) < MIN(VIA,VIB))THEN VIJ1(II)=VIA VIJ2(II)=VIB END IF # endif UIJ1_TMP = UIJ1(II) VIJ1_TMP = VIJ1(II) UIJ2_TMP = UIJ2(II) VIJ2_TMP = VIJ2(II) UIJ_TMP=0.5_SP*(UIJ1(II)+UIJ2(II)) VIJ_TMP=0.5_SP*(VIJ1(II)+VIJ2(II)) UN_TMP=-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP !!COMPUTE BOUNDARY FLUX AUGMENTERS TPA = FLOAT(1-ISBC(I))*EPOR(IA) TPB = FLOAT(1-ISBC(I))*EPOR(IB) !!ACCUMULATE THE FLUX XADV_TMP=DIJ*UN_TMP*& ((1.0_SP-SIGN(1.0_SP,UN_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=DIJ*UN_TMP* & ((1.0_SP-SIGN(1.0_SP,UN_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) END IF END DO END DO DEALLOCATE(UIJ1,VIJ1,UIJ2,VIJ2,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UIJ1,VIJ1,UIJ2 and VIJ2", & & "in subroutine ADVECTION_XY.") DEALLOCATE(UALFA,VALFA,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UALFA,VALFA", & & "in subroutine ADVECTION_XY.") DEALLOCATE(FXX,FYY,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for FXX,FYY", & & "in subroutine ADVECTION_XY.") # else DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) ! DIJ= 0.5_SP*(DT(J1)+DT(J2)) K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) K4=NBE(IB,1) K5=NBE(IB,2) K6=NBE(IB,3) XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJA = XIJC_TMP-XCIA_TMP YIJA = YIJC_TMP-YCIA_TMP XIJB = XIJC_TMP-XCIB_TMP YIJB = YIJC_TMP-YCIB_TMP DO K=1,KBM1 DIJ= 0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) UK1 = -V(K1,K)*COS(XC(K1)*DEG2RAD)-U(K1,K)*SIN(XC(K1)*DEG2RAD) VK1 = -V(K1,K)*SIN(XC(K1)*DEG2RAD)+U(K1,K)*COS(XC(K1)*DEG2RAD) UK2 = -V(K2,K)*COS(XC(K2)*DEG2RAD)-U(K2,K)*SIN(XC(K2)*DEG2RAD) VK2 = -V(K2,K)*SIN(XC(K2)*DEG2RAD)+U(K2,K)*COS(XC(K2)*DEG2RAD) UK3 = -V(K3,K)*COS(XC(K3)*DEG2RAD)-U(K3,K)*SIN(XC(K3)*DEG2RAD) VK3 = -V(K3,K)*SIN(XC(K3)*DEG2RAD)+U(K3,K)*COS(XC(K3)*DEG2RAD) UK4 = -V(K4,K)*COS(XC(K4)*DEG2RAD)-U(K4,K)*SIN(XC(K4)*DEG2RAD) VK4 = -V(K4,K)*SIN(XC(K4)*DEG2RAD)+U(K4,K)*COS(XC(K4)*DEG2RAD) UK5 = -V(K5,K)*COS(XC(K5)*DEG2RAD)-U(K5,K)*SIN(XC(K5)*DEG2RAD) VK5 = -V(K5,K)*SIN(XC(K5)*DEG2RAD)+U(K5,K)*COS(XC(K5)*DEG2RAD) UK6 = -V(K6,K)*COS(XC(K6)*DEG2RAD)-U(K6,K)*SIN(XC(K6)*DEG2RAD) VK6 = -V(K6,K)*SIN(XC(K6)*DEG2RAD)+U(K6,K)*COS(XC(K6)*DEG2RAD) !!FORM THE LEFT FLUX COFA1=A1U_XY(IA,1)*UIA+A1U_XY(IA,2)*UK1 & +A1U_XY(IA,3)*UK2+A1U_XY(IA,4)*UK3 COFA2=A2U_XY(IA,1)*UIA+A2U_XY(IA,2)*UK1 & +A2U_XY(IA,3)*UK2+A2U_XY(IA,4)*UK3 COFA5=A1U_XY(IA,1)*VIA+A1U_XY(IA,2)*VK1 & +A1U_XY(IA,3)*VK2+A1U_XY(IA,4)*VK3 COFA6=A2U_XY(IA,1)*VIA+A2U_XY(IA,2)*VK1 & +A2U_XY(IA,3)*VK2+A2U_XY(IA,4)*VK3 UIJ1=UIA+COFA1*XIJA+COFA2*YIJA VIJ1=VIA+COFA5*XIJA+COFA6*YIJA !!FORM THE RIGHT FLUX COFA3=A1U_XY(IB,1)*UIB+A1U_XY(IB,2)*UK4 & +A1U_XY(IB,3)*UK5+A1U_XY(IB,4)*UK6 COFA4=A2U_XY(IB,1)*UIB+A2U_XY(IB,2)*UK4 & +A2U_XY(IB,3)*UK5+A2U_XY(IB,4)*UK6 COFA7=A1U_XY(IB,1)*VIB+A1U_XY(IB,2)*VK4 & +A1U_XY(IB,3)*VK5+A1U_XY(IB,4)*VK6 COFA8=A2U_XY(IB,1)*VIB+A2U_XY(IB,2)*VK4 & +A2U_XY(IB,3)*VK5+A2U_XY(IB,4)*VK6 UIJ2=UIB+COFA3*XIJB+COFA4*YIJB VIJ2=VIB+COFA7*XIJB+COFA8*YIJB !! VISCOSITY COEFFICIENT EDGE VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) ! VISCOF = HORCON*(FACT*0.5_SP*(VISCOF1+VISCOF2)/HPRNU + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) UIJ1_TMP = UIJ1 VIJ1_TMP = VIJ1 UIJ2_TMP = UIJ2 VIJ2_TMP = VIJ2 UIJ_TMP=0.5_SP*(UIJ1+UIJ2) VIJ_TMP=0.5_SP*(VIJ1+VIJ2) UN_TMP=-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP !!COMPUTE BOUNDARY FLUX AUGMENTERS TPA = FLOAT(1-ISBC(I))*EPOR(IA) TPB = FLOAT(1-ISBC(I))*EPOR(IB) !!ACCUMULATE THE FLUX XADV_TMP=DIJ*UN_TMP*& ((1.0_SP-SIGN(1.0_SP,UN_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=DIJ*UN_TMP* & ((1.0_SP-SIGN(1.0_SP,UN_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,UN_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) END IF END DO END DO # endif if(dbg_set(dbg_sbr)) write(ipt,*) "End: advection_edge_XY" RETURN END SUBROUTINE ADVECTION_EDGE_XY !==============================================================================| !==============================================================================! SUBROUTINE ADV_UV_EDGE_XY(XFLUX,YFLUX,CETA,STG,K_STG) IMPLICIT NONE REAL(SP) :: XFLUX(0:NT,KB),YFLUX(0:NT,KB) REAL(SP) :: PSTX_TM(0:NT,KB),PSTY_TM(0:NT,KB) REAL(SP) :: COFA1,COFA2,COFA3,COFA4,COFA5,COFA6,COFA7,COFA8 REAL(SP) :: XADV,YADV,TXXIJ,TYYIJ,TXYIJ,UN REAL(SP) :: VISCOF,VISCOF1,VISCOF2,TEMP,TPA,TPB REAL(SP) :: XIJA,YIJA,XIJB,YIJB,UIJ,VIJ REAL(SP) :: SITA,DIJ,ELIJ,TMPA,TMPB,TMP,XFLUXV,YFLUXV REAL(SP) :: FACT,FM1,EXFLUX,ISWETTMP INTEGER :: I,IA,IB,J1,J2,K1,K2,K3,K4,K5,K6,K,II,J,I1,I2 ! REAL(SP) :: TY REAL(SP) :: UIJ1_TMP,VIJ1_TMP,UIJ2_TMP,VIJ2_TMP,UIJ3_TMP,VIJ3_TMP REAL(SP) :: U_TMP,V_TMP,UF_TMP,VF_TMP REAL(SP) :: TXXIJ_TMP,TYYIJ_TMP REAL(SP) :: XADV_TMP,YADV_TMP,PSTX_TMP,PSTY_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,EXFLUX_TMP REAL(SP) :: DLTXC_TMP,DLTYC_TMP REAL(SP) :: VX1_TMP,VX2_TMP,VY1_TMP,VY2_TMP REAL(SP) :: UIA,VIA,UIB,VIB,UK1,VK1,UK2,VK2,UK3,VK3,UK4,VK4,UK5,VK5,UK6,VK6 REAL(SP) :: XIJC_TMP,YIJC_TMP,XCIA_TMP,YCIA_TMP,XCIB_TMP,YCIB_TMP REAL(SP) :: CETA # if defined (LIMITED_NO) REAL(SP) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY # else REAL(SP),ALLOCATABLE,DIMENSION(:) :: UIJ1,VIJ1,UIJ2,VIJ2,FXX,FYY REAL(SP),ALLOCATABLE,DIMENSION(:) :: UALFA,VALFA REAL(SP) :: UALFA_TMP,VALFA_TMP INTEGER :: ERROR REAL(SP) :: EPS # endif INTEGER :: STG, K_STG !------------------------------------------------------------------------------! ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: adv_uv_edge_xy" SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !-----Initialize Flux Variables------------------------------------------------! ! DO K = 1,KBM1 DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) IF(CELL_NORTHAREA(IA) == 1)THEN XFLUX(IA,K) = 0.0_SP YFLUX(IA,K) = 0.0_SP PSTX_TM(IA,K) = 0.0_SP PSTY_TM(IA,K) = 0.0_SP # if defined (SEMI_IMPLICIT) XFLUX3_NP(IA,K) = 0.0_SP YFLUX3_NP(IA,K) = 0.0_SP # endif END IF IF(CELL_NORTHAREA(IB) == 1)THEN XFLUX(IB,K) = 0.0_SP YFLUX(IB,K) = 0.0_SP PSTX_TM(IB,K) = 0.0_SP PSTY_TM(IB,K) = 0.0_SP # if defined (SEMI_IMPLICIT) XFLUX3_NP(IB,K) = 0.0_SP YFLUX3_NP(IB,K) = 0.0_SP # endif END IF END DO END DO ! !-----Loop Over Edges and Accumulate Flux--------------------------------------! ! # if !defined (LIMITED_NO) ALLOCATE(UIJ1(NPE),VIJ1(NPE),UIJ2(NPE),VIJ2(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UIJ1,VIJ1,UIJ2 and VIJ2 can not be allocated", & & "in SUBROUTINE ADV_UV_EDGE_XY.") ALLOCATE(UALFA(0:NT),VALFA(0:NT),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays UALFA,VALFA can not be allocated", & & "in SUBROUTINE ADV_UV_EDGE_XY.") ALLOCATE(FXX(NPE),FYY(NPE),STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("The arrays FXX,FYY can not be allocated", & & "in SUBROUTINE ADV_UV_EDGE_XY.") DO K=1,KBM1 UIJ1=0.0_SP;VIJ1=0.0_SP;UIJ2=0.0_SP;VIJ2=0.0_SP UALFA=1.0_SP;VALFA=1.0_SP FXX=0.0_SP;FYY=0.0_SP DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) ! DIJ=0.5_SP*(DT(J1)+DT(J2)) K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) K4=NBE(IB,1) K5=NBE(IB,2) K6=NBE(IB,3) XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJA = XIJC_TMP-XCIA_TMP YIJA = YIJC_TMP-YCIA_TMP XIJB = XIJC_TMP-XCIB_TMP YIJB = YIJC_TMP-YCIB_TMP DIJ=0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) UK1 = -V(K1,K)*COS(XC(K1)*DEG2RAD)-U(K1,K)*SIN(XC(K1)*DEG2RAD) VK1 = -V(K1,K)*SIN(XC(K1)*DEG2RAD)+U(K1,K)*COS(XC(K1)*DEG2RAD) UK2 = -V(K2,K)*COS(XC(K2)*DEG2RAD)-U(K2,K)*SIN(XC(K2)*DEG2RAD) VK2 = -V(K2,K)*SIN(XC(K2)*DEG2RAD)+U(K2,K)*COS(XC(K2)*DEG2RAD) UK3 = -V(K3,K)*COS(XC(K3)*DEG2RAD)-U(K3,K)*SIN(XC(K3)*DEG2RAD) VK3 = -V(K3,K)*SIN(XC(K3)*DEG2RAD)+U(K3,K)*COS(XC(K3)*DEG2RAD) UK4 = -V(K4,K)*COS(XC(K4)*DEG2RAD)-U(K4,K)*SIN(XC(K4)*DEG2RAD) VK4 = -V(K4,K)*SIN(XC(K4)*DEG2RAD)+U(K4,K)*COS(XC(K4)*DEG2RAD) UK5 = -V(K5,K)*COS(XC(K5)*DEG2RAD)-U(K5,K)*SIN(XC(K5)*DEG2RAD) VK5 = -V(K5,K)*SIN(XC(K5)*DEG2RAD)+U(K5,K)*COS(XC(K5)*DEG2RAD) UK6 = -V(K6,K)*COS(XC(K6)*DEG2RAD)-U(K6,K)*SIN(XC(K6)*DEG2RAD) VK6 = -V(K6,K)*SIN(XC(K6)*DEG2RAD)+U(K6,K)*COS(XC(K6)*DEG2RAD) COFA1=A1U_XY(IA,1)*UIA+A1U_XY(IA,2)*UK1 & +A1U_XY(IA,3)*UK2+A1U_XY(IA,4)*UK3 COFA2=A2U_XY(IA,1)*UIA+A2U_XY(IA,2)*UK1 & +A2U_XY(IA,3)*UK2+A2U_XY(IA,4)*UK3 COFA5=A1U_XY(IA,1)*VIA+A1U_XY(IA,2)*VK1 & +A1U_XY(IA,3)*VK2+A1U_XY(IA,4)*VK3 COFA6=A2U_XY(IA,1)*VIA+A2U_XY(IA,2)*VK1 & +A2U_XY(IA,3)*VK2+A2U_XY(IA,4)*VK3 UIJ1(II)=COFA1*XIJA+COFA2*YIJA VIJ1(II)=COFA5*XIJA+COFA6*YIJA UALFA_TMP=ABS(UIA-UIB)/ABS(UIJ1(II)+EPSILON(EPS)) VALFA_TMP=ABS(VIA-VIB)/ABS(VIJ1(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IA)=MIN(UALFA(IA),UALFA_TMP) VALFA(IA)=MIN(VALFA(IA),VALFA_TMP) COFA3=A1U_XY(IB,1)*UIB+A1U_XY(IB,2)*UK4 & +A1U_XY(IB,3)*UK5+A1U_XY(IB,4)*UK6 COFA4=A2U_XY(IB,1)*UIB+A2U_XY(IB,2)*UK4 & +A2U_XY(IB,3)*UK5+A2U_XY(IB,4)*UK6 COFA7=A1U_XY(IB,1)*VIB+A1U_XY(IB,2)*VK4 & +A1U_XY(IB,3)*VK5+A1U_XY(IB,4)*VK6 COFA8=A2U_XY(IB,1)*VIB+A2U_XY(IB,2)*VK4 & +A2U_XY(IB,3)*VK5+A2U_XY(IB,4)*VK6 UIJ2(II)=COFA3*XIJB+COFA4*YIJB VIJ2(II)=COFA7*XIJB+COFA8*YIJB UALFA_TMP=ABS(UIA-UIB)/ABS(UIJ2(II)+EPSILON(EPS)) VALFA_TMP=ABS(VIA-VIB)/ABS(VIJ2(II)+EPSILON(EPS)) IF(UALFA_TMP > 1)UALFA_TMP = 1.0_SP IF(VALFA_TMP > 1)VALFA_TMP = 1.0_SP UALFA(IB)=MIN(UALFA(IB),UALFA_TMP) VALFA(IB)=MIN(VALFA(IB),VALFA_TMP) !-------ADD THE VISCOUS TERM & ADVECTION TERM---------------------------------! ! VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) ! VISCOF=FACT*0.5_SP*HORCON*(VISCOF1+VISCOF2)/HPRNU + FM1*HORCON ! VISCOF=FACT*0.5_SP*HORCON*(VISCOF1+VISCOF2)/HPRNU + FM1*HORCON/HPRNU ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX(II)=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY(II)=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) ENDDO DO II=1, NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) # if !defined (SEMI_IMPLICIT) ELIJ=0.5_SP*(EGF(J1)+EGF(J2)) ! ggao 0103-2007 consider the sea surface pressure change # if defined (AIR_PRESSURE) ELIJ=ELIJ-0.5_SP*(EGF_AIR(J1)+EGF_AIR(J2)) # endif ! change end # if defined (EQUI_TIDE) ELIJ=ELIJ-0.5_SP*(EGF_EQI(J1)+EGF_EQI(J2)) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-0.5_SP*(EGF_ATMO(J1)+EGF_ATMO(J2)) # endif # else IF(STG<K_STG) THEN ELIJ=0.5_SP*(ET(J1)+ET(J2)) ELSE ELIJ=(1.0_SP-CETA)*0.5_SP*(ET(J1)+ET(J2)) ENDIF # if defined (AIR_PRESSURE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_AIR(J1)+EL_AIR(J2))+CETA*0.5_SP*(ELF_AIR(J1)+ELF_AIR(J2)) ) # endif # if defined (EQUI_TIDE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_EQI(J1)+EL_EQI(J2))+CETA*0.5_SP*(ELF_EQI(J1)+ELF_EQI(J2)) ) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2))+CETA*0.5_SP*(ELF_ATMO(J1)+ELF_ATMO(J2)) ) # endif # endif DIJ=0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) UIJ1(II)=UIA+UALFA(IA)*UIJ1(II) VIJ1(II)=VIA+VALFA(IA)*VIJ1(II) UIJ2(II)=UIB+UALFA(IB)*UIJ2(II) VIJ2(II)=VIB+VALFA(IB)*VIJ2(II) # if defined (LIMITED_1) IF(UIJ1(II) > MAX(UIA,UIB) .OR. UIJ1(II) < MIN(UIA,UIB) .OR. & UIJ2(II) > MAX(UIA,UIB) .OR. UIJ2(II) < MIN(UIA,UIB))THEN UIJ1(II)=UIA UIJ2(II)=UIB END IF IF(VIJ1(II) > MAX(VIA,VIB) .OR. VIJ1(II) < MIN(VIA,VIB) .OR. & VIJ2(II) > MAX(VIA,VIB) .OR. VIJ2(II) < MIN(VIA,VIB))THEN VIJ1(II)=VIA VIJ2(II)=VIB END IF # endif UIJ1_TMP = UIJ1(II) VIJ1_TMP = VIJ1(II) UIJ2_TMP = UIJ2(II) VIJ2_TMP = VIJ2(II) VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)!& ! * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP UIJ_TMP=0.5_SP*(UIJ1(II)+UIJ2(II)) VIJ_TMP=0.5_SP*(VIJ1(II)+VIJ2(II)) EXFLUX_TMP = DIJ*(-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP) !!CALCULATE BOUNDARY FLUX AUGMENTERS TPA = FLOAT(1-ISBC(I))*EPOR(IA) TPB = FLOAT(1-ISBC(I))*EPOR(IB) !!ACCUMULATE ADVECTIVE + DIFFUSIVE + BAROTROPIC PRESSURE GRADIENT TERMS XADV_TMP=EXFLUX_TMP*& ((1.0_SP-SIGN(1.0_SP,EXFLUX_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,EXFLUX_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=EXFLUX_TMP* & ((1.0_SP-SIGN(1.0_SP,EXFLUX_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,EXFLUX_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) # else XFLUX3_NP(IA,K)=XFLUX3_NP(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX3_NP(IA,K)=YFLUX3_NP(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) XFLUX3_NP(IB,K)=XFLUX3_NP(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX3_NP(IB,K)=YFLUX3_NP(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) # endif ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) # else XFLUX3_NP(IA,K)=XFLUX3_NP(IA,K)+XADV_TMP*TPA+(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IA) YFLUX3_NP(IA,K)=YFLUX3_NP(IA,K)+YADV_TMP*TPA+(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IA) # endif ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) # else XFLUX3_NP(IB,K)=XFLUX3_NP(IB,K)-XADV_TMP*TPB-(FXX(II)+3.0_SP*FXX(II)*FLOAT(ISBC(I)))*EPOR(IB) YFLUX3_NP(IB,K)=YFLUX3_NP(IB,K)-YADV_TMP*TPB-(FYY(II)+3.0_SP*FYY(II)*FLOAT(ISBC(I)))*EPOR(IB) # endif END IF VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ! PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*H1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & ! (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ! PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*H1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & ! (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ! PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*H1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & ! (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ! PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*H1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & ! (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ! PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*H1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & ! (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ! PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*H1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & ! (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ! PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*H1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & ! (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ! PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*H1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & ! (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) END IF END DO END DO DEALLOCATE(UIJ1,VIJ1,UIJ2,VIJ2,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UIJ1,VIJ1,UIJ2 and VIJ2", & & "in subroutine ADV_UV_EDGE_XY.") DEALLOCATE(UALFA,VALFA,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for UALFA,VALFA", & & "in subroutine ADV_UV_EDGE_XY.") DEALLOCATE(FXX,FYY,STAT=ERROR) IF(ERROR /= 0) & & CALL FATAL_ERROR("Unexpected deallocation error for FXX,FYY", & & "in subroutine ADV_UV_EDGE_XY.") # else DO II=1,NPE I=NPEDGE_LST(II) IA=IEC(I,1) IB=IEC(I,2) J1=IENODE(I,1) J2=IENODE(I,2) ! DIJ=0.5_SP*(DT(J1)+DT(J2)) # if !defined (SEMI_IMPLICIT) ELIJ=0.5_SP*(EGF(J1)+EGF(J2)) ! ggao 0103-2007 consider the sea surface pressure change # if defined (AIR_PRESSURE) ELIJ=ELIJ-0.5_SP*(EGF_AIR(J1)+EGF_AIR(J2)) # endif ! change end # if defined (EQUI_TIDE) ELIJ=ELIJ-0.5_SP*(EGF_EQI(J1)+EGF_EQI(J2)) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-0.5_SP*(EGF_ATMO(J1)+EGF_ATMO(J2)) # endif # else IF(STG<K_STG) THEN ELIJ=0.5_SP*(ET(J1)+ET(J2)) ELSE ELIJ=(1.0_SP-CETA)*0.5_SP*(ET(J1)+ET(J2)) ENDIF # if defined (AIR_PRESSURE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_AIR(J1)+EL_AIR(J2))+CETA*0.5_SP*(ELF_AIR(J1)+ELF_AIR(J2)) ) # endif # if defined (EQUI_TIDE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_EQI(J1)+EL_EQI(J2))+CETA*0.5_SP*(ELF_EQI(J1)+ELF_EQI(J2)) ) # endif # if defined (ATMO_TIDE) ELIJ=ELIJ-( (1.0_SP-CETA)*0.5_SP*(EL_ATMO(J1)+EL_ATMO(J2))+CETA*0.5_SP*(ELF_ATMO(J1)+ELF_ATMO(J2)) ) # endif # endif K1=NBE(IA,1) K2=NBE(IA,2) K3=NBE(IA,3) K4=NBE(IB,1) K5=NBE(IB,2) K6=NBE(IB,3) XIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * COS(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) YIJC_TMP = REARTH * COS(YIJC(I)*DEG2RAD) * SIN(XIJC(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(YIJC(I)*DEG2RAD)) XCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * COS(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) YCIA_TMP = REARTH * COS(YC(IA)*DEG2RAD) * SIN(XC(IA)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IA)*DEG2RAD)) XCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * COS(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) YCIB_TMP = REARTH * COS(YC(IB)*DEG2RAD) * SIN(XC(IB)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(IB)*DEG2RAD)) XIJA = XIJC_TMP-XCIA_TMP YIJA = YIJC_TMP-YCIA_TMP XIJB = XIJC_TMP-XCIB_TMP YIJB = YIJC_TMP-YCIB_TMP DO K=1,KBM1 DIJ=0.5_SP*(DT(J1)*DZ(J1,K)+DT(J2)*DZ(J2,K)) UIA = -V(IA,K)*COS(XC(IA)*DEG2RAD)-U(IA,K)*SIN(XC(IA)*DEG2RAD) VIA = -V(IA,K)*SIN(XC(IA)*DEG2RAD)+U(IA,K)*COS(XC(IA)*DEG2RAD) UIB = -V(IB,K)*COS(XC(IB)*DEG2RAD)-U(IB,K)*SIN(XC(IB)*DEG2RAD) VIB = -V(IB,K)*SIN(XC(IB)*DEG2RAD)+U(IB,K)*COS(XC(IB)*DEG2RAD) UK1 = -V(K1,K)*COS(XC(K1)*DEG2RAD)-U(K1,K)*SIN(XC(K1)*DEG2RAD) VK1 = -V(K1,K)*SIN(XC(K1)*DEG2RAD)+U(K1,K)*COS(XC(K1)*DEG2RAD) UK2 = -V(K2,K)*COS(XC(K2)*DEG2RAD)-U(K2,K)*SIN(XC(K2)*DEG2RAD) VK2 = -V(K2,K)*SIN(XC(K2)*DEG2RAD)+U(K2,K)*COS(XC(K2)*DEG2RAD) UK3 = -V(K3,K)*COS(XC(K3)*DEG2RAD)-U(K3,K)*SIN(XC(K3)*DEG2RAD) VK3 = -V(K3,K)*SIN(XC(K3)*DEG2RAD)+U(K3,K)*COS(XC(K3)*DEG2RAD) UK4 = -V(K4,K)*COS(XC(K4)*DEG2RAD)-U(K4,K)*SIN(XC(K4)*DEG2RAD) VK4 = -V(K4,K)*SIN(XC(K4)*DEG2RAD)+U(K4,K)*COS(XC(K4)*DEG2RAD) UK5 = -V(K5,K)*COS(XC(K5)*DEG2RAD)-U(K5,K)*SIN(XC(K5)*DEG2RAD) VK5 = -V(K5,K)*SIN(XC(K5)*DEG2RAD)+U(K5,K)*COS(XC(K5)*DEG2RAD) UK6 = -V(K6,K)*COS(XC(K6)*DEG2RAD)-U(K6,K)*SIN(XC(K6)*DEG2RAD) VK6 = -V(K6,K)*SIN(XC(K6)*DEG2RAD)+U(K6,K)*COS(XC(K6)*DEG2RAD) COFA1=A1U_XY(IA,1)*UIA+A1U_XY(IA,2)*UK1 & +A1U_XY(IA,3)*UK2+A1U_XY(IA,4)*UK3 COFA2=A2U_XY(IA,1)*UIA+A2U_XY(IA,2)*UK1 & +A2U_XY(IA,3)*UK2+A2U_XY(IA,4)*UK3 COFA5=A1U_XY(IA,1)*VIA+A1U_XY(IA,2)*VK1 & +A1U_XY(IA,3)*VK2+A1U_XY(IA,4)*VK3 COFA6=A2U_XY(IA,1)*VIA+A2U_XY(IA,2)*VK1 & +A2U_XY(IA,3)*VK2+A2U_XY(IA,4)*VK3 UIJ1=UIA+COFA1*XIJA+COFA2*YIJA VIJ1=VIA+COFA5*XIJA+COFA6*YIJA COFA3=A1U_XY(IB,1)*UIB+A1U_XY(IB,2)*UK4 & +A1U_XY(IB,3)*UK5+A1U_XY(IB,4)*UK6 COFA4=A2U_XY(IB,1)*UIB+A2U_XY(IB,2)*UK4 & +A2U_XY(IB,3)*UK5+A2U_XY(IB,4)*UK6 COFA7=A1U_XY(IB,1)*VIB+A1U_XY(IB,2)*VK4 & +A1U_XY(IB,3)*VK5+A1U_XY(IB,4)*VK6 COFA8=A2U_XY(IB,1)*VIB+A2U_XY(IB,2)*VK4 & +A2U_XY(IB,3)*VK5+A2U_XY(IB,4)*VK6 UIJ2=UIB+COFA3*XIJB+COFA4*YIJB VIJ2=VIB+COFA7*XIJB+COFA8*YIJB !-------ADD THE VISCOUS TERM & ADVECTION TERM---------------------------------! ! VISCOF1=ART(IA)*SQRT(COFA1**2+COFA6**2+0.5_SP*(COFA2+COFA5)**2) VISCOF2=ART(IB)*SQRT(COFA3**2+COFA8**2+0.5_SP*(COFA4+COFA7)**2) !VISCOF=FACT*0.5_SP*HORCON*(VISCOF1+VISCOF2)/HPRNU + FM1*HORCON ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOF1*CC_HVC(IA)+VISCOF2*CC_HVC(IB)) + FM1*0.5_SP*(CC_HVC(IA)+CC_HVC(IB)))/HPRNU VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD)& * 2._SP /(1._SP+SIN(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP TXXIJ=(COFA1+COFA3)*VISCOF TYYIJ=(COFA6+COFA8)*VISCOF TXYIJ=0.5_SP*(COFA2+COFA4+COFA5+COFA7)*VISCOF FXX=DIJ*(TXXIJ*DLTYC_TMP-TXYIJ*DLTXC_TMP) FYY=DIJ*(TXYIJ*DLTYC_TMP-TYYIJ*DLTXC_TMP) UIJ1_TMP = UIJ1 VIJ1_TMP = VIJ1 UIJ2_TMP = UIJ2 VIJ2_TMP = VIJ2 UIJ_TMP=0.5_SP*(UIJ1+UIJ2) VIJ_TMP=0.5_SP*(VIJ1+VIJ2) EXFLUX_TMP = DIJ*(-UIJ_TMP*DLTYC_TMP + VIJ_TMP*DLTXC_TMP) !!CALCULATE BOUNDARY FLUX AUGMENTERS TPA = FLOAT(1-ISBC(I))*EPOR(IA) TPB = FLOAT(1-ISBC(I))*EPOR(IB) !!ACCUMULATE ADVECTIVE + DIFFUSIVE + BAROTROPIC PRESSURE GRADIENT TERMS XADV_TMP=EXFLUX_TMP*& ((1.0_SP-SIGN(1.0_SP,EXFLUX_TMP))*UIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,EXFLUX_TMP))*UIJ1_TMP)*0.5_SP YADV_TMP=EXFLUX_TMP* & ((1.0_SP-SIGN(1.0_SP,EXFLUX_TMP))*VIJ2_TMP & +(1.0_SP+SIGN(1.0_SP,EXFLUX_TMP))*VIJ1_TMP)*0.5_SP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) # else XFLUX3_NP(IA,K)=XFLUX3_NP(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX3_NP(IA,K)=YFLUX3_NP(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) XFLUX3_NP(IB,K)=XFLUX3_NP(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX3_NP(IB,K)=YFLUX3_NP(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) # endif ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IA,K)=XFLUX(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX(IA,K)=YFLUX(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) # else XFLUX3_NP(IA,K)=XFLUX3_NP(IA,K)+XADV_TMP*TPA+(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IA) YFLUX3_NP(IA,K)=YFLUX3_NP(IA,K)+YADV_TMP*TPA+(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IA) # endif ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN # if !defined (SEMI_IMPLICIT) XFLUX(IB,K)=XFLUX(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX(IB,K)=YFLUX(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) # else XFLUX3_NP(IB,K)=XFLUX3_NP(IB,K)-XADV_TMP*TPB-(FXX+3.0_SP*FXX*FLOAT(ISBC(I)))*EPOR(IB) YFLUX3_NP(IB,K)=YFLUX3_NP(IB,K)-YADV_TMP*TPB-(FYY+3.0_SP*FYY*FLOAT(ISBC(I)))*EPOR(IB) # endif END IF VX1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * COS(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VY1_TMP = REARTH * COS(VY(IENODE(I,1))*DEG2RAD) * SIN(VX(IENODE(I,1))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,1))*DEG2RAD)) VX2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * COS(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) VY2_TMP = REARTH * COS(VY(IENODE(I,2))*DEG2RAD) * SIN(VX(IENODE(I,2))*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IENODE(I,2))*DEG2RAD)) DLTXC_TMP = VX2_TMP-VX1_TMP DLTYC_TMP = VY2_TMP-VY1_TMP IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) == 1)THEN PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) ELSE IF(CELL_NORTHAREA(IA) == 1 .AND. CELL_NORTHAREA(IB) /= 1)THEN PSTX_TM(IA,K)=PSTX_TM(IA,K)-GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) PSTY_TM(IA,K)=PSTY_TM(IA,K)+GRAV_E(IA)*DT1(IA)*DZ1(IA,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IA)*DEG2RAD))) ELSE IF(CELL_NORTHAREA(IB) == 1 .AND. CELL_NORTHAREA(IA) /= 1)THEN PSTX_TM(IB,K)=PSTX_TM(IB,K)+GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTYC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) PSTY_TM(IB,K)=PSTY_TM(IB,K)-GRAV_E(IB)*DT1(IB)*DZ1(IB,K)*ELIJ*DLTXC_TMP/ & (2._SP /(1._SP+sin(YC(IB)*DEG2RAD))) END IF END DO END DO # endif DO K = 1,KBM1 DO II=1,NP I=NP_LST(II) # if !defined (SEMI_IMPLICIT) XFLUX(I,K)=XFLUX(I,K)+PSTX_TM(I,K) YFLUX(I,K)=YFLUX(I,K)+PSTY_TM(I,K) # else XFLUX3_NP(I,K)=XFLUX3_NP(I,K)+PSTX_TM(I,K) YFLUX3_NP(I,K)=YFLUX3_NP(I,K)+PSTY_TM(I,K) # endif END DO END DO ! !-------ADD VERTICAL CONVECTIVE FLUX, CORIOLIS TERM AND BAROCLINIC PG TERM----! ! DO II=1,NP I=NP_LST(II) IF(CELL_NORTHAREA(I) == 1)THEN DO K=1,KBM1 IF(K == 1) THEN UIJ1_TMP = -V(I,K)*COS(XC(I)*DEG2RAD)-U(I,K)*SIN(XC(I)*DEG2RAD) VIJ1_TMP = -V(I,K)*SIN(XC(I)*DEG2RAD)+U(I,K)*COS(XC(I)*DEG2RAD) UIJ2_TMP = -V(I,K+1)*COS(XC(I)*DEG2RAD)-U(I,K+1)*SIN(XC(I)*DEG2RAD) VIJ2_TMP = -V(I,K+1)*SIN(XC(I)*DEG2RAD)+U(I,K+1)*COS(XC(I)*DEG2RAD) XFLUXV=-W(I,K+1)*(UIJ1_TMP*DZ1(I,K+1)+UIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K+1)) YFLUXV=-W(I,K+1)*(VIJ1_TMP*DZ1(I,K+1)+VIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K+1)) ELSE IF(K == KBM1) THEN UIJ1_TMP = -V(I,K)*COS(XC(I)*DEG2RAD)-U(I,K)*SIN(XC(I)*DEG2RAD) VIJ1_TMP = -V(I,K)*SIN(XC(I)*DEG2RAD)+U(I,K)*COS(XC(I)*DEG2RAD) UIJ2_TMP = -V(I,K-1)*COS(XC(I)*DEG2RAD)-U(I,K-1)*SIN(XC(I)*DEG2RAD) VIJ2_TMP = -V(I,K-1)*SIN(XC(I)*DEG2RAD)+U(I,K-1)*COS(XC(I)*DEG2RAD) XFLUXV= W(I,K)*(UIJ1_TMP*DZ1(I,K-1)+UIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K-1)) YFLUXV= W(I,K)*(VIJ1_TMP*DZ1(I,K-1)+VIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K-1)) ELSE UIJ1_TMP = -V(I,K)*COS(XC(I)*DEG2RAD)-U(I,K)*SIN(XC(I)*DEG2RAD) VIJ1_TMP = -V(I,K)*SIN(XC(I)*DEG2RAD)+U(I,K)*COS(XC(I)*DEG2RAD) UIJ2_TMP = -V(I,K-1)*COS(XC(I)*DEG2RAD)-U(I,K-1)*SIN(XC(I)*DEG2RAD) VIJ2_TMP = -V(I,K-1)*SIN(XC(I)*DEG2RAD)+U(I,K-1)*COS(XC(I)*DEG2RAD) UIJ3_TMP = -V(I,K+1)*COS(XC(I)*DEG2RAD)-U(I,K+1)*SIN(XC(I)*DEG2RAD) VIJ3_TMP = -V(I,K+1)*SIN(XC(I)*DEG2RAD)+U(I,K+1)*COS(XC(I)*DEG2RAD) XFLUXV= W(I,K)*(UIJ1_TMP*DZ1(I,K-1)+UIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K-1))- & W(I,K+1)*(UIJ1_TMP*DZ1(I,K+1)+UIJ3_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K+1)) YFLUXV= W(I,K)*(VIJ1_TMP*DZ1(I,K-1)+VIJ2_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K-1))- & W(I,K+1)*(VIJ1_TMP*DZ1(I,K+1)+VIJ3_TMP*DZ1(I,K))/(DZ1(I,K)+DZ1(I,K+1)) END IF U_TMP = -V(I,K)*COS(XC(I)*DEG2RAD)-U(I,K)*SIN(XC(I)*DEG2RAD) V_TMP = -V(I,K)*SIN(XC(I)*DEG2RAD)+U(I,K)*COS(XC(I)*DEG2RAD) # if !defined (SEMI_IMPLICIT) ! XFLUX(I,K)=XFLUX(I,K)+XFLUXV/DZ(K)*ART(I)& ! +DRHOX(I,K)-COR(I)*V_TMP*DT1(I)*ART(I) ! YFLUX(I,K)=YFLUX(I,K)+YFLUXV/DZ(K)*ART(I)& ! +DRHOY(I,K)+COR(I)*U_TMP*DT1(I)*ART(I) XFLUX(I,K)=XFLUX(I,K)+XFLUXV*ART(I)& +DRHOX(I,K)-COR(I)*V_TMP*DT1(I)*DZ1(I,K)*ART(I) YFLUX(I,K)=YFLUX(I,K)+YFLUXV*ART(I)& +DRHOY(I,K)+COR(I)*U_TMP*DT1(I)*DZ1(I,K)*ART(I) # else ! XFLUX3_NP(I,K)=XFLUX3_NP(I,K)+XFLUXV/DZ(K)*ART(I)& ! +DRHOX(I,K)-COR(I)*V_TMP*DT1(I)*ART(I) ! YFLUX3_NP(I,K)=YFLUX3_NP(I,K)+YFLUXV/DZ(K)*ART(I)& ! +DRHOY(I,K)+COR(I)*U_TMP*DT1(I)*ART(I) XFLUX3_NP(I,K)=XFLUX3_NP(I,K)+XFLUXV*ART(I)& +DRHOX(I,K)-COR(I)*V_TMP*DT1(I)*DZ1(I,K)*ART(I) YFLUX3_NP(I,K)=YFLUX3_NP(I,K)+YFLUXV*ART(I)& +DRHOY(I,K)+COR(I)*U_TMP*DT1(I)*DZ1(I,K)*ART(I) # endif END DO END IF END DO # if defined (SEMI_IMPLICIT) DO II=1, NP I = NP_LST(II) IF(CELL_NORTHAREA(I) ==1 ) THEN DO K=1, KBM1 XFLUX(I,K) = YFLUX3_NP(I,K)*COS(XC(I)*DEG2RAD)-XFLUX3_NP(I,K)*SIN(XC(I)*DEG2RAD) YFLUX(I,K) = -( XFLUX3_NP(I,K)*COS(XC(I)*DEG2RAD)+YFLUX3_NP(I,K)*SIN(XC(I)*DEG2RAD) ) ENDDO ENDIF ENDDO # endif IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: adv_uv_edge_xy" RETURN END SUBROUTINE ADV_UV_EDGE_XY !==============================================================================! !==============================================================================| # if !defined (SEMI_IMPLICIT) SUBROUTINE EXTEL_EDGE_XY(K,XFLUX) USE MOD_OBCS IMPLICIT NONE REAL(SP) :: XFLUX(0:MT) REAL(SP) :: DIJ,UIJ,VIJ INTEGER :: I,J,K,I1,IA,IB,JJ,J1,J2,II REAL(SP) :: UIJ_TMP,VIJ_TMP,EXFLUX_TMP REAL(SP) :: DLTXE_TMP,DLTYE_TMP REAL(SP) :: VX1_TMP,VX2_TMP,VY1_TMP,VY2_TMP ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: extel_edge_XY" !----------INITIALIZE FLUX ARRAY ----------------------------------------------! DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA) = 0.0_SP END IF IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB) = 0.0_SP END IF END DO !---------ACCUMULATE FLUX BY LOOPING OVER CONTROL VOLUME HALF EDGES------------! DO II=1,NPCV I = NCEDGE_LST(II) I1 = NTRG(I) IA = NIEC(I,1) IB = NIEC(I,2) DIJ = D1(I1) UIJ = UA(I1) VIJ = VA(I1) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN UIJ_TMP = -VIJ*COS(XC(I1)*DEG2RAD)-UIJ*SIN(XC(I1)*DEG2RAD) VIJ_TMP = -VIJ*SIN(XC(I1)*DEG2RAD)+UIJ*COS(XC(I1)*DEG2RAD) VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP EXFLUX_TMP = DIJ*(-UIJ_TMP*DLTYE_TMP+VIJ_TMP*DLTXE_TMP) END IF IF(IA == NODE_NORTHPOLE) THEN XFLUX(IA) = XFLUX(IA)-EXFLUX_TMP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB) = XFLUX(IB)+EXFLUX_TMP END IF END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: extel_edge_XY" RETURN END SUBROUTINE EXTEL_EDGE_XY # endif !==============================================================================| !==============================================================================| # if !defined (SEMI_IMPLICIT) SUBROUTINE EXTUV_EDGE_XY(K) IMPLICIT NONE INTEGER, INTENT(IN) :: K REAL(SP), DIMENSION(0:NT) :: RESX,RESY INTEGER :: I,II REAL(SP) :: UARK_TMP,VARK_TMP,UAF_TMP,VAF_TMP,UA_TMP,VA_TMP REAL(SP) :: WUSURF2_TMP,WVSURF2_TMP,WUBOT_TMP,WVBOT_TMP ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: extuv_edge_XY" ! !--ACCUMULATE RESIDUALS FOR EXTERNAL MODE EQUATIONS----------------------------| ! DO II=1,NP I=NP_LST(II) UA_TMP = -VA(I)*COS(XC(I)*DEG2RAD)-UA(I)*SIN(XC(I)*DEG2RAD) VA_TMP = -VA(I)*SIN(XC(I)*DEG2RAD)+UA(I)*COS(XC(I)*DEG2RAD) WUSURF2_TMP = -WVSURF2(I)*COS(XC(I)*DEG2RAD)-WUSURF2(I)*SIN(XC(I)*DEG2RAD) WVSURF2_TMP = -WVSURF2(I)*SIN(XC(I)*DEG2RAD)+WUSURF2(I)*COS(XC(I)*DEG2RAD) WUBOT_TMP = -WVBOT(I)*COS(XC(I)*DEG2RAD)-WUBOT(I)*SIN(XC(I)*DEG2RAD) WVBOT_TMP = -WVBOT(I)*SIN(XC(I)*DEG2RAD)+WUBOT(I)*COS(XC(I)*DEG2RAD) RESX(I) = ADX2D(I)+ADVUA(I)+DRX2D(I)+PSTX(I) & -COR(I)*VA_TMP*D1(I)*ART(I) & -(WUSURF2_TMP+WUBOT_TMP)*ART(I) RESY(I) = ADY2D(I)+ADVVA(I)+DRY2D(I)+PSTY(I) & +COR(I)*UA_TMP*D1(I)*ART(I) & -(WVSURF2_TMP+WVBOT_TMP)*ART(I) ! !--UPDATE----------------------------------------------------------------------| ! UARK_TMP = -VARK(I)*COS(XC(I)*DEG2RAD)-UARK(I)*SIN(XC(I)*DEG2RAD) VARK_TMP = -VARK(I)*SIN(XC(I)*DEG2RAD)+UARK(I)*COS(XC(I)*DEG2RAD) UAF_TMP = (UARK_TMP*(H1(I)+ELRK1(I)) & -ALPHA_RK(K)*DTE*RESX(I)/ART(I))/(H1(I)+ELF1(I)) VAF_TMP = (VARK_TMP*(H1(I)+ELRK1(I)) & -ALPHA_RK(K)*DTE*RESY(I)/ART(I))/(H1(I)+ELF1(I)) UAF(I) = VAF_TMP*COS(XC(I)*DEG2RAD)-UAF_TMP*SIN(XC(I)*DEG2RAD) VAF(I) = UAF_TMP*COS(XC(I)*DEG2RAD)+VAF_TMP*SIN(XC(I)*DEG2RAD) VAF(I) = -VAF(I) END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: extuv_edge_XY" RETURN END SUBROUTINE EXTUV_EDGE_XY # endif !==============================================================================| !==============================================================================| SUBROUTINE VERTVL_EDGE_XY(XFLUX,CETA) !------------------------------------------------------------------------------| IMPLICIT NONE REAL(SP) :: XFLUX(MT,KBM1) REAL(SP) :: DIJ,UIJ,VIJ,UN,EXFLUX,TMP1,DIJ1,UIJ1,VIJ1 INTEGER :: I,K,IA,IB,I1 ,J,JJ,J1,J2,II REAL(SP) :: UIJ_TMP,VIJ_TMP,VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP,UIJ1_TMP,VIJ1_TMP REAL(SP) :: DLTXE_TMP,DLTYE_TMP,EXFLUX_TMP REAL(SP) :: CETA !------------------------------------------------------------------------------| ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: Vertvl_edge_XY" !----------------------INITIALIZE FLUX-----------------------------------------! DO K=1,KBM1 DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K) = 0.0_SP END IF IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K) = 0.0_SP END IF END DO END DO !----------------------ACCUMULATE FLUX-----------------------------------------! DO II=1,NPCV I=NCEDGE_LST(II) I1=NTRG(I) IA=NIEC(I,1) IB=NIEC(I,2) ! DIJ=DT1(I1) DO K=1,KBM1 # if !defined (SEMI_IMPLICIT) DIJ=DT1(I1)*DZ1(I1,K) UIJ=U(I1,K) VIJ=V(I1,K) # else DIJ=DT1(I1)*DZ1(I1,K) DIJ1=D1(I1)*DZ1(I1,K) UIJ=U(I1,K) VIJ=V(I1,K) UIJ1=UF(I1,K) VIJ1=VF(I1,K) # endif IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN UIJ_TMP = -VIJ*COS(XC(I1)*DEG2RAD)-UIJ*SIN(XC(I1)*DEG2RAD) VIJ_TMP = -VIJ*SIN(XC(I1)*DEG2RAD)+UIJ*COS(XC(I1)*DEG2RAD) # if defined (SEMI_IMPLICIT) UIJ1_TMP = -VIJ1*COS(XC(I1)*DEG2RAD)-UIJ1*SIN(XC(I1)*DEG2RAD) VIJ1_TMP = -VIJ1*SIN(XC(I1)*DEG2RAD)+UIJ1*COS(XC(I1)*DEG2RAD) # endif VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD)& * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP # if !defined (SEMI_IMPLICIT) EXFLUX_TMP = DIJ*(-UIJ_TMP*DLTYE_TMP+VIJ_TMP*DLTXE_TMP) # else EXFLUX_TMP = (1.0_SP-CETA)*DIJ*(-UIJ_TMP*DLTYE_TMP+VIJ_TMP*DLTXE_TMP)+CETA*DIJ1*(-UIJ1_TMP*DLTYE_TMP+VIJ1_TMP*DLTXE_TMP) # endif END IF IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K) = XFLUX(IA,K)-EXFLUX_TMP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K) = XFLUX(IB,K)+EXFLUX_TMP END IF END DO END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: Vertvl_edge_xy" RETURN END SUBROUTINE VERTVL_EDGE_XY !==============================================================================| !==============================================================================| SUBROUTINE ADV_S_XY(XFLUX,XFLUX_ADV,PSPX,PSPY,PSPXD,PSPYD,VISCOFF,K,CETA) !------------------------------------------------------------------------------| IMPLICIT NONE INTEGER, INTENT(IN) :: K REAL(SP), DIMENSION(0:MT,KB) :: XFLUX,XFLUX_ADV REAL(SP), DIMENSION(M) :: PSPX,PSPY,PSPXD,PSPYD,VISCOFF ! REAL(SP), DIMENSION(3*(NT)) :: DTIJ REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ REAL(SP) :: XI,YI REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2 REAL(SP) :: TXX,TYY,FXX,FYY,VISCOF REAL(SP) :: FACT,FM1 INTEGER :: I,I1,I2,IA,IB,J,J1,J2,JTMP,JJ,II REAL(SP) :: TXPI,TYPI REAL(SP) :: VX_TMP,VY_TMP,VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP,VX3_TMP,VY3_TMP REAL(SP) :: XI_TMP,YI_TMP,VXA_TMP,VYA_TMP,VXB_TMP,VYB_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,DLTXE_TMP,DLTYE_TMP,UVN_TMP,EXFLUX_TMP REAL(SP) :: PUPX_TMP,PUPY_TMP,PVPX_TMP,PVPY_TMP REAL(SP) :: PSPX_TMP,PSPY_TMP,PSPXD_TMP,PSPYD_TMP REAL(SP) :: U_TMP,V_TMP REAL(SP) :: X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2 !! ggao edge calculation REAL(SP) :: XIJE1_TMP,YIJE1_TMP,XIJE2_TMP,YIJE2_TMP REAL(SP) :: S1MIN, S1MAX, S2MIN, S2MAX REAL(SP) :: CETA # if defined (SEMI_IMPLICIT) REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ1 REAL(SP) :: UIJ_TMP1, VIJ_TMP1, UVN_TMP1 # endif !------------------------------------------------------------------------------! ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: ADV_S_XY(K):",K SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !--Initialize Fluxes-----------------------------------------------------------! ! DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K) = 0.0_SP XFLUX_ADV(IA,K) = 0.0_SP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K) = 0.0_SP XFLUX_ADV(IB,K) = 0.0_SP END IF END DO ! !--Loop Over Control Volume Sub-Edges And Calculate Normal Velocity------------! ! DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) DTIJ(I,K)=DT1(I1)*DZ1(I1,K) # if defined (SEMI_IMPLICIT) DTIJ1(I,K) = D1(I1)*DZ1(I1,K) # endif END DO ! !--Calculate the Advection and Horizontal Diffusion Terms----------------------! ! I = NODE_NORTHPOLE IF(I==0) RETURN PUPX_TMP=0.0_SP PUPY_TMP=0.0_SP PVPX_TMP=0.0_SP PVPY_TMP=0.0_SP DO J=1,NTVE(I) I1=NBVE(I,J) JTMP=NBVT(I,J) J1=JTMP+1-(JTMP+1)/4*3 J2=JTMP+2-(JTMP+2)/4*3 VX_TMP = REARTH * COS(VY(I)*DEG2RAD) * COS(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VY_TMP = REARTH * COS(VY(I)*DEG2RAD) * SIN(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VX1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * COS(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VY1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * SIN(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VX2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * COS(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VY2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * SIN(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VX3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * COS(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) VY3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * SIN(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) X11=0.5_SP*(VX_TMP+VX1_TMP) Y11=0.5_SP*(VY_TMP+VY1_TMP) X22=VX2_TMP Y22=VX2_TMP X33=0.5_SP*(VX_TMP+VX3_TMP) Y33=0.5_SP*(VY_TMP+VY3_TMP) U_TMP = -V(I1,K)*COS(XC(I1)*DEG2RAD)-U(I1,K)*SIN(XC(I1)*DEG2RAD) V_TMP = -V(I1,K)*SIN(XC(I1)*DEG2RAD)+U(I1,K)*COS(XC(I1)*DEG2RAD) PUPX_TMP=PUPX_TMP+U_TMP*(Y11-Y33) PUPY_TMP=PUPY_TMP+U_TMP*(X33-X11) PVPX_TMP=PVPX_TMP+V_TMP*(Y11-Y33) PVPY_TMP=PVPY_TMP+V_TMP*(X33-X11) END DO PUPX_TMP=PUPX_TMP/ART1(I) PUPY_TMP=PUPY_TMP/ART1(I) PVPX_TMP=PVPX_TMP/ART1(I) PVPY_TMP=PVPY_TMP/ART1(I) TMP1=PUPX_TMP**2+PVPY_TMP**2 TMP2=0.5_SP*(PUPY_TMP+PVPX_TMP)**2 VISCOFF(I)=SQRT(TMP1+TMP2)*ART1(I) IF(K == KBM1) THEN AH_BOTTOM(I) = (FACT*VISCOFF(I) + FM1)*NN_HVC(I) END IF DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) IA=NIEC(I,1) IB=NIEC(I,2) IF((IA <= M .AND. IB <= M) .AND. I1 <= N)THEN ! XI=0.5_SP*(XIJE(I,1)+XIJE(I,2)) ! YI=0.5_SP*(YIJE(I,1)+YIJE(I,2)) !! ggao edge calculation XIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) YIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) XIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) YIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) XI_TMP =0.5_SP*(XIJE1_TMP+XIJE2_TMP) YI_TMP =0.5_SP*(YIJE1_TMP+YIJE2_TMP) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN ! XI_TMP = REARTH * COS(YI*DEG2RAD) * COS(XI*DEG2RAD) & ! * 2._SP /(1._SP+sin(YI*DEG2RAD)) ! YI_TMP = REARTH * COS(YI*DEG2RAD) * SIN(XI*DEG2RAD) & ! * 2._SP /(1._SP+sin(YI*DEG2RAD)) VXA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * COS(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VYA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * SIN(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VXB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * COS(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) VYB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * SIN(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) ! IF(IA == NODE_NORTHPOLE)THEN DXA=XI_TMP-VXA_TMP DYA=YI_TMP-VYA_TMP ! ELSE IF(IB == NODE_NORTHPOLE)THEN DXB=XI_TMP-VXB_TMP DYB=YI_TMP-VYB_TMP ! END IF ! END IF IF(IA == NODE_NORTHPOLE)THEN PSPX_TMP=-PSPY(IB)*COS(VX(IB)*DEG2RAD)-PSPX(IB)*SIN(VX(IB)*DEG2RAD) PSPY_TMP=-PSPY(IB)*SIN(VX(IB)*DEG2RAD)+PSPX(IB)*COS(VX(IB)*DEG2RAD) PSPXD_TMP=-PSPYD(IB)*COS(VX(IB)*DEG2RAD)-PSPXD(IB)*SIN(VX(IB)*DEG2RAD) PSPYD_TMP=-PSPYD(IB)*SIN(VX(IB)*DEG2RAD)+PSPXD(IB)*COS(VX(IB)*DEG2RAD) FIJ1=S1(IA,K)+DXA*PSPX(IA)+DYA*PSPY(IA) FIJ2=S1(IB,K)+DXB*PSPX_TMP+DYB*PSPY_TMP !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB))) !/HPRNU TXX=0.5_SP*(PSPXD(IA)+PSPXD_TMP)*VISCOF TYY=0.5_SP*(PSPYD(IA)+PSPYD_TMP)*VISCOF ELSE IF(IB == NODE_NORTHPOLE)THEN PSPX_TMP=-PSPY(IA)*COS(VX(IA)*DEG2RAD)-PSPX(IA)*SIN(VX(IA)*DEG2RAD) PSPY_TMP=-PSPY(IA)*SIN(VX(IA)*DEG2RAD)+PSPX(IA)*COS(VX(IA)*DEG2RAD) PSPXD_TMP=-PSPYD(IA)*COS(VX(IA)*DEG2RAD)-PSPXD(IA)*SIN(VX(IA)*DEG2RAD) PSPYD_TMP=-PSPYD(IA)*SIN(VX(IA)*DEG2RAD)+PSPXD(IA)*COS(VX(IA)*DEG2RAD) FIJ1=S1(IA,K)+DXA*PSPX_TMP+DYA*PSPY_TMP FIJ2=S1(IB,K)+DXB*PSPX(IB)+DYB*PSPY(IB) !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB))) TXX=0.5_SP*(PSPXD_TMP+PSPXD(IB))*VISCOF TYY=0.5_SP*(PSPYD_TMP+PSPYD(IB))*VISCOF END IF S1MIN=MINVAL(S1(NBSN(IA,1:NTSN(IA)-1),K)) S1MIN=MIN(S1MIN, S1(IA,K)) S1MAX=MAXVAL(S1(NBSN(IA,1:NTSN(IA)-1),K)) S1MAX=MAX(S1MAX, S1(IA,K)) S2MIN=MINVAL(S1(NBSN(IB,1:NTSN(IB)-1),K)) S2MIN=MIN(S2MIN, S1(IB,K)) S2MAX=MAXVAL(S1(NBSN(IB,1:NTSN(IB)-1),K)) S2MAX=MAX(S2MAX, S1(IB,K)) IF(FIJ1 < S1MIN) FIJ1=S1MIN IF(FIJ1 > S1MAX) FIJ1=S1MAX IF(FIJ2 < S2MIN) FIJ2=S2MIN IF(FIJ2 > S2MAX) FIJ2=S2MAX ! IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN UIJ_TMP = -V(I1,K)*COS(XC(I1)*DEG2RAD)-U(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP = -V(I1,K)*SIN(XC(I1)*DEG2RAD)+U(I1,K)*COS(XC(I1)*DEG2RAD) # if defined (SEMI_IMPLICIT) UIJ_TMP1 = -VF(I1,K)*COS(XC(I1)*DEG2RAD)-UF(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP1 = -VF(I1,K)*SIN(XC(I1)*DEG2RAD)+UF(I1,K)*COS(XC(I1)*DEG2RAD) # endif VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP FXX=-DTIJ(I,K)*TXX*DLTYE_TMP FYY= DTIJ(I,K)*TYY*DLTXE_TMP # if !defined (SEMI_IMPLICIT) UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP # else UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP UVN_TMP1 = VIJ_TMP1*DLTXE_TMP - UIJ_TMP1*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP EXFLUX_TMP = (1.0_SP-CETA)*EXFLUX_TMP+CETA*( -UVN_TMP1*DTIJ1(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP1))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP1))*FIJ1)*0.5_SP ) # endif IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K)=XFLUX(IA,K)+EXFLUX_TMP+FXX+FYY XFLUX_ADV(IA,K)=XFLUX_ADV(IA,K)+EXFLUX_TMP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K)=XFLUX(IB,K)-EXFLUX_TMP-FXX-FYY XFLUX_ADV(IB,K)=XFLUX_ADV(IB,K)-EXFLUX_TMP END IF END IF END IF END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: ADV_S_XY(K):",K RETURN END SUBROUTINE ADV_S_XY !==============================================================================| !==============================================================================| SUBROUTINE ADV_T_XY(XFLUX,XFLUX_ADV,PTPX,PTPY,PTPXD,PTPYD,VISCOFF,K,CETA) !------------------------------------------------------------------------------| IMPLICIT NONE INTEGER, INTENT(IN) :: K REAL(SP), DIMENSION(0:MT,KB) :: XFLUX,XFLUX_ADV REAL(SP), DIMENSION(M) :: PTPX,PTPY,PTPXD,PTPYD,VISCOFF REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ REAL(SP) :: XI,YI REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2 REAL(SP) :: TXX,TYY,FXX,FYY,VISCOF REAL(SP) :: FACT,FM1 INTEGER :: I,I1,I2,IA,IB,J,J1,J2,JTMP,JJ,II REAL(SP) :: TXPI,TYPI REAL(SP) :: VX_TMP,VY_TMP,VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP,VX3_TMP,VY3_TMP REAL(SP) :: XI_TMP,YI_TMP,VXA_TMP,VYA_TMP,VXB_TMP,VYB_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,DLTXE_TMP,DLTYE_TMP,UVN_TMP,EXFLUX_TMP REAL(SP) :: PUPX_TMP,PUPY_TMP,PVPX_TMP,PVPY_TMP REAL(SP) :: PTPX_TMP,PTPY_TMP,PTPXD_TMP,PTPYD_TMP REAL(SP) :: U_TMP,V_TMP REAL(SP) :: X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2 !! ggao edge calculation REAL(SP) :: XIJE1_TMP,YIJE1_TMP,XIJE2_TMP,YIJE2_TMP REAL(SP) :: T1MIN, T1MAX, T2MIN, T2MAX REAL(SP) :: CETA # if defined (SEMI_IMPLICIT) REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ1 REAL(SP) :: UIJ_TMP1, VIJ_TMP1, UVN_TMP1 # endif !------------------------------------------------------------------------------! ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: ADV_T_XY(K):",K SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !--Initialize Fluxes-----------------------------------------------------------! ! DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K) = 0.0_SP XFLUX_ADV(IA,K) = 0.0_SP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K) = 0.0_SP XFLUX_ADV(IB,K) = 0.0_SP END IF END DO ! !--Loop Over Control Volume Sub-Edges And Calculate Normal Velocity------------! ! DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) DTIJ(I,K)=DT1(I1)*DZ1(I1,K) # if defined (SEMI_IMPLICIT) DTIJ1(I,K) = D1(I1)*DZ1(I1,K) # endif END DO ! !--Calculate the Advection and Horizontal Diffusion Terms----------------------! ! I = NODE_NORTHPOLE PUPX_TMP=0.0_SP PUPY_TMP=0.0_SP PVPX_TMP=0.0_SP PVPY_TMP=0.0_SP DO J=1,NTVE(I) I1=NBVE(I,J) JTMP=NBVT(I,J) J1=JTMP+1-(JTMP+1)/4*3 J2=JTMP+2-(JTMP+2)/4*3 VX_TMP = REARTH * COS(VY(I)*DEG2RAD) * COS(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VY_TMP = REARTH * COS(VY(I)*DEG2RAD) * SIN(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VX1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * COS(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VY1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * SIN(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VX2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * COS(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VY2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * SIN(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VX3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * COS(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) VY3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * SIN(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) X11=0.5_SP*(VX_TMP+VX1_TMP) Y11=0.5_SP*(VY_TMP+VY1_TMP) X22=VX2_TMP Y22=VX2_TMP X33=0.5_SP*(VX_TMP+VX3_TMP) Y33=0.5_SP*(VY_TMP+VY3_TMP) U_TMP = -V(I1,K)*COS(XC(I1)*DEG2RAD)-U(I1,K)*SIN(XC(I1)*DEG2RAD) V_TMP = -V(I1,K)*SIN(XC(I1)*DEG2RAD)+U(I1,K)*COS(XC(I1)*DEG2RAD) PUPX_TMP=PUPX_TMP+U_TMP*(Y11-Y33) PUPY_TMP=PUPY_TMP+U_TMP*(X33-X11) PVPX_TMP=PVPX_TMP+V_TMP*(Y11-Y33) PVPY_TMP=PVPY_TMP+V_TMP*(X33-X11) END DO PUPX_TMP=PUPX_TMP/ART1(I) PUPY_TMP=PUPY_TMP/ART1(I) PVPX_TMP=PVPX_TMP/ART1(I) PVPY_TMP=PVPY_TMP/ART1(I) TMP1=PUPX_TMP**2+PVPY_TMP**2 TMP2=0.5_SP*(PUPY_TMP+PVPX_TMP)**2 VISCOFF(I)=SQRT(TMP1+TMP2)*ART1(I) IF(K == KBM1) THEN AH_BOTTOM(I) = (FACT*VISCOFF(I) + FM1)*NN_HVC(I) END IF DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) IA=NIEC(I,1) IB=NIEC(I,2) IF(IA <= M .AND. IB <= M .AND. I1 <= N)THEN ! XI=0.5_SP*(XIJE(I,1)+XIJE(I,2)) ! YI=0.5_SP*(YIJE(I,1)+YIJE(I,2)) !! ggao edge calculation XIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) YIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) XIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) YIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) XI_TMP =0.5_SP*(XIJE1_TMP+XIJE2_TMP) YI_TMP =0.5_SP*(YIJE1_TMP+YIJE2_TMP) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN ! XI_TMP = REARTH * COS(YI*DEG2RAD) * COS(XI*DEG2RAD) & ! * 2._SP /(1._SP+sin(YI*DEG2RAD)) ! YI_TMP = REARTH * COS(YI*DEG2RAD) * SIN(XI*DEG2RAD) & ! * 2._SP /(1._SP+sin(YI*DEG2RAD)) VXA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * COS(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VYA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * SIN(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VXB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * COS(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) VYB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * SIN(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) ! IF(IA == NODE_NORTHPOLE)THEN DXA=XI_TMP-VXA_TMP DYA=YI_TMP-VYA_TMP ! ELSE IF(IB == NODE_NORTHPOLE)THEN DXB=XI_TMP-VXB_TMP DYB=YI_TMP-VYB_TMP ! END IF ! END IF IF(IA == NODE_NORTHPOLE)THEN PTPX_TMP=-PTPY(IB)*COS(VX(IB)*DEG2RAD)-PTPX(IB)*SIN(VX(IB)*DEG2RAD) PTPY_TMP=-PTPY(IB)*SIN(VX(IB)*DEG2RAD)+PTPX(IB)*COS(VX(IB)*DEG2RAD) PTPXD_TMP=-PTPYD(IB)*COS(VX(IB)*DEG2RAD)-PTPXD(IB)*SIN(VX(IB)*DEG2RAD) PTPYD_TMP=-PTPYD(IB)*SIN(VX(IB)*DEG2RAD)+PTPXD(IB)*COS(VX(IB)*DEG2RAD) FIJ1=T1(IA,K)+DXA*PTPX(IA)+DYA*PTPY(IA) FIJ2=T1(IB,K)+DXB*PTPX_TMP+DYB*PTPY_TMP !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB))) !/HPRNU TXX=0.5_SP*(PTPXD(IA)+PTPXD_TMP)*VISCOF TYY=0.5_SP*(PTPYD(IA)+PTPYD_TMP)*VISCOF ELSE IF(IB == NODE_NORTHPOLE)THEN PTPX_TMP=-PTPY(IA)*COS(VX(IA)*DEG2RAD)-PTPX(IA)*SIN(VX(IA)*DEG2RAD) PTPY_TMP=-PTPY(IA)*SIN(VX(IA)*DEG2RAD)+PTPX(IA)*COS(VX(IA)*DEG2RAD) PTPXD_TMP=-PTPYD(IA)*COS(VX(IA)*DEG2RAD)-PTPXD(IA)*SIN(VX(IA)*DEG2RAD) PTPYD_TMP=-PTPYD(IA)*SIN(VX(IA)*DEG2RAD)+PTPXD(IA)*COS(VX(IA)*DEG2RAD) FIJ1=T1(IA,K)+DXA*PTPX_TMP+DYA*PTPY_TMP FIJ2=T1(IB,K)+DXB*PTPX(IB)+DYB*PTPY(IB) !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB))) TXX=0.5_SP*(PTPXD_TMP+PTPXD(IB))*VISCOF TYY=0.5_SP*(PTPYD_TMP+PTPYD(IB))*VISCOF END IF T1MIN=MINVAL(T1(NBSN(IA,1:NTSN(IA)-1),K)) T1MIN=MIN(T1MIN, T1(IA,K)) T1MAX=MAXVAL(T1(NBSN(IA,1:NTSN(IA)-1),K)) T1MAX=MAX(T1MAX, T1(IA,K)) T2MIN=MINVAL(T1(NBSN(IB,1:NTSN(IB)-1),K)) T2MIN=MIN(T2MIN, T1(IB,K)) T2MAX=MAXVAL(T1(NBSN(IB,1:NTSN(IB)-1),K)) T2MAX=MAX(T2MAX, T1(IB,K)) IF(FIJ1 < T1MIN) FIJ1=T1MIN IF(FIJ1 > T1MAX) FIJ1=T1MAX IF(FIJ2 < T2MIN) FIJ2=T2MIN IF(FIJ2 > T2MAX) FIJ2=T2MAX ! IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN UIJ_TMP = -V(I1,K)*COS(XC(I1)*DEG2RAD)-U(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP = -V(I1,K)*SIN(XC(I1)*DEG2RAD)+U(I1,K)*COS(XC(I1)*DEG2RAD) # if defined (SEMI_IMPLICIT) UIJ_TMP1 = -VF(I1,K)*COS(XC(I1)*DEG2RAD)-UF(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP1 = -VF(I1,K)*SIN(XC(I1)*DEG2RAD)+UF(I1,K)*COS(XC(I1)*DEG2RAD) # endif VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP FXX=-DTIJ(I,K)*TXX*DLTYE_TMP FYY= DTIJ(I,K)*TYY*DLTXE_TMP # if !defined (SEMI_IMPLICIT) UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP # else UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP UVN_TMP1 = VIJ_TMP1*DLTXE_TMP - UIJ_TMP1*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP EXFLUX_TMP = (1.0_SP-CETA)*EXFLUX_TMP+CETA*( -UVN_TMP1*DTIJ1(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP1))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP1))*FIJ1)*0.5_SP ) # endif IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K)=XFLUX(IA,K)+EXFLUX_TMP+FXX+FYY XFLUX_ADV(IA,K)=XFLUX_ADV(IA,K)+EXFLUX_TMP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K)=XFLUX(IB,K)-EXFLUX_TMP-FXX-FYY XFLUX_ADV(IB,K)=XFLUX_ADV(IB,K)-EXFLUX_TMP END IF END IF END IF END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: ADV_T_XY(K):",K RETURN END SUBROUTINE ADV_T_XY !==============================================================================| SUBROUTINE ADV_N_XY(XFLUX,PWPX,PWPY,ISS,ID,DEP2,SPCDIR,N32) ! This subroutine is for wave advection at the north pole yzhang !------------------------------------------------------------------------------| USE SWCOMM3, ONLY :MDC,MSC IMPLICIT NONE SAVE REAL :: N32(MDC,MSC,0:MT),N32_TMP(MDC,MSC,0:MT) INTEGER :: ID,ISS,IG,IG2,IDT,IDD ! LWU IG2 IS FOR PLBC REAL :: CANX,CANY,CANX_TMP,CANY_TMP,ADDEXFLUX2455 REAL :: SPCDIR(MDC,6) REAL(SP) :: DEP2(MT) REAL :: DEPLOC,KWAVELOC,CGLOC,NN,ND,SPCSIGL # if defined (SPHERICAL) REAL(8) :: XTMP1,XTMP # endif REAL(SP), DIMENSION(0:MT) :: XFLUX REAL(SP), DIMENSION(M) :: PWPX,PWPY REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2 INTEGER :: I,I1,I2,IA,IB,J,J1,J2,JTMP,JJ,II,L REAL(SP) :: VX_TMP,VY_TMP,VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP,VX3_TMP,VY3_TMP REAL(SP) :: XI_TMP,YI_TMP,VXA_TMP,VYA_TMP,VXB_TMP,VYB_TMP REAL(SP) :: UL_DEGREE,DL_DEGREE,CENTER_DEGREE,FF11 REAL(SP) :: UIJ_TMP,VIJ_TMP,DLTXE_TMP,DLTYE_TMP,UVN_TMP,EXFLUX_TMP REAL(SP) :: PUPX_TMP,PUPY_TMP,PVPX_TMP,PVPY_TMP REAL(SP) :: PWPX_TMP,PWPY_TMP REAL(SP) :: U_TMP,V_TMP REAL(SP) :: ADDYIJE1,ADDYIJE2 REAL(SP) :: ADD_DLTXE ,ADD_DLTYE,ADD_DLTXTRIE,ADD_DLTYTRIE REAL(SP) :: X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2 REAL(SP) :: XIJE1_TMP,YIJE1_TMP,XIJE2_TMP,YIJE2_TMP REAL(SP) :: AC1MIN, AC1MAX, AC2MIN, AC2MAX # if defined (SEMI_IMPLICIT) REAL(SP) :: UIJ_TMP1, VIJ_TMP1, UVN_TMP1 # endif !------------------------------------------------------------------------------! IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: ADV_N_XY" ! CAX = 0.0 ! CAY = 0.0 ! !--Initialize Fluxes-----------------------------------------------------------! ! DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA) = 0.0_SP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB) = 0.0_SP END IF END DO !==========YZHANG_NORTHPOLE_TESTING================================ I=NODE_NORTHPOLE PWPX(I)=0.0_SP PWPY(I)=0.0_SP ADD_DLTXTRIE=0.0_SP ADD_DLTYTRIE=0.0_SP DO J=1,NTSN(I)-1 I1=NBSN(I,J) I2=NBSN(I,J+1) UL_DEGREE=22.5 CENTER_DEGREE=0 DL_DEGREE=337.5 IF (VX(I1)<UL_DEGREE .OR. VX(I1)>DL_DEGREE)THEN IDT=MDC-(MDC*2/8) IDD=ID+IDT ! IDD=ID IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,I1)=N32(IDD,ISS,I1) END IF IF (VX(I2)<UL_DEGREE .OR. VX(I2)>DL_DEGREE)THEN IDT=MDC-(MDC*2/8) IDD=ID+IDT ! IDD=ID IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,I2)=N32(IDD,ISS,I2) END IF DO L=1,7 CENTER_DEGREE=L*45.0 UL_DEGREE=CENTER_DEGREE+22.5 DL_DEGREE=CENTER_DEGREE-22.5 IF(VX(I1)<UL_DEGREE .AND. VX(I1)>DL_DEGREE) THEN IDT=MDC-(MDC*(L+2)/8) ! IDT=MDC-(MDC*L/8) IF(IDT<0)THEN IDT=IDT+MDC END IF IDD=ID+IDT IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,I1)=N32(IDD,ISS,I1) END IF IF(VX(I2)<UL_DEGREE .AND. VX(I2)>DL_DEGREE) THEN IDT=MDC-(MDC*(L+2)/8) ! IDT=MDC-(MDC*L/8) IF(IDT<0)THEN IDT=IDT+MDC END IF IDD=ID+IDT IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,I2)=N32(IDD,ISS,I2) END IF END DO FF11=0.5*(N32_TMP(ID,ISS,I1)+N32_TMP(ID,ISS,I2)) PWPX(I)=PWPX(I)+FF11*DLTYTRIE(I,J) PWPY(I)=PWPY(I)+FF11*DLTXTRIE(I,J) ADD_DLTXTRIE=ADD_DLTXTRIE+DLTXTRIE(I,J) ADD_DLTYTRIE=ADD_DLTYTRIE+DLTYTRIE(I,J) END DO PWPX(I)=PWPX(I)/ART2(I) PWPY(I)=PWPY(I)/ART2(I) !============================================================================ ADDYIJE1=0.0_SP ADDYIJE2=0.0_SP DO II=1,NPCV I = NCEDGE_LST(II) ADDYIJE1=ADDYIJE1+YIJE(I,1) ADDYIJE2=ADDYIJE2+YIJE(I,2) END DO ADDYIJE1=ADDYIJE1/NPCV ADDYIJE2=ADDYIJE2/NPCV ADD_DLTXE=0.0_SP ADD_DLTYE=0.0_SP DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) IA=NIEC(I,1) IB=NIEC(I,2) IF(IA <= M .AND. IB <= M .AND. I1 <= N)THEN ! XI=0.5_SP*(XIJE(I,1)+XIJE(I,2)) ! YI=0.5_SP*(YIJE(I,1)+YIJE(I,2)) !! ggao edge calculation XIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) YIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) XIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) YIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) XI_TMP =0.5_SP*(XIJE1_TMP+XIJE2_TMP) YI_TMP =0.5_SP*(YIJE1_TMP+YIJE2_TMP) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN VXA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * COS(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VYA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * SIN(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VXB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * COS(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) VYB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * SIN(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) ! IF(IA == NODE_NORTHPOLE)THEN DXA=XI_TMP-VXA_TMP DYA=YI_TMP-VYA_TMP ! ELSE IF(IB == NODE_NORTHPOLE)THEN DXB=XI_TMP-VXB_TMP DYB=YI_TMP-VYB_TMP IF(IA == NODE_NORTHPOLE)THEN PWPX_TMP=-PWPY(IB)*COS(VX(IB)*DEG2RAD)-PWPX(IB)*SIN(VX(IB)*DEG2RAD) PWPY_TMP=-PWPY(IB)*SIN(VX(IB)*DEG2RAD)+PWPX(IB)*COS(VX(IB)*DEG2RAD) ! PSPXD_TMP=-PSPYD(IB)*COS(VX(IB)*DEG2RAD)-PSPXD(IB)*SIN(VX(IB)*DEG2RAD) ! PSPYD_TMP=-PSPYD(IB)*SIN(VX(IB)*DEG2RAD)+PSPXD(IB)*COS(VX(IB)*DEG2RAD) !======================zhangyang======start======================= IF (VX(IB)<UL_DEGREE .OR. VX(IB)>DL_DEGREE)THEN IDT=MDC-(MDC*2/8) IDD=ID+IDT ! IDD=ID IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,IB)=N32(IDD,ISS,IB) END IF DO L=1,7 CENTER_DEGREE=L*45.0 UL_DEGREE=CENTER_DEGREE+22.5 DL_DEGREE=CENTER_DEGREE-22.5 IF(VX(IB)<UL_DEGREE .AND. VX(IB)>DL_DEGREE) THEN IDT=MDC-(MDC*(L+2)/8) ! IDT=MDC-(MDC*L/8) IF(IDT<0)THEN IDT=IDT+MDC END IF IDD=ID+IDT IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,IB)=N32(IDD,ISS,IB) END IF END DO FIJ1=N32(ID,ISS,IA)!+DXA*PWPX(IA)+DYA*PWPY(IA) FIJ2=N32_TMP(ID,ISS,IB)!+DXB*PWPX_TMP+DYB*PWPY_TMP !================zhangyang======end================================== !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC ! VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + ! FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB))) !/HPRNU ! TXX=0.5_SP*(PSPXD(IA)+PSPXD_TMP)*VISCOF ! TYY=0.5_SP*(PSPYD(IA)+PSPYD_TMP)*VISCOF ELSE IF(IB == NODE_NORTHPOLE)THEN PWPX_TMP=-PWPY(IA)*COS(VX(IA)*DEG2RAD)-PWPX(IA)*SIN(VX(IA)*DEG2RAD) PWPY_TMP=-PWPY(IA)*SIN(VX(IA)*DEG2RAD)+PWPX(IA)*COS(VX(IA)*DEG2RAD) ! PSPXD_TMP=-PSPYD(IA)*COS(VX(IA)*DEG2RAD)-PSPXD(IA)*SIN(VX(IA)*DEG2RAD) ! PSPYD_TMP=-PSPYD(IA)*SIN(VX(IA)*DEG2RAD)+PSPXD(IA)*COS(VX(IA)*DEG2RAD) !======================zhangyang======start======================= IF (VX(IA)<UL_DEGREE .OR. VX(IA)>DL_DEGREE)THEN IDT=MDC-(MDC*2/8) IDD=ID+IDT ! IDD=ID IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,IA)=N32(IDD,ISS,IA) END IF DO L=1,7 CENTER_DEGREE=L*45.0 UL_DEGREE=CENTER_DEGREE+22.5 DL_DEGREE=CENTER_DEGREE-22.5 IF(VX(IA)<UL_DEGREE .AND. VX(IA)>DL_DEGREE) THEN IDT=MDC-(MDC*(L+2)/8) ! IDT=MDC-(MDC*L/8) IF(IDT<0)THEN IDT=IDT+MDC END IF IDD=ID+IDT IF(IDD>MDC)THEN IDD=IDD-MDC END IF N32_TMP(ID,ISS,IA)=N32(IDD,ISS,IA) END IF END DO FIJ1=N32_TMP(ID,ISS,IA)!+DXA*PWPX_TMP+DYA*PWPY_TMP FIJ2=N32(ID,ISS,IB)!+DXB*PWPX(IB)+DYB*PWPY(IB) !================zhangyang======end================================== END IF CALL SWAPAR1(I1,ISS,ID,DEP2(1),KWAVELOC,CGLOC) UIJ_TMP = UA(I1) VIJ_TMP = VA(I1) DO L=1,8 CENTER_DEGREE=L*45.0-22.5 UL_DEGREE=CENTER_DEGREE+22.5 DL_DEGREE=CENTER_DEGREE-22.5 IF(XC(I1)<UL_DEGREE .AND. XC(I1)>DL_DEGREE) THEN IDT=MDC-(MDC*(L+2)/8-5) ! IDT=MDC-(MDC*L/8) IF(IDT<0)THEN IDT=IDT+MDC END IF IDD=ID+IDT IF(IDD>MDC)THEN IDD=IDD-MDC END IF END IF END DO CALL SPROXY(I1,ISS,IDD,CANX,CANY,CGLOC,SPCDIR(IDD,2),SPCDIR(IDD,3),UIJ_TMP,VIJ_TMP) VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP CANX_TMP = -CANY*COS(XC(I1)*DEG2RAD)-CANX*SIN(XC(I1)*DEG2RAD) CANY_TMP = -CANY*SIN(XC(I1)*DEG2RAD)+CANX*COS(XC(I1)*DEG2RAD) # if !defined (SEMI_IMPLICIT) UVN_TMP = CANY_TMP*DLTXE_TMP - CANX_TMP*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP # endif IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA)=XFLUX(IA)+EXFLUX_TMP ! XFLUX_ADV(IA,K)=XFLUX_ADV(IA,K)+EXFLUX_TMP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB)=XFLUX(IB)-EXFLUX_TMP ! XFLUX_ADV(IB,K)=XFLUX_ADV(IB,K)-EXFLUX_TMP END IF END IF END IF END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: ADV_N_XY(ID,ISS):",ID,ISS RETURN END SUBROUTINE ADV_N_XY !==============================================================================| ! CALCULATE THE BAROCLINIC PRESSURE GRADIENT IN SIGMA COORDINATES | !==============================================================================| SUBROUTINE BAROPG_XY(DRIJK1,DRIJK2) !==============================================================================| IMPLICIT NONE REAL(SP) :: DRIJK1(0:N,3,KBM1), DRIJK2(0:N,KBM1) REAL(SP) :: DIJ,DRHO1,DRHO2 INTEGER :: I,II,K,J,J1,J2,IJK REAL(SP) :: VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP !==============================================================================| IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: baropg_XY" DO II = 1, NP I=NP_LST(II) DO K=1,KBM1 DRHOX(I,K)=0.0_SP DRHOY(I,K)=0.0_SP END DO END DO DO II = 1, NP I=NP_LST(II) DO K=1,KBM1 DO J = 1, 3 J1=J+1-INT((J+1)/4)*3 J2=J+2-INT((J+2)/4)*3 IJK=NBE(I,J) DIJ=0.5_SP*(DT(NV(I,J1))+DT(NV(I,J2))) VY1_TMP=REARTH*COS(VY(NV(I,J1))*DEG2RAD)*SIN(VX(NV(I,J1))*DEG2RAD) VY2_TMP=REARTH*COS(VY(NV(I,J2))*DEG2RAD)*SIN(VX(NV(I,J2))*DEG2RAD) DRHO1=(VY1_TMP-VY2_TMP)*DRIJK1(I,J,K)*DT1(I) DRHO2=(VY1_TMP-VY2_TMP)*DIJ*DRIJK2(I,K) DRHOX(I,K)=DRHOX(I,K)+DRHO1+DRHO2 VX1_TMP=REARTH*COS(VY(NV(I,J1))*DEG2RAD)*COS(VX(NV(I,J1))*DEG2RAD) VX2_TMP=REARTH*COS(VY(NV(I,J2))*DEG2RAD)*COS(VX(NV(I,J2))*DEG2RAD) DRHO1=(VX2_TMP-VX1_TMP)*DRIJK1(I,J,K)*DT1(I) DRHO2=(VX2_TMP-VX1_TMP)*DIJ*DRIJK2(I,K) DRHOY(I,K)=DRHOY(I,K)+DRHO1+DRHO2 END DO END DO END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: baropg_XY" RETURN END SUBROUTINE BAROPG_XY !==============================================================================| !==============================================================================| SUBROUTINE SHAPE_COEF_XY !----------------------------------------------------------------------! ! This subrountine is used to calculate the coefficient for a linear ! ! function on the x-y plane, i.e.: ! ! r(x,y;phai)=phai_c+cofa1*x+cofa2*y ! ! innc(i)=0 cells on the boundary ! ! innc(i)=1 cells in the interior ! !----------------------------------------------------------------------! USE ALL_VARS IMPLICIT NONE REAL(DP) X1,X2,X3,Y1,Y2,Y3,DELT,AI1,AI2,AI3,BI1,BI2,BI3,CI1,CI2,CI3 REAL(DP) DELTX,DELTY,TEMP1,ANG1,ANG2,B1,B2,ANGLE REAL(DP), ALLOCATABLE :: XC_TMP(:),YC_TMP(:),VX_TMP(:),VY_TMP(:) INTEGER I,II,J,JJ,J1,J2 ! !---------------interior cells-----------------------------------------! ! IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: shape_coef_xy" ! ALL OTHER PROCESSORS ESCAPE HERE IF (NODE_NORTHPOLE .EQ. 0) RETURN ALLOCATE(A1U_XY(N,4)); A1U_XY = 0.0_SP ALLOCATE(A2U_XY(N,4)); A2U_XY = 0.0_SP ALLOCATE(AW0_XY(N,3)); AW0_XY = 0.0_SP ALLOCATE(AWX_XY(N,3)); AWX_XY = 0.0_SP ALLOCATE(AWY_XY(N,3)); AWY_XY = 0.0_SP ALLOCATE(XC_TMP(0:NT)); XC_TMP = 0.0_SP ALLOCATE(YC_TMP(0:NT)); YC_TMP = 0.0_SP ALLOCATE(VX_TMP(0:MT)); VX_TMP = 0.0_SP ALLOCATE(VY_TMP(0:MT)); VY_TMP = 0.0_SP DO I=1,NT XC_TMP(I) = REARTH * COS(YC(I)*DEG2RAD) * COS(XC(I)*DEG2RAD) & * 2._SP /(1._SP+sin(YC(I)*DEG2RAD)) YC_TMP(I) = REARTH * COS(YC(I)*DEG2RAD) * SIN(XC(I)*DEG2RAD) & * 2._SP /(1._SP+sin(YC(I)*DEG2RAD)) END DO DO I=1,MT VX_TMP(I) = REARTH * COS(VY(I)*DEG2RAD) * COS(VX(I)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(I)*DEG2RAD)) VY_TMP(I) = REARTH * COS(VY(I)*DEG2RAD) * SIN(VX(I)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(I)*DEG2RAD)) END DO DO I=1,N IF(ISBCE(I) == 0)THEN Y1 = YC_TMP(NBE(I,1))-YC_TMP(I) Y2 = YC_TMP(NBE(I,2))-YC_TMP(I) Y3 = YC_TMP(NBE(I,3))-YC_TMP(I) X1=XC_TMP(NBE(I,1))-XC_TMP(I) X2=XC_TMP(NBE(I,2))-XC_TMP(I) X3=XC_TMP(NBE(I,3))-XC_TMP(I) X1=X1/1000.0_SP X2=X2/1000.0_SP X3=X3/1000.0_SP Y1=Y1/1000.0_SP Y2=Y2/1000.0_SP Y3=Y3/1000.0_SP delt=(x1*y2-x2*y1)**2+(x1*y3-x3*y1)**2+(x2*y3-x3*y2)**2 delt=delt*1000.0_SP a1u_XY(i,1)=(y1+y2+y3)*(x1*y1+x2*y2+x3*y3)- & (x1+x2+x3)*(y1**2+y2**2+y3**2) a1u_XY(i,1)=a1u_XY(i,1)/delt a1u_XY(i,2)=(y1**2+y2**2+y3**2)*x1-(x1*y1+x2*y2+x3*y3)*y1 a1u_XY(i,2)=a1u_XY(i,2)/delt a1u_XY(i,3)=(y1**2+y2**2+y3**2)*x2-(x1*y1+x2*y2+x3*y3)*y2 a1u_XY(i,3)=a1u_XY(i,3)/delt a1u_XY(i,4)=(y1**2+y2**2+y3**2)*x3-(x1*y1+x2*y2+x3*y3)*y3 a1u_XY(i,4)=a1u_XY(i,4)/delt a2u_XY(i,1)=(x1+x2+x3)*(x1*y1+x2*y2+x3*y3)- & (y1+y2+y3)*(x1**2+x2**2+x3**2) a2u_XY(i,1)=a2u_XY(i,1)/delt a2u_XY(i,2)=(x1**2+x2**2+x3**2)*y1-(x1*y1+x2*y2+x3*y3)*x1 a2u_XY(i,2)=a2u_XY(i,2)/delt a2u_XY(i,3)=(x1**2+x2**2+x3**2)*y2-(x1*y1+x2*y2+x3*y3)*x2 a2u_XY(i,3)=a2u_XY(i,3)/delt a2u_XY(i,4)=(x1**2+x2**2+x3**2)*y3-(x1*y1+x2*y2+x3*y3)*x3 a2u_XY(i,4)=a2u_XY(i,4)/delt end if x1=vx_TMP(nv(i,1))-xc_TMP(i) x2=vx_TMP(nv(i,2))-xc_TMP(i) x3=vx_TMP(nv(i,3))-xc_TMP(i) y1=vy_TMP(nv(i,1))-yc_TMP(i) y2=vy_TMP(nv(i,2))-yc_TMP(i) y3=vy_TMP(nv(i,3))-yc_TMP(i) ai1=y2-y3 ai2=y3-y1 ai3=y1-y2 bi1=x3-x2 bi2=x1-x3 bi3=x2-x1 ci1=x2*y3-x3*y2 ci2=x3*y1-x1*y3 ci3=x1*y2-x2*y1 aw0_XY(i,1)=-ci1/2./art(i) aw0_XY(i,2)=-ci2/2./art(i) aw0_XY(i,3)=-ci3/2./art(i) awx_XY(i,1)=-ai1/2./art(i) awx_XY(i,2)=-ai2/2./art(i) awx_XY(i,3)=-ai3/2./art(i) awy_XY(i,1)=-bi1/2./art(i) awy_XY(i,2)=-bi2/2./art(i) awy_XY(i,3)=-bi3/2./art(i) end do DEALLOCATE(XC_TMP,YC_TMP,VX_TMP,VY_TMP) IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: shape_coef_xy" return end subroutine shape_coef_xy !==============================================================================| !==============================================================================| !==============================================================================| SUBROUTINE ADV_Q_XY(XFLUX,PQPX,PQPY,PQPXD,PQPYD,VISCOFF,Q,UQ,VQ,K,UQ1,VQ1,CETA) !==============================================================================| ! Calculate the Turbulent Kinetic Energy and Mixing Length Based on | ! The Mellor-Yamada Level 2.5 Turbulent Closure Model | !==============================================================================| !------------------------------------------------------------------------------| IMPLICIT NONE INTEGER, INTENT(IN) :: K REAL(SP), DIMENSION(0:MT,KB) :: XFLUX,Q REAL(SP), DIMENSION(M) :: PQPX,PQPY,PQPXD,PQPYD,VISCOFF REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ REAL(SP) :: XI,YI REAL(SP) :: DXA,DYA,DXB,DYB,FIJ1,FIJ2 REAL(SP) :: TXX,TYY,FXX,FYY,VISCOF REAL(SP) :: FACT,FM1 INTEGER :: I,I1,I2,IA,IB,J,J1,J2,JTMP,JJ,II REAL(SP) :: TXPI,TYPI REAL(SP) :: VX_TMP,VY_TMP,VX1_TMP,VY1_TMP,VX2_TMP,VY2_TMP,VX3_TMP,VY3_TMP REAL(SP) :: XI_TMP,YI_TMP,VXA_TMP,VYA_TMP,VXB_TMP,VYB_TMP REAL(SP) :: UIJ_TMP,VIJ_TMP,DLTXE_TMP,DLTYE_TMP,UVN_TMP,EXFLUX_TMP REAL(SP) :: PUPX_TMP,PUPY_TMP,PVPX_TMP,PVPY_TMP REAL(SP) :: PQPX_TMP,PQPY_TMP,PQPXD_TMP,PQPYD_TMP REAL(SP) :: U_TMP,V_TMP REAL(SP) :: X11,Y11,X22,Y22,X33,Y33,TMP1,TMP2 REAL(SP) :: XIJE1_TMP,YIJE1_TMP,XIJE2_TMP,YIJE2_TMP REAL(SP) :: Q1MIN, Q1MAX, Q2MIN, Q2MAX REAL(SP), DIMENSION(0:NT,KB) :: UQ,VQ REAL(SP), DIMENSION(0:,:) :: UQ1, VQ1 REAL(SP) :: CETA # if defined (SEMI_IMPLICIT) REAL(SP), DIMENSION(3*(NT),KBM1) :: DTIJ1 REAL(SP) :: UIJ_TMP1, VIJ_TMP1, UVN_TMP1 # endif !------------------------------------------------------------------------------! IF (NODE_NORTHPOLE .EQ. 0) RETURN IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "Start: adv_q_xy(K):",K SELECT CASE(HORIZONTAL_MIXING_TYPE) CASE ('closure') FACT = 1.0_SP FM1 = 0.0_SP CASE('constant') FACT = 0.0_SP FM1 = 1.0_SP CASE DEFAULT CALL FATAL_ERROR("UNKNOW HORIZONTAL MIXING TYPE:",& & TRIM(HORIZONTAL_MIXING_TYPE) ) END SELECT ! !--Initialize Fluxes-----------------------------------------------------------! ! DO II=1,NPCV I = NCEDGE_LST(II) IA = NIEC(I,1) IB = NIEC(I,2) IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K) = 0.0_SP ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K) = 0.0_SP END IF END DO ! !--Loop Over Control Volume Sub-Edges And Calculate Normal Velocity------------! ! DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) DTIJ(I,K)=DT1(I1)*DZ1(I1,K) # if defined (SEMI_IMPLICIT) DTIJ1(I,K)=D1(I1)*DZ1(I1,K) # endif END DO ! !--Calculate the Advection and Horizontal Diffusion Terms----------------------! ! I = NODE_NORTHPOLE IF(I==0) RETURN IF(I /= 0)THEN PUPX_TMP=0.0_SP PUPY_TMP=0.0_SP PVPX_TMP=0.0_SP PVPY_TMP=0.0_SP DO J=1,NTVE(I) I1=NBVE(I,J) JTMP=NBVT(I,J) J1=JTMP+1-(JTMP+1)/4*3 J2=JTMP+2-(JTMP+2)/4*3 VX_TMP = REARTH * COS(VY(I)*DEG2RAD) * COS(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VY_TMP = REARTH * COS(VY(I)*DEG2RAD) * SIN(VX(I)*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(I)*DEG2RAD)) VX1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * COS(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VY1_TMP= REARTH * COS(VY(NV(I1,J1))*DEG2RAD) * SIN(VX(NV(I1,J1))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J1))*DEG2RAD)) VX2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * COS(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VY2_TMP= REARTH * COS(YC(I1)*DEG2RAD) * SIN(XC(I1)*DEG2RAD) & * 2._SP /(1._SP+SIN(YC(I1)*DEG2RAD)) VX3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * COS(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) VY3_TMP= REARTH * COS(VY(NV(I1,J2))*DEG2RAD) * SIN(VX(NV(I1,J2))*DEG2RAD) & * 2._SP /(1._SP+SIN(VY(NV(I1,J2))*DEG2RAD)) X11=0.5_SP*(VX_TMP+VX1_TMP) Y11=0.5_SP*(VY_TMP+VY1_TMP) X22=VX2_TMP Y22=VX2_TMP X33=0.5_SP*(VX_TMP+VX3_TMP) Y33=0.5_SP*(VY_TMP+VY3_TMP) U_TMP = -VQ(I1,K)*COS(XC(I1)*DEG2RAD)-UQ(I1,K)*SIN(XC(I1)*DEG2RAD) V_TMP = -VQ(I1,K)*SIN(XC(I1)*DEG2RAD)+UQ(I1,K)*COS(XC(I1)*DEG2RAD) PUPX_TMP=PUPX_TMP+U_TMP*(Y11-Y33) PUPY_TMP=PUPY_TMP+U_TMP*(X33-X11) PVPX_TMP=PVPX_TMP+V_TMP*(Y11-Y33) PVPY_TMP=PVPY_TMP+V_TMP*(X33-X11) END DO PUPX_TMP=PUPX_TMP/ART1(I) PUPY_TMP=PUPY_TMP/ART1(I) PVPX_TMP=PVPX_TMP/ART1(I) PVPY_TMP=PVPY_TMP/ART1(I) TMP1=PUPX_TMP**2+PVPY_TMP**2 TMP2=0.5_SP*(PUPY_TMP+PVPX_TMP)**2 VISCOFF(I)=SQRT(TMP1+TMP2)*ART1(I) IF(K == KBM1) THEN AH_BOTTOM(I) = (FACT*VISCOFF(I) + FM1)*NN_HVC(I) END IF endif DO II=1,NPCV I = NCEDGE_LST(II) I1=NTRG(I) IA=NIEC(I,1) IB=NIEC(I,2) IF((IA <= M .AND. IB <= M) .AND. I1 <= N)THEN XIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) YIJE1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,1)*DEG2RAD)) XIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) YIJE2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) & * 2._SP /(1._SP+sin(YIJE(I,2)*DEG2RAD)) XI_TMP =0.5_SP*(XIJE1_TMP+XIJE2_TMP) YI_TMP =0.5_SP*(YIJE1_TMP+YIJE2_TMP) IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN VXA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * COS(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VYA_TMP = REARTH * COS(VY(IA)*DEG2RAD) * SIN(VX(IA)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IA)*DEG2RAD)) VXB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * COS(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) VYB_TMP = REARTH * COS(VY(IB)*DEG2RAD) * SIN(VX(IB)*DEG2RAD) & * 2._SP /(1._SP+sin(VY(IB)*DEG2RAD)) DXA=XI_TMP-VXA_TMP DYA=YI_TMP-VYA_TMP DXB=XI_TMP-VXB_TMP DYB=YI_TMP-VYB_TMP IF(IA == NODE_NORTHPOLE)THEN PQPX_TMP=-PQPY(IB)*COS(VX(IB)*DEG2RAD)-PQPX(IB)*SIN(VX(IB)*DEG2RAD) PQPY_TMP=-PQPY(IB)*SIN(VX(IB)*DEG2RAD)+PQPX(IB)*COS(VX(IB)*DEG2RAD) PQPXD_TMP=-PQPYD(IB)*COS(VX(IB)*DEG2RAD)-PQPXD(IB)*SIN(VX(IB)*DEG2RAD) PQPYD_TMP=-PQPYD(IB)*SIN(VX(IB)*DEG2RAD)+PQPXD(IB)*COS(VX(IB)*DEG2RAD) FIJ1=Q(IA,K)+DXA*PQPX(IA)+DYA*PQPY(IA) FIJ2=Q(IB,K)+DXB*PQPX_TMP+DYB*PQPY_TMP ! VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB)))/HPRNU TXX=0.5_SP*(PQPXD(IA)+PQPXD_TMP)*VISCOF TYY=0.5_SP*(PQPYD(IA)+PQPYD_TMP)*VISCOF ELSE IF(IB == NODE_NORTHPOLE)THEN PQPX_TMP=-PQPY(IA)*COS(VX(IA)*DEG2RAD)-PQPX(IA)*SIN(VX(IA)*DEG2RAD) PQPY_TMP=-PQPY(IA)*SIN(VX(IA)*DEG2RAD)+PQPX(IA)*COS(VX(IA)*DEG2RAD) PQPXD_TMP=-PQPYD(IA)*COS(VX(IA)*DEG2RAD)-PQPXD(IA)*SIN(VX(IA)*DEG2RAD) PQPYD_TMP=-PQPYD(IA)*SIN(VX(IA)*DEG2RAD)+PQPXD(IA)*COS(VX(IA)*DEG2RAD) FIJ1=Q(IA,K)+DXA*PQPX_TMP+DYA*PQPY_TMP FIJ2=Q(IB,K)+DXB*PQPX(IB)+DYB*PQPY(IB) !VISCOF=HORCON*(FACT*(VISCOFF(IA)+VISCOFF(IB))*0.5_SP + FM1) ! David moved HPRNU and added VHC VISCOF=(FACT*0.5_SP*(VISCOFF(IA)*NN_HVC(IA)+VISCOFF(IB)*NN_HVC(IB)) + FM1*0.5_SP*(NN_HVC(IA)+NN_HVC(IB)))/HPRNU TXX=0.5_SP*(PQPXD_TMP+PQPXD(IB))*VISCOF TYY=0.5_SP*(PQPYD_TMP+PQPYD(IB))*VISCOF END IF Q1MIN=MINVAL(Q(NBSN(IA,1:NTSN(IA)-1),K)) Q1MIN=MIN(Q1MIN, Q(IA,K)) Q1MAX=MAXVAL(Q(NBSN(IA,1:NTSN(IA)-1),K)) Q1MAX=MAX(Q1MAX, Q(IA,K)) Q2MIN=MINVAL(Q(NBSN(IB,1:NTSN(IB)-1),K)) Q2MIN=MIN(Q2MIN, Q(IB,K)) Q2MAX=MAXVAL(Q(NBSN(IB,1:NTSN(IB)-1),K)) Q2MAX=MAX(Q2MAX, Q(IB,K)) IF(FIJ1 < Q1MIN) FIJ1=Q1MIN IF(FIJ1 > Q1MAX) FIJ1=Q1MAX IF(FIJ2 < Q2MIN) FIJ2=Q2MIN IF(FIJ2 > Q2MAX) FIJ2=Q2MAX ! FXX=-DTIJ(I,K)*TXX*DLTYE(I) ! FYY= DTIJ(I,K)*TYY*DLTXE(I) ! IF(IA == NODE_NORTHPOLE .OR. IB == NODE_NORTHPOLE)THEN UIJ_TMP = -VQ(I1,K)*COS(XC(I1)*DEG2RAD)-UQ(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP = -VQ(I1,K)*SIN(XC(I1)*DEG2RAD)+UQ(I1,K)*COS(XC(I1)*DEG2RAD) # if defined (SEMI_IMPLICIT) UIJ_TMP1 = -VQ1(I1,K)*COS(XC(I1)*DEG2RAD)-UQ1(I1,K)*SIN(XC(I1)*DEG2RAD) VIJ_TMP1 = -VQ1(I1,K)*SIN(XC(I1)*DEG2RAD)+UQ1(I1,K)*COS(XC(I1)*DEG2RAD) # endif VX1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * COS(XIJE(I,1)*DEG2RAD) VY1_TMP = REARTH * COS(YIJE(I,1)*DEG2RAD) * SIN(XIJE(I,1)*DEG2RAD) VX2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * COS(XIJE(I,2)*DEG2RAD) VY2_TMP = REARTH * COS(YIJE(I,2)*DEG2RAD) * SIN(XIJE(I,2)*DEG2RAD) DLTXE_TMP = VX2_TMP-VX1_TMP DLTYE_TMP = VY2_TMP-VY1_TMP FXX=-DTIJ(I,K)*TXX*DLTYE_TMP FYY= DTIJ(I,K)*TYY*DLTXE_TMP # if !defined (SEMI_IMPLICIT) UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP # else UVN_TMP = VIJ_TMP*DLTXE_TMP - UIJ_TMP*DLTYE_TMP UVN_TMP1 = VIJ_TMP1*DLTXE_TMP - UIJ_TMP1*DLTYE_TMP EXFLUX_TMP = -UVN_TMP*DTIJ(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP))*FIJ1)*0.5_SP EXFLUX_TMP = (1.0_SP-CETA)*EXFLUX_TMP+CETA*( -UVN_TMP1*DTIJ1(I,K)*((1.0_SP+SIGN(1.0_SP,UVN_TMP1))*FIJ2+ & (1.0_SP-SIGN(1.0_SP,UVN_TMP1))*FIJ1)*0.5_SP ) # endif IF(IA == NODE_NORTHPOLE)THEN XFLUX(IA,K)=XFLUX(IA,K)+EXFLUX_TMP+FXX+FYY ELSE IF(IB == NODE_NORTHPOLE)THEN XFLUX(IB,K)=XFLUX(IB,K)-EXFLUX_TMP-FXX-FYY END IF END IF END IF END DO IF(DBG_SET(DBG_SBR)) WRITE(IPT,*) "End: ADV_Q_XY(K):",K RETURN END SUBROUTINE ADV_Q_XY !==============================================================================| END MODULE MOD_NORTHPOLE