Changeset 2820 for LMDZ5/trunk/libf/phylmd/regr_pr_time_av_m.F90
- Timestamp:
- Mar 10, 2017, 5:46:08 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/regr_pr_time_av_m.F90
r2819 r2820 2 2 MODULE regr_pr_time_av_m 3 3 4 USE print_control_mod, ONLY: lunout 4 5 USE write_field_phy 5 6 USE mod_phys_lmdz_transfert_para, ONLY: bcast … … 117 118 CHARACTER(LEN=80) :: sub 118 119 CHARACTER(LEN=320) :: msg 119 INTEGER :: vID, ncerr, n_var, nlev_in, ndim, i, ibot, itop, itrp,itrp0120 LOGICAL :: l trop!--- Need to adjust tropopause120 INTEGER :: vID, ncerr, n_var, nlev_in,ntim_in, ndim, i, ibot, itop, itrp,itrp0 121 LOGICAL :: lAdjTro !--- Need to adjust tropopause 121 122 REAL :: y_frac !--- Elapsed year fraction 122 123 REAL :: alpha, beta, al !--- For strectching/interpolation … … 137 138 !------------------------------------------------------------------------------- 138 139 sub="regr_pr_time_av" 139 nlev_in=SIZE(pint_in)-1 140 nlev_in=SIZE(pint_in)-1; ntim_in=SIZE(time_in) 140 141 CALL assert(SIZE(v3,1)==klon, TRIM(sub)//" v3 klon") 141 142 CALL assert(SIZE(v3,2)==nbp_lev, TRIM(sub)//" v3 nbp_lev") … … 145 146 IF(PRESENT(ptrop_ou)) CALL assert(SIZE(ptrop_ou)==klon,TRIM(sub)//" ptrop_ou klon") 146 147 IF(PRESENT(pcen_in)) CALL assert(SIZE(pcen_in)==nlev_in,TRIM(sub)//" pcen_in") 147 ltrop=PRESENT(lat_in).AND.PRESENT(pcen_in).AND.PRESENT(ptrop_ou) 148 lAdjTro=PRESENT(ptrop_ou) 149 IF(lAdjTro.AND.(.NOT.PRESENT(lat_in).OR..NOT.PRESENT(pcen_in))) & 150 CALL abort_physic(sub, 'Missing lat_in and/or pcen_in (adjust_tropopause=T)', 1) 148 151 149 152 !$OMP MASTER … … 155 158 lPrTrop=NF90_INQ_VARID(fID,"tropopause_air_pressure",vID)==NF90_NOERR 156 159 lO3Trop=NF90_INQ_VARID(fID,"tro3_at_tropopause" ,vID)==NF90_NOERR 157 linterp=PRESENT(time_in) 158 IF(linterp) linterp=SIZE(time_in,1)==14 160 linterp=PRESENT(time_in); IF(linterp) linterp=ntim_in==14 159 161 IF(linterp) THEN 160 162 ALLOCATE(v1m(nbp_lon,nbp_lat,nlev_in,n_var)) … … 165 167 END IF 166 168 !--- 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 172 IF(lPrSurf) WRITE(*,*)' >> Using GROUND PRESSURE from input O3 forcing file.' 173 IF(linterp) WRITE(*,*)' >> Monthly O3 files => ONLINE TIME INTERPOLATION.' 174 WRITE(*,*)' >> o3 forcing file tropopause location uses:' 175 IF(lPrTrop) THEN; WRITE(*,*)' PRESSURE AT TROPOPAUSE from file.' 176 ELSE IF(lO3Trop) THEN; WRITE(*,*)' O3 CONCENTRATION AT TROPOPAUSE from file.' 177 ELSE; WRITE(*,*)' PARAMETRIZATION of O3 concentration at tropopause.' 169 IF(lAdjTro) itrp0=locate(pcen_in,prtrop) 170 IF(lPrSurf) WRITE(lunout,*)TRIM(sub)//': Using GROUND PRESSURE from input O3 forcing file.' 171 IF(linterp) WRITE(lunout,*)TRIM(sub)//': Monthly O3 files => ONLINE TIME INTERPOLATION.' 172 IF(lAdjTro) THEN 173 WRITE(lunout,*)TRIM(sub)//': o3 forcing file tropopause location uses:' 174 IF(lPrTrop) THEN 175 WRITE(lunout,*)' PRESSURE AT TROPOPAUSE from file.' 176 ELSE IF(lO3Trop) THEN 177 WRITE(lunout,*)' O3 CONCENTRATION AT TROPOPAUSE from file.' 178 ELSE 179 WRITE(lunout,*)' PARAMETRIZED O3 concentration at tropopause.' 180 END IF 178 181 END IF 179 182 END IF 180 183 181 184 !=== UPDATE (ALWAYS FOR DAILY FILES, EACH MONTH FOR MONTHLY FILES) 182 IF(.NOT.linterp.OR.(linterp.AND.(lfirst.OR.julien>=time_in(irec+1)))) &183 CALL update_fields() 185 CALL update_fields() 186 184 187 185 188 !=== TIME INTERPOLATION FOR MONTHLY INPUT FILES 186 189 IF(linterp) THEN 187 WRITE( *,'(3(a,f7.3))')' >> Interpolating O3 at julian day ',julien,&188 & ' from forcingfields at times ',time_in(irec),' and ', time_in(irec+1)190 WRITE(lunout,'(3(a,f7.3))')TRIM(sub)//': Interpolating O3 at julian day '& 191 &,julien,' from fields at times ',time_in(irec),' and ', time_in(irec+1) 189 192 al=(time_in(irec+1)-julien)/(time_in(irec+1)-time_in(irec)) 190 193 v1=al*v1m+(1.-al)*v1p … … 195 198 END IF 196 199 !$OMP END MASTER 200 IF(lfirst) THEN 201 lfirst=.FALSE. ; CALL bcast(lfirst) ; CALL bcast(lPrSurf) 202 CALL bcast(lPrTrop); CALL bcast(lO3Trop); CALL bcast(linterp) 203 IF(lAdjTro) CALL bcast(itrp0) 204 END IF 197 205 CALL scatter2d(v1,v2) 198 CALL bcast(itrp0)199 206 !--- No "ps" in input file => assumed to be equal to current LMDZ ground press 200 207 IF(lPrSurf) THEN; CALL scatter2d(ps1,ps2); ELSE; ps2=Pint_ou(:,1); END IF … … 203 210 204 211 !--- REGRID IN PRESSURE ; 3rd index inverted because "paprs" is decreasing 205 IF(.NOT.l trop) THEN212 IF(.NOT.lAdjTro) THEN 206 213 DO i=1,klon 207 214 CALL regr_conserv(1,v2(i,:,:) , Pint_in , Pint_ou(i,nbp_lev+1:1:-1), & … … 245 252 !------------------------------------------------------------------------------- 246 253 IF(.NOT.linterp) THEN !=== DAILY FILES: NO TIME INTERPOLATION 247 WRITE(*,*)' >> Updating Ozone forcing field: read from file.' 248 irec=INT(julien)+1 !--- irec is just the julian day number 254 WRITE(lunout,*)TRIM(sub)//': Updating Ozone forcing field: read from file.' 255 irec=MIN(INT(julien)+1,ntim_in) !--- irec is just the julian day number 256 !--- MIN -> Security in the unlikely case of roundup errors. 249 257 CALL get_3Dfields(v1) !--- Read ozone field(s) 250 IF(l trop) THEN!--- Additional files for fields strain258 IF(lAdjTro) THEN !--- Additional files for fields strain 251 259 IF(lPrSurf) CALL get_2Dfield(ps1,"ps") 252 260 IF(lPrTrop) CALL get_2Dfield(pt1,"tropopause_air_pressure") … … 254 262 END IF 255 263 ELSE !=== MONTHLY FILES: GET 2 NEAREST RECS 256 WRITE(*,*)' >> Refreshing adjacent Ozone forcing fields.' 264 IF(.NOT.lfirst.AND.julien<time_in(irec+1)) RETURN 265 WRITE(lunout,*)TRIM(sub)//': Refreshing adjacent Ozone forcing fields.' 257 266 IF(lfirst) THEN !=== READ EARLIEST TIME FIELDS 258 267 irec=locate(time_in,julien) !--- Need to locate surrounding times 259 268 CALL get_3Dfields(v1m) !--- Read ozone field(s) 260 IF(l trop) THEN!--- Additional files for fields strain269 IF(lAdjTro) THEN !--- Additional files for fields strain 261 270 IF(lPrSurf) CALL get_2Dfield(psm,"ps") 262 271 IF(lPrTrop) CALL get_2Dfield(ptm,"tropopause_air_pressure") … … 265 274 ELSE !=== SHIFT FIELDS 266 275 v1m=v1p !--- Ozone fields 267 IF(l trop) THEN!--- Additional files for fields strain276 IF(lAdjTro) THEN !--- Additional files for fields strain 268 277 IF(lPrSurf) psm=psp !--- Surface pressure 269 278 IF(lPrTrop) ptm=ptp !--- Tropopause pressure … … 273 282 irec=irec+1 274 283 CALL get_3Dfields(v1p) !--- Read ozone field(s) 275 IF(l trop) THEN!--- Additional files for fields strain284 IF(lAdjTro) THEN !--- Additional files for fields strain 276 285 IF(lPrSurf) CALL get_2Dfield(psp,"ps") 277 286 IF(lPrTrop) CALL get_2Dfield(ptp,"tropopause_air_pressure") … … 280 289 IF(lfirst) irec=irec-1 281 290 END IF 282 lfirst=.FALSE.283 CALL bcast(lfirst)284 291 285 292 END SUBROUTINE update_fields
Note: See TracChangeset
for help on using the changeset viewer.