- Timestamp:
- Oct 19, 2023, 4:02:57 PM (11 months ago)
- Location:
- LMDZ6/branches/LMDZ_ECRad
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/LMDZ_ECRad
- Property svn:mergeinfo changed
-
LMDZ6/branches/LMDZ_ECRad/libf/phylmd/StratAer/interp_sulf_input.F90
r3677 r4727 12 12 USE mod_phys_lmdz_omp_data, ONLY : is_omp_root 13 13 USE phys_local_var_mod, ONLY : budg_3D_backgr_ocs, budg_3D_backgr_so2 14 USE phys_local_var_mod, ONLY : OCS_lifetime, SO2_lifetime 14 USE phys_local_var_mod, ONLY : OCS_lifetime, SO2_lifetime, H2SO4_lifetime, O3_clim 15 15 USE mod_phys_lmdz_para 16 16 USE dimphy … … 19 19 USE aerophys 20 20 USE YOMCST 21 USE strataer_local_var_mod, ONLY : flag_newclim_file,flag_verbose_strataer 21 22 22 23 IMPLICIT NONE … … 42 43 REAL paprs_glo(klon_glo,klev+1) 43 44 44 REAL, POINTER:: latitude(:)45 REAL, ALLOCATABLE :: latitude(:) 45 46 ! (of input data sorted in strictly ascending order) 46 47 47 REAL, POINTER:: longitude(:)48 REAL, ALLOCATABLE :: longitude(:) 48 49 ! (of input data sorted in strictly ascending order) 49 50 50 REAL, POINTER:: time(:)51 REAL, ALLOCATABLE :: time(:) 51 52 ! (of input data sorted in strictly ascending order) 52 53 53 REAL, POINTER:: lev(:)54 REAL, ALLOCATABLE :: lev(:) 54 55 ! levels of input data 55 56 … … 62 63 REAL OCS_clim_glo(klon_glo,klev) 63 64 REAL SO2_clim_glo(klon_glo,klev) 65 66 REAL, ALLOCATABLE :: O3_clim_in(:, :, :, :) 67 REAL, ALLOCATABLE :: O3_clim_mth(:, :, :) 68 REAL, ALLOCATABLE :: O3_clim_tmp(:, :) 69 REAL O3_clim_glo(klon_glo,klev) 70 71 ! fixed climatos 64 72 REAL, ALLOCATABLE :: OCS_lifetime_in(:, :, :, :) 65 73 REAL, ALLOCATABLE :: SO2_lifetime_in(:, :, :, :) … … 70 78 REAL OCS_lifetime_glo(klon_glo,klev) 71 79 REAL SO2_lifetime_glo(klon_glo,klev) 80 81 REAL, ALLOCATABLE :: H2SO4_lifetime_in(:, :, :, :) 82 REAL, ALLOCATABLE :: H2SO4_lifetime_mth(:, :, :) 83 REAL, ALLOCATABLE :: H2SO4_lifetime_tmp(:, :) 84 85 REAL H2SO4_lifetime_glo(klon_glo,klev) 72 86 ! 73 87 REAL, ALLOCATABLE, SAVE :: OCS_clim(:,:) … … 79 93 80 94 ! For NetCDF: 81 INTEGER ncid_in ! IDs for input files 82 INTEGER varid, ncerr 95 INTEGER :: ncid_in ! IDs for input files 96 INTEGER :: varid, ncerr 97 CHARACTER (LEN=3) :: nc_lat, nc_lon 98 CHARACTER (LEN=256) :: nc_fname 83 99 84 100 INTEGER, PARAMETER :: lev_input=17 … … 103 119 IF (is_mpi_root.AND.is_omp_root) THEN 104 120 105 !--reading emission files 106 CALL nf95_open("ocs_so2_annual_lmdz.nc", nf90_nowrite, ncid_in) 107 121 !--init ncdf variables 122 IF(flag_newclim_file) THEN 123 nc_fname = "ocs_so2_h2so4_annual_lmdz.nc" 124 nc_lat = "LAT" 125 nc_lon = "LON" 126 ELSE 127 ! old file for retro compatibility 128 nc_fname = "ocs_so2_annual_lmdz.nc" 129 nc_lat = "lat" 130 nc_lon = "lon" 131 ENDIF 132 133 !--reading emission files 134 CALL nf95_open(nc_fname, nf90_nowrite, ncid_in) 135 IF(flag_verbose_strataer) print *, "Open file ", nc_fname 136 108 137 CALL nf95_inq_varid(ncid_in, "LEV", varid) 109 138 CALL nf95_gw_var(ncid_in, varid, lev) 110 139 n_lev = size(lev) 111 112 CALL nf95_inq_varid(ncid_in, "lat", varid)140 141 CALL nf95_inq_varid(ncid_in, nc_lat, varid) 113 142 CALL nf95_gw_var(ncid_in, varid, latitude) 114 143 n_lat = size(latitude) 115 116 CALL nf95_inq_varid(ncid_in, "lon", varid)144 145 CALL nf95_inq_varid(ncid_in, nc_lon, varid) 117 146 CALL nf95_gw_var(ncid_in, varid, longitude) 118 147 n_lon = size(longitude) 119 148 120 149 CALL nf95_inq_varid(ncid_in, "TIME", varid) 121 150 CALL nf95_gw_var(ncid_in, varid, time) 122 151 n_mth = size(time) 123 152 124 153 IF (.NOT.ALLOCATED(OCS_clim_in)) ALLOCATE(OCS_clim_in(n_lon, n_lat, n_lev, n_mth)) 125 154 IF (.NOT.ALLOCATED(SO2_clim_in)) ALLOCATE(SO2_clim_in(n_lon, n_lat, n_lev, n_mth)) 155 IF (.NOT.ALLOCATED(O3_clim_in)) ALLOCATE(O3_clim_in(n_lon, n_lat, n_lev, n_mth)) 156 126 157 IF (.NOT.ALLOCATED(OCS_lifetime_in)) ALLOCATE(OCS_lifetime_in(n_lon, n_lat, n_lev, n_mth)) 127 158 IF (.NOT.ALLOCATED(SO2_lifetime_in)) ALLOCATE(SO2_lifetime_in(n_lon, n_lat, n_lev, n_mth)) 128 159 IF (.NOT.ALLOCATED(H2SO4_lifetime_in)) ALLOCATE(H2SO4_lifetime_in(n_lon, n_lat, n_lev, n_mth)) 160 129 161 CALL nf95_inq_varid(ncid_in, "OCS", varid) 130 162 ncerr = nf90_get_var(ncid_in, varid, OCS_clim_in) 131 print *,'code erreur OCS=', ncerr, varid163 IF(flag_verbose_strataer) print *,'code erreur OCS=', ncerr, varid 132 164 133 165 CALL nf95_inq_varid(ncid_in, "SO2", varid) 134 166 ncerr = nf90_get_var(ncid_in, varid, SO2_clim_in) 135 print *,'code erreur SO2=', ncerr, varid167 IF(flag_verbose_strataer) print *,'code erreur SO2=', ncerr, varid 136 168 137 169 CALL nf95_inq_varid(ncid_in, "OCS_LIFET", varid) 138 170 ncerr = nf90_get_var(ncid_in, varid, OCS_lifetime_in) 139 print *,'code erreur OCS_lifetime_in=', ncerr, varid171 IF(flag_verbose_strataer) print *,'code erreur OCS_lifetime_in=', ncerr, varid 140 172 141 173 CALL nf95_inq_varid(ncid_in, "SO2_LIFET", varid) 142 174 ncerr = nf90_get_var(ncid_in, varid, SO2_lifetime_in) 143 print *,'code erreur SO2_lifetime_in=', ncerr, varid 144 175 IF(flag_verbose_strataer) print *,'code erreur SO2_lifetime_in=', ncerr, varid 176 177 IF(flag_newclim_file) THEN 178 CALL nf95_inq_varid(ncid_in, "O3", varid) 179 ncerr = nf90_get_var(ncid_in, varid, O3_clim_in) 180 IF(flag_verbose_strataer) print *,'code erreur O3=', ncerr, varid 181 182 CALL nf95_inq_varid(ncid_in, "H2SO4_LIFET", varid) 183 ncerr = nf90_get_var(ncid_in, varid, H2SO4_lifetime_in) 184 IF(flag_verbose_strataer) print *,'code erreur H2SO4_lifetime_in=', ncerr, varid 185 ENDIF 186 145 187 CALL nf95_close(ncid_in) 146 188 … … 149 191 IF (.NOT.ALLOCATED(OCS_clim_tmp)) ALLOCATE(OCS_clim_tmp(klon_glo, n_lev)) 150 192 IF (.NOT.ALLOCATED(SO2_clim_tmp)) ALLOCATE(SO2_clim_tmp(klon_glo, n_lev)) 193 IF (.NOT.ALLOCATED(O3_clim_mth)) ALLOCATE(O3_clim_mth(n_lon, n_lat, n_lev)) 194 IF (.NOT.ALLOCATED(O3_clim_tmp)) ALLOCATE(O3_clim_tmp(klon_glo, n_lev)) 195 151 196 IF (.NOT.ALLOCATED(OCS_lifetime_mth)) ALLOCATE(OCS_lifetime_mth(n_lon, n_lat, n_lev)) 152 197 IF (.NOT.ALLOCATED(SO2_lifetime_mth)) ALLOCATE(SO2_lifetime_mth(n_lon, n_lat, n_lev)) 153 198 IF (.NOT.ALLOCATED(OCS_lifetime_tmp)) ALLOCATE(OCS_lifetime_tmp(klon_glo, n_lev)) 154 199 IF (.NOT.ALLOCATED(SO2_lifetime_tmp)) ALLOCATE(SO2_lifetime_tmp(klon_glo, n_lev)) 155 200 IF (.NOT.ALLOCATED(H2SO4_lifetime_mth)) ALLOCATE(H2SO4_lifetime_mth(n_lon, n_lat, n_lev)) 201 IF (.NOT.ALLOCATED(H2SO4_lifetime_tmp)) ALLOCATE(H2SO4_lifetime_tmp(klon_glo, n_lev)) 202 156 203 !---select the correct month, undo multiplication with 1.e12 (precision reasons) 157 204 !---correct latitudinal order and convert input from volume mixing ratio to mass mixing ratio … … 161 208 SO2_lifetime_mth(:,j,:) = SO2_lifetime_in(:,n_lat+1-j,:,mth_cur) 162 209 OCS_lifetime_mth(:,j,:) = OCS_lifetime_in(:,n_lat+1-j,:,mth_cur) 210 211 ! O3 from 2d model is not tracer, in VMR 212 IF(flag_newclim_file) THEN 213 H2SO4_lifetime_mth(:,j,:) = H2SO4_lifetime_in(:,n_lat+1-j,:,mth_cur) 214 ! new input files 215 O3_clim_mth(:,j,:) = 1.e-6*O3_clim_in(:,n_lat+1-j,:,mth_cur) 216 ELSE 217 H2SO4_lifetime_mth(:,j,:) = 1.e-6 218 O3_clim_mth(:,j,:) = 1.e-6 219 ENDIF 163 220 ENDDO 164 221 … … 166 223 CALL grid2dTo1d_glo(OCS_clim_mth,OCS_clim_tmp) 167 224 CALL grid2dTo1d_glo(SO2_clim_mth,SO2_clim_tmp) 225 CALL grid2dTo1d_glo(O3_clim_mth,O3_clim_tmp) 226 168 227 CALL grid2dTo1d_glo(OCS_lifetime_mth,OCS_lifetime_tmp) 169 228 CALL grid2dTo1d_glo(SO2_lifetime_mth,SO2_lifetime_tmp) 229 CALL grid2dTo1d_glo(H2SO4_lifetime_mth,H2SO4_lifetime_tmp) 170 230 171 231 !--set lifetime to very high value in uninsolated areas 172 232 DO i=1, klon_glo 173 233 DO kk=1, n_lev 234 !--added tests on VMR of species for realism 235 IF (OCS_clim_tmp(i,kk).LT.1.e-20) THEN 236 OCS_clim_tmp(i,kk)=1.0e-20 237 ENDIF 238 IF (SO2_clim_tmp(i,kk).LT.1.e-20) THEN 239 SO2_clim_tmp(i,kk)=1.0e-20 240 ENDIF 241 ! 50 ppbv min for O3 242 IF (O3_clim_tmp(i,kk).LT.50.0e-9) THEN 243 O3_clim_tmp(i,kk)=50.0e-9 244 ENDIF 245 174 246 IF (OCS_lifetime_tmp(i,kk)==0.0) THEN 175 247 OCS_lifetime_tmp(i,kk)=1.0e12 … … 178 250 SO2_lifetime_tmp(i,kk)=1.0e12 179 251 ENDIF 252 IF (H2SO4_lifetime_tmp(i,kk)==0.0) THEN 253 H2SO4_lifetime_tmp(i,kk)=1.0e12 254 ENDIF 180 255 ENDDO 181 256 ENDDO … … 186 261 OCS_lifetime_glo(i,k)=0.0 187 262 SO2_lifetime_glo(i,k)=0.0 263 O3_clim_glo(i,k)=0.0 264 188 265 OCS_clim_glo(i,k)=0.0 189 266 SO2_clim_glo(i,k)=0.0 267 H2SO4_lifetime_glo(i,k)=0.0 268 190 269 DO kk=1, n_lev 191 270 OCS_lifetime_glo(i,k)=OCS_lifetime_glo(i,k)+ & … … 195 274 MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) & 196 275 *SO2_lifetime_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1)) 276 IF(flag_newclim_file) THEN 277 H2SO4_lifetime_glo(i,k)=H2SO4_lifetime_glo(i,k)+ & 278 MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk)) & 279 -MAX(paprs_glo(i,k+1),paprs_input(kk+1))) & 280 *H2SO4_lifetime_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1)) 281 ENDIF 282 197 283 OCS_clim_glo(i,k)=OCS_clim_glo(i,k)+ & 198 284 MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) & … … 201 287 MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) & 202 288 *SO2_clim_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1)) 289 IF(flag_newclim_file) THEN 290 O3_clim_glo(i,k)=O3_clim_glo(i,k)+ & 291 MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk)) & 292 -MAX(paprs_glo(i,k+1),paprs_input(kk+1))) & 293 *O3_clim_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1)) 294 ENDIF 203 295 ENDDO 204 296 ENDDO … … 213 305 CALL scatter(OCS_clim_glo, OCS_clim) 214 306 CALL scatter(SO2_clim_glo, SO2_clim) 307 CALL scatter(O3_clim_glo, O3_clim) 215 308 CALL scatter(OCS_lifetime_glo, OCS_lifetime) 216 309 CALL scatter(SO2_lifetime_glo, SO2_lifetime) 217 310 CALL scatter(H2SO4_lifetime_glo, H2SO4_lifetime) 311 218 312 IF (is_mpi_root.AND.is_omp_root) THEN 219 313 ! 220 DEALLOCATE(OCS_clim_in,SO2_clim_in )221 DEALLOCATE(OCS_clim_mth,SO2_clim_mth )222 DEALLOCATE(OCS_clim_tmp,SO2_clim_tmp )223 DEALLOCATE(OCS_lifetime_in, SO2_lifetime_in)224 DEALLOCATE(OCS_lifetime_mth, SO2_lifetime_mth)225 DEALLOCATE(OCS_lifetime_tmp, SO2_lifetime_tmp)314 DEALLOCATE(OCS_clim_in,SO2_clim_in,O3_clim_in) 315 DEALLOCATE(OCS_clim_mth,SO2_clim_mth,O3_clim_mth) 316 DEALLOCATE(OCS_clim_tmp,SO2_clim_tmp,O3_clim_tmp) 317 DEALLOCATE(OCS_lifetime_in, SO2_lifetime_in, H2SO4_lifetime_in) 318 DEALLOCATE(OCS_lifetime_mth, SO2_lifetime_mth, H2SO4_lifetime_mth) 319 DEALLOCATE(OCS_lifetime_tmp, SO2_lifetime_tmp, H2SO4_lifetime_tmp) 226 320 ! 227 321 ENDIF !--is_mpi_root and is_omp_root
Note: See TracChangeset
for help on using the changeset viewer.