34 |
#ifdef ALLOW_SALT_PLUME |
#ifdef ALLOW_SALT_PLUME |
35 |
|
|
36 |
C !LOCAL VARIABLES: |
C !LOCAL VARIABLES: |
37 |
integer i, j, kLevBotm |
integer i, j |
38 |
_RL minusone |
_RL minusone |
39 |
parameter(minusone = -1.) |
parameter(minusone = -1.) |
40 |
_RL plumefrac(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL plumefrac(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
41 |
_RL plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
_RL plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy) |
42 |
|
#ifdef SALT_PLUME_VOLUME |
43 |
|
_RL gS_Surf2kLev, gS_Below2kLev, gS_kLev2Above |
44 |
|
integer kp1 |
45 |
|
#endif |
46 |
|
|
47 |
#ifdef TARGET_NEC_SX |
#ifdef TARGET_NEC_SX |
48 |
integer imt |
integer imt |
49 |
parameter( imt=(sNx+2*OLx)*(sNy+2*OLy) ) |
parameter( imt=(sNx+2*OLx)*(sNy+2*OLy) ) |
54 |
_RL plumekb(two2), SPdepth(two2) |
_RL plumekb(two2), SPdepth(two2) |
55 |
#endif |
#endif |
56 |
|
|
57 |
#ifdef TARGET_NEC_SX |
#ifndef SALT_PLUME_VOLUME |
|
C The vector version computes plumekb2D at each grid point, but this |
|
|
C is still faster than non-vector code. |
|
|
IF ( kLev .LT. Nr ) THEN |
|
|
DO j=1-Oly,sNy+Oly |
|
|
DO i=1-Olx,sNx+Olx |
|
|
plumekb2D(i,j)=abs(rF(kLev)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
CALL SALT_PLUME_FRAC( |
|
|
I imt,minusone,SaltPlumeDepth(1-Olx,1-Oly,bi,bj), |
|
|
U plumekb2D, |
|
|
I myTime, 1, myThid ) |
|
|
DO j=1-Oly,sNy+Oly |
|
|
DO i=1-Olx,sNx+Olx |
|
|
plumefrac(I,J) = plumekb2D(i,j)*maskC(i,j,klev,bi,bj) |
|
|
plumekb2D(i,j) = abs(rF(kLev+1)) |
|
|
ENDDO |
|
|
ENDDO |
|
|
CALL SALT_PLUME_FRAC( |
|
|
I imt,minusone,SaltPlumeDepth(1-Olx,1-Oly,bi,bj), |
|
|
U plumekb2D, |
|
|
I myTime, 1, myThid ) |
|
|
kLevBotm = klev+1 |
|
|
IF (klev.EQ.Nr) THEN |
|
|
kLevBotm = klev |
|
|
ENDIF |
|
|
DO j=1-Oly,sNy+Oly |
|
|
DO i=1-Olx,sNx+Olx |
|
|
C Penetrating saltplume fraction: |
|
|
IF ( SaltPlumeDepth(i,j,bi,bj) .GT. abs(rF(kLev)) ) THEN |
|
|
IF(kLev.GT.1) THEN |
|
|
plumefrac(i,j)=plumekb2D(i,j)*maskC(i,j,kLevBotm,bi,bj) |
|
|
& -plumefrac(i,j) |
|
|
ELSE |
|
|
plumefrac(i,j)=plumekb2D(i,j)*maskC(i,j,kLevBotm,bi,bj) |
|
|
ENDIF |
|
|
plumetend(I,J) = saltPlumeFlux(i,j,bi,bj)*plumefrac(I,J) |
|
|
gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj)+plumetend(I,J) |
|
|
& *recip_drF(kLev)*mass2rUnit*_recip_hFacC(i,j,kLev,bi,bj) |
|
|
ELSE |
|
|
plumefrac(i,j)=0. _d 0 |
|
|
plumetend(I,J) = 0. _d 0 |
|
|
ENDIF |
|
|
ENDDO |
|
|
ENDDO |
|
|
ENDIF |
|
|
#else |
|
58 |
DO j=jMin,jMax |
DO j=jMin,jMax |
59 |
DO i=iMin,iMax |
DO i=iMin,iMax |
60 |
C Penetrating saltplume fraction: |
C Penetrating saltplume fraction:cumulativeSP(klev+1)-cumulativeSP(klev) |
61 |
IF ( SaltPlumeDepth(i,j,bi,bj) .GT. abs(rF(kLev)) ) THEN |
IF ( SaltPlumeDepth(i,j,bi,bj) .GT. abs(rF(kLev)) ) THEN |
62 |
plumefrac(I,J) = 0. _d 0 |
plumefrac(I,J) = 0. _d 0 |
63 |
plumekb(1)=abs(rF(klev)) |
plumekb(1)=abs(rF(klev)) |
68 |
I two2,minusone,SPdepth, |
I two2,minusone,SPdepth, |
69 |
U plumekb, |
U plumekb, |
70 |
I myTime, 1, myThid ) |
I myTime, 1, myThid ) |
71 |
kLevBotm = klev+1 |
plumefrac(I,J) = (plumekb(2)-plumekb(1))*maskC(i,j,klev,bi,bj) |
|
IF (klev.EQ.Nr) THEN |
|
|
kLevBotm = klev |
|
|
ENDIF |
|
|
IF(kLev.GT.1) THEN |
|
|
plumefrac(I,J) = plumekb(2)*maskC(i,j,kLevBotm,bi,bj) |
|
|
& -plumekb(1)*maskC(i,j,kLev, bi,bj) |
|
|
ELSE |
|
|
plumefrac(I,J) = plumekb(2)*maskC(i,j,kLevBotm,bi,bj) |
|
|
ENDIF |
|
72 |
plumetend(I,J) = saltPlumeFlux(i,j,bi,bj)*plumefrac(I,J) |
plumetend(I,J) = saltPlumeFlux(i,j,bi,bj)*plumefrac(I,J) |
73 |
gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)+plumetend(I,J) |
gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)+plumetend(I,J) |
74 |
& *recip_drF(kLev)*mass2rUnit*_recip_hFacC(i,j,kLev,bi,bj) |
& *recip_drF(kLev)*mass2rUnit*_recip_hFacC(i,j,kLev,bi,bj) |
78 |
ENDIF |
ENDIF |
79 |
ENDDO |
ENDDO |
80 |
ENDDO |
ENDDO |
81 |
#endif /* TARGET_NEC_SX */ |
#else /* SALT_PLUME_VOLUME */ |
82 |
|
kp1 = kLev + 1 |
83 |
|
if(kLev.EQ.Nr) kp1 = kLev |
84 |
|
DO j=jMin,jMax |
85 |
|
DO i=iMin,iMax |
86 |
|
Catn: check unit |
87 |
|
gS_Surf2kLev = dSPvolSurf2kLev(i,j,kLev,bi,bj) |
88 |
|
& * SPbrineSalt(i,j,bi,bj) |
89 |
|
gS_Below2kLev = dSPvolBelow2kLev(i,j,kLev,bi,bj) |
90 |
|
* salt(i,j,kp1,bi,bj) |
91 |
|
Catn: gS_kLev2Above works even for kLev=1 because this is how much |
92 |
|
C volume of original salinity was replaced by same volume of brine. |
93 |
|
C Note: by design, dSPvolkLev2Above already is negative |
94 |
|
gS_kLev2Above = dSPvolkLev2Above(i,j,kLev,bi,bj) |
95 |
|
* salt(i,j,kLev,bi,bj) |
96 |
|
plumetend(i,j)=gS_Surf2kLev + gS_Below2kLev + gS_kLev2Above |
97 |
|
gS(i,j,kLev,bi,bj)=gS(i,j,kLev,bi,bj)+plumetend(I,J) |
98 |
|
& *recip_drF(kLev)*mass2rUnit*_recip_hFacC(i,j,kLev,bi,bj) |
99 |
|
ENDDO |
100 |
|
ENDDO |
101 |
|
#endif /* SALT_PLUME_VOLUME */ |
102 |
|
|
103 |
#ifdef ALLOW_DIAGNOSTICS |
#ifdef ALLOW_DIAGNOSTICS |
104 |
|
#ifndef SALT_PLUME_VOLUME |
105 |
IF ( useDiagnostics ) THEN |
IF ( useDiagnostics ) THEN |
106 |
CALL DIAGNOSTICS_FILL ( |
CALL DIAGNOSTICS_FILL ( |
107 |
& plumefrac,'PLUMEKB ',kLev,1,2,bi,bj,myThid ) |
& plumefrac,'PLUMEKB ',kLev,1,2,bi,bj,myThid ) |
108 |
|
#endif /* SALT_PLUME_VOLUME */ |
109 |
CALL DIAGNOSTICS_FILL ( |
CALL DIAGNOSTICS_FILL ( |
110 |
& plumetend,'oceSPtnd',kLev,1,2,bi,bj,myThid ) |
& plumetend,'oceSPtnd',kLev,1,2,bi,bj,myThid ) |
111 |
ENDIF |
ENDIF |