Changeset 2819 for LMDZ5/trunk/libf/phylmd/regr_pr_time_av_m.F90
- Timestamp:
- Mar 8, 2017, 3:34:12 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/regr_pr_time_av_m.F90
r2788 r2819 71 71 LOGICAL, SAVE :: lO3Trop !--- Tropopause ozone flag 72 72 LOGICAL, SAVE :: lfirst=.TRUE. !--- First call flag 73 !$OMP THREADPRIVATE(lfirst) 73 74 REAL, PARAMETER :: co3(3)=[91.,28.,20.] !--- Coeffs for o3 threshold 74 75 REAL, PARAMETER :: prtrop=5.E+3 !--- Value lower than the tropopause pressure … … 79 80 !------------------------------------------------------------------------------- 80 81 ! 81 SUBROUTINE regr_pr_time_av(fID, nam, julien, pint_in, p cen_ou, v3, time_in, &82 SUBROUTINE regr_pr_time_av(fID, nam, julien, pint_in, pint_ou, v3, time_in, & 82 83 lat_in, pcen_in, ptrop_ou) 83 84 ! … … 102 103 CHARACTER(LEN=13), INTENT(IN) :: nam(:) !--- NetCDF variables names 103 104 REAL, INTENT(IN) :: julien !--- Days since Jan 1st 104 REAL, INTENT(IN) :: pint_in(:) !--- Interfaces Pressure, Pa, ascending105 REAL, INTENT(IN) :: p cen_ou(:,:) !--- Mid-layers LMDZ Pres, Pa (klon,llm+1)105 REAL, INTENT(IN) :: pint_in(:) !--- Interfaces file Pres, Pa, ascending 106 REAL, INTENT(IN) :: pint_ou(:,:) !--- Interfaces LMDZ Pres, Pa (klon,llm+1) 106 107 REAL, INTENT(OUT) :: v3(:,:,:) !--- Regridded field (klon,llm,SIZE(nam)) 107 108 REAL, INTENT(IN), OPTIONAL :: time_in(:) !--- Records times, in days 108 109 ! since Jan 1 of current year 109 110 REAL, INTENT(IN), OPTIONAL :: lat_in(:) !--- Input/output latitudes vector 110 REAL, INTENT(IN), OPTIONAL :: pcen_in(:) !--- Mid-layers pressure111 REAL, INTENT(IN), OPTIONAL :: pcen_in(:) !--- Mid-layers file pressure 111 112 REAL, INTENT(IN), OPTIONAL :: ptrop_ou(:)!--- Output tropopause pressure (klon) 112 113 !------------------------------------------------------------------------------- … … 136 137 !------------------------------------------------------------------------------- 137 138 sub="regr_pr_time_av" 139 nlev_in=SIZE(pint_in)-1 138 140 CALL assert(SIZE(v3,1)==klon, TRIM(sub)//" v3 klon") 139 141 CALL assert(SIZE(v3,2)==nbp_lev, TRIM(sub)//" v3 nbp_lev") 140 142 n_var = assert_eq(SIZE(nam), SIZE(v3,3), TRIM(sub)//" v3 n_var") 141 CALL assert(SHAPE(p cen_ou)==[klon, nbp_lev+1],TRIM(sub)//" pcen_ou")143 CALL assert(SHAPE(pint_ou)==[klon, nbp_lev+1],TRIM(sub)//" pint_ou") 142 144 IF(PRESENT(lat_in)) CALL assert(SIZE(lat_in )==klon,TRIM(sub)//" lat_in klon") 143 145 IF(PRESENT(ptrop_ou)) CALL assert(SIZE(ptrop_ou)==klon,TRIM(sub)//" ptrop_ou klon") 146 IF(PRESENT(pcen_in)) CALL assert(SIZE(pcen_in)==nlev_in,TRIM(sub)//" pcen_in") 144 147 ltrop=PRESENT(lat_in).AND.PRESENT(pcen_in).AND.PRESENT(ptrop_ou) 145 nlev_in=SIZE(pint_in)-1146 148 147 149 !$OMP MASTER … … 162 164 IF(lO3Trop) ALLOCATE(otm(nbp_lon,nbp_lat),otp(nbp_lon,nbp_lat)) 163 165 END IF 164 IF(PRESENT(pcen_in)) itrp0=locate(pcen_in,prtrop) !--- Above tropopause: 50hPa 166 !--- INITIAL INDEX: LOCATE A LAYER WELL ABOVE TROPOPAUSE (50hPa) 167 IF(PRESENT(pcen_in)) THEN 168 itrp0=locate(pcen_in,prtrop) 169 ELSE 170 itrp0=locate(SQRT(pint_in(1:nlev_in)*pint_in(2:nlev_in+1)),prtrop) 171 END IF 165 172 IF(lPrSurf) WRITE(*,*)' >> Using GROUND PRESSURE from input O3 forcing file.' 166 173 IF(linterp) WRITE(*,*)' >> Monthly O3 files => ONLINE TIME INTERPOLATION.' … … 178 185 !=== TIME INTERPOLATION FOR MONTHLY INPUT FILES 179 186 IF(linterp) THEN 180 WRITE(*,'(3(a,f7.3))')' >> Interpolating O3 at julian day ',julien, ' fr&181 & om forcing fields at times ',time_in(irec),' and ', time_in(irec+1)187 WRITE(*,'(3(a,f7.3))')' >> Interpolating O3 at julian day ',julien, & 188 &' from forcing fields at times ',time_in(irec),' and ', time_in(irec+1) 182 189 al=(time_in(irec+1)-julien)/(time_in(irec+1)-time_in(irec)) 183 190 v1=al*v1m+(1.-al)*v1p … … 188 195 END IF 189 196 !$OMP END MASTER 190 !$OMP BARRIER191 197 CALL scatter2d(v1,v2) 192 IF(PRESENT(pcen_in))CALL bcast(itrp0)193 !--- "ps" not in input file => assume it is equal to current LMDZ value194 IF(lPrSurf) THEN; CALL scatter2d(ps1,ps2); ELSE; ps2= pcen_ou(:,1); END IF198 CALL bcast(itrp0) 199 !--- No "ps" in input file => assumed to be equal to current LMDZ ground press 200 IF(lPrSurf) THEN; CALL scatter2d(ps1,ps2); ELSE; ps2=Pint_ou(:,1); END IF 195 201 IF(lPrTrop) CALL scatter2d(pt1,pt2) 196 202 IF(lO3Trop) CALL scatter2d(ot1,ot2) … … 199 205 IF(.NOT.ltrop) THEN 200 206 DO i=1,klon 201 CALL regr_conserv(1,v2(i,:,:) , Pint_in , P cen_ou(i,nbp_lev+1:1:-1), &207 CALL regr_conserv(1,v2(i,:,:) , Pint_in , Pint_ou(i,nbp_lev+1:1:-1), & 202 208 v3(i,nbp_lev:1:-1,:), slopes(1,v2(i,:,:),pint_in)) 203 209 END DO … … 206 212 DO i=1,klon 207 213 SigT_in = get_SigTrop(i,itrp) !--- input (file) tropopause 208 SigT_ou = ptrop_ou(i)/p cen_ou(i,1) !--- output (lmdz) tropopause214 SigT_ou = ptrop_ou(i)/pint_ou(i,1) !--- output (lmdz) tropopause 209 215 SigT_mn = SQRT(SigT_in*SigT_ou) !--- mean tropopause>strained domain 210 216 … … 221 227 !--- STRAINED INPUT logP PROFILE ; alpha: MAX. STRETCH. EXPONENT INCREMENT 222 228 alpha = LOG(SigT_ou/SigT_in)/LOG(SigT_in) 223 Pint_st(:) = p cen_ou(i,1) * Sig_in(:)**(1+alpha*phi(:))229 Pint_st(:) = pint_ou(i,1) * Sig_in(:)**(1+alpha*phi(:)) 224 230 225 231 !--- REGRID INPUT PROFILE ON STRAINED VERTICAL LEVELS 226 CALL regr_conserv(1,v2(i,:,:) , Pint_st, P cen_ou(i,nbp_lev+1:1:-1), &232 CALL regr_conserv(1,v2(i,:,:) , Pint_st, Pint_ou(i,nbp_lev+1:1:-1), & 227 233 v3(i,nbp_lev:1:-1,:), slopes(1,v2(i,:,:),Pint_st)) 228 234 END DO … … 275 281 END IF 276 282 lfirst=.FALSE. 283 CALL bcast(lfirst) 277 284 278 285 END SUBROUTINE update_fields … … 361 368 REAL :: prt !--- Air pressure at tropopause 362 369 REAL :: al !--- Interpolation coefficient 363 REAL :: y_frac !--- Elapsed year fraction364 370 REAL :: coef !--- Coef: North/South transition 365 371 !-------------------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.