Changeset 603 for codes/icosagcm/devel
- Timestamp:
- 10/24/17 01:22:08 (7 years ago)
- Location:
- codes/icosagcm/devel/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/diagnostics/diagflux.F90
r601 r603 54 54 CALL swap_dimensions(ind) 55 55 ZERO2(f_masst) 56 ZERO2(f_ulont) 57 ZERO2(f_thetat) 56 58 ZERO2(f_epot) 57 59 ZERO2(f_ekin) … … 59 61 ZERO3(f_qmasst) 60 62 ZERO2(f_massfluxt) 63 ZERO2(f_ulonfluxt) 64 ZERO2(f_thetafluxt) 61 65 ZERO2(f_epotfluxt) 62 66 ZERO2(f_ekinfluxt) … … 165 169 ! even if loops are of the _ext variant, we still need halo exchanges before reconstructing fluxes at cell centers 166 170 ! => loop over interior region 167 CALL distrib_level(ij_end-ij_begin+1,ij_omp_begin_ext,ij_omp_end_ext) 168 ij_omp_begin_ext = ij_omp_begin_ext+ij_begin-1 169 ij_omp_end_ext = ij_omp_end_ext+ij_begin-1 171 CALL distrib_level(ij_begin_ext, ij_end_ext, ij_omp_begin_ext,ij_omp_end_ext) 170 172 #include "../kernels/energy_fluxes.k90" 171 173 END SUBROUTINE compute_diagflux_energy -
codes/icosagcm/devel/src/diagnostics/observable.f90
r600 r603 1 1 MODULE observable_mod 2 2 USE icosa 3 USE diagflux_mod 4 USE output_field_mod 3 5 IMPLICIT NONE 4 6 PRIVATE … … 35 37 USE disvert_mod 36 38 USE wind_mod 37 USE output_field_mod38 39 USE omp_para 39 40 USE time_mod … … 44 45 USE theta2theta_rhodz_mod 45 46 USE omega_mod 46 USE diagflux_mod47 47 LOGICAL, INTENT(IN) :: init 48 48 INTEGER :: l … … 163 163 CALL output_field("massflux_lat",f_buf_ulat) 164 164 165 CALL transfert_request(f_epotfluxt,req_e1_vect) 166 CALL flux_centered_lonlat(1./(itau_out*dt) , f_epotfluxt, f_buf_ulon, f_buf_ulat) 167 CALL output_field("epot_t", f_epot) 168 CALL output_field("epotflux_lon",f_buf_ulon) 169 CALL output_field("epotflux_lat",f_buf_ulat) 170 171 CALL transfert_request(f_ekinfluxt,req_e1_vect) 172 CALL flux_centered_lonlat(1./(itau_out*dt) , f_ekinfluxt, f_buf_ulon, f_buf_ulat) 173 CALL output_field("ekin_t", f_ekin) 174 CALL output_field("ekinflux_lon",f_buf_ulon) 175 CALL output_field("ekinflux_lat",f_buf_ulat) 176 177 CALL transfert_request(f_enthalpyfluxt,req_e1_vect) 178 CALL flux_centered_lonlat(1./(itau_out*dt) , f_enthalpyfluxt, f_buf_ulon, f_buf_ulat) 179 CALL output_field("enthalpy_t", f_enthalpy) 180 CALL output_field("enthalpyflux_lon",f_buf_ulon) 181 CALL output_field("enthalpyflux_lat",f_buf_ulat) 165 CALL output_energyflux(f_ulont, f_ulonfluxt, "ulon_t", "ulonflux_lon", "ulonflux_lat") 166 CALL output_energyflux(f_thetat, f_thetafluxt, "theta_t", "thetaflux_lon", "thetaflux_lat") 167 CALL output_energyflux(f_epot, f_epotfluxt, "epot_t", "epotflux_lon", "epotflux_lat") 168 CALL output_energyflux(f_ekin, f_ekinfluxt, "ekin_t", "ekinflux_lon", "ekinflux_lat") 169 CALL output_energyflux(f_enthalpy, f_enthalpyfluxt, "enthalpy_t", "enthalpyflux_lon", "enthalpyflux_lat") 182 170 183 171 CALL qflux_centered_lonlat(1./(itau_out*dt) , f_qfluxt, f_qfluxt_lon, f_qfluxt_lat) … … 189 177 END IF 190 178 END SUBROUTINE write_output_fields_basic 179 180 SUBROUTINE output_energyflux(f_energy, f_flux, name_energy, name_fluxlon, name_fluxlat) 181 TYPE(t_field), POINTER :: f_energy(:), f_flux(:) 182 CHARACTER(*), INTENT(IN) :: name_energy, name_fluxlon, name_fluxlat 183 CALL transfert_request(f_flux,req_e1_vect) 184 CALL flux_centered_lonlat(1./(itau_out*dt) , f_flux, f_buf_ulon, f_buf_ulat) 185 CALL output_field(name_energy, f_energy) 186 CALL output_field(name_fluxlon, f_buf_ulon) 187 CALL output_field(name_fluxlat, f_buf_ulat) 188 END SUBROUTINE output_energyflux 191 189 192 190 !------------------- Conversion from prognostic to observable variables ------------------ -
codes/icosagcm/devel/src/dynamics/caldyn_kernels_base.F90
r573 r603 43 43 !$OMP BARRIER 44 44 45 CALL distrib_level(ij_end_ext-ij_begin_ext+1,ij_omp_begin_ext,ij_omp_end_ext) 46 ij_omp_begin_ext=ij_omp_begin_ext+ij_begin_ext-1 47 ij_omp_end_ext=ij_omp_end_ext+ij_begin_ext-1 45 CALL distrib_level(ij_begin_ext,ij_end_ext, ij_omp_begin_ext,ij_omp_end_ext) 48 46 49 47 Rd = kappa*cpp … … 190 188 CALL trace_start("compute_caldyn_vert") 191 189 192 CALL distrib_level(ij_end-ij_begin+1,ij_omp_begin,ij_omp_end) 193 ij_omp_begin=ij_omp_begin+ij_begin-1 194 ij_omp_end=ij_omp_end+ij_begin-1 190 CALL distrib_level(ij_begin,ij_end, ij_omp_begin,ij_omp_end) 195 191 196 192 ! REAL(rstd) :: wwuu(iim*3*jjm,llm+1) ! tmp var, don't know why but gain 30% on the whole code in opemp -
codes/icosagcm/devel/src/dynamics/caldyn_kernels_hevi.F90
r573 r603 122 122 INTEGER :: iter, ij, l, ij_omp_begin_ext, ij_omp_end_ext 123 123 124 CALL distrib_level(ij_end_ext-ij_begin_ext+1,ij_omp_begin_ext,ij_omp_end_ext) 125 ij_omp_begin_ext=ij_omp_begin_ext+ij_begin_ext-1 126 ij_omp_end_ext=ij_omp_end_ext+ij_begin_ext-1 124 CALL distrib_level(ij_begin_ext,ij_end_ext, ij_omp_begin_ext,ij_omp_end_ext) 127 125 128 126 IF(dysl) THEN -
codes/icosagcm/devel/src/parallel/omp_para.F90
r533 r603 204 204 END SUBROUTINE init_omp_para 205 205 206 SUBROUTINE distrib_level( size,lbegin,lend)207 IMPLICIT NONE 208 INTEGER,INTENT(IN) :: size206 SUBROUTINE distrib_level(ibegin,iend, lbegin,lend) 207 IMPLICIT NONE 208 INTEGER,INTENT(IN) :: ibegin,iend 209 209 INTEGER,INTENT(OUT) :: lbegin 210 210 INTEGER,INTENT(OUT) :: lend 211 INTEGER :: div,rest212 211 INTEGER :: size,div,rest 212 size=iend-ibegin+1 213 213 div=size/omp_level_size 214 214 rest=MOD(size,omp_level_size) 215 215 IF (omp_level_rank<rest) THEN 216 lbegin=(div+1)*omp_level_rank +1216 lbegin=(div+1)*omp_level_rank + ibegin 217 217 lend=lbegin+div 218 218 ELSE 219 lbegin=(div+1)*rest + (omp_level_rank-rest)*div +1219 lbegin=(div+1)*rest + (omp_level_rank-rest)*div + ibegin 220 220 lend=lbegin+div-1 221 221 ENDIF -
codes/icosagcm/devel/src/parallel/transfert_mpi.f90
r533 r603 1237 1237 1238 1238 dim3=size(field(ind)%rval3d,2) 1239 CALL distrib_level( dim3,lbegin,lend)1239 CALL distrib_level(1,dim3, lbegin,lend) 1240 1240 1241 1241 rval3d=>field(ind)%rval3d … … 1295 1295 IF (.NOT. assigned_domain(ind) ) CYCLE 1296 1296 dim3=size(field(ind)%rval3d,2) 1297 CALL distrib_level( dim3,lbegin,lend)1297 CALL distrib_level(1,dim3, lbegin,lend) 1298 1298 rval3d=>field(ind)%rval3d 1299 1299 req=>message%request(ind) … … 1349 1349 1350 1350 dim3=size(field(ind)%rval4d,2) 1351 CALL distrib_level( dim3,lbegin,lend)1351 CALL distrib_level(1,dim3, lbegin,lend) 1352 1352 dim4=size(field(ind)%rval4d,3) 1353 1353 rval4d=>field(ind)%rval4d … … 1411 1411 1412 1412 dim3=size(field(ind)%rval4d,2) 1413 CALL distrib_level( dim3,lbegin,lend)1413 CALL distrib_level(1,dim3, lbegin,lend) 1414 1414 dim4=size(field(ind)%rval4d,3) 1415 1415 rval4d=>field(ind)%rval4d … … 1589 1589 dim3=size(rval3d,2) 1590 1590 1591 CALL distrib_level( dim3,lbegin,lend)1591 CALL distrib_level(1,dim3, lbegin,lend) 1592 1592 offset=recv%offset*dim3 + (lbegin-1)*recv%size 1593 1593 CALL trace_start("copy_from_buffer") … … 1637 1637 1638 1638 dim3=size(rval4d,2) 1639 CALL distrib_level( dim3,lbegin,lend)1639 CALL distrib_level(1,dim3, lbegin,lend) 1640 1640 dim4=size(rval4d,3) 1641 1641 CALL trace_start("copy_from_buffer")
Note: See TracChangeset
for help on using the changeset viewer.