File indexing completed on 2018-03-02 18:36:55 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
1dbaea09ee Chri*0001 #include "CPP_OPTIONS.h"
a74b31ee34 Alis*0002
9366854e02 Chri*0003
0004
0005
a74b31ee34 Alis*0006 SUBROUTINE INI_VERTICAL_GRID( myThid )
c57655c2bb Jean*0007
9366854e02 Chri*0008
0009
c57655c2bb Jean*0010
0011
9366854e02 Chri*0012
0013
a74b31ee34 Alis*0014
9366854e02 Chri*0015
0016 IMPLICIT NONE
a74b31ee34 Alis*0017
0018 #include "SIZE.h"
0019 #include "EEPARAMS.h"
0020 #include "PARAMS.h"
0021 #include "GRID.h"
0022
9366854e02 Chri*0023
a74b31ee34 Alis*0024
c57655c2bb Jean*0025
a74b31ee34 Alis*0026 INTEGER myThid
0027
9366854e02 Chri*0028
a74b31ee34 Alis*0029
c57655c2bb Jean*0030
f15994caab Jean*0031
c57655c2bb Jean*0032 INTEGER k
0033 _RL tmpRatio, checkRatio1, checkRatio2
c28ce1627a Jean*0034 CHARACTER*(MAX_LEN_MBUF) msgBuf
f15994caab Jean*0035 _RL maxErrC, maxErrF, epsil, tmpError
0036 _RL rFullDepth, recip_fullDepth
0037 _RS rSigBndRS, tmpRS
9366854e02 Chri*0038
a74b31ee34 Alis*0039
06bb0cec77 Jean*0040 _BEGIN_MASTER(myThid)
0041
4606c28752 Jean*0042 WRITE(msgBuf,'(A,2(A,L5))') 'Enter INI_VERTICAL_GRID:',
0043 & ' setInterFDr=', setInterFDr,
0044 & ' ; setCenterDr=', setCenterDr
0045 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0046 & SQUEEZE_RIGHT, myThid )
0047
ad6178a973 Jean*0048
0049
c57655c2bb Jean*0050
0051
0052
ad6178a973 Jean*0053 rkSign = -1. _d 0
0054 gravitySign = -1. _d 0
0055 IF ( usingPCoords ) THEN
0056 gravitySign = 1. _d 0
0057 ENDIF
0058
4606c28752 Jean*0059 IF ( .NOT.(setInterFDr.OR.setCenterDr) ) THEN
0060 WRITE(msgBuf,'(A)')
c57655c2bb Jean*0061 & 'S/R INI_VERTICAL_GRID: neither delR nor delRc are defined'
4606c28752 Jean*0062 CALL PRINT_ERROR( msgBuf, myThid )
0063 WRITE(msgBuf,'(A)')
c57655c2bb Jean*0064 & 'S/R INI_VERTICAL_GRID: Need at least 1 of the 2 (delR,delRc)'
4606c28752 Jean*0065 CALL PRINT_ERROR( msgBuf, myThid )
0066 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
c57655c2bb Jean*0067 ENDIF
c28ce1627a Jean*0068
c57655c2bb Jean*0069
4606c28752 Jean*0070
c57655c2bb Jean*0071 IF (setInterFDr) THEN
0072
0073 DO k=1,Nr
4606c28752 Jean*0074 drF(k) = delR(k)
c57655c2bb Jean*0075 ENDDO
c28ce1627a Jean*0076
c57655c2bb Jean*0077 DO k=1,Nr
4606c28752 Jean*0078 IF (delR(k).LE.0.) THEN
0079 WRITE(msgBuf,'(A,I4,A,E16.8)')
c57655c2bb Jean*0080 & 'S/R INI_VERTICAL_GRID: delR(k=',k,' )=',delR(k)
4606c28752 Jean*0081 CALL PRINT_ERROR( msgBuf, myThid )
0082 WRITE(msgBuf,'(A)')
c28ce1627a Jean*0083 & 'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
4606c28752 Jean*0084 CALL PRINT_ERROR( msgBuf, myThid )
0085 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
0086 ENDIF
c28ce1627a Jean*0087 ENDDO
0088 ELSE
c57655c2bb Jean*0089
0090
0091 drF(1) = delRc(1)
0092 DO k=2,Nr
0e48383ebf Jean*0093
0094
0095
0096
4606c28752 Jean*0097 drF( k ) = 0.5 _d 0 *delRc(k)
0e48383ebf Jean*0098 drF(k-1) = 0.5 _d 0 *delRc(k) + drF(k-1)
c57655c2bb Jean*0099 ENDDO
0100 drF(Nr) = delRc(Nr+1) + drF(Nr)
0101 ENDIF
c28ce1627a Jean*0102
c57655c2bb Jean*0103 IF (setCenterDr) THEN
0104
700c03e4bf Jean*0105 DO k=1,Nr+1
c57655c2bb Jean*0106 drC(k) = delRc(k)
0107 ENDDO
c28ce1627a Jean*0108
c57655c2bb Jean*0109 DO k=1,Nr+1
0110 IF (delRc(k).LE.0.) THEN
c28ce1627a Jean*0111 WRITE(msgBuf,'(A,I4,A,E16.8)')
c57655c2bb Jean*0112 & 'S/R INI_VERTICAL_GRID: delRc(k=',k,' )=',delRc(k)
0113 CALL PRINT_ERROR( msgBuf, myThid )
c28ce1627a Jean*0114 WRITE(msgBuf,'(A)')
0115 & 'S/R INI_VERTICAL_GRID: Vert. grid spacing MUST BE > 0'
c57655c2bb Jean*0116 CALL PRINT_ERROR( msgBuf, myThid )
c28ce1627a Jean*0117 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
0118 ENDIF
0119 ENDDO
c57655c2bb Jean*0120 ELSE
0121
0122
0123 drC(1) = 0.5 _d 0 *delR(1)
0124 DO k=2,Nr
0125 drC(k) = 0.5 _d 0 *(delR(k-1)+delR(k))
0126 ENDDO
700c03e4bf Jean*0127 drC(Nr+1) = 0.5 _d 0 *delR(Nr)
c57655c2bb Jean*0128 ENDIF
c28ce1627a Jean*0129
c57655c2bb Jean*0130
2ad79bdf32 Jean*0131
0132
0133
0134
0135
0136 IF ( rF(1).EQ.UNSET_RS .AND.
0137 & usingZCoords.AND.fluidIsWater ) THEN
0138 rF(1) = seaLev_Z
0139 ENDIF
0140 IF ( rF(1).NE.UNSET_RS ) THEN
0141 DO k=1,Nr
0142 rF(k+1) = rF(k) + rkSign*drF(k)
0143 ENDDO
0144 rC(1) = rF(1) + rkSign*drC(1)
0145 DO k=2,Nr
0146 rC(k) = rC(k-1) + rkSign*drC(k)
0147 ENDDO
0148
0149
0150
0151
0152
0153
0154
0155 ELSE
0156 IF ( usingPCoords ) THEN
0157 rF(Nr+1) = top_Pres
0158 ELSE
0159 rF(Nr+1) = seaLev_Z
0160 ENDIF
0161 DO k=Nr,1,-1
0162 rF(k) = rF(k+1) - rkSign*drF(k)
0163 ENDDO
0164 rC(Nr) = rF(Nr+1) - rkSign*drC(Nr+1)
0165 DO k=Nr,2,-1
0166 rC(k-1) = rC(k) - rkSign*drC(k)
0167 ENDDO
0168 ENDIF
c28ce1627a Jean*0169
c57655c2bb Jean*0170
0171 checkRatio2 = 100.
0172 checkRatio1 = 1. _d 0 / checkRatio2
0173 DO k=1,Nr
0174 tmpRatio = 0.
0175 IF ( (rC(k)-rF(k+1)) .NE. 0. )
0176 & tmpRatio = (rF(k)-rC(k)) / (rC(k)-rF(k+1))
0177 IF ( tmpRatio.LT.checkRatio1 .OR. tmpRatio.GT.checkRatio2 ) THEN
0178
0179
0180
0181
0182 WRITE(msgBuf,'(A,I4,A,E16.8)')
0183 & 'S/R INI_VERTICAL_GRID: Invalid relative position, level k=',
0184 & k, ' :', tmpRatio
0185 CALL PRINT_ERROR( msgBuf, myThid )
0186 WRITE(msgBuf,'(A,1PE14.6,A,2E14.6)')
0187 & 'S/R INI_VERTICAL_GRID: rC=', rC(k),
0188 & ' , rF(k,k+1)=',rF(k),rF(k+1)
0189 CALL PRINT_ERROR( msgBuf, myThid )
0190 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
0191 ENDIF
0192 ENDDO
c28ce1627a Jean*0193
0194
700c03e4bf Jean*0195 DO k=1,Nr+1
c57655c2bb Jean*0196 recip_drC(k) = 1. _d 0/drC(k)
700c03e4bf Jean*0197 ENDDO
0198 DO k=1,Nr
c57655c2bb Jean*0199 recip_drF(k) = 1. _d 0/drF(k)
a74b31ee34 Alis*0200 ENDDO
c28ce1627a Jean*0201
f15994caab Jean*0202
0203 IF ( selectSigmaCoord .EQ. 0 ) THEN
0204 DO k=1,Nr+1
0205 aHybSigmF(k) = 0. _d 0
0206 bHybSigmF(k) = 0. _d 0
0207 dAHybSigC(k) = 0. _d 0
0208 dAHybSigC(k) = 0. _d 0
0209 ENDDO
0210 DO k=1,Nr
0211 aHybSigmC(k) = 0. _d 0
0212 bHybSigmC(k) = 0. _d 0
0213 dAHybSigF(k) = 0. _d 0
0214 dAHybSigF(k) = 0. _d 0
0215 ENDDO
0216 ELSE
0217 rFullDepth = rF(1) - rF(Nr+1)
0218 recip_fullDepth = 0. _d 0
0219 IF ( rFullDepth.GT.0. ) recip_fullDepth = 1. _d 0 / rFullDepth
0220 rSigBndRS = rSigmaBnd
0221 IF ( hybSigmFile.EQ.' ' .AND. rSigmaBnd.EQ.UNSET_RL ) THEN
0222
0223 IF ( usingPCoords ) rSigBndRS = rF(Nr+1)
0224 IF ( usingZCoords ) rSigBndRS = rF(1)
0225 ENDIF
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 IF ( hybSigmFile.EQ.' ' ) THEN
0238
0239 IF ( usingPCoords .AND. setInterFDr ) THEN
0240
0241
0242
0243
0244
0245
0246
0247 DO k=1,Nr+1
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258 tmpRS = MIN( rF(k), rSigBndRS )
0259 bHybSigmF(k) = ( rF(k) - tmpRS )/(rF(1)-rSigBndRS)
0260 aHybSigmF(k) = (1. _d 0 - bHybSigmF(k))
0261 & *( tmpRS -rF(Nr+1) )*recip_fullDepth
0262 ENDDO
0263 ENDIF
0264 IF ( usingPCoords .AND. setCenterDr ) THEN
0265 DO k=1,Nr
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 tmpRS = MIN( rC(k), rSigBndRS )
0277 bHybSigmC(k) = ( rC(k) - tmpRS )/(rF(1)-rSigBndRS)
0278 aHybSigmC(k) = (1. _d 0 - bHybSigmC(k))
0279 & *( tmpRS -rF(Nr+1) )*recip_fullDepth
0280 ENDDO
0281 ENDIF
0282 IF ( usingZCoords .AND. setInterFDr ) THEN
0283
0284
0285 DO k=1,Nr+1
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295 tmpRS = MAX( rF(k), rSigBndRS )
0296 bHybSigmF(k) = ( rF(k)-rF(Nr+1) )/( tmpRS-rF(Nr+1) )
0297 aHybSigmF(k) = bHybSigmF(k)*( tmpRS-rF(1) )*recip_fullDepth
0298 ENDDO
0299 ENDIF
0300 IF ( usingZCoords .AND. setCenterDr ) THEN
0301 DO k=1,Nr
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311 tmpRS = MAX( rC(k), rSigBndRS )
0312 bHybSigmC(k) = ( rC(k)-rF(Nr+1) )/( tmpRS-rF(Nr+1) )
0313 aHybSigmC(k) = bHybSigmC(k)*( tmpRS-rF(1) )*recip_fullDepth
0314 ENDDO
0315 ENDIF
0316 ELSE
0317
0318 IF (setCenterDr) THEN
0319 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID: Missing Code'
0320 ENDIF
0321 ENDIF
0322
0323
0324 IF ( .NOT.setInterFDr ) THEN
0325
0326 bHybSigmF(1) = 1. _d 0
0327 aHybSigmF(1) = 0. _d 0
0328 bHybSigmF(Nr+1) = 0. _d 0
0329 aHybSigmF(Nr+1) = 0. _d 0
0330 DO k=2,Nr
0331 bHybSigmF(k) = ( bHybSigmC(k) + bHybSigmC(k-1) )*0.5 _d 0
0332 aHybSigmF(k) = ( aHybSigmC(k) + aHybSigmC(k-1) )*0.5 _d 0
0333 ENDDO
0334 ENDIF
0335 IF ( .NOT.setCenterDr ) THEN
0336
0337 DO k=1,Nr
0338 bHybSigmC(k) = ( bHybSigmF(k) + bHybSigmF(k+1) )*0.5 _d 0
0339 aHybSigmC(k) = ( aHybSigmF(k) + aHybSigmF(k+1) )*0.5 _d 0
0340 ENDDO
0341 ENDIF
0342
0343
0344 DO k=1,Nr
0345 dAHybSigF(k) = ( aHybSigmF(k+1) - aHybSigmF(k) )*rkSign
0346 dBHybSigF(k) = ( bHybSigmF(k+1) - bHybSigmF(k) )*rkSign
0347 ENDDO
0348 DO k=2,Nr
0349 dAHybSigC(k) = ( aHybSigmC(k) - aHybSigmC(k-1) )*rkSign
0350 dBHybSigC(k) = ( bHybSigmC(k) - bHybSigmC(k-1) )*rkSign
0351 ENDDO
0352 dAHybSigC(1) = ( aHybSigmC(1) - aHybSigmF(1) )*rkSign
0353 dBHybSigC(1) = ( bHybSigmC(1) - bHybSigmF(1) )*rkSign
0354 dAHybSigC(Nr+1) = ( aHybSigmF(Nr+1) - aHybSigmC(Nr) )*rkSign
0355 dBHybSigC(Nr+1) = ( bHybSigmF(Nr+1) - bHybSigmC(Nr) )*rkSign
0356
0357
0358 maxErrC = 0.
0359 maxErrF = 0.
0360 epsil = 1. _d -9
0361 DO k=1,Nr
0362 tmpError = ( rC(k)-rF(Nr+1) )*recip_fullDepth
0363 & - ( aHybSigmC(k)+bHybSigmC(k) )
0364 IF ( ABS(tmpError).GT.epsil ) THEN
0365 IF ( maxErrC.LE.epsil ) THEN
0366 WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
0367 & ' rC and Hybrid-Sigma Coeff miss-match'
0368 CALL PRINT_ERROR( msgBuf, myThid )
0369 ENDIF
0370 WRITE(msgBuf,'(A,I4,2(A,1PE14.6),A,1P2E14.6)')
0371 & ' k=', k,' , err=', tmpError, ' ; rC=', rC(k),
0372 & ' , a & b=', aHybSigmC(k), bHybSigmC(k)
0373 CALL PRINT_ERROR( msgBuf, myThid )
0374 ENDIF
0375 maxErrC = MAX( maxErrC, ABS(tmpError) )
0376 ENDDO
0377 DO k=1,Nr+1
0378 tmpError = ( rF(k)-rF(Nr+1) )*recip_fullDepth
0379 & - ( aHybSigmF(k)+bHybSigmF(k) )
0380 IF ( ABS(tmpError).GT.epsil ) THEN
0381 IF ( maxErrF.LE.epsil ) THEN
0382 WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
0383 & ' rF and Hybrid-Sigma Coeff miss-match'
0384 CALL PRINT_ERROR( msgBuf, myThid )
0385 ENDIF
0386 WRITE(msgBuf,'(A,I4,2(A,1PE14.6),A,1P2E14.6)')
0387 & ' k=', k,' , err=', tmpError, ' ; rF=', rF(k),
0388 & ' , a & b=', aHybSigmF(k), bHybSigmF(k)
0389 CALL PRINT_ERROR( msgBuf, myThid )
0390 ENDIF
0391 maxErrF = MAX( maxErrF, ABS(tmpError) )
0392 ENDDO
0393 WRITE(msgBuf,'(2A,1PE14.6)') 'S/R INI_VERTICAL_GRID:',
0394 & ' matching of aHybSigmC & rC :', maxErrC
0395 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0396 & SQUEEZE_RIGHT, myThid )
0397 WRITE(msgBuf,'(2A,1PE14.6)') 'S/R INI_VERTICAL_GRID:',
0398 & ' matching of aHybSigmF & rF :', maxErrF
0399 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
0400 & SQUEEZE_RIGHT, myThid )
0401 IF ( maxErrC.GT.epsil .OR. maxErrF.GT.epsil ) THEN
0402 WRITE(msgBuf,'(2A)') 'S/R INI_VERTICAL_GRID:',
0403 & ' rC,rF and Hybrid-Sigma Coeff miss-match'
0404 CALL PRINT_ERROR( msgBuf, myThid )
0405 STOP 'ABNORMAL END: S/R INI_VERTICAL_GRID'
0406 ENDIF
0407
0408
0409 ENDIF
0410
06bb0cec77 Jean*0411 _END_MASTER(myThid)
0412 _BARRIER
0413
a74b31ee34 Alis*0414 RETURN
0415 END