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