File indexing completed on 2025-09-19 05:09:08 UTC
view on githubraw file Latest commit c3be0435 on 2025-09-18 18:40:16 UTC
b4daa24319 Shre*0001 #include "PTRACERS_OPTIONS.h"
0002
0003
0004
0005
0006
0007 SUBROUTINE PTRACERS_FORCING_SURF(
0008 I relaxForcingS,
0009 I bi, bj, iMin, iMax, jMin, jMax,
0010 I myTime,myIter,myThid )
0011
0012
0013
0014
0015
0016
0017
0018 IMPLICIT NONE
0019 #include "SIZE.h"
0020 #include "EEPARAMS.h"
0021 #include "PARAMS.h"
0022 #include "GRID.h"
0023 #include "SURFACE.h"
0024 #include "DYNVARS.h"
0025 #include "FFIELDS.h"
0026 #include "PTRACERS_SIZE.h"
0027 #include "PTRACERS_PARAMS.h"
0028 #include "PTRACERS_START.h"
0029 #include "PTRACERS_FIELDS.h"
0030
0031
0032
0033
0034
0035
0036
0037 _RL relaxForcingS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0038 INTEGER bi, bj, iMin, iMax, jMin, jMax
0039 _RL myTime
0040 INTEGER myIter
0041 INTEGER myThid
0042
0043 #ifdef ALLOW_PTRACERS
0044
0045
0046
0047
0048
0049 INTEGER i, j
0050 INTEGER iTrc, ks
0051 _RL add2EmP(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0052 _RL epsil, cutoff, tmpVar
0053
0054
0055 IF ( usingPCoords ) THEN
0056 ks = Nr
0057 ELSE
0058 ks = 1
0059 ENDIF
0060
0061
0062 DO iTrc=1,PTRACERS_numInUse
0063
0064 DO j = jMin, jMax
0065 DO i = iMin, iMax
0066 surfaceForcingPTr(i,j,bi,bj,iTrc) = 0. _d 0
0067 & + surfaceForcingS(i,j,bi,bj)
0068 ENDDO
0069 ENDDO
0070
0071 ENDDO
0072
0073
0074 IF ( PTRACERS_addSrelax2EmP ) THEN
0075
0076
0077
0078 epsil = 1. _d -10
0079 cutoff = 0.1 _d 0 *drF(ks)/PTRACERS_dTLev(ks)
0080 IF ( ( (nonlinFreeSurf.GT.0 .OR. usingPCoords)
0081 & .AND. useRealFreshWaterFlux )
0082 & .OR.convertFW2Salt .EQ. -1. ) THEN
0083 DO j = jMin, jMax
0084 DO i = iMin, iMax
0085 tmpVar = MAX( salt(i,j,ks,bi,bj), epsil )
0086 add2EmP(i,j) = relaxForcingS(i,j)/tmpVar
0087 add2EmP(i,j) = rUnit2mass
0088 & *MAX( -cutoff, MIN( add2EmP(i,j), cutoff ) )
0089 ENDDO
0090 ENDDO
0091 ELSE
0092 DO j = jMin, jMax
0093 DO i = iMin, iMax
0094 add2EmP(i,j) = relaxForcingS(i,j)/convertFW2Salt
0095 add2EmP(i,j) = rUnit2mass
0096 & *MAX( -cutoff, MIN( add2EmP(i,j), cutoff ) )
0097 ENDDO
0098 ENDDO
0099 ENDIF
0100 #ifdef ALLOW_DIAGNOSTICS
0101 IF ( useDiagnostics ) THEN
0102 CALL DIAGNOSTICS_FILL(add2EmP,'Add2EmP ',0,1,2,bi,bj,myThid)
0103 ENDIF
0104 #endif /* ALLOW_DIAGNOSTICS */
0105 ELSE
0106 DO j = jMin, jMax
0107 DO i = iMin, iMax
0108 add2EmP(i,j) = 0. _d 0
0109 ENDDO
0110 ENDDO
0111 ENDIF
0112
0113
0114 IF ( (nonlinFreeSurf.GT.0 .OR. usingPCoords)
0115 & .AND. useRealFreshWaterFlux ) THEN
0116
0117 DO iTrc=1,PTRACERS_numInUse
0118
0119
0120
0121
0122
0123 IF ( PTRACERS_StepFwd(iTrc) .AND.
0124 & PTRACERS_EvPrRn(iTrc).NE.UNSET_RL ) THEN
0125 DO j = jMin, jMax
0126 DO i = iMin, iMax
0127 surfaceForcingPTr(i,j,bi,bj,iTrc) =
0128 & surfaceForcingPTr(i,j,bi,bj,iTrc)
0129 & + ( PmEpR(i,j,bi,bj) - add2EmP(i,j) )
0130 & *( PTRACERS_EvPrRn(iTrc) - pTracer(i,j,ks,bi,bj,iTrc) )
0131 & *mass2rUnit
0132 ENDDO
0133 ENDDO
0134 ENDIF
0135
0136 ENDDO
0137
0138
0139 ELSE
0140
0141
0142
0143
0144 IF (convertFW2Salt .EQ. -1.) THEN
0145
0146
0147 DO iTrc=1,PTRACERS_numInUse
0148
0149 IF ( PTRACERS_StepFwd(iTrc) .AND.
0150 & PTRACERS_EvPrRn(iTrc).NE.UNSET_RL ) THEN
0151
0152
0153 DO j = jMin, jMax
0154 DO i = iMin, iMax
0155 surfaceForcingPTr(i,j,bi,bj,iTrc) =
0156 & surfaceForcingPTr(i,j,bi,bj,iTrc)
0157 & + ( EmPmR(i,j,bi,bj) + add2EmP(i,j) )
0158 & *( pTracer(i,j,ks,bi,bj,iTrc) - PTRACERS_EvPrRn(iTrc) )
0159 & *mass2rUnit
0160 ENDDO
0161 ENDDO
0162 ENDIF
0163
0164 ENDDO
0165
0166 ELSE
0167
0168
0169 DO iTrc=1,PTRACERS_numInUse
0170
0171 IF ( PTRACERS_StepFwd(iTrc) .AND.
0172 & PTRACERS_EvPrRn(iTrc).NE.UNSET_RL ) THEN
0173
0174
0175 DO j = jMin, jMax
0176 DO i = iMin, iMax
0177 surfaceForcingPTr(i,j,bi,bj,iTrc) =
0178 & surfaceForcingPTr(i,j,bi,bj,iTrc)
0179 & + ( EmPmR(i,j,bi,bj) + add2EmP(i,j) )
0180 & *( PTRACERS_ref(ks,iTrc) - PTRACERS_EvPrRn(iTrc) )
0181 & *mass2rUnit
0182 ENDDO
0183 ENDDO
0184 ENDIF
0185
0186 ENDDO
0187
0188
0189 ENDIF
0190
0191 ENDIF
0192
0193
0194
0195 #endif /* ALLOW_PTRACERS */
0196
0197 RETURN
0198 END