File indexing completed on 2018-03-02 18:40:36 UTC
view on githubraw file Latest commit add29e06 on 2018-01-31 20:35:05 UTC
a456aa407c Andr*0001 #include "FIZHI_OPTIONS.h"
45f4a0300f Jean*0002 #undef CHECK_GETPWHERE
0003
28e90e66e5 Andr*0004 subroutine getpwhere(myThid,numpress,pressures,levpressures)
45f4a0300f Jean*0005
0006
0007
0008
0009
0010
0011
bfa80ec297 Andr*0012
45f4a0300f Jean*0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
bfa80ec297 Andr*0028 implicit none
0029
0030 #include "SIZE.h"
0031 #include "fizhi_SIZE.h"
0032 #include "GRID.h"
0889f02121 Jean*0033 #ifdef CHECK_GETPWHERE
0034 #include "EEPARAMS.h"
0035 #include "PARAMS.h"
0036 #endif /* CHECK_GETPWHERE */
bfa80ec297 Andr*0037
0038 integer myThid,numpress
0039 _RL pressures(numpress)
0040 integer levpressures(numpress)
0041
0889f02121 Jean*0042 #ifdef CHECK_GETPWHERE
0043 INTEGER ioUnit, upperBnd
0044
0045 #endif /* CHECK_GETPWHERE */
bfa80ec297 Andr*0046 integer n,L,dynlev
45f4a0300f Jean*0047
0048
3daafce20b Jean*0049
c3bac45152 Andr*0050 integer ntry,ntry10,ntry40
0051 parameter (ntry40=15)
0052 parameter (ntry10=12)
0053 _RL dptry(ntry40), dptry10(ntry10), dptry40(ntry40)
0054 _RL dptry_pedge(ntry40+1)
45f4a0300f Jean*0055 #ifdef TRY_NEW_GETPWHERE
0056 _RL rC_dyn(Nr), dpTop
0057 #else
c3bac45152 Andr*0058 _RL rF_pmid(Nr),rF_edge(Nr+1)
45f4a0300f Jean*0059 #endif
0889f02121 Jean*0060 _RL pref(Nrphys)
45f4a0300f Jean*0061 integer tmplev
c3bac45152 Andr*0062 data dptry10 /3.00, 6.00,10.00,14.00,17.00,25.00,
0063 . 25.00,25.00,25.00,50.00,50.00,50.00/
0064 data dptry40 /3.00, 6.00,10.00,14.00,17.00,25.00,
0065 . 25.00,25.00,25.00,25.00,25.00,25.00,
0066 . 25.00,25.00,25.00/
0067
0068 if( (Nr.eq.10).or.(Nr.eq.20) ) then
0069 ntry = ntry10
0070 do L = 1,ntry
0071 dptry(L) = dptry10(L)
0072 enddo
c909a9788d Andr*0073 elseif ((Nr.eq.40).or.(Nr.eq.70)) then
c3bac45152 Andr*0074 ntry = ntry40
0075 do L = 1,ntry
0076 dptry(L) = dptry40(L)
0077 enddo
0078 else
0079 print *,' Dont know how to set levels for given pressures '
0080 stop
0081 endif
0082
45f4a0300f Jean*0083
63f7517fd8 Jean*0084 #ifdef TRY_NEW_GETPWHERE
0085 dptry_pedge(1) = rF(1)*1. _d -2
0086 #else /* TRY_NEW_GETPWHERE */
c3bac45152 Andr*0087 dptry_pedge(1) = 1000.
63f7517fd8 Jean*0088 #endif /* TRY_NEW_GETPWHERE */
45f4a0300f Jean*0089 do L = 1,ntry
0090 dptry_pedge(L+1) = dptry_pedge(L) - dptry(L)
c3bac45152 Andr*0091 enddo
0092 do L = 1,ntry
0093 pref(L) = (dptry_pedge(L) + dptry_pedge(L+1))/2.
0094 enddo
45f4a0300f Jean*0095 #ifdef CHECK_GETPWHERE
0096 ioUnit = errorMessageUnit
0097 WRITE(ioUnit,'(A)') '===== GETPWHERE: CHECK start ====='
0098 WRITE(ioUnit,'(4(A,I6),A)') ' Nr =', Nr,
0099 & ' , Nrphys=', Nrphys,
0100 & ' , ntry =', ntry,
0101 & ' , pref(1:ntry):'
0102 WRITE(ioUnit,'(10F10.4)') (pref(L),L=1,ntry)
0103 #endif /* CHECK_GETPWHERE */
0104
0105 #ifdef TRY_NEW_GETPWHERE
0106
0107 dpTop = 1. _d 0
0108 IF (Nr.EQ.70) dpTop = 1. _d -2
0109 DO L = ntry+1,Nrphys
0110 pref(L) = (Nrphys-L+0.5)*dpTop
0111 ENDDO
0112
0113 DO L = 1,Nr
0114 rC_dyn(L) = rC(L)*1. _d -2
0115 ENDDO
bfa80ec297 Andr*0116
45f4a0300f Jean*0117 dynlev = 0
0118 DO L = 1,Nr
0119 IF ( rC_dyn(L).GE.dptry_pedge(ntry+1) ) dynlev = L
0120 ENDDO
0121 DO L = ntry+1,MIN(Nrphys,ntry+Nr-dynlev)
0122 pref(L) = rC_dyn(dynlev+L-ntry)
0123 ENDDO
0124 #else /* TRY_NEW_GETPWHERE */
0125
c3bac45152 Andr*0126 rF_edge(1) = 1000.
0127 do L = 2,Nr+1
0128 rF_edge(L) = rF_edge(L-1) - (drF(L-1)/100.)
0129 enddo
0130 do L = 1,Nr
0131 rF_pmid(L) = (rF_edge(L) + rF_edge(L+1))/2.
0132 enddo
bfa80ec297 Andr*0133
c3bac45152 Andr*0134 dynlev = 0
0135 do L = 1,Nr
0136 if(rF_pmid(L).ge.pref(ntry)) dynlev = L
0137 enddo
0889f02121 Jean*0138 #ifdef CHECK_GETPWHERE
0139 IF ( rF_pmid(dynlev).ge.pref(ntry)-25. ) THEN
0140 upperBnd = ntry+Nr-dynlev
0141 ELSE
0142 upperBnd = ntry+Nr-dynlev-1
0143 ENDIF
45f4a0300f Jean*0144 WRITE(ioUnit,'(1(A,I5),A)') ' Up-Bnd=', upperBnd,
0145 & ' , rF_pmid:'
0889f02121 Jean*0146 WRITE(ioUnit,'(10F10.4)') rF_pmid
45f4a0300f Jean*0147 IF ( upperBnd.LT.Nrphys-1 ) THEN
0148 WRITE(ioUnit,'(A)')
0149 & 'ERROR: exeeding "rF_pmid" array bounds => pref ill defined'
0150
0151 ENDIF
0889f02121 Jean*0152 #endif /* CHECK_GETPWHERE */
c3bac45152 Andr*0153 if(rF_pmid(dynlev).ge.pref(ntry)-25.) then
0154 do L = ntry+1,Nrphys-1
0155 pref(L) = rF_pmid(dynlev+L-ntry)
0156 enddo
0157 else
0158 pref(ntry) = rF_pmid(dynlev)
0159 do L = ntry+1,Nrphys-1
0160 pref(L) = rF_pmid(dynlev+L-ntry+1)
0161 enddo
0162 endif
45f4a0300f Jean*0163
c3bac45152 Andr*0164 pref(Nrphys) = 0.5
c909a9788d Andr*0165 if(Nr.eq.70)pref(Nrphys) = 0.005
45f4a0300f Jean*0166 #endif /* TRY_NEW_GETPWHERE */
0167
0168 DO n = 1,numpress
0169 DO L = 1,Nrphys
0170 IF ( pref(L).GE.pressures(n) ) tmplev = L
0171 ENDDO
0172
0173
0174 levpressures(n) = Nrphys+1-tmplev
0175 ENDDO
bfa80ec297 Andr*0176
869d786604 Jean*0177 #ifdef CHECK_GETPWHERE
45f4a0300f Jean*0178 WRITE(ioUnit,'(3(A,I5),A)') ' dynlev=', dynlev,
0179 & ' , numpress=', numpress,
0180 & ' , pressures:'
869d786604 Jean*0181 WRITE(ioUnit,'(10F10.4)') pressures
45f4a0300f Jean*0182 WRITE(ioUnit,'(A)') 'pref(ntry:Nrphys):'
0183 WRITE(ioUnit,'(10F10.4)') (pref(L),L=ntry,Nrphys)
869d786604 Jean*0184 WRITE(ioUnit,'(A)') 'levpressures:'
0185 WRITE(ioUnit,'(20I5)') levpressures
0186 WRITE(ioUnit,'(A)') '===== GETPWHERE: CHECK end ====='
0187 #endif /* CHECK_GETPWHERE */
0188
45f4a0300f Jean*0189 RETURN
0190 END