Changeset 146
- Timestamp:
- 03/12/13 16:34:45 (11 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/advect_tracer.f90
r145 r146 40 40 USE mpipara 41 41 USE trace 42 USE write_field 42 43 IMPLICIT NONE 43 44 … … 55 56 CALL trace_start("advect_tracer") 56 57 57 CALL transfert_request(f_u,req_e1 )58 CALL transfert_request(f_u,req_e1_vect) 58 59 ! CALL transfert_request(f_hfluxt,req_e1) ! BUG : This (unnecessary) transfer makes the computation go wrong 59 60 CALL transfert_request(f_wfluxt,req_i1) … … 113 114 CALL transfert_request(f_q,req_i1) ! necessary ? 114 115 CALL transfert_request(f_rhodz,req_i1) ! necessary ? 115 116 CALL trace_end("advect_tracer")117 118 116 119 117 ! horizontal transport - split in two to place transfer of gradq3d … … 141 139 END DO 142 140 END DO 143 141 144 142 CALL transfert_request(f_q,req_i1) ! necessary ? 145 143 CALL transfert_request(f_rhodz,req_i1) ! necessary ? 146 144 147 145 ! 1/2 vertical transport 148 146 DO ind=1,ndomain … … 156 154 END DO 157 155 END DO 156 157 CALL trace_end("advect_tracer") 158 158 159 159 END SUBROUTINE advect_tracer -
codes/icosagcm/trunk/src/caldyn.f90
r139 r146 11 11 USE icosa 12 12 USE caldyn_gcm_mod, ONLY : init_caldyn_gcm=>init_caldyn 13 USE caldyn_gcm_opt_mod, ONLY : init_caldyn_gcm_opt=>init_caldyn 13 14 USE caldyn_adv_mod, ONLY : init_caldyn_adv=>init_caldyn 14 15 IMPLICIT NONE … … 20 21 CASE('gcm') 21 22 CALL init_caldyn_gcm 23 CASE('gcm_opt') 24 CALL init_caldyn_gcm_opt 22 25 CASE('adv') 23 26 CALL init_caldyn_adv … … 34 37 USE icosa 35 38 USE caldyn_gcm_mod, ONLY : caldyn_gcm=>caldyn 39 USE caldyn_gcm_opt_mod, ONLY : caldyn_gcm_opt=>caldyn 36 40 USE caldyn_adv_mod, ONLY : caldyn_adv=>caldyn 37 41 IMPLICIT NONE … … 52 56 CALL caldyn_gcm(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 53 57 f_hflux, f_wflux, f_dps, f_dtheta_rhodz, f_du) 58 CASE('gcm_opt') 59 CALL caldyn_gcm_opt(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 60 f_hflux, f_wflux, f_dps, f_dtheta_rhodz, f_du) 54 61 CASE('adv') 55 62 CALL caldyn_adv(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & -
codes/icosagcm/trunk/src/caldyn_adv.f90
r139 r146 75 75 76 76 CALL transfert_request(f_ps,req_i1) 77 CALL transfert_request(f_u,req_e1 )77 CALL transfert_request(f_u,req_e1_vect) 78 78 79 79 DO ind=1,ndomain -
codes/icosagcm/trunk/src/caldyn_gcm.f90
r145 r146 114 114 CALL transfert_request(f_ps,req_i1) 115 115 CALL transfert_request(f_theta_rhodz,req_i1) 116 CALL transfert_request(f_u,req_e1 )116 CALL transfert_request(f_u,req_e1_vect) 117 117 118 118 SELECT CASE(caldyn_conserv) … … 131 131 ENDDO 132 132 133 CALL transfert_request(f_qu,req_e1 )133 CALL transfert_request(f_qu,req_e1_scal) 134 134 135 135 DO ind=1,ndomain … … 419 419 ij=(j-1)*iim+i 420 420 wflux(ij,1) = 0. 421 wflux(ij,llm+1) = 0. 421 422 ! dps/dt = -int(div flux)dz 422 423 dps(ij)=-divm(ij,1) * g … … 475 476 ENDDO 476 477 ENDDO 477 478 478 479 CASE(enstrophy) ! enstrophy-conserving TRiSK 479 480 -
codes/icosagcm/trunk/src/caldyn_sw.f90
r44 r146 79 79 ENDDO 80 80 81 CALL create_request(field_u,req_u )81 CALL create_request(field_u,req_u,.TRUE.) 82 82 DO ind=1,ndomain 83 83 DO i=ii_begin,ii_end … … 138 138 139 139 CALL transfert_request(f_h,req_i1) 140 CALL transfert_request(f_u,req_e1 )141 CALL transfert_request(f_u,req_e1 )140 CALL transfert_request(f_u,req_e1_vect) 141 CALL transfert_request(f_u,req_e1_vect) 142 142 143 143 -
codes/icosagcm/trunk/src/caldyn_wave.f90
r19 r146 58 58 59 59 CALL transfert_request(f_h,req_i1) 60 CALL transfert_request(f_u,req_e1 )60 CALL transfert_request(f_u,req_e1_vect) 61 61 CALL transfert_request(f_u,req_e1) 62 62 -
codes/icosagcm/trunk/src/dissip_gcm.f90
r145 r146 205 205 dumax=0 206 206 DO iter=1,nitergdiv 207 CALL transfert_request(f_u,req_e1 )207 CALL transfert_request(f_u,req_e1_vect) 208 208 DO ind=1,ndomain 209 209 CALL swap_dimensions(ind) … … 216 216 ENDDO 217 217 218 CALL transfert_request(f_du,req_e1 )218 CALL transfert_request(f_du,req_e1_vect) 219 219 220 220 DO ind=1,ndomain … … 282 282 dumax=0 283 283 DO iter=1,nitergrot 284 CALL transfert_request(f_u,req_e1 )284 CALL transfert_request(f_u,req_e1_vect) 285 285 DO ind=1,ndomain 286 286 CALL swap_dimensions(ind) … … 293 293 ENDDO 294 294 295 CALL transfert_request(f_du,req_e1 )295 CALL transfert_request(f_du,req_e1_vect) 296 296 297 297 DO ind=1,ndomain … … 557 557 DO it=1,nitergdiv 558 558 559 CALL transfert_request(f_due,req_e1 )559 CALL transfert_request(f_due,req_e1_vect) 560 560 561 561 DO ind=1,ndomain … … 595 595 DO it=1,nitergrot 596 596 597 CALL transfert_request(f_due,req_e1 )597 CALL transfert_request(f_due,req_e1_vect) 598 598 599 599 DO ind=1,ndomain -
codes/icosagcm/trunk/src/dissip_sw.f90
r98 r146 48 48 CALL allocate_field(f_u,field_u,type_real) 49 49 CALL allocate_field(f_du,field_u,type_real) 50 CALL create_request(field_u,req_dissip )50 CALL create_request(field_u,req_dissip,.TRUE.) 51 51 52 52 DO ind=1,ndomain -
codes/icosagcm/trunk/src/domain.f90
r26 r146 23 23 INTEGER,POINTER :: edge_assign_j(:,:,:) 24 24 INTEGER,POINTER :: edge_assign_pos(:,:,:) 25 INTEGER,POINTER :: edge_assign_sign(:,:,:) 25 26 REAL,POINTER :: xyz(:,:,:) 26 27 REAL,POINTER :: neighbour(:,:,:,:) … … 134 135 ALLOCATE(d%edge_assign_j(0:5,d%iim,d%jjm)) 135 136 ALLOCATE(d%edge_assign_pos(0:5,d%iim,d%jjm)) 137 ALLOCATE(d%edge_assign_sign(0:5,d%iim,d%jjm)) 136 138 ALLOCATE(d%delta(d%iim,d%jjm)) 137 139 ALLOCATE(d%xyz(3,d%iim,d%jjm)) … … 171 173 d2%edge_assign_j => d1%edge_assign_j 172 174 d2%edge_assign_pos => d1%edge_assign_pos 175 d2%edge_assign_sign => d1%edge_assign_sign 173 176 d2%xyz => d1%xyz 174 177 d2%neighbour => d1%neighbour … … 210 213 IMPLICIT NONE 211 214 INTEGER :: ind_d,ind,ind2,e 212 INTEGER :: nf 215 INTEGER :: nf,nf2 213 216 INTEGER :: i,j,k,ii,jj 214 217 TYPE(t_domain),POINTER :: d … … 257 260 ind2=vertex_glo(ii,jj,nf)%neighbour(k) 258 261 d%neighbour(:,k,i,j)=cell_glo(ind2)%xyz(:) 259 d%ne(k,i,j)=vertex_glo(ii,jj,nf)%ne(k) 262 263 ! d%ne(k,i,j)=vertex_glo(ii,jj,nf)%ne(k) 264 d%ne(k,i,j)=1-2*MOD(k,2) 265 260 266 e=cell_glo(ind)%edge(MOD(k+delta+6,6)) 261 267 d%edge_assign_domain(k,i,j)=edge_glo(e)%assign_domain … … 263 269 d%edge_assign_j(k,i,j)=edge_glo(e)%assign_j 264 270 d%edge_assign_pos(k,i,j)=edge_glo(e)%assign_pos 271 nf2=domain_glo(edge_glo(e)%assign_domain)%face 272 d%edge_assign_sign(k,i,j)=1-2*MOD(12+tab_index(nf,nf2,0),2) 273 IF (MOD(6+k+tab_index(nf,nf2,0),6)/=edge_glo(e)%assign_pos .AND. MOD(6+k+tab_index(nf,nf2,0),6) /= MOD(edge_glo(e)%assign_pos+3,6)) THEN 274 d%edge_assign_sign(k,i,j)=-d%edge_assign_sign(k,i,j) 275 ENDIF 276 265 277 ENDDO 266 278 d%xyz(:,i,j)=cell_glo(ind)%xyz(:) … … 284 296 edge_glo(e)%assign_j=j 285 297 edge_glo(e)%assign_pos=k 298 edge_glo(e)%assign_delta=delta 286 299 ! PRINT*,"Assign_edge",ind_d,ind,i,j,k,e 287 300 END SUBROUTINE assign_edge -
codes/icosagcm/trunk/src/geometry.f90
r47 r146 49 49 50 50 51 51 INTEGER, PARAMETER :: ne_right=1 52 INTEGER, PARAMETER :: ne_rup=-1 53 INTEGER, PARAMETER :: ne_lup=1 54 INTEGER, PARAMETER :: ne_left=-1 55 INTEGER, PARAMETER :: ne_ldown=1 56 INTEGER, PARAMETER :: ne_rdown=-1 57 52 58 CONTAINS 53 59 -
codes/icosagcm/trunk/src/kinetic.f90
r19 r146 14 14 INTEGER :: ind 15 15 16 CALL transfert_request(f_ue,req_e1 )17 CALL transfert_request(f_ue,req_e1 )16 CALL transfert_request(f_ue,req_e1_vect) 17 CALL transfert_request(f_ue,req_e1_vect) 18 18 19 19 DO ind=1,ndomain -
codes/icosagcm/trunk/src/metric.f90
r131 r146 29 29 INTEGER :: assign_j 30 30 INTEGER :: assign_pos 31 INTEGER :: assign_delta 31 32 END TYPE t_edge_glo 32 33 -
codes/icosagcm/trunk/src/physics_dcmip.f90
r110 r146 40 40 INTEGER :: ind 41 41 42 CALL transfert_request(f_ue,req_e1 )42 CALL transfert_request(f_ue,req_e1_vect) 43 43 DO ind=1,ndomain 44 44 CALL swap_dimensions(ind) -
codes/icosagcm/trunk/src/timeloop_gcm.f90
r145 r146 408 408 LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check 409 409 REAL(rstd), INTENT(IN) :: ps(iim*jjm) 410 REAL(rstd), INTENT( OUT) :: rhodz(iim*jjm,llm)410 REAL(rstd), INTENT(INOUT) :: rhodz(iim*jjm,llm) 411 411 REAL(rstd) :: m, err 412 412 INTEGER :: l,i,j,ij,dd -
codes/icosagcm/trunk/src/transfert.F90
r31 r146 2 2 3 3 #ifdef CPP_USING_MPI 4 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_mpi, req_i1,req_e1 , &5 req uest_add_point, create_request, gather_field4 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_mpi, req_i1,req_e1_vect, & 5 req_e1_scal,request_add_point, create_request, gather_field 6 6 #else 7 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request, req_i1,req_e1 , &8 req uest_add_point, create_request, gather_field7 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request, req_i1,req_e1_vect, & 8 req_e1_scal,request_add_point, create_request, gather_field 9 9 #endif 10 10 -
codes/icosagcm/trunk/src/transfert_mpi.f90
r74 r146 4 4 TYPE array 5 5 INTEGER,POINTER :: value(:) 6 INTEGER,POINTER :: sign(:) 6 7 INTEGER :: domain 7 8 INTEGER :: rank … … 17 18 INTEGER :: max_size 18 19 INTEGER :: size 20 LOGICAL :: vector 19 21 INTEGER,POINTER :: src_domain(:) 20 22 INTEGER,POINTER :: src_i(:) … … 24 26 INTEGER,POINTER :: target_i(:) 25 27 INTEGER,POINTER :: target_j(:) 28 INTEGER,POINTER :: target_sign(:) 26 29 INTEGER :: nrecv 27 30 TYPE(ARRAY),POINTER :: recv(:) … … 31 34 32 35 TYPE(t_request),POINTER :: req_i1(:) 33 TYPE(t_request),POINTER :: req_e1(:) 36 TYPE(t_request),POINTER :: req_e1_scal(:) 37 TYPE(t_request),POINTER :: req_e1_vect(:) 34 38 35 39 … … 84 88 CALL finalize_request(req_i1) 85 89 86 CALL create_request(field_u,req_e1 )90 CALL create_request(field_u,req_e1_scal) 87 91 DO ind=1,ndomain 88 92 CALL swap_dimensions(ind) 89 93 DO i=ii_begin,ii_end 90 CALL request_add_point(ind,i,jj_begin-1,req_e1 ,rup)91 CALL request_add_point(ind,i+1,jj_begin-1,req_e1 ,lup)94 CALL request_add_point(ind,i,jj_begin-1,req_e1_scal,rup) 95 CALL request_add_point(ind,i+1,jj_begin-1,req_e1_scal,lup) 92 96 ENDDO 93 97 94 98 DO j=jj_begin,jj_end 95 CALL request_add_point(ind,ii_end+1,j,req_e1 ,left)96 CALL request_add_point(ind,ii_end+1,j-1,req_e1 ,lup)99 CALL request_add_point(ind,ii_end+1,j,req_e1_scal,left) 100 CALL request_add_point(ind,ii_end+1,j-1,req_e1_scal,lup) 97 101 ENDDO 98 102 99 103 DO i=ii_begin,ii_end 100 CALL request_add_point(ind,i,jj_end+1,req_e1 ,ldown)101 CALL request_add_point(ind,i-1,jj_end+1,req_e1 ,rdown)104 CALL request_add_point(ind,i,jj_end+1,req_e1_scal,ldown) 105 CALL request_add_point(ind,i-1,jj_end+1,req_e1_scal,rdown) 102 106 ENDDO 103 107 104 108 DO j=jj_begin,jj_end 105 CALL request_add_point(ind,ii_begin-1,j,req_e1 ,right)106 CALL request_add_point(ind,ii_begin-1,j+1,req_e1 ,rdown)109 CALL request_add_point(ind,ii_begin-1,j,req_e1_scal,right) 110 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_scal,rdown) 107 111 ENDDO 108 112 109 113 DO i=ii_begin+1,ii_end-1 110 CALL request_add_point(ind,i,jj_begin,req_e1 ,right)111 CALL request_add_point(ind,i,jj_end,req_e1 ,right)114 CALL request_add_point(ind,i,jj_begin,req_e1_scal,right) 115 CALL request_add_point(ind,i,jj_end,req_e1_scal,right) 112 116 ENDDO 113 117 114 118 DO j=jj_begin+1,jj_end-1 115 CALL request_add_point(ind,ii_begin,j,req_e1 ,rup)116 CALL request_add_point(ind,ii_end,j,req_e1 ,rup)119 CALL request_add_point(ind,ii_begin,j,req_e1_scal,rup) 120 CALL request_add_point(ind,ii_end,j,req_e1_scal,rup) 117 121 ENDDO 118 122 119 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1,left) 120 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1,ldown) 121 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1,left) 122 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1,ldown) 123 124 CALL finalize_request(req_e1) 125 126 ENDDO 127 123 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_scal,left) 124 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_scal,ldown) 125 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_scal,left) 126 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_scal,ldown) 127 128 ENDDO 129 130 CALL finalize_request(req_e1_scal) 131 132 CALL create_request(field_u,req_e1_vect,.TRUE.) 133 DO ind=1,ndomain 134 CALL swap_dimensions(ind) 135 DO i=ii_begin,ii_end 136 CALL request_add_point(ind,i,jj_begin-1,req_e1_vect,rup) 137 CALL request_add_point(ind,i+1,jj_begin-1,req_e1_vect,lup) 138 ENDDO 139 140 DO j=jj_begin,jj_end 141 CALL request_add_point(ind,ii_end+1,j,req_e1_vect,left) 142 CALL request_add_point(ind,ii_end+1,j-1,req_e1_vect,lup) 143 ENDDO 144 145 DO i=ii_begin,ii_end 146 CALL request_add_point(ind,i,jj_end+1,req_e1_vect,ldown) 147 CALL request_add_point(ind,i-1,jj_end+1,req_e1_vect,rdown) 148 ENDDO 149 150 DO j=jj_begin,jj_end 151 CALL request_add_point(ind,ii_begin-1,j,req_e1_vect,right) 152 CALL request_add_point(ind,ii_begin-1,j+1,req_e1_vect,rdown) 153 ENDDO 154 155 DO i=ii_begin+1,ii_end-1 156 CALL request_add_point(ind,i,jj_begin,req_e1_vect,right) 157 CALL request_add_point(ind,i,jj_end,req_e1_vect,right) 158 ENDDO 159 160 DO j=jj_begin+1,jj_end-1 161 CALL request_add_point(ind,ii_begin,j,req_e1_vect,rup) 162 CALL request_add_point(ind,ii_end,j,req_e1_vect,rup) 163 ENDDO 164 165 CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_vect,left) 166 CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_vect,ldown) 167 CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_vect,left) 168 CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_vect,ldown) 169 170 171 ENDDO 172 173 CALL finalize_request(req_e1_vect) 174 128 175 END SUBROUTINE init_transfert 129 176 130 SUBROUTINE create_request(type_field,request )177 SUBROUTINE create_request(type_field,request,vector) 131 178 USE domain_mod 132 179 USE field_mod … … 134 181 INTEGER :: type_field 135 182 TYPE(t_request),POINTER :: request(:) 183 LOGICAL,OPTIONAL :: vector 184 136 185 TYPE(t_request),POINTER :: req 137 186 TYPE(t_domain),POINTER :: d 138 187 INTEGER :: ind 139 188 INTEGER :: max_size 140 189 141 190 ALLOCATE(request(ndomain)) 142 191 … … 155 204 req%max_size=max_size*2 156 205 req%size=0 206 req%vector=.FALSE. 207 IF (PRESENT(vector)) req%vector=vector 157 208 ALLOCATE(req%src_domain(req%max_size)) 158 209 ALLOCATE(req%src_ind(req%max_size)) … … 162 213 ALLOCATE(req%target_i(req%max_size)) 163 214 ALLOCATE(req%target_j(req%max_size)) 215 ALLOCATE(req%target_sign(req%max_size)) 164 216 ENDDO 165 217 … … 177 229 INTEGER,POINTER :: target_i(:) 178 230 INTEGER,POINTER :: target_j(:) 231 INTEGER,POINTER :: target_sign(:) 179 232 180 233 PRINT *,"REALLOCATE_REQUEST" … … 186 239 target_i=>req%target_i 187 240 target_j=>req%target_j 241 target_sign=>req%target_sign 188 242 ! req%max_size=req%max_size*2 189 243 ALLOCATE(req%src_domain(req%max_size*2)) … … 194 248 ALLOCATE(req%target_i(req%max_size*2)) 195 249 ALLOCATE(req%target_j(req%max_size*2)) 250 ALLOCATE(req%target_sign(req%max_size*2)) 196 251 197 252 req%src_domain(1:req%max_size)=src_domain(:) … … 202 257 req%target_i(1:req%max_size)=target_i(:) 203 258 req%target_j(1:req%max_size)=target_j(:) 259 req%target_sign(1:req%max_size)=target_sign(:) 204 260 205 261 req%max_size=req%max_size*2 … … 212 268 DEALLOCATE(target_i) 213 269 DEALLOCATE(target_j) 270 DEALLOCATE(target_sign) 214 271 215 272 END SUBROUTINE reallocate_request … … 243 300 244 301 req%target_ind(req%size)=(j-1)*d%iim+i 302 req%target_sign(req%size)=1 245 303 req%src_domain(req%size)=src_domain 246 304 req%src_ind(req%size)=(src_j-1)*src_iim+src_i … … 254 312 src_n=(src_j-1)*src_iim+src_i 255 313 src_delta=domain(ind)%delta(i,j) 256 257 ! src_pos=MOD(pos-1+src_delta+6,6)+1258 314 src_pos=domain(ind)%edge_assign_pos(pos-1,i,j)+1 259 315 260 316 req%target_ind(req%size)=(j-1)*d%iim+i+d%u_pos(pos) 317 318 req%target_sign(req%size)= 1 319 IF (req%vector) req%target_sign(req%size)= domain(ind)%edge_assign_sign(pos-1,i,j) 320 261 321 req%src_domain(req%size)=src_domain 262 322 req%src_ind(req%size)=src_n+domain_glo(src_domain)%u_pos(src_pos) 263 264 ! req%target_i(req%size)=i265 ! req%target_j(req%size)=j266 ! req%src_i(req%size)=domain(ind)%assign_i(i,j)267 ! req%src_j(req%size)=domain(ind)%assign_j(i,j)268 269 ! PRINT *,"1--->",ind,i,j,pos270 ! PRINT *,"2--->",src_domain,src_i,src_j,src_pos271 323 272 324 ELSE IF (req%type_field==field_z) THEN … … 283 335 284 336 req%target_ind(req%size)=(j-1)*d%iim+i+d%z_pos(pos) 337 req%target_sign(req%size)=1 285 338 req%src_domain(req%size)=src_domain 286 339 req%src_ind(req%size)=src_n+domain_glo(src_domain)%z_pos(src_pos) … … 338 391 req%recv(irecv)%domain=domglo_loc_ind(ind_glo) 339 392 ALLOCATE(req%recv(irecv)%value(req%recv(irecv)%size)) 393 ALLOCATE(req%recv(irecv)%sign(req%recv(irecv)%size)) 340 394 ALLOCATE(req%recv(irecv)%buffer(req%recv(irecv)%size)) 341 395 ENDIF … … 350 404 req%recv(irecv)%value(size)=req%src_ind(i) 351 405 req%recv(irecv)%buffer(size)=req%target_ind(i) 406 req%recv(irecv)%sign(size)=req%target_sign(i) 352 407 ENDDO 353 408 ENDDO … … 362 417 ENDDO 363 418 ENDDO 364 365 419 366 420 CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) … … 465 519 DO irecv=1,req%nrecv 466 520 req%recv(irecv)%value(:)=req%recv(irecv)%buffer(:) 521 req%recv(irecv)%sign(:) =req%recv(irecv)%sign(:) 467 522 DEALLOCATE(req%recv(irecv)%buffer) 468 523 ENDDO … … 470 525 471 526 472 ! nb_domain_recv(:)=0 473 ! nb_data_domain_recv(:)=0 474 ! 475 ! DO ind_loc=1,ndomain 476 ! 477 ! DO i=1,req%size 478 ! ind_glo=req%src_domain(i) 479 ! nb_data_domain_recv(ind_glo)=nb_data_domain_recv(ind_glo)+1 480 ! ENDDO 481 ! 482 ! DO ind_glo=1,ndomain_glo 483 ! IF ( nb_data_domain_recv(ind_glo) > 0 ) nb_domain_recv(domglo_rank(ind_glo))=nb_domain_recv(domglo_rank(ind_glo))+1 484 ! ENDDO 485 ! 486 ! CALL MPI_Alltoall(nb_domain_recv,1,MPI_INTEGER,nb_domain_send,1,MPI_INTEGER,comm_icosa,ierr) 487 ! ENDDO 488 ! 489 ! DO 490 ! recv=sum(nb_domain_recv(:)) 491 ! send=sum(nb_domain_send(:)) 492 493 ! ALLOCATE(req%recv(recv)) 494 ! ALLOCATE(req%send(send)) 495 496 ! ALLOCATE(mpi_req(2*(send+recv))) 497 ! ALLOCATE(status(MPI_STATUS_SIZE,2*(send+recv))) 498 ! 499 ! recv=0 500 ! ireq=0 501 ! DO ind_glo=1,ndomain_glo 502 ! IF (nb_data_domain_recv(ind_glo)>0) THEN 503 ! recv=recv+1 504 ! list_domain_recv(ind_glo)=recv 505 ! req%recv(recv)%rank=domglo_rank(ind_glo) 506 ! req%recv(recv)%size=nb_data_domain_recv(ind_glo) 507 ! req%recv(recv)%domain=domglo_loc_ind(ind_glo) 508 ! ALLOCATE(req%recv(recv)%value(req%recv(recv)%size)) 509 ! ireq=ireq+1 510 ! CALL MPI_ISEND(req%recv(recv)%domain,1,MPI_INTEGER,req%recv(recv)%rank,0,comm_icosa, mpi_req(ireq),ierr) 511 ! ireq=ireq+1 512 ! CALL MPI_ISEND(req%recv(recv)%size,1,MPI_INTEGER,req%recv(recv)%rank,0,comm_icosa, mpi_req(ireq),ierr) 513 ! ENDIF 514 ! ENDDO 515 ! 516 ! 517 ! send=0 518 ! DO rank=0,mpi_size-1 519 ! DO j=1,nb_domain_send(rank) 520 ! send=send+1 521 ! req%send(send)%rank=rank 522 ! ireq=ireq+1 523 ! CALL MPI_IRECV(req%send(send)%domain,1,MPI_INTEGER,rank,0,comm_icosa, mpi_req(ireq),ierr) 524 ! ireq=ireq+1 525 ! CALL MPI_IRECV(req%send(send)%size,1,MPI_INTEGER,rank,0,comm_icosa, mpi_req(ireq),ierr) 526 ! ENDDO 527 ! ENDDO 528 ! 529 ! CALL MPI_WAITALL(2*(send+recv),mpi_req,status,ierr) 530 531 ! req%recv(:)%size=0 532 ! 533 ! DO i=1,req%size 534 ! j=list_domain_recv(req%src_domain(i)) 535 ! req%recv(j)%size=req%recv(j)%size+1 536 ! size=req%recv(j)%size 537 ! req%recv(j)%value(size)=req%src_ind(i) 538 ! ENDDO 539 ! 540 ! ireq=0 541 ! DO i=1,recv 542 ! ireq=ireq+1 543 ! CALL MPI_ISEND(req%recv(i)%value,req%recv(i)%size,MPI_INTEGER,req%recv(i)%rank,req%recv(i)%domain,comm_icosa, mpi_req(ireq),ierr) 544 ! ENDDO 545 546 ! DO i=1,send 547 ! ireq=ireq+1 548 ! ALLOCATE(req%send(i)%value(req%send(i)%size)) 549 ! CALL MPI_IRECV(req%send(i)%value,req%send(i)%size,MPI_INTEGER,req%send(i)%rank,req%send(i)%domain,comm_icosa, mpi_req(ireq),ierr) 550 ! ENDDO 551 ! 552 ! CALL MPI_WAITALL(send+recv,mpi_req,status,ierr) 553 554 555 END SUBROUTINE Finalize_request 527 END SUBROUTINE Finalize_request 556 528 557 529 … … 571 543 REAL(rstd),POINTER :: buffer_r4(:,:,:) 572 544 INTEGER,POINTER :: value(:) 545 INTEGER,POINTER :: sgn(:) 573 546 TYPE(ARRAY),POINTER :: recv,send 574 547 TYPE(t_request),POINTER :: req … … 634 607 buffer_r2=>recv%buffer_r2 635 608 value=>recv%value 609 sgn=>recv%sign 636 610 DO n=1,recv%size 637 rval2d(value(n))=buffer_r2(n) 611 rval2d(value(n))=buffer_r2(n)*sgn(n) 638 612 ENDDO 639 613 DEALLOCATE(recv%buffer_r2) … … 697 671 buffer_r3=>recv%buffer_r3 698 672 value=>recv%value 673 sgn=>recv%sign 699 674 DO n=1,recv%size 700 rval3d(value(n),:)=buffer_r3(n,:) 675 rval3d(value(n),:)=buffer_r3(n,:)*sgn(n) 701 676 ENDDO 702 677 DEALLOCATE(recv%buffer_r3) … … 760 735 buffer_r4=>recv%buffer_r4 761 736 value=>recv%value 737 sgn=>recv%sign 762 738 DO n=1,recv%size 763 rval4d(value(n),:,:)=buffer_r4(n,:,:) 739 rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n) 764 740 ENDDO 765 741 DEALLOCATE(recv%buffer_r4) … … 797 773 IF (field(ind)%ndim==2) THEN 798 774 DO n=1,req%size 799 rval2d(req%target_ind(n))=field(req%src_domain(n))%rval2d(req%src_ind(n)) 775 rval2d(req%target_ind(n))=field(req%src_domain(n))%rval2d(req%src_ind(n))*req%target_sign(n) 800 776 ENDDO 801 777 ELSE IF (field(ind)%ndim==3) THEN 802 778 DO n=1,req%size 803 rval3d(req%target_ind(n),:)=field(req%src_domain(n))%rval3d(req%src_ind(n),:) 779 rval3d(req%target_ind(n),:)=field(req%src_domain(n))%rval3d(req%src_ind(n),:)*req%target_sign(n) 804 780 ENDDO 805 781 ELSE IF (field(ind)%ndim==4) THEN 806 782 DO n=1,req%size 807 rval4d(req%target_ind(n),:,:)=field(req%src_domain(n))%rval4d(req%src_ind(n),:,:) 783 rval4d(req%target_ind(n),:,:)=field(req%src_domain(n))%rval4d(req%src_ind(n),:,:)*req%target_sign(n) 808 784 ENDDO 809 785 ENDIF -
codes/icosagcm/trunk/src/vorticity.f90
r19 r146 13 13 INTEGER :: ind 14 14 15 CALL transfert_request(f_ue,req_e1) 16 CALL transfert_request(f_ue,req_e1) 15 CALL transfert_request(f_ue,req_e1_vect) 17 16 18 17 DO ind=1,ndomain
Note: See TracChangeset
for help on using the changeset viewer.