Changeset 481
- Timestamp:
- 09/16/16 15:39:08 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/physics.f90
r472 r481 9 9 10 10 INTEGER :: phys_type 11 TYPE(t_field),POINTER :: f_extra_physics_2D(:), f_extra_physics_3D(:) 12 TYPE(t_field),POINTER :: f_dulon(:), f_dulat(:) 13 TYPE(t_field),POINTER :: f_temp(:) 14 15 CHARACTER(LEN=255) :: physics_type 11 TYPE(t_field),POINTER,SAVE :: f_extra_physics_2D(:), f_extra_physics_3D(:) 12 TYPE(t_field),POINTER,SAVE :: f_dulon(:), f_dulat(:) 13 TYPE(t_field),POINTER,SAVE :: f_ulon(:), f_ulat(:) 14 TYPE(t_field),POINTER,SAVE :: f_p(:), f_pk(:) 15 TYPE(t_field),POINTER,SAVE :: f_temp(:) 16 17 CHARACTER(LEN=255),SAVE :: physics_type 16 18 !$OMP THREADPRIVATE(physics_type) 17 19 … … 55 57 CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat') 56 58 CALL allocate_field(f_temp,field_t,type_real,llm, name='temp') 59 CALL allocate_field(f_ulon,field_t,type_real,llm, name='ulon') 60 CALL allocate_field(f_ulat,field_t,type_real,llm, name='ulat') 61 CALL allocate_field(f_p,field_t,type_real,llm+1, name='p') 62 CALL allocate_field(f_pk,field_t,type_real,llm, name='pk') 57 63 CALL init_pack_before ! Compute physics_inout%ngrid and offsets used by pack/unpack 58 64 CALL init_physics_dcmip … … 63 69 CALL allocate_field(f_dulat,field_t,type_real,llm, name='dulat') 64 70 CALL allocate_field(f_temp,field_t,type_real,llm, name='temp') 71 CALL allocate_field(f_ulon,field_t,type_real,llm, name='ulon') 72 CALL allocate_field(f_ulat,field_t,type_real,llm, name='ulat') 73 CALL allocate_field(f_p,field_t,type_real,llm+1, name='p') 74 CALL allocate_field(f_pk,field_t,type_real,llm, name='pk') 65 75 CALL init_pack_before ! Compute physics_inout%ngrid and offsets used by pack/unpack 66 76 CALL init_physics_dcmip2016 … … 139 149 USE theta2theta_rhodz_mod 140 150 USE mpipara 151 USE omp_para 152 USE checksum_mod 141 153 IMPLICIT NONE 142 154 TYPE(t_field),POINTER :: f_phis(:) … … 152 164 REAL(rstd),POINTER :: dulat(:,:) 153 165 REAL(rstd),POINTER :: q(:,:,:) 166 REAL(rstd),POINTER :: p(:,:) 167 REAL(rstd),POINTER :: pk(:,:) 168 REAL(rstd),POINTER :: ulon(:,:) 169 REAL(rstd),POINTER :: ulat(:,:) 154 170 INTEGER :: it, ind 155 171 … … 165 181 ue=f_ue(ind) 166 182 q=f_q(ind) 167 CALL pack_physics(pack_info(ind), phis, ps, temp, ue, q) 183 p=f_p(ind) 184 pk=f_pk(ind) 185 ulon=f_ulon(ind) 186 ulat=f_ulat(ind) 187 CALL pack_physics(pack_info(ind), phis, ps, temp, ue, q, p, pk, ulon, ulat) 168 188 END DO 169 189 170 190 SELECT CASE(phys_type) 171 191 CASE (phys_DCMIP) 172 CALL full_physics_dcmip192 IF (is_omp_level_master) CALL full_physics_dcmip 173 193 CASE (phys_DCMIP2016) 174 CALL full_physics_dcmip2016194 IF (is_omp_level_master) CALL full_physics_dcmip2016 175 195 CASE DEFAULT 176 IF(is_m pi_master) PRINT *,'Internal error : illegal value of phys_type', phys_type196 IF(is_master) PRINT *,'Internal error : illegal value of phys_type', phys_type 177 197 STOP 178 198 END SELECT … … 189 209 CALL unpack_physics(pack_info(ind), ps, temp, q, dulon, dulat) 190 210 END DO 211 191 212 CALL temperature2theta_rhodz(f_ps,f_temp,f_theta_rhodz) 192 213 … … 207 228 END SUBROUTINE physics_column 208 229 209 SUBROUTINE pack_physics(info, phis, ps, temp, ue, q )230 SUBROUTINE pack_physics(info, phis, ps, temp, ue, q, p, pk, ulon, ulat ) 210 231 USE icosa 211 232 USE wind_mod … … 214 235 USE physics_interface_mod 215 236 USE exner_mod 237 USE omp_para 216 238 IMPLICIT NONE 217 239 TYPE(t_pack_info) :: info … … 236 258 CALL compute_wind_centered(ue,uc) 237 259 CALL compute_wind_centered_lonlat_compound(uc, ulon, ulat) 238 239 CALL pack_domain(info, phis, physics_inout%phis) 240 CALL pack_domain(info, p, physics_inout%p) 241 CALL pack_domain(info, pk, physics_inout%pk) 242 CALL pack_domain(info, Temp, physics_inout%Temp) 243 CALL pack_domain(info, ulon, physics_inout%ulon) 244 CALL pack_domain(info, ulat, physics_inout%ulat) 245 CALL pack_domain(info, q, physics_inout%q) 260 !$OMP BARRIER 261 IF (is_omp_level_master) THEN 262 CALL pack_domain(info, phis, physics_inout%phis) 263 CALL pack_domain(info, p, physics_inout%p) 264 CALL pack_domain(info, pk, physics_inout%pk) 265 CALL pack_domain(info, Temp, physics_inout%Temp) 266 CALL pack_domain(info, ulon, physics_inout%ulon) 267 CALL pack_domain(info, ulat, physics_inout%ulat) 268 CALL pack_domain(info, q, physics_inout%q) 269 ENDIF 270 !$OMP BARRIER 246 271 END SUBROUTINE pack_physics 247 272 … … 250 275 USE physics_interface_mod 251 276 USE theta2theta_rhodz_mod 277 USE omp_para 252 278 IMPLICIT NONE 253 279 TYPE(t_pack_info) :: info … … 260 286 REAL(rstd) :: dq(iim*jjm,llm,nqtot) 261 287 REAL(rstd) :: dTemp(iim*jjm,llm) 262 CALL unpack_domain(info, dulon, physics_inout%dulon) 263 CALL unpack_domain(info, dulat, physics_inout%dulat) 264 CALL unpack_domain(info, dq, physics_inout%dq) 265 CALL unpack_domain(info, Temp, physics_inout%Temp) 266 CALL unpack_domain(info, dTemp, physics_inout%dTemp) 267 q = q + physics_inout%dt_phys * dq 268 Temp = Temp + physics_inout%dt_phys * dTemp 288 289 !$OMP BARRIER 290 IF (is_omp_level_master) THEN 291 CALL unpack_domain(info, dulon, physics_inout%dulon) 292 CALL unpack_domain(info, dulat, physics_inout%dulat) 293 CALL unpack_domain(info, dq, physics_inout%dq) 294 CALL unpack_domain(info, Temp, physics_inout%Temp) 295 CALL unpack_domain(info, dTemp, physics_inout%dTemp) 296 q = q + physics_inout%dt_phys * dq 297 Temp = Temp + physics_inout%dt_phys * dTemp 298 ENDIF 299 !$OMP BARRIER 300 269 301 ! CALL compute_temperature2theta_rhodz(ps,Temp,theta_rhodz,0) 270 302 END SUBROUTINE unpack_physics … … 274 306 USE physics_interface_mod 275 307 USE wind_mod 308 USE omp_para 276 309 IMPLICIT NONE 277 310 REAL(rstd) :: dulon(iim*jjm,llm) … … 284 317 CALL compute_wind_centered_from_lonlat_compound(dulon,dulat,duc) 285 318 dt2=.5*physics_inout%dt_phys 286 DO l= 1,llm319 DO l=ll_begin,ll_end 287 320 DO j=jj_begin,jj_end 288 321 DO i=ii_begin,ii_end
Note: See TracChangeset
for help on using the changeset viewer.