File indexing completed on 2025-02-02 06:11:29 UTC
view on githubraw file Latest commit 701e10a9 on 2025-02-01 19:15:20 UTC
5dddee4ea2 Jean*0001 #include "CPP_OPTIONS.h"
0002
0003
0004
d0305341db Mart*0005
58a003f85e Jean*0006
0007
d0305341db Mart*0008
701e10a905 Mart*0009
0010
0011
0012
5dddee4ea2 Jean*0013
da3bdb7dd1 Jean*0014
0015
0016
0017
0018
58a003f85e Jean*0019 SUBROUTINE SW_PTMP (S,T,P,PR, rv)
5dddee4ea2 Jean*0020
0021
da3bdb7dd1 Jean*0022
0023
0024
0025
d0305341db Mart*0026
da3bdb7dd1 Jean*0027
0028
0029
0030
0031
0032
701e10a905 Mart*0033
0034
0035
0036
0037
5dddee4ea2 Jean*0038
0039
0040 IMPLICIT NONE
0041
0042
0043 _RL S,T,P,PR
0044 _RL rv
0045
da3bdb7dd1 Jean*0046
5dddee4ea2 Jean*0047 _RL del_P ,del_th, th, q
0048 _RL onehalf, two, three
da3bdb7dd1 Jean*0049 PARAMETER ( onehalf = 0.5 _d 0, two = 2. _d 0, three = 3. _d 0 )
5dddee4ea2 Jean*0050 _RL adtg_val
da3bdb7dd1 Jean*0051
0052
0053
5dddee4ea2 Jean*0054 del_P = PR - P
701e10a905 Mart*0055 CALL SW_ADTG(S,T,P, adtg_val)
5dddee4ea2 Jean*0056 del_th = del_P*adtg_val
0057 th = T + onehalf*del_th
0058 q = del_th
da3bdb7dd1 Jean*0059
701e10a905 Mart*0060 CALL SW_ADTG(S,th,P+onehalf*del_P, adtg_val)
5dddee4ea2 Jean*0061 del_th = del_P*adtg_val
0062
0063 th = th + (1 - 1/sqrt(two))*(del_th - q)
0064 q = (two-sqrt(two))*del_th + (-two+three/sqrt(two))*q
0065
da3bdb7dd1 Jean*0066
701e10a905 Mart*0067 CALL SW_ADTG(S,th,P+onehalf*del_P, adtg_val)
5dddee4ea2 Jean*0068 del_th = del_P*adtg_val
0069 th = th + (1 + 1/sqrt(two))*(del_th - q)
0070 q = (two + sqrt(two))*del_th + (-two-three/sqrt(two))*q
0071
da3bdb7dd1 Jean*0072
701e10a905 Mart*0073 CALL SW_ADTG(S,th,P+del_P, adtg_val)
5dddee4ea2 Jean*0074 del_th = del_P*adtg_val
0075 rv = th + (del_th - two*q)/(two*three)
da3bdb7dd1 Jean*0076 RETURN
0077 END
5dddee4ea2 Jean*0078
da3bdb7dd1 Jean*0079
5dddee4ea2 Jean*0080
0081
0082
0083
58a003f85e Jean*0084 SUBROUTINE SW_TEMP( S, T, P, PR, rv)
5dddee4ea2 Jean*0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
07712e28f8 Jean*0098
0099
5dddee4ea2 Jean*0100
d0305341db Mart*0101
5dddee4ea2 Jean*0102
0103
0104 IMPLICIT NONE
0105
0106
0107
0108
da3bdb7dd1 Jean*0109
0110
0111
0112
d0305341db Mart*0113
da3bdb7dd1 Jean*0114 _RL S, T, P, PR
5dddee4ea2 Jean*0115 _RL rv
d0305341db Mart*0116
5dddee4ea2 Jean*0117
d0305341db Mart*0118 CALL SW_PTMP (S,T,PR,P,rv)
5dddee4ea2 Jean*0119
0120 RETURN
0121 END
0122
da3bdb7dd1 Jean*0123
5dddee4ea2 Jean*0124
da3bdb7dd1 Jean*0125
0126
0127
5dddee4ea2 Jean*0128 SUBROUTINE SW_ADTG (S,T,P, rv)
0129
da3bdb7dd1 Jean*0130
0131
0132
0133
0134
0135
0136
0137
701e10a905 Mart*0138
da3bdb7dd1 Jean*0139
0140
0141 IMPLICIT NONE
0142
0143
5dddee4ea2 Jean*0144 _RL S,T,P
58a003f85e Jean*0145 _RL rv
da3bdb7dd1 Jean*0146
0147
0148 _RL a0,a1,a2,a3,b0,b1,c0,c1,c2,c3,d0,d1,e0,e1,e2
5dddee4ea2 Jean*0149 _RL sref
da3bdb7dd1 Jean*0150
5dddee4ea2 Jean*0151
0152 sref = 35. _d 0
0153 a0 = 3.5803 _d -5
0154 a1 = +8.5258 _d -6
0155 a2 = -6.836 _d -8
0156 a3 = 6.6228 _d -10
0157
0158 b0 = +1.8932 _d -6
0159 b1 = -4.2393 _d -8
0160
0161 c0 = +1.8741 _d -8
0162 c1 = -6.7795 _d -10
0163 c2 = +8.733 _d -12
0164 c3 = -5.4481 _d -14
0165
0166 d0 = -1.1351 _d -10
0167 d1 = 2.7759 _d -12
0168
0169 e0 = -4.6206 _d -13
0170 e1 = +1.8676 _d -14
0171 e2 = -2.1687 _d -16
0172
0173 rv = a0 + (a1 + (a2 + a3*T)*T)*T
0174 & + (b0 + b1*T)*(S-sref)
0175 & + ( (c0 + (c1 + (c2 + c3*T)*T)*T) + (d0 + d1*T)*(S-sref) )*P
0176 & + ( e0 + (e1 + e2*T)*T )*P*P
da3bdb7dd1 Jean*0177
0178 RETURN
0179 END
701e10a905 Mart*0180
0181
0182
0183
0184
0185
0186
0187 SUBROUTINE CONVERT_PT2CT(
0188 I Tp, Sa,
0189 O Tc,
0190 I myTime, myIter, myThid )
0191
0192
0193
0194
0195
0196
0197 IMPLICIT NONE
0198
0199 #include "SIZE.h"
0200 #include "EOS.h"
0201
0202
0203
0204
0205
0206
0207
0208
0209 _RL Tc(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0210 _RL Sa(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0211 _RL Tp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0212 _RL myTime
0213 INTEGER myIter, myThid
0214
0215
0216
0217 INTEGER i,j
0218
0219
0220 _RL x2, x
0221
0222 _RL zeRL
0223 PARAMETER ( zeRL = 0.0 _d 0 )
0224
0225 DO j=1-OLy,sNy+OLy
0226 DO i=1-OLx,sNx+OLx
0227 x2 = MAX(I_S0 * Sa(i,j), zeRL)
0228 #ifdef ALLOW_AUTODIFF
0229 x = 0. _d 0
0230 IF ( x2 .GT. 0. _d 0 ) x = SQRT(x2)
0231 #else
0232 x = SQRT(x2)
0233 #endif
0234 Tc(i,j) = H00 + (Tp(i,j)*(H01 + Tp(i,j)*(H02 + Tp(i,j)*(H03
0235 & + Tp(i,j)*(H04 + Tp(i,j)*(H05
0236 & + Tp(i,j)*(H06 + Tp(i,j)* H07))))))
0237 & + x2*(H20 + (Tp(i,j)*(H21 + Tp(i,j)*(H22 + Tp(i,j)*(H23
0238 & + Tp(i,j)*(H24 + Tp(i,j)*(H25 + Tp(i,j)*H26)))))
0239 & + x*(H30 + (Tp(i,j)*(H31 + Tp(i,j)*(H32
0240 & + Tp(i,j)*(H33 + Tp(i,j)* H34)))
0241 & + x*(H40 + (Tp(i,j)*(H41 + Tp(i,j)*(H42 + Tp(i,j)*(H43
0242 & + Tp(i,j)*(H44 + Tp(i,j)*H45))))
0243 & + x*(H50 + x*(H60 + x* H70)) )) )) )) )
0244 ENDDO
0245 ENDDO
0246
0247 RETURN
0248 END
0249
0250
0251
0252
0253
0254
0255
0256 SUBROUTINE CONVERT_CT2PT(
0257 I Tc, Sa,
0258 O Tp,
0259 I myTime, myIter, myThid )
0260
0261
0262
0263
0264
0265
0266
0267 IMPLICIT NONE
0268
0269 #include "SIZE.h"
0270 #include "EOS.h"
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 _RL Tc(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0281 _RL Sa(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0282 _RL Tp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0283 _RL myTime
0284 INTEGER myIter, myThid
0285
0286
0287
0288 INTEGER i,j
0289
0290 _RL Tp_num
0291
0292
0293 _RL I_Tp_den
0294
0295
0296 _RL Tc_diff(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0297
0298 _RL Tp_old
0299
0300
0301 _RL dTp_dTc(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
0302 _RL dTc_dTp
0303
0304
0305 _RL x2, x
0306
0307 _RL Tmp
0308
0309 _RL zeRL
0310 PARAMETER ( zeRL = 0.0 _d 0 )
0311
0312 DO j=1-OLy,sNy+OLy
0313 DO i=1-OLx,sNx+OLx
0314 Tp_num = TPN00 + (Sa(i,j)*(TPN10 + TPN20*Sa(i,j))
0315 & + Tc(i,j)*(TPN01 + (TPN11*Sa(i,j) + TPN02*Tc(i,j))))
0316 I_Tp_den = 1.0 _d 0 / (1.0 _d 0
0317 & + (TPD10*Sa(i,j) + Tc(i,j)*(TPD01 + TPD02*Tc(i,j))))
0318 Tp(i,j) = Tp_num*I_Tp_den
0319 dTp_dTc(i,j) = ((TPN01 + (TPN11*Sa(i,j) + 2.*TPN02*Tc(i,j)))
0320 & - (TPD01 + 2.*TPD02*Tc(i,j))*Tp(i,j))*I_Tp_den
0321 ENDDO
0322 ENDDO
0323
0324
0325
0326
0327
0328
0329 CALL CONVERT_PT2CT (
0330 I Tp, Sa,
0331 O Tc_diff,
0332 I myTime, myIter, myThid )
0333 DO j=1-OLy,sNy+OLy
0334 DO i=1-OLx,sNx+OLx
0335 Tc_diff(i,j) = Tc_diff(i,j) - Tc(i,j)
0336 Tp_old = Tp(i,j)
0337 Tp(i,j) = Tp_old - Tc_diff(i,j)*dTp_dTc(i,j)
0338
0339
0340
0341 x2 = MAX(I_S0 * Sa(i,j), zeRL)
0342 #ifdef ALLOW_AUTODIFF
0343 x = 0. _d 0
0344 IF ( x2 .GT. 0. _d 0 ) x = SQRT(x2)
0345 #else
0346 x = SQRT(x2)
0347 #endif
0348 Tmp = 0.5 _d 0 *(Tp(i,j) + Tp_old)
0349 dTc_dTp = ( H01 + Tmp*(2.*H02 + Tmp*(3.*H03 + Tmp*(4.*H04
0350 & + Tmp*(5.*H05 + Tmp*(6.*H06 + Tmp*(7.*H07)))))) )
0351 & + x2*( (H21 + Tmp*(2.*H22 + Tmp*(3.*H23 + Tmp*(4.*H24
0352 & + Tmp*(5.*H25 + Tmp*(6.*H26))))))
0353 & + x*( (H31 + Tmp*(2.*H32 + Tmp*(3.*H33 + Tmp*(4.*H34))))
0354 & + x*(H41 + Tmp*(2.*H42 + Tmp*(3.*H43
0355 & + Tmp*(4.*H44 + Tmp*(5.*H45))))) ) )
0356 dTp_dTc(i,j) = 1. _d 0 / dTc_dTp
0357
0358 Tp(i,j) = Tp_old - Tc_diff(i,j)*dTp_dTc(i,j)
0359 ENDDO
0360 ENDDO
0361 CALL CONVERT_PT2CT (
0362 I Tp, Sa,
0363 O Tc_diff,
0364 I myTime, myIter, myThid )
0365 DO j=1-OLy,sNy+OLy
0366 DO i=1-OLx,sNx+OLx
0367 Tc_diff(i,j) = Tc_diff(i,j) - Tc(i,j)
0368 Tp_old = Tp(i,j)
0369 Tp(i,j) = Tp_old - Tc_diff(i,j)*dTp_dTc(i,j)
0370 ENDDO
0371 ENDDO
0372
0373 RETURN
0374 END