Changeset 151
- Timestamp:
- 05/13/13 14:30:31 (11 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 1 added
- 3 deleted
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/advect.f90
r148 r151 53 53 SUBROUTINE compute_gradq3d(qi,one_over_sqrt_leng,gradq3d) 54 54 USE trace 55 USE omp_para 55 56 IMPLICIT NONE 56 57 REAL(rstd),INTENT(IN) :: qi(iim*jjm,llm) … … 72 73 ! Compute gradient at triangles solving a linear system 73 74 ! arr = area of triangle joining centroids of hexagons 74 Do l = 1,llm75 DO l = ll_begin,ll_end 75 76 DO j=jj_begin-1,jj_end+1 76 77 DO i=ii_begin-1,ii_end+1 … … 90 91 91 92 DO k=1,3 92 DO l = 1,llm93 DO l =ll_begin,ll_end 93 94 DO j=jj_begin,jj_end 94 95 DO i=ii_begin,ii_end … … 103 104 104 105 !============================================================================================= LIMITING 105 ! GO TO 120 106 DO l =1,llm 106 DO l =ll_begin,ll_end 107 107 DO j=jj_begin,jj_end 108 108 DO i=ii_begin,ii_end … … 110 110 maggrd = dot_product(gradq3d(n,l,:),gradq3d(n,l,:)) 111 111 maggrd = sqrt(maggrd) 112 ! leng = max(sum((xyz_v(n+z_up,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_down,:) - xyz_i(n,:))**2), &113 ! sum((xyz_v(n+z_rup,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_rdown,:) - xyz_i(n,:))**2), &114 ! sum((xyz_v(n+z_lup,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_ldown,:) - xyz_i(n,:))**2))115 ! maxq_c = qi(n,l) + maggrd*sqrt(leng(n))116 ! minq_c = qi(n,l) - maggrd*sqrt(leng(n))117 112 maxq_c = qi(n,l) + maggrd*one_over_sqrt_leng(n) 118 113 minq_c = qi(n,l) - maggrd*one_over_sqrt_leng(n) … … 137 132 SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc) 138 133 USE trace 134 USE omp_para 139 135 IMPLICIT NONE 140 136 REAL(rstd),INTENT(IN) :: normal(3*iim*jjm,3) … … 152 148 153 149 ! reconstruct tangential wind then 3D wind at edge then cc = edge midpoint - u*tau 154 DO l = 1,llm150 DO l = ll_begin,ll_end 155 151 DO j=jj_begin-1,jj_end+1 156 152 DO i=ii_begin-1,ii_end+1 … … 213 209 SUBROUTINE compute_advect_horiz(update_mass,hfluxt,cc,gradq3d, mass,qi) 214 210 USE trace 211 USE omp_para 215 212 IMPLICIT NONE 216 213 LOGICAL, INTENT(IN) :: update_mass … … 230 227 ! q(cc)= q0 + gradq.(cc-xyz_i) with xi centroid of hexagon 231 228 ! ne*hfluxt>0 iff outgoing 232 DO l = 1,llm229 DO l = ll_begin,ll_end 233 230 DO j=jj_begin-1,jj_end+1 234 231 DO i=ii_begin-1,ii_end+1 … … 265 262 266 263 ! update q and, if update_mass, update mass 267 DO l = 1,llm264 DO l = ll_begin,ll_end 268 265 DO j=jj_begin,jj_end 269 266 DO i=ii_begin,ii_end -
codes/icosagcm/trunk/src/advect_tracer.f90
r149 r151 9 9 TYPE(t_field),POINTER :: f_cc(:) ! starting point of backward-trajectory (Miura approach) 10 10 TYPE(t_field),POINTER :: f_one_over_sqrt_leng(:) 11 11 12 TYPE(t_message) :: req_u, req_wfluxt, req_q, req_rhodz, req_gradq3d 13 12 14 REAL(rstd), PARAMETER :: pente_max=2.0 ! for vlz 15 16 ! temporary shared variable for vlz 17 TYPE(t_field),POINTER :: f_dzqw(:) ! vertical finite difference of q 18 TYPE(t_field),POINTER :: f_adzqw(:) ! abs(dzqw) 19 TYPE(t_field),POINTER :: f_dzq(:) ! limited slope of q 20 TYPE(t_field),POINTER :: f_wq(:) ! time-integrated flux of q 13 21 14 22 PUBLIC init_advect_tracer, advect_tracer … … 28 36 CALL allocate_field(f_cc,field_u,type_real,llm,3, name='cc') 29 37 CALL allocate_field(f_one_over_sqrt_leng,field_t,type_real, name='one_over_sqrt_leng') 30 38 CALL allocate_field(f_dzqw, field_t, type_real, llm, name='dzqw') 39 CALL allocate_field(f_adzqw, field_t, type_real, llm, name='adzqw') 40 CALL allocate_field(f_dzq, field_t, type_real, llm, name='dzq') 41 CALL allocate_field(f_wq, field_t, type_real, llm+1, name='wq') 42 31 43 DO ind=1,ndomain 32 44 CALL swap_dimensions(ind) … … 56 68 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 57 69 REAL(rstd),POINTER :: rhodz(:,:), u(:,:) 58 INTEGER :: ind,k 70 ! temporary shared variable for vlz 71 REAL(rstd),POINTER :: dzqw(:,:) ! vertical finite difference of q 72 REAL(rstd),POINTER :: adzqw(:,:) ! abs(dzqw) 73 REAL(rstd),POINTER :: dzq(:,:) ! limited slope of q 74 REAL(rstd),POINTER :: wq(:,:) ! time-integrated flux of q 75 76 INTEGER :: ind,k 77 LOGICAL,SAVE :: first=.TRUE. 78 !$OMP THREADPRIVATE(first) 79 80 IF (first) THEN 81 first=.FALSE. 82 CALL init_message(f_u,req_e1_vect,req_u) 83 CALL init_message(f_wfluxt,req_i1,req_wfluxt) 84 CALL init_message(f_q,req_i1,req_q) 85 CALL init_message(f_rhodz,req_i1,req_rhodz) 86 CALL init_message(f_gradq3d,req_i1,req_gradq3d) 87 ENDIF 88 89 !$OMP BARRIER 59 90 60 91 CALL trace_start("advect_tracer") 61 92 62 CALL transfert_request(f_u,req_e1_vect) 63 ! CALL transfert_request(f_hfluxt,req_e1) ! BUG : This (unnecessary) transfer makes the computation go wrong 64 CALL transfert_request(f_wfluxt,req_i1) 65 CALL transfert_request(f_q,req_i1) 66 CALL transfert_request(f_rhodz,req_i1) 67 68 ! IF (is_mpi_root) PRINT *, 'Advection scheme' 69 70 ! DO ind=1,ndomain 71 ! CALL swap_dimensions(ind) 72 ! CALL swap_geometry(ind) 73 ! normal = f_normal(ind) 74 ! tangent = f_tangent(ind) 75 ! cc = f_cc(ind) 76 ! u = f_u(ind) 77 ! q = f_q(ind) 78 ! rhodz = f_rhodz(ind) 79 ! hfluxt = f_hfluxt(ind) 80 ! wfluxt = f_wfluxt(ind) 81 ! gradq3d = f_gradq3d(ind) 82 ! 83 ! ! 1/2 vertical transport 84 ! DO k = 1, nqtot 85 ! CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k)) 86 ! END DO 87 ! 88 ! ! horizontal transport 89 ! CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc) 90 ! DO k = 1,nqtot 91 ! CALL compute_gradq3d(q(:,:,k),gradq3d) 92 ! CALL compute_advect_horiz(k==nqtot,hfluxt,cc,gradq3d, rhodz,q(:,:,k)) 93 ! END DO 94 ! 95 ! ! 1/2 vertical transport 96 ! DO k = 1,nqtot 97 ! CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k)) 98 ! END DO 99 ! END DO 100 93 CALL send_message(f_u,req_u) 94 CALL send_message(f_wfluxt,req_wfluxt) 95 CALL send_message(f_q,req_q) 96 CALL send_message(f_rhodz,req_rhodz) 97 CALL wait_message(req_u) 98 CALL wait_message(req_wfluxt) 99 CALL wait_message(req_q) 100 CALL wait_message(req_rhodz) 101 101 102 ! 1/2 vertical transport + back-trajectories 102 103 DO ind=1,ndomain … … 110 111 rhodz = f_rhodz(ind) 111 112 wfluxt = f_wfluxt(ind) 113 dzqw = f_dzqw(ind) 114 adzqw = f_adzqw(ind) 115 dzq = f_dzq(ind) 116 wq = f_wq(ind) 112 117 113 118 DO k = 1, nqtot 114 CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k),1 )119 CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k),1,dzqw, adzqw, dzq, wq) 115 120 END DO 116 121 117 122 CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc) 118 END DO 119 120 ! CALL transfert_request(f_q,req_i1) ! necessary ? 121 ! CALL transfert_request(f_rhodz,req_i1) ! necessary ? 123 124 END DO 125 122 126 123 127 ! horizontal transport - split in two to place transfer of gradq3d 124 128 !$OMP BARRIER 125 129 DO k = 1, nqtot 126 130 DO ind=1,ndomain … … 133 137 END DO 134 138 135 CALL transfert_request(f_gradq3d,req_i1)136 139 CALL send_message(f_gradq3d,req_gradq3d) 140 CALL wait_message(req_gradq3d) 137 141 138 142 … … 149 153 END DO 150 154 151 ! CALL transfert_request(f_q,req_i1) ! necessary ?152 ! CALL transfert_request(f_rhodz,req_i1) ! necessary ?153 154 155 ! 1/2 vertical transport 156 !$OMP BARRIER 157 155 158 DO ind=1,ndomain 156 159 CALL swap_dimensions(ind) … … 159 162 rhodz = f_rhodz(ind) 160 163 wfluxt = f_wfluxt(ind) 164 dzqw = f_dzqw(ind) 165 adzqw = f_adzqw(ind) 166 dzq = f_dzq(ind) 167 wq = f_wq(ind) 168 161 169 DO k = 1,nqtot 162 CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k),0 )170 CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k),0, dzqw, adzqw, dzq, wq) 163 171 END DO 172 164 173 END DO 165 174 166 175 CALL trace_end("advect_tracer") 167 176 177 !$OMP BARRIER 178 168 179 END SUBROUTINE advect_tracer 169 180 170 SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q, halo )181 SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q, halo, dzqw, adzqw, dzq, wq) 171 182 ! 172 183 ! Auteurs: P.Le Van, F.Hourdin, F.Forget, T. Dubos … … 178 189 ! ******************************************************************** 179 190 USE trace 191 USE omp_para 180 192 IMPLICIT NONE 181 193 LOGICAL, INTENT(IN) :: update_mass … … 185 197 INTEGER, INTENT(IN) :: halo 186 198 187 REAL(rstd) :: dq(iim*jjm,llm), & ! increase of q 188 dzqw(iim*jjm,llm), & ! vertical finite difference of q 189 adzqw(iim*jjm,llm), & ! abs(dzqw) 190 dzq(iim*jjm,llm), & ! limited slope of q 191 wq(iim*jjm,llm+1) ! time-integrated flux of q 199 ! temporary shared variable 200 REAL(rstd),INTENT(INOUT) :: dzqw(iim*jjm,llm), & ! vertical finite difference of q 201 adzqw(iim*jjm,llm), & ! abs(dzqw) 202 dzq(iim*jjm,llm), & ! limited slope of q 203 wq(iim*jjm,llm+1) ! time-integrated flux of q 204 205 192 206 REAL(rstd) :: dzqmax, newmass, sigw, qq, w 193 207 INTEGER :: i,ij,l,j … … 196 210 197 211 ! finite difference of q 198 DO l=2,llm 212 213 DO l=ll_beginp1,ll_end 199 214 DO j=jj_begin-halo,jj_end+halo 200 215 DO i=ii_begin-halo,ii_end+halo … … 206 221 ENDDO 207 222 223 !--> flush dzqw, adzqw 224 !$OMP BARRIER 225 208 226 ! minmod-limited slope of q 209 227 ! dzq = slope*dz, i.e. the reconstructed q varies by dzq inside level l 210 DO l=2,llm-1 228 229 DO l=ll_beginp1,ll_endm1 211 230 DO j=jj_begin-halo,jj_end+halo 212 231 DO i=ii_begin-halo,ii_end+halo … … 223 242 ENDDO 224 243 244 225 245 ! 0 slope in top and bottom layers 226 DO j=jj_begin-halo,jj_end+halo 227 DO i=ii_begin-halo,ii_end+halo 228 ij=(j-1)*iim+i 229 dzq(ij,1)=0. 246 IF (omp_first) THEN 247 DO j=jj_begin-halo,jj_end+halo 248 DO i=ii_begin-halo,ii_end+halo 249 ij=(j-1)*iim+i 250 dzq(ij,1)=0. 251 ENDDO 252 ENDDO 253 ENDIF 254 255 IF (omp_last) THEN 256 DO j=jj_begin-halo,jj_end+halo 257 DO i=ii_begin-halo,ii_end+halo 230 258 dzq(ij,llm)=0. 231 ENDDO 232 ENDDO 259 ENDDO 260 ENDDO 261 ENDIF 262 263 !---> flush dzq 264 !$OMP BARRIER 233 265 234 266 ! sigw = fraction of mass that leaves level l/l+1 235 267 ! then amount of q leaving level l/l+1 = wq = w * qq 236 DO l = 1,llm-1268 DO l=ll_beginp1,ll_end 237 269 DO j=jj_begin-halo,jj_end+halo 238 270 DO i=ii_begin-halo,ii_end+halo 239 271 ij=(j-1)*iim+i 240 w = fac*wfluxt(ij,l +1)272 w = fac*wfluxt(ij,l) 241 273 IF(w>0.) THEN ! upward transport, upwind side is at level l 274 sigw = w/mass(ij,l-1) 275 qq = q(ij,l-1)+0.5*(1.-sigw)*dzq(ij,l-1) ! qq = q if sigw=1 , qq = q+dzq/2 if sigw=0 276 ELSE ! downward transport, upwind side is at level l+1 242 277 sigw = w/mass(ij,l) 243 qq = q(ij,l)+0.5*(1.-sigw)*dzq(ij,l) ! qq = q if sigw=1 , qq = q+dzq/2 if sigw=0 244 ELSE ! downward transport, upwind side is at level l+1 245 sigw = w/mass(ij,l+1) 246 qq = q(ij,l+1)-0.5*(1.+sigw)*dzq(ij,l+1) ! qq = q if sigw=-1 , qq = q-dzq/2 if sigw=0 278 qq = q(ij,l)-0.5*(1.+sigw)*dzq(ij,l) ! qq = q if sigw=-1 , qq = q-dzq/2 if sigw=0 247 279 ENDIF 248 wq(ij,l +1) = w*qq280 wq(ij,l) = w*qq 249 281 ENDDO 250 282 ENDDO 251 283 END DO 252 284 ! wq = 0 at top and bottom 253 DO j=jj_begin-halo,jj_end+halo 254 DO i=ii_begin-halo,ii_end+halo 255 ij=(j-1)*iim+i 256 wq(ij,llm+1)=0. 257 wq(ij,1)=0. 258 ENDDO 259 END DO 285 IF (omp_first) THEN 286 DO j=jj_begin-halo,jj_end+halo 287 DO i=ii_begin-halo,ii_end+halo 288 ij=(j-1)*iim+i 289 wq(ij,1)=0. 290 ENDDO 291 END DO 292 ENDIF 293 294 IF (omp_last) THEN 295 DO j=jj_begin-halo,jj_end+halo 296 DO i=ii_begin-halo,ii_end+halo 297 ij=(j-1)*iim+i 298 wq(ij,llm+1)=0. 299 ENDDO 300 END DO 301 ENDIF 302 303 ! --> flush wq 304 !$OMP BARRIER 305 260 306 261 307 ! update q, mass is updated only after all q's have been updated 262 DO l= 1,llm308 DO l=ll_begin,ll_end 263 309 DO j=jj_begin-halo,jj_end+halo 264 310 DO i=ii_begin-halo,ii_end+halo -
codes/icosagcm/trunk/src/caldyn.f90
r146 r151 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_caldyn14 13 USE caldyn_adv_mod, ONLY : init_caldyn_adv=>init_caldyn 15 14 IMPLICIT NONE … … 21 20 CASE('gcm') 22 21 CALL init_caldyn_gcm 23 CASE('gcm_opt')24 CALL init_caldyn_gcm_opt25 22 CASE('adv') 26 23 CALL init_caldyn_adv … … 37 34 USE icosa 38 35 USE caldyn_gcm_mod, ONLY : caldyn_gcm=>caldyn 39 USE caldyn_gcm_opt_mod, ONLY : caldyn_gcm_opt=>caldyn40 36 USE caldyn_adv_mod, ONLY : caldyn_adv=>caldyn 41 37 IMPLICIT NONE … … 56 52 CALL caldyn_gcm(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 57 53 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)61 54 CASE('adv') 62 55 CALL caldyn_adv(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & -
codes/icosagcm/trunk/src/caldyn_gcm.f90
r149 r151 1 1 MODULE caldyn_gcm_mod 2 2 USE icosa 3 3 USE transfert_mod 4 4 PRIVATE 5 5 … … 11 11 TYPE(t_field),POINTER :: f_buf_v(:), f_buf_s(:), f_buf_p(:) 12 12 13 PUBLIC init_caldyn, caldyn, write_output_fields,un2ulonlat 14 13 ! temporary shared variable for caldyn 14 TYPE(t_field),POINTER :: f_theta(:) 15 TYPE(t_field),POINTER :: f_pk(:) 16 TYPE(t_field),POINTER :: f_pks(:) 17 TYPE(t_field),POINTER :: f_phi(:) 18 TYPE(t_field),POINTER :: f_divm(:) 19 TYPE(t_field),POINTER :: f_wwuu(:) 20 15 21 INTEGER :: caldyn_hydrostat, caldyn_conserv 22 23 TYPE(t_message) :: req_ps, req_theta_rhodz, req_u, req_qu 24 25 PUBLIC init_caldyn, caldyn, write_output_fields,req_ps 16 26 17 27 CONTAINS … … 69 79 IMPLICIT NONE 70 80 71 CALL allocate_field(f_out_u,field_u,type_real,llm) 72 CALL allocate_field(f_p,field_t,type_real,llm+1) 73 CALL allocate_field(f_rhodz,field_t,type_real,llm) 74 CALL allocate_field(f_qu,field_u,type_real,llm) 75 76 CALL allocate_field(f_buf_i,field_t,type_real,llm) 77 CALL allocate_field(f_buf_p,field_t,type_real,llm+1) 78 CALL allocate_field(f_buf_u3d,field_t,type_real,3,llm) ! 3D vel at cell centers 79 CALL allocate_field(f_buf_ulon,field_t,type_real,llm) 80 CALL allocate_field(f_buf_ulat,field_t,type_real,llm) 81 CALL allocate_field(f_buf_v,field_z,type_real,llm) 82 CALL allocate_field(f_buf_s,field_t,type_real) 81 CALL allocate_field(f_out_u,field_u,type_real,llm) 82 CALL allocate_field(f_p,field_t,type_real,llm+1) 83 CALL allocate_field(f_rhodz,field_t,type_real,llm) 84 CALL allocate_field(f_qu,field_u,type_real,llm) 85 86 CALL allocate_field(f_buf_i,field_t,type_real,llm) 87 CALL allocate_field(f_buf_p,field_t,type_real,llm+1) 88 CALL allocate_field(f_buf_u3d,field_t,type_real,3,llm) ! 3D vel at cell centers 89 CALL allocate_field(f_buf_ulon,field_t,type_real,llm) 90 CALL allocate_field(f_buf_ulat,field_t,type_real,llm) 91 CALL allocate_field(f_buf_v,field_z,type_real,llm) 92 CALL allocate_field(f_buf_s,field_t,type_real) 93 94 CALL allocate_field(f_theta,field_t,type_real,llm) ! potential temperature 95 CALL allocate_field(f_pk,field_t,type_real,llm) 96 CALL allocate_field(f_pks,field_t,type_real) ! Exner function 97 CALL allocate_field(f_phi,field_t,type_real,llm) ! geopotential 98 CALL allocate_field(f_divm,field_t,type_real,llm) ! mass flux divergence 99 CALL allocate_field(f_wwuu,field_u,type_real,llm+1) 83 100 84 101 END SUBROUTINE allocate_caldyn … … 92 109 USE mpipara 93 110 USE trace 111 USE omp_para 94 112 IMPLICIT NONE 95 113 LOGICAL,INTENT(IN) :: write_out … … 108 126 REAL(rstd),POINTER :: u(:,:), du(:,:), hflux(:,:), wflux(:,:) 109 127 REAL(rstd),POINTER :: p(:,:), rhodz(:,:), qu(:,:) 128 129 ! temporary shared variable 130 REAL(rstd),POINTER :: theta(:,:) 131 REAL(rstd),POINTER :: pk(:,:), pks(:) 132 REAL(rstd),POINTER :: phi(:,:) 133 REAL(rstd),POINTER :: divm(:,:) 134 REAL(rstd),POINTER :: wwuu(:,:) 135 136 110 137 INTEGER :: ind,ij 138 LOGICAL,SAVE :: first=.TRUE. 139 !$OMP THREADPRIVATE(first) 140 141 142 IF (first) THEN 143 first=.FALSE. 144 CALL init_message(f_ps,req_i1,req_ps) 145 CALL init_message(f_theta_rhodz,req_i1,req_theta_rhodz) 146 CALL init_message(f_u,req_e1_vect,req_u) 147 CALL init_message(f_qu,req_e1_scal,req_qu) 148 CALL send_message(f_ps,req_ps) 149 ENDIF 111 150 112 151 CALL trace_start("caldyn") 113 CALL transfert_request(f_phis,req_i1) 114 CALL transfert_request(f_ps,req_i1) 115 CALL transfert_request(f_theta_rhodz,req_i1) 116 CALL transfert_request(f_u,req_e1_vect) 152 153 CALL send_message(f_u,req_u) 154 CALL send_message(f_theta_rhodz,req_theta_rhodz) 117 155 118 156 SELECT CASE(caldyn_conserv) … … 126 164 qu=f_qu(ind) 127 165 u=f_u(ind) 128 !$OMP PARALLEL DEFAULT(SHARED) 166 129 167 CALL compute_pvort(ps, u, p,rhodz,qu) 130 !$OMP END PARALLEL 168 131 169 ENDDO 132 170 133 CALL transfert_request(f_qu,req_e1_scal)171 CALL send_message(f_qu,req_qu) 134 172 135 173 DO ind=1,ndomain … … 148 186 u=f_u(ind) 149 187 du=f_du(ind) 150 out_u=f_out_u(ind) 151 !$OMP PARALLEL DEFAULT(SHARED) 152 CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, & 153 hflux, wflux, dps, dtheta_rhodz, du) 154 !$OMP END PARALLEL 188 out_u=f_out_u(ind) 189 theta = f_theta(ind) 190 pk = f_pk(ind) 191 pks = f_pks(ind) 192 phi = f_phi(ind) 193 divm = f_divm(ind) 194 wwuu=f_wwuu(ind) 195 196 CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du, & 197 theta,pk, pks, phi, divm, wwuu) 155 198 ENDDO 156 199 … … 172 215 du=f_du(ind) 173 216 out_u=f_out_u(ind) 174 !$OMP PARALLEL DEFAULT(SHARED)217 wwuu=f_wwuu(ind) 175 218 CALL compute_pvort(ps, u, p,rhodz,qu) 176 CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, & 177 hflux, wflux, dps, dtheta_rhodz, du) 178 !$OMP END PARALLEL 219 CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du, & 220 theta,pk, pks, phi, divm, wwuu) 179 221 ENDDO 180 222 … … 183 225 END SELECT 184 226 227 !$OMP BARRIER 185 228 IF (write_out) THEN 229 186 230 IF (is_mpi_root) PRINT *,'CALL write_output_fields' 187 CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 188 f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 231 232 ! ---> for openMP test to fix later 233 ! CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 234 ! f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 235 CALL writefield("ps",f_ps) 236 CALL writefield("dps",f_dps) 237 CALL writefield("vort",f_qu) 238 CALL writefield("theta",f_theta) 239 189 240 END IF 190 241 191 242 ! CALL check_mass_conservation(f_ps,f_dps) 192 243 CALL trace_end("caldyn") 244 !$OMP BARRIER 193 245 194 246 END SUBROUTINE caldyn … … 199 251 USE exner_mod 200 252 USE trace 253 USE omp_para 201 254 IMPLICIT NONE 202 255 REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm) … … 208 261 INTEGER :: i,j,ij,l 209 262 REAL(rstd) :: etav,hv 210 REAL(rstd),ALLOCATABLE,SAVE :: qv(:,:) ! potential velocity 211 212 LOGICAL,SAVE :: first=.TRUE. 213 !$OMP THREADPRIVATE(first) 214 263 REAL(rstd) :: qv(2*iim*jjm,llm) ! potential velocity 264 215 265 216 266 CALL trace_start("compute_pvort") 217 !$OMP BARRIER 218 !$OMP MASTER 219 ! IF (first) THEN 220 ALLOCATE(qv(2*iim*jjm,llm)) ! potential velocity 221 267 268 CALL wait_message(req_ps) 222 269 !!! Compute pressure 223 DO l = 1, llm+1 224 !$OMP DO 270 DO l = ll_begin, ll_endp1 271 CALL test_message(req_u) 272 225 273 DO j=jj_begin-1,jj_end+1 226 274 DO i=ii_begin-1,ii_end+1 … … 230 278 ENDDO 231 279 ENDDO 232 280 281 !$OMP BARRIER 282 233 283 !!! Compute mass 234 DO l = 1, llm235 !$OMP DO284 DO l = ll_begin,ll_end 285 CALL test_message(req_u) 236 286 DO j=jj_begin-1,jj_end+1 237 287 DO i=ii_begin-1,ii_end+1 … … 241 291 ENDDO 242 292 ENDDO 293 294 CALL wait_message(req_u) 243 295 244 296 !!! Compute shallow-water potential vorticity 245 DO l = 1,llm 246 !$OMP DO 297 DO l = ll_begin,ll_end 298 CALL test_message(req_theta_rhodz) 299 247 300 DO j=jj_begin-1,jj_end+1 248 301 DO i=ii_begin-1,ii_end+1 249 302 ij=(j-1)*iim+i 250 303 251 etav= 1./Av(ij+z_up)*( ne (ij,rup)* u(ij+u_rup,l) * de(ij+u_rup) &252 + ne (ij+t_rup,left)* u(ij+t_rup+u_left,l) * de(ij+t_rup+u_left) &253 - ne (ij,lup)* u(ij+u_lup,l) * de(ij+u_lup) )304 etav= 1./Av(ij+z_up)*( ne_rup * u(ij+u_rup,l) * de(ij+u_rup) & 305 + ne_left * u(ij+t_rup+u_left,l) * de(ij+t_rup+u_left) & 306 - ne_lup * u(ij+u_lup,l) * de(ij+u_lup) ) 254 307 255 308 hv = Riv2(ij,vup) * rhodz(ij,l) & … … 259 312 qv(ij+z_up,l) = ( etav+fv(ij+z_up) )/hv 260 313 261 etav = 1./Av(ij+z_down)*( ne (ij,ldown)* u(ij+u_ldown,l) * de(ij+u_ldown) &262 + ne (ij+t_ldown,right)* u(ij+t_ldown+u_right,l) * de(ij+t_ldown+u_right) &263 - ne (ij,rdown)* u(ij+u_rdown,l) * de(ij+u_rdown) )314 etav = 1./Av(ij+z_down)*( ne_ldown * u(ij+u_ldown,l) * de(ij+u_ldown) & 315 + ne_right * u(ij+t_ldown+u_right,l) * de(ij+t_ldown+u_right) & 316 - ne_rdown * u(ij+u_rdown,l) * de(ij+u_rdown) ) 264 317 265 318 hv = Riv2(ij,vdown) * rhodz(ij,l) & … … 283 336 ENDDO 284 337 285 !!$OMP BARRIER 286 !!$OMP MASTER 287 DEALLOCATE(qv) ! potential velocity 288 !!$OMP END MASTER 289 !!$OMP BARRIER 290 CALL trace_end("compute_pvort") 338 CALL trace_end("compute_pvort") 291 339 292 340 END SUBROUTINE compute_pvort 293 294 SUBROUTINE compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du) 341 342 343 SUBROUTINE compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du, & 344 theta,pk, pks, phi, divm, wwuu) 295 345 USE icosa 296 346 USE disvert_mod 297 347 USE exner_mod 298 348 USE trace 349 USE omp_para 299 350 IMPLICIT NONE 300 351 REAL(rstd),INTENT(IN) :: phis(iim*jjm) … … 310 361 REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 311 362 REAL(rstd),INTENT(OUT) :: wflux(iim*jjm,llm+1) ! vertical mass flux (kg/m2/s) 312 313 REAL(rstd),ALLOCATABLE,SAVE :: theta(:,:) ! potential temperature 314 REAL(rstd),ALLOCATABLE,SAVE :: pk(:,:), pks(:) ! Exner function 315 REAL(rstd),ALLOCATABLE,SAVE :: alpha(:,:), beta(:,:) 316 REAL(rstd),ALLOCATABLE,SAVE :: phi(:,:) ! geopotential 317 REAL(rstd),ALLOCATABLE,SAVE :: Ftheta(:,:) ! theta flux 318 REAL(rstd),ALLOCATABLE,SAVE :: divm(:,:) ! mass flux divergence 319 REAL(rstd),ALLOCATABLE,SAVE :: berni(:,:) ! Bernouilli function 363 364 ! temporary variable 365 REAL(rstd),INTENT(INOUT) :: theta(iim*jjm,llm) ! potential temperature 366 REAL(rstd),INTENT(INOUT) :: pk(iim*jjm,llm), pks(iim*jjm) ! Exner function 367 REAL(rstd),INTENT(INOUT) :: phi(iim*jjm,llm) ! geopotential 368 REAL(rstd),INTENT(INOUT) :: divm(iim*jjm,llm) ! mass flux divergence 369 REAL(rstd),INTENT(INOUT) :: wwuu(iim*3*jjm,llm+1) 370 371 372 REAL(rstd) :: Ftheta(3*iim*jjm,llm) ! theta flux 373 REAL(rstd) :: berni(iim*jjm,llm) ! Bernouilli function 320 374 321 375 INTEGER :: i,j,ij,l 322 376 REAL(rstd) :: ww,uu 323 377 324 LOGICAL,SAVE :: first=.TRUE.325 !$OMP THREADPRIVATE(first)326 327 378 CALL trace_start("compute_caldyn") 328 !$OMP BARRIER 329 !$OMP MASTER 330 ! IF (first) THEN 331 ALLOCATE(theta(iim*jjm,llm)) ! potential temperature 332 ALLOCATE(pk(iim*jjm,llm)) ! Exner function 333 ALLOCATE(pks(iim*jjm)) 334 ALLOCATE(alpha(iim*jjm,llm)) 335 ALLOCATE(beta(iim*jjm,llm)) 336 ALLOCATE(phi(iim*jjm,llm)) ! geopotential 337 ALLOCATE(Ftheta(3*iim*jjm,llm)) ! theta flux 338 ALLOCATE(divm(iim*jjm,llm)) ! mass flux divvergence 339 ALLOCATE(berni(iim*jjm,llm)) ! bernouilli term 379 380 CALL wait_message(req_theta_rhodz) 340 381 341 382 !!! Compute theta 342 DO l = 1, llm343 !$OMP DO 383 DO l = ll_begin, ll_end 384 IF (caldyn_conserv==energy) CALL test_message(req_qu) 344 385 DO j=jj_begin-1,jj_end+1 345 386 DO i=ii_begin-1,ii_end+1 … … 350 391 ENDDO 351 392 352 DO l = 1, llm393 DO l = ll_begin, ll_end 353 394 !!! Compute mass and theta fluxes 395 IF (caldyn_conserv==energy) CALL test_message(req_qu) 354 396 DO j=jj_begin-1,jj_end+1 355 397 DO i=ii_begin-1,ii_end+1 … … 370 412 ij=(j-1)*iim+i 371 413 ! divm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 372 divm(ij,l)= 1./Ai(ij)*(ne (ij,right)*hflux(ij+u_right,l) + &373 ne (ij,rup)*hflux(ij+u_rup,l) + &374 ne (ij,lup)*hflux(ij+u_lup,l) + &375 ne (ij,left)*hflux(ij+u_left,l) + &376 ne (ij,ldown)*hflux(ij+u_ldown,l) + &377 ne (ij,rdown)*hflux(ij+u_rdown,l))414 divm(ij,l)= 1./Ai(ij)*(ne_right*hflux(ij+u_right,l) + & 415 ne_rup*hflux(ij+u_rup,l) + & 416 ne_lup*hflux(ij+u_lup,l) + & 417 ne_left*hflux(ij+u_left,l) + & 418 ne_ldown*hflux(ij+u_ldown,l) + & 419 ne_rdown*hflux(ij+u_rdown,l)) 378 420 379 421 ! signe ? attention d (rho theta dz) 380 422 ! dtheta_rhodz = -div(flux.theta) 381 dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne (ij,right)*Ftheta(ij+u_right,l) + &382 ne (ij,rup)*Ftheta(ij+u_rup,l) + &383 ne (ij,lup)*Ftheta(ij+u_lup,l) + &384 ne (ij,left)*Ftheta(ij+u_left,l) + &385 ne (ij,ldown)*Ftheta(ij+u_ldown,l) + &386 ne (ij,rdown)*Ftheta(ij+u_rdown,l))423 dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne_right*Ftheta(ij+u_right,l) + & 424 ne_rup*Ftheta(ij+u_rup,l) + & 425 ne_lup*Ftheta(ij+u_lup,l) + & 426 ne_left*Ftheta(ij+u_left,l) + & 427 ne_ldown*Ftheta(ij+u_ldown,l) + & 428 ne_rdown*Ftheta(ij+u_rdown,l)) 387 429 ENDDO 388 430 ENDDO 389 431 ENDDO 390 432 433 !$OMP BARRIER 391 434 !!! cumulate mass flux divergence from top to bottom 392 435 DO l = llm-1, 1, -1 393 !$OMP DO 436 IF (caldyn_conserv==energy) CALL test_message(req_qu) 437 !$OMP DO SCHEDULE(STATIC) 394 438 DO j=jj_begin,jj_end 395 439 DO i=ii_begin,ii_end … … 399 443 ENDDO 400 444 ENDDO 445 446 ! IMPLICIT FLUSH on divm 447 !!!!!!!!!!!!!!!!!!!!!!!!! 401 448 402 449 !!! Compute vertical mass flux 403 DO l = 1,llm-1 404 !$OMP DO 450 ! DO l = 2,llm 451 DO l=ll_beginp1,ll_end 452 IF (caldyn_conserv==energy) CALL test_message(req_qu) 405 453 DO j=jj_begin,jj_end 406 454 DO i=ii_begin,ii_end … … 408 456 ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt 409 457 ! => w>0 for upward transport 410 wflux( ij, l +1 ) = divm( ij, l+1 ) - bp(l+1) * divm( ij, 1 )458 wflux( ij, l ) = divm( ij, l ) - bp(l) * divm( ij, 1 ) 411 459 ENDDO 412 460 ENDDO … … 414 462 415 463 ! compute dps, set vertical mass flux at the surface to 0 416 !$OMP DO 417 DO j=jj_begin,jj_end 418 DO i=ii_begin,ii_end 419 ij=(j-1)*iim+i 420 wflux(ij,1) = 0. 421 wflux(ij,llm+1) = 0. 422 ! dps/dt = -int(div flux)dz 423 dps(ij)=-divm(ij,1) * g 424 ENDDO 425 ENDDO 426 464 IF (omp_first) THEN 465 DO j=jj_begin,jj_end 466 DO i=ii_begin,ii_end 467 ij=(j-1)*iim+i 468 wflux(ij,1) = 0. 469 ! dps/dt = -int(div flux)dz 470 dps(ij)=-divm(ij,1) * g 471 ENDDO 472 ENDDO 473 ENDIF 474 475 476 IF (omp_last) THEN 477 DO j=jj_begin,jj_end 478 DO i=ii_begin,ii_end 479 ij=(j-1)*iim+i 480 wflux(ij,llm+1) = 0. 481 ENDDO 482 ENDDO 483 ENDIF 427 484 !!! Compute potential vorticity (Coriolis) contribution to du 428 485 … … 430 487 CASE(energy) ! energy-conserving TRiSK 431 488 432 DO l=1,llm 433 !$OMP DO 489 CALL wait_message(req_qu) 490 491 DO l=ll_begin,ll_end 434 492 DO j=jj_begin,jj_end 435 493 DO i=ii_begin,ii_end … … 479 537 CASE(enstrophy) ! enstrophy-conserving TRiSK 480 538 481 DO l=1,llm 482 !$OMP DO 539 DO l=ll_begin,ll_end 483 540 DO j=jj_begin,jj_end 484 541 DO i=ii_begin,ii_end … … 531 588 532 589 !!! Compute Exner function 533 ! PRINT *, 'Computing Exner' 534 CALL compute_exner(ps,p,pks,pk,1) 590 ! CALL compute_exner(ps,p,pks,pk,1) 591 ! replaced in source 592 IF (omp_first) THEN 593 DO j=jj_begin-1,jj_end+1 594 DO i=ii_begin-1,ii_end+1 595 ij=(j-1)*iim+i 596 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 597 ENDDO 598 ENDDO 599 ENDIF 600 601 ! 3D : pk 602 DO l = ll_begin, ll_end 603 DO j=jj_begin-1,jj_end+1 604 DO i=ii_begin-1,ii_end+1 605 ij=(j-1)*iim+i 606 pk(ij,l) = cpp * ((.5/preff)*(p(ij,l)+p(ij,l+1))) ** kappa 607 ENDDO 608 ENDDO 609 ENDDO 610 611 !---> flush pk,pks, theta 612 !$OMP BARRIER 535 613 536 614 !!! Compute geopotential 537 615 538 616 ! for first layer 539 !$OMP DO 540 DO j=jj_begin-1,jj_end+1 541 DO i=ii_begin-1,ii_end+1 542 ij=(j-1)*iim+i 543 phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) ) 617 IF (omp_first) THEN 618 DO j=jj_begin-1,jj_end+1 619 DO i=ii_begin-1,ii_end+1 620 ij=(j-1)*iim+i 621 phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) ) 622 ENDDO 623 ENDDO 624 ENDIF 625 !!-> implicit flush on phi(:,1) 626 627 ! for other layers 628 DO l = ll_beginp1, ll_end 629 DO j=jj_begin-1,jj_end+1 630 DO i=ii_begin-1,ii_end+1 631 ij=(j-1)*iim+i 632 phi(ij,l) = 0.5 * ( theta(ij,l) + theta(ij,l-1) ) & 633 * ( pk(ij,l-1) - pk(ij,l) ) 634 ENDDO 544 635 ENDDO 545 636 ENDDO 546 547 ! for other layers 637 638 !$OMP BARRIER 548 639 DO l = 2, llm 549 640 !$OMP DO … … 551 642 DO i=ii_begin-1,ii_end+1 552 643 ij=(j-1)*iim+i 553 phi(ij,l) = phi(ij,l-1) + 0.5 * ( theta(ij,l) + theta(ij,l-1) ) & 554 * ( pk(ij,l-1) - pk(ij,l) ) 644 phi(ij,l) = phi(ij,l)+ phi(ij,l-1) 555 645 ENDDO 556 646 ENDDO 557 647 ENDDO 558 559 648 ! --> IMPLICIT FLUSH on phi 649 560 650 !!! Compute bernouilli term = Kinetic Energy + geopotential 561 DO l=1,llm 562 !$OMP DO 651 DO l=ll_begin,ll_end 563 652 DO j=jj_begin,jj_end 564 653 DO i=ii_begin,ii_end … … 576 665 ENDDO 577 666 ENDDO 578 667 579 668 580 669 !!! gradients of Bernoulli and Exner functions 581 DO l=1,llm 582 !$OMP DO 670 671 DO l=ll_begin,ll_end 583 672 DO j=jj_begin,jj_end 584 673 DO i=ii_begin,ii_end 585 674 ij=(j-1)*iim+i 586 675 587 out_u(ij+u_right,l)= 1/de(ij+u_right) * (&588 0.5*(theta(ij,l)+theta(ij+t_right,l)) 589 *( ne (ij,right)*pk(ij,l)+ne(ij+t_right,left)*pk(ij+t_right,l))&590 + ne (ij,right)*berni(ij,l)+ne(ij+t_right,left)*berni(ij+t_right,l) )676 du(ij+u_right,l) = du(ij+u_right,l) + 1/de(ij+u_right) * ( & 677 0.5*(theta(ij,l)+theta(ij+t_right,l)) & 678 *( ne_right*pk(ij,l)+ne_left*pk(ij+t_right,l)) & 679 + ne_right*berni(ij,l)+ne_left*berni(ij+t_right,l) ) 591 680 592 du(ij+u_right,l) = du(ij+u_right,l) + out_u(ij+u_right,l)593 681 594 out_u(ij+u_lup,l)= 1/de(ij+u_lup) * ( & 595 0.5*(theta(ij,l)+theta(ij+t_lup,l)) & 596 *( ne(ij,lup)*pk(ij,l)+ne(ij+t_lup,rdown)*pk(ij+t_lup,l)) & 597 + ne(ij,lup)*berni(ij,l)+ne(ij+t_lup,rdown)*berni(ij+t_lup,l) ) 598 599 du(ij+u_lup,l) = du(ij+u_lup,l) + out_u(ij+u_lup,l) 682 du(ij+u_lup,l) = du(ij+u_lup,l) + 1/de(ij+u_lup) * ( & 683 0.5*(theta(ij,l)+theta(ij+t_lup,l)) & 684 *( ne_lup*pk(ij,l)+ne_rdown*pk(ij+t_lup,l)) & 685 + ne_lup*berni(ij,l)+ne_rdown*berni(ij+t_lup,l) ) 600 686 601 out_u(ij+u_ldown,l)= 1/de(ij+u_ldown) * ( & 602 0.5*(theta(ij,l)+theta(ij+t_ldown,l)) & 603 *( ne(ij,ldown)*pk(ij,l)+ne(ij+t_ldown,rup)*pk(ij+t_ldown,l)) & 604 + ne(ij,ldown)*berni(ij,l)+ne(ij+t_ldown,rup)*berni(ij+t_ldown,l) ) 605 606 du(ij+u_ldown,l) = du(ij+u_ldown,l) + out_u(ij+u_ldown,l) 687 du(ij+u_ldown,l) = du(ij+u_ldown,l) + 1/de(ij+u_ldown) * ( & 688 0.5*(theta(ij,l)+theta(ij+t_ldown,l)) & 689 *( ne_ldown*pk(ij,l)+ne_rup*pk(ij+t_ldown,l)) & 690 + ne_ldown*berni(ij,l)+ne_rup*berni(ij+t_ldown,l) ) 607 691 608 692 ENDDO 609 693 ENDDO 610 694 ENDDO 611 612 !!! contributions of vertical advection to du, dtheta 613 614 DO l=1,llm-1 615 !$OMP DO 616 DO j=jj_begin,jj_end 617 DO i=ii_begin,ii_end 618 ij=(j-1)*iim+i 619 ! ww>0 <=> upward transport 620 621 ww = 0.5 * wflux(ij,l+1) * (theta(ij,l) + theta(ij,l+1) ) 622 dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l ) - ww 623 dtheta_rhodz(ij,l+1) = dtheta_rhodz(ij,l+1) + ww 624 625 ww = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_right,l+1)) 626 uu = u(ij+u_right,l+1) - u(ij+u_right,l) 627 du(ij+u_right, l ) = du(ij+u_right,l) - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))) 628 du(ij+u_right, l+1 ) = du(ij+u_right,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_right,l+1))) 629 630 ww = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_lup,l+1)) 631 uu = u(ij+u_lup,l+1) - u(ij+u_lup,l) 632 du(ij+u_lup, l ) = du(ij+u_lup,l) - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))) 633 du(ij+u_lup, l+1 ) = du(ij+u_lup,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_lup,l+1))) 634 635 ww = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_ldown,l+1)) 636 uu = u(ij+u_ldown,l+1) - u(ij+u_ldown,l) 637 du(ij+u_ldown, l ) = du(ij+u_ldown,l) - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))) 638 du(ij+u_ldown, l+1 ) = du(ij+u_ldown,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_ldown,l+1))) 639 695 696 697 DO l=ll_begin,ll_endm1 698 DO j=jj_begin,jj_end 699 DO i=ii_begin,ii_end 700 ij=(j-1)*iim+i 701 dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l ) - 0.5 * ( wflux(ij,l+1) * (theta(ij,l) + theta(ij,l+1))) 702 ENDDO 703 ENDDO 704 ENDDO 705 706 DO l=ll_beginp1,ll_end 707 DO j=jj_begin,jj_end 708 DO i=ii_begin,ii_end 709 ij=(j-1)*iim+i 710 dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l ) + 0.5 * ( wflux(ij,l ) * (theta(ij,l-1) + theta(ij,l) ) ) 711 ENDDO 712 ENDDO 713 ENDDO 714 715 IF (omp_first) THEN 716 DO j=jj_begin,jj_end 717 DO i=ii_begin,ii_end 718 ij=(j-1)*iim+i 719 wwuu(ij+u_right,1)=0 720 wwuu(ij+u_lup,1)=0 721 wwuu(ij+u_ldown,1)=0 722 ENDDO 723 ENDDO 724 ENDIF 725 726 IF (omp_last) THEN 727 DO j=jj_begin,jj_end 728 DO i=ii_begin,ii_end 729 ij=(j-1)*iim+i 730 wwuu(ij+u_right,llm+1)=0 731 wwuu(ij+u_lup,llm+1)=0 732 wwuu(ij+u_ldown,llm+1)=0 733 ENDDO 734 ENDDO 735 ENDIF 736 737 DO l=ll_beginp1,ll_end 738 DO j=jj_begin,jj_end 739 DO i=ii_begin,ii_end 740 ij=(j-1)*iim+i 741 wwuu(ij+u_right,l) = 0.5*( wflux(ij,l) + wflux(ij+t_right,l)) * (u(ij+u_right,l) - u(ij+u_right,l-1)) 742 wwuu(ij+u_lup,l) = 0.5* ( wflux(ij,l) + wflux(ij+t_lup,l)) * (u(ij+u_lup,l) - u(ij+u_lup,l-1)) 743 wwuu(ij+u_ldown,l) = 0.5*( wflux(ij,l) + wflux(ij+t_ldown,l)) * (u(ij+u_ldown,l) - u(ij+u_ldown,l-1)) 744 ENDDO 745 ENDDO 746 ENDDO 747 748 !--> flush wwuu 749 !$OMP BARRIER 750 751 DO l=ll_begin,ll_end 752 DO j=jj_begin,jj_end 753 DO i=ii_begin,ii_end 754 ij=(j-1)*iim+i 755 du(ij+u_right, l ) = du(ij+u_right,l) - (wwuu(ij+u_right,l+1)+ wwuu(ij+u_right,l)) / (rhodz(ij,l)+rhodz(ij+t_right,l)) 756 du(ij+u_lup, l ) = du(ij+u_lup,l) - (wwuu(ij+u_lup,l+1) + wwuu(ij+u_lup,l)) / (rhodz(ij,l)+rhodz(ij+t_lup,l)) 757 du(ij+u_ldown, l ) = du(ij+u_ldown,l) - (wwuu(ij+u_ldown,l+1)+ wwuu(ij+u_ldown,l)) / (rhodz(ij,l)+rhodz(ij+t_ldown,l)) 640 758 ENDDO 641 759 ENDDO 642 760 ENDDO 643 644 !!$OMP BARRIER 645 !!$OMP MASTER 646 DEALLOCATE(theta) ! potential temperature 647 DEALLOCATE(pk) ! Exner function 648 DEALLOCATE(pks) 649 DEALLOCATE(alpha) 650 DEALLOCATE(beta) 651 DEALLOCATE(phi) ! geopotential 652 DEALLOCATE(Ftheta) ! theta flux 653 DEALLOCATE(divm) ! mass flux divergence 654 DEALLOCATE(berni) ! bernouilli term 655 !!$OMP END MASTER 656 !!$OMP BARRIER 657 CALL trace_end("compute_caldyn") 761 762 CALL trace_end("compute_caldyn") 658 763 659 764 END SUBROUTINE compute_caldyn … … 709 814 USE write_field 710 815 USE vertical_interp_mod 816 USE wind_mod 711 817 TYPE(t_field),POINTER :: f_ps(:), f_phis(:), f_u(:), f_theta_rhodz(:), f_q(:), f_dps(:), & 712 818 f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:) … … 722 828 723 829 CALL writefield("ps",f_ps) 724 !CALL writefield("dps",f_dps)725 !CALL writefield("phis",f_phis)726 !CALL vorticity(f_u,f_buf_v)727 !CALL writefield("vort",f_buf_v)728 729 !CALL w_omega(f_ps, f_u, f_buf_i)730 !CALL writefield('omega', f_buf_i)731 !IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN732 !CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level)733 !CALL writefield("omega"//TRIM(str_pression),f_buf_s)734 !ENDIF830 CALL writefield("dps",f_dps) 831 CALL writefield("phis",f_phis) 832 CALL vorticity(f_u,f_buf_v) 833 CALL writefield("vort",f_buf_v) 834 835 CALL w_omega(f_ps, f_u, f_buf_i) 836 CALL writefield('omega', f_buf_i) 837 IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 838 CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level) 839 CALL writefield("omega"//TRIM(str_pression),f_buf_s) 840 ENDIF 735 841 736 842 ! Temperature … … 754 860 755 861 ! velocity components 756 CALL un2ulonlat(f_u, f_buf _i3, f_buf1_i, f_buf2_i)862 CALL un2ulonlat(f_u, f_buf1_i, f_buf2_i) 757 863 CALL writefield("ulon",f_buf1_i) 758 864 CALL writefield("ulat",f_buf2_i) … … 767 873 ! geopotential 768 874 CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i) 769 !CALL writefield("p",f_buf_p)770 !CALL writefield("phi",f_buf_i)771 772 !CALL writefield("pk",f_buf2_i) ! Exner pressure875 CALL writefield("p",f_buf_p) 876 CALL writefield("phi",f_buf_i) 877 CALL writefield("theta",f_buf1_i) ! potential temperature 878 CALL writefield("pk",f_buf2_i) ! Exner pressure 773 879 774 880 … … 806 912 END SUBROUTINE thetarhodz2geopot 807 913 808 SUBROUTINE un2ulonlat(f_u, f_u3d, f_ulon, f_ulat)809 USE field_mod810 USE wind_mod811 TYPE(t_field), POINTER :: f_u(:), & ! IN : normal velocity components on edges812 f_u3d(:), f_ulon(:), f_ulat(:) ! OUT : velocity reconstructed at hexagons813 REAL(rstd),POINTER :: u(:,:), u3d(:,:,:), ulon(:,:), ulat(:,:)814 INTEGER :: ind815 DO ind=1,ndomain816 CALL swap_dimensions(ind)817 CALL swap_geometry(ind)818 u=f_u(ind)819 u3d=f_u3d(ind)820 CALL compute_wind_centered(u,u3d)821 ulon=f_ulon(ind)822 ulat=f_ulat(ind)823 CALL compute_wind_centered_lonlat_compound(u3d, ulon, ulat)824 END DO825 END SUBROUTINE un2ulonlat826 827 914 SUBROUTINE Tv2T(f_Tv, f_q, f_T) 828 915 USE icosa -
codes/icosagcm/trunk/src/check_conserve.f90
r149 r151 1 1 MODULE check_conserve_mod 2 3 4 5 6 7 8 2 USE icosa 3 IMPLICIT NONE 4 5 PRIVATE 6 TYPE(t_field),POINTER,SAVE :: f_pk(:), f_pks(:), f_p(:) 7 TYPE(t_field),POINTER,SAVE :: f_vort(:) 8 TYPE(t_field),POINTER,SAVE :: f_rhodz(:) 9 9 10 PUBLIC compute_conserve11 12 13 10 PUBLIC init_check_conserve, check_conserve 11 REAL(rstd),SAVE:: mtot0,ztot0,etot0,ang0,stot0,rmsv0 12 REAL(rstd),SAVE::rmsdpdt,etot,ang,stot,rmsv 13 REAL(rstd),SAVE:: ztot,mtot 14 14 15 15 16 C ontains17 18 !--------------------------------------------------------------------- 19 20 SUBROUTINE allocate_check_conserve21 22 16 CONTAINS 17 18 !--------------------------------------------------------------------- 19 20 SUBROUTINE init_check_conserve 21 USE icosa 22 IMPLICIT NONE 23 23 CALL allocate_field(f_pk,field_t,type_real,llm) 24 24 CALL allocate_field(f_p,field_t,type_real,llm+1) … … 26 26 CALL allocate_field(f_rhodz,field_t,type_real,llm) 27 27 CALL allocate_field(f_vort,field_z,type_real,llm) 28 END SUBROUTINE allocate_check_conserve 29 30 !--------------------------------------------------------------------- 31 32 SUBROUTINE check_mass_conserve(f_ps,f_dps) 28 END SUBROUTINE init_check_conserve 29 30 SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it) 31 USE icosa 32 USE pression_mod 33 USE vorticity_mod 34 USE caldyn_gcm_mod 35 USE exner_mod 36 USE mpipara 37 IMPLICIT NONE 38 TYPE(t_field),POINTER :: f_ps(:) 39 TYPE(t_field),POINTER :: f_dps(:) 40 TYPE(t_field),POINTER :: f_ue(:) 41 TYPE(t_field),POINTER :: f_theta_rhodz(:) 42 TYPE(t_field),POINTER :: f_phis(:) 43 INTEGER::it 44 REAL(rstd),POINTER :: p(:,:),rhodz(:,:) 45 INTEGER::ind 46 47 etot=0.0; ang=0.0;stot=0.0;rmsv=0.0 48 mtot=0.0 ; rmsdpdt=0.0 ; ztot = 0.0 49 50 CALL pression(f_ps,f_p) 51 52 DO ind=1,ndomain 53 CALL swap_dimensions(ind) 54 CALL swap_geometry(ind) 55 p=f_p(ind) 56 rhodz=f_rhodz(ind) 57 CALL compute_rhodz(p,rhodz) 58 END DO 59 60 CALL vorticity(f_ue,f_vort) 61 CALL check_mass_conserve(f_ps,f_dps) 62 CALL check_PV 63 CALL exner(f_ps,f_p,f_pks,f_pk) 64 CALL check_EN(f_ue,f_theta_rhodz,f_phis) 65 66 IF ( it == 0 ) Then 67 ztot0 = ztot 68 mtot0 = mtot 69 etot0 = etot 70 ang0 = ang 71 stot0 = stot 72 END IF 73 74 rmsv=SQRT(rmsv/mtot) 75 ztot=ztot/ztot0 ; mtot=mtot/mtot0 76 etot=etot/etot0 ; ang=ang/ang0 ; stot=stot/stot0 77 rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo) 78 79 80 IF (is_mpi_root) THEN 81 OPEN(134,file="checkconsicosa.txt",position='append') 82 WRITE(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 83 WRITE(134,*)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 84 WRITE(134,*)"==================================================" 85 WRITE(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 86 87 4000 FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie' & 88 ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB ' & 89 ,f10.6,e13.6,5f10.3/) 90 close(134) 91 END IF 92 END SUBROUTINE check_conserve 93 94 !--------------------------------------------------------------------- 95 96 SUBROUTINE check_mass_conserve(f_ps,f_dps) 33 97 USE icosa 34 98 IMPLICIT NONE … … 38 102 INTEGER :: ind,i,j,ij 39 103 40 DO ind=1,ndomain104 DO ind=1,ndomain 41 105 CALL swap_dimensions(ind) 42 106 CALL swap_geometry(ind) … … 49 113 mtot=mtot+ps(ij)*Ai(ij) 50 114 rmsdpdt=rmsdpdt+dps(ij)*dps(ij) 51 115 ENDIF 52 116 ENDDO 53 117 ENDDO … … 57 121 !--------------------------------------------------------------------- 58 122 59 SUBROUTINE check_EN(f_ue,f_theta_rhodz,f_phis)60 61 62 63 123 SUBROUTINE check_en(f_ue,f_theta_rhodz,f_phis) 124 USE icosa 125 USE pression_mod 126 USE vorticity_mod 127 IMPLICIT NONE 64 128 TYPE(t_field), POINTER :: f_ue(:) 65 129 TYPE(t_field), POINTER :: f_theta_rhodz(:) … … 74 138 75 139 76 Do ind=1,ndomain 77 CALL swap_dimensions(ind) 78 CALL swap_geometry(ind) 79 ue=f_ue(ind) 80 p=f_p(ind) 81 rhodz=f_rhodz(ind) 82 theta_rhodz=f_theta_rhodz(ind) 83 pk=f_pk(ind) 84 phis=f_phis(ind) 85 CALL compute_en(ind,ue,p,rhodz,theta_rhodz,pk,phis) 86 END DO 87 END SUBROUTINE CHECK_EN 88 89 SUBROUTINE compute_en(ind,u,p,rhodz,theta_rhodz,pk,phis) 90 USE icosa 91 USE disvert_mod 92 USE wind_mod 93 IMPLICIT NONE 140 DO ind=1,ndomain 141 CALL swap_dimensions(ind) 142 CALL swap_geometry(ind) 143 ue=f_ue(ind) 144 p=f_p(ind) 145 rhodz=f_rhodz(ind) 146 theta_rhodz=f_theta_rhodz(ind) 147 pk=f_pk(ind) 148 phis=f_phis(ind) 149 CALL compute_en(ind,ue,p,rhodz,theta_rhodz,pk,phis) 150 END DO 151 152 END SUBROUTINE check_en 153 154 SUBROUTINE compute_en(ind,u,p,rhodz,theta_rhodz,pk,phis) 155 USE icosa 156 USE disvert_mod 157 USE wind_mod 158 IMPLICIT NONE 94 159 INTEGER,INTENT(IN)::ind 95 160 REAL(rstd),INTENT(IN) :: u(3*iim*jjm,llm) … … 110 175 111 176 112 DO l = 1, llm 113 DO j=jj_begin,jj_end 114 DO i=ii_begin,ii_end 115 ij=(j-1)*iim+i 116 masse(ij,l) = rhodz(ij,l)*Ai(ij) 117 theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l) 118 IF (domain(ind)%own(i,j)) THEN 119 stot = stot + Ai(ij)*theta_rhodz(ij,l) 120 END IF 121 END DO 122 END DO 123 END DO 124 125 DO l = 1, llm 126 DO j=jj_begin,jj_end 127 DO i=ii_begin,ii_end 128 ij=(j-1)*iim+i 129 IF (domain(ind)%own(i,j)) THEN 130 KE(ij,l)= 1/(4*Ai(ij))*(le(ij+u_right)*de(ij+u_right)*u(ij+u_right,l)**2 + & 131 le(ij+u_rup)*de(ij+u_rup)*u(ij+u_rup,l)**2 + & 132 le(ij+u_lup)*de(ij+u_lup)*u(ij+u_lup,l)**2 + & 133 le(ij+u_left)*de(ij+u_left)*u(ij+u_left,l)**2 + & 134 le(ij+u_ldown)*de(ij+u_ldown)*u(ij+u_ldown,l)**2 + & 135 le(ij+u_rdown)*de(ij+u_rdown)*u(ij+u_rdown,l)**2 ) 136 rmsv = rmsv + 2*masse(ij,l)*KE(ij,l) 137 END IF 138 END DO 139 END DO 140 END DO 141 142 DO l = 1, llm 143 DO j=jj_begin,jj_end 144 DO i=ii_begin,ii_end 145 ij=(j-1)*iim+i 146 IF (domain(ind)%own(i,j)) THEN 147 etot = etot + masse(ij,l)*(phis(ij)+theta(ij,l)*pk(ij,l)+KE(ij,l)) 148 END IF 149 END DO 177 DO l = 1, llm 178 DO j=jj_begin,jj_end 179 DO i=ii_begin,ii_end 180 ij=(j-1)*iim+i 181 masse(ij,l) = rhodz(ij,l)*Ai(ij) 182 theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l) 183 IF (domain(ind)%own(i,j)) THEN 184 stot = stot + Ai(ij)*theta_rhodz(ij,l) 185 END IF 150 186 END DO 151 END DO 187 END DO 188 END DO 189 190 DO l = 1, llm 191 DO j=jj_begin,jj_end 192 DO i=ii_begin,ii_end 193 ij=(j-1)*iim+i 194 IF (domain(ind)%own(i,j)) THEN 195 KE(ij,l)= 1/(4*Ai(ij))*(le(ij+u_right)*de(ij+u_right)*u(ij+u_right,l)**2 + & 196 le(ij+u_rup)*de(ij+u_rup)*u(ij+u_rup,l)**2 + & 197 le(ij+u_lup)*de(ij+u_lup)*u(ij+u_lup,l)**2 + & 198 le(ij+u_left)*de(ij+u_left)*u(ij+u_left,l)**2 + & 199 le(ij+u_ldown)*de(ij+u_ldown)*u(ij+u_ldown,l)**2 + & 200 le(ij+u_rdown)*de(ij+u_rdown)*u(ij+u_rdown,l)**2 ) 201 rmsv = rmsv + 2*masse(ij,l)*KE(ij,l) 202 END IF 203 END DO 204 END DO 205 END DO 206 207 DO l = 1, llm 208 DO j=jj_begin,jj_end 209 DO i=ii_begin,ii_end 210 ij=(j-1)*iim+i 211 IF (domain(ind)%own(i,j)) THEN 212 etot = etot + masse(ij,l)*(phis(ij)+theta(ij,l)*pk(ij,l)+KE(ij,l)) 213 END IF 214 END DO 215 END DO 216 END DO 152 217 153 218 !------------------------------ ANGULAR VELOCITY 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 219 CALL compute_wind_centered(u,ucenter) 220 CALL compute_wind_centered_lonlat_compound(ucenter,ulon,ulat) 221 rad = radius 222 radomeg = rad*omega 223 224 DO l = 1, llm 225 DO j=jj_begin,jj_end 226 DO i=ii_begin,ii_end 227 ij=(j-1)*iim+i 228 IF (domain(ind)%own(i,j)) THEN 229 CALL xyz2lonlat(xyz_i(ij,:),lon,lat) 230 ang=ang+rad*cos(lat)*masse(ij,l)*(ulon(ij,l)+ radomeg*cos(lat)) 231 END IF 232 END DO 233 END DO 234 END DO 170 235 171 END SUBROUTINE compute_en 172 173 !--------------------------------------------------------------------- 174 175 SUBROUTINE check_PV 176 USE icosa 177 IMPLICIT NONE 178 179 REAL(rstd), POINTER :: vort(:,:) 180 REAL(rstd), POINTER :: rhodz(:,:) 181 INTEGER :: ind 182 183 Do ind=1,ndomain 184 CALL swap_dimensions(ind) 185 CALL swap_geometry(ind) 186 vort=f_vort(ind) 187 rhodz=f_rhodz(ind) 188 CALL compute_PV(vort,rhodz) 189 ENDDO 236 END SUBROUTINE compute_en 237 238 !--------------------------------------------------------------------- 239 240 SUBROUTINE check_PV 241 USE icosa 242 IMPLICIT NONE 243 REAL(rstd), POINTER :: vort(:,:) 244 REAL(rstd), POINTER :: rhodz(:,:) 245 INTEGER :: ind 246 247 DO ind=1,ndomain 248 CALL swap_dimensions(ind) 249 CALL swap_geometry(ind) 250 vort=f_vort(ind) 251 rhodz=f_rhodz(ind) 252 CALL compute_PV(vort,rhodz) 253 ENDDO 190 254 191 192 193 194 195 196 255 END SUBROUTINE check_PV 256 257 SUBROUTINE compute_PV(vort,rhodz) 258 USE icosa 259 USE disvert_mod 260 IMPLICIT NONE 197 261 REAL(rstd),INTENT(IN) :: vort(2*iim*jjm,llm) 198 262 REAL(rstd),INTENT(IN) :: rhodz(iim*jjm,llm) … … 201 265 INTEGER :: i,j,ij,l,ij2 202 266 203 267 hv1 = 0.0 ; hv2 = 0.0 204 268 205 269 DO l = 1,llm 206 270 DO j=jj_begin+1,jj_end-1 207 DO i=ii_begin+1,ii_end-1 208 ij=(j-1)*iim+i 209 hv1 = Riv2(ij,vup) * rhodz(ij,l) & 210 + Riv2(ij+t_rup,vldown) * rhodz(ij+t_rup,l) & 211 + Riv2(ij+t_lup,vrdown) * rhodz(ij+t_lup,l) 212 213 qv1 = ( vort(ij+z_up,l)+fv(ij+z_up) )/hv1 214 215 hv2 = Riv2(ij,vdown) * rhodz(ij,l) & 216 + Riv2(ij+t_ldown,vrup) * rhodz(ij+t_ldown,l) & 217 + Riv2(ij+t_rdown,vlup) * rhodz(ij+t_rdown,l) 218 219 qv2 =( vort(ij+z_down,l)+fv(ij+z_down) )/hv2 220 221 ztot = ztot + (qv1*qv1*hv1 + qv2*qv2*hv2) 222 ENDDO 223 ENDDO 271 DO i=ii_begin+1,ii_end-1 272 ij=(j-1)*iim+i 273 hv1 = Riv2(ij,vup) * rhodz(ij,l) & 274 + Riv2(ij+t_rup,vldown) * rhodz(ij+t_rup,l) & 275 + Riv2(ij+t_lup,vrdown) * rhodz(ij+t_lup,l) 276 277 qv1 = ( vort(ij+z_up,l)+fv(ij+z_up) )/hv1 278 279 hv2 = Riv2(ij,vdown) * rhodz(ij,l) & 280 + Riv2(ij+t_ldown,vrup) * rhodz(ij+t_ldown,l) & 281 + Riv2(ij+t_rdown,vlup) * rhodz(ij+t_rdown,l) 282 283 qv2 =( vort(ij+z_down,l)+fv(ij+z_down) )/hv2 284 285 ztot = ztot + (qv1*qv1*hv1 + qv2*qv2*hv2) 286 224 287 ENDDO 225 END SUBROUTINE compute_PV 226 !--------------------------------------------------------------------- 227 228 SUBROUTINE compute_rhodz(p,rhodz) 229 USE icosa 230 IMPLICIT NONE 288 ENDDO 289 ENDDO 290 291 END SUBROUTINE compute_PV 292 !--------------------------------------------------------------------- 293 294 SUBROUTINE compute_rhodz(p,rhodz) 295 USE icosa 296 IMPLICIT NONE 231 297 REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 232 298 REAL(rstd),INTENT(OUT):: rhodz(iim*jjm,llm) … … 244 310 ENDDO 245 311 246 312 END SUBROUTINE compute_rhodz 247 313 !==================================================================== 248 314 249 SUBROUTINE compute_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it)250 USE icosa251 USE pression_mod252 USE vorticity_mod253 USE caldyn_gcm_mod254 USE exner_mod255 USE mpipara256 TYPE(t_field),POINTER :: f_ps(:)257 TYPE(t_field),POINTER :: f_dps(:)258 TYPE(t_field),POINTER :: f_ue(:)259 TYPE(t_field),POINTER :: f_theta_rhodz(:)260 TYPE(t_field),POINTER :: f_phis(:)261 INTEGER::it262 REAL(rstd),POINTER :: p(:,:),rhodz(:,:)263 INTEGER::ind264 265 etot=0.0; ang=0.0;stot=0.0;rmsv=0.0266 mtot=0.0 ; rmsdpdt=0.0 ; ztot = 0.0267 268 CALL allocate_check_conserve269 270 CALL pression(f_ps,f_p)271 272 Do ind=1,ndomain273 CALL swap_dimensions(ind)274 CALL swap_geometry(ind)275 p=f_p(ind)276 rhodz=f_rhodz(ind)277 CALL compute_rhodz(p,rhodz)278 END DO279 280 CALL vorticity(f_ue,f_vort)281 CALL check_mass_conserve(f_ps,f_dps)282 CALL check_PV283 CALL exner(f_ps,f_p,f_pks,f_pk)284 CALL check_EN(f_ue,f_theta_rhodz,f_phis)285 286 IF ( it == 0 ) Then287 ztot0 = ztot288 mtot0 = mtot289 etot0 = etot290 ang0 = ang291 stot0 = stot292 END IF293 294 rmsv=SQRT(rmsv/mtot)295 ztot=ztot/ztot0 ; mtot=mtot/mtot0296 etot=etot/etot0 ; ang=ang/ang0 ; stot=stot/stot0297 rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)298 299 300 IF (is_mpi_root) THEN301 OPEN(134,file="checkconsicosa.txt",position='append')302 write(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang303 write(134,*)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang304 write(134,*)"=================================================="305 write(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang306 307 4000 FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie' &308 ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB ' &309 ,f10.6,e13.6,5f10.3/)310 close(134)311 END IF312 END SUBROUTINE compute_conserve313 315 314 316 END MODULE check_conserve_mod -
codes/icosagcm/trunk/src/dimensions.f90
r12 r151 44 44 TYPE(t_domain),POINTER :: d 45 45 46 47 !$OMP MASTER 46 48 d=>domain(ind) 47 49 … … 79 81 u_pos(:)=d%u_pos(:) 80 82 z_pos(:)=d%z_pos(:) 81 83 84 !$OMP END MASTER 85 !$OMP BARRIER 82 86 END SUBROUTINE swap_dimensions 83 87 -
codes/icosagcm/trunk/src/dissip_gcm.f90
r149 r151 10 10 TYPE(t_field),POINTER,SAVE :: f_dtheta_diss(:) 11 11 TYPE(t_field),POINTER,SAVE :: f_dtheta_rhodz_diss(:) 12 12 TYPE(t_message) :: req_due, req_dtheta 13 13 14 14 INTEGER,SAVE :: nitergdiv=1 … … 29 29 ! INTEGER,SAVE :: itau_dissip 30 30 REAL,SAVE :: dtdissip 31 31 32 32 PUBLIC init_dissip, dissip 33 33 CONTAINS … … 57 57 USE mpi_mod 58 58 USE mpipara 59 USE transfert_mod 59 60 USE time_mod 60 61 … … 96 97 IF (is_mpi_root) PRINT *, 'Rayleigh friction : Schaer-like mountain with shear DCMIP2.2' 97 98 CASE DEFAULT 98 IF (is_mpi_root) PRINT *, 'Bad selector : rayleigh_friction_type =', TRIM(rayleigh_friction_key), & 99 ' in dissip_gcm.f90/init_dissip' 99 IF (is_mpi_root) PRINT *, 'Bad selector : rayleigh_friction_type =', TRIM(rayleigh_friction_key), ' in dissip_gcm.f90/init_dissip' 100 100 STOP 101 101 END SELECT … … 116 116 CALL allocate_field(f_theta,field_t,type_real) 117 117 CALL allocate_field(f_dtheta,field_t,type_real) 118 119 CALL init_message(f_due_diss1,req_e1_vect,req_due) 120 CALL init_message(f_dtheta_diss,req_i1,req_dtheta) 118 121 119 122 tau_graddiv(:)=5000 … … 135 138 136 139 CALL getin("niterdivgrad",niterdivgrad) 137 138 ! CALL create_request(field_u,req_dissip)139 140 ! DO ind=1,ndomain141 ! DO i=ii_begin,ii_end142 ! CALL request_add_point(ind,i,jj_begin-1,req_dissip,rup)143 ! CALL request_add_point(ind,i+1,jj_begin-1,req_dissip,lup)144 ! ENDDO145 146 ! DO j=jj_begin,jj_end147 ! CALL request_add_point(ind,ii_end+1,j,req_dissip,left)148 ! CALL request_add_point(ind,ii_end+1,j-1,req_dissip,lup)149 ! ENDDO150 !151 ! DO i=ii_begin,ii_end152 ! CALL request_add_point(ind,i,jj_end+1,req_dissip,ldown)153 ! CALL request_add_point(ind,i-1,jj_end+1,req_dissip,rdown)154 ! ENDDO155 156 ! DO j=jj_begin,jj_end157 ! CALL request_add_point(ind,ii_begin-1,j,req_dissip,right)158 ! CALL request_add_point(ind,ii_begin-1,j+1,req_dissip,rdown)159 ! ENDDO160 161 ! DO i=ii_begin+1,ii_end-1162 ! CALL request_add_point(ind,i,jj_begin,req_dissip,right)163 ! CALL request_add_point(ind,i,jj_end,req_dissip,right)164 ! ENDDO165 !166 ! DO j=jj_begin+1,jj_end-1167 ! CALL request_add_point(ind,ii_begin,j,req_dissip,rup)168 ! CALL request_add_point(ind,ii_end,j,req_dissip,rup)169 ! ENDDO170 171 ! CALL request_add_point(ind,ii_begin+1,jj_begin,req_dissip,left)172 ! CALL request_add_point(ind,ii_begin,jj_begin+1,req_dissip,ldown)173 ! CALL request_add_point(ind,ii_begin+1,jj_end,req_dissip,left)174 ! CALL request_add_point(ind,ii_end,jj_begin+1,req_dissip,ldown)175 !176 ! ENDDO177 140 178 141 … … 214 177 u=f_u(ind) 215 178 du=f_du(ind) 216 CALL compute_gradiv(u,du,1 )179 CALL compute_gradiv(u,du,1,1) 217 180 u=du 218 181 ENDDO … … 238 201 239 202 IF (using_mpi) THEN 240 203 CALL MPI_ALLREDUCE(dumax,dumax1,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 241 204 dumax=dumax1 242 205 ENDIF … … 291 254 u=f_u(ind) 292 255 du=f_du(ind) 293 CALL compute_gradrot(u,du,1 )256 CALL compute_gradrot(u,du,1,1) 294 257 u=du 295 258 ENDDO … … 362 325 theta=f_theta(ind) 363 326 dtheta=f_dtheta(ind) 364 CALL compute_divgrad(theta,dtheta,1 )327 CALL compute_divgrad(theta,dtheta,1,1) 365 328 theta=dtheta 366 329 ENDDO 367 330 ENDDO 368 ! CALL writefield("divgrad",f_dtheta)369 331 370 332 CALL transfert_request(f_dtheta,req_i1) … … 398 360 ENDDO 399 361 400 ! CALL writefield("divgrad",f_dtheta)401 362 IF (is_mpi_root) PRINT *,"divgrad : divgrad",dthetamax 402 363 403 364 cdivgrad=dthetamax**(-1./niterdivgrad) 404 365 IF (is_mpi_root) PRINT *,"cdivgrad : ",cdivgrad 405 406 407 408 409 410 366 411 367 … … 442 398 USE trace 443 399 USE time_mod 400 USE omp_para 444 401 IMPLICIT NONE 445 402 TYPE(t_field),POINTER :: f_ue(:) … … 458 415 INTEGER :: ind, shear 459 416 INTEGER :: l,i,j,n 417 418 !$OMP BARRIER 460 419 461 420 CALL trace_start("dissip") 462 421 CALL gradiv(f_ue,f_due_diss1) 463 422 CALL gradrot(f_ue,f_due_diss2) 464 CALL theta_rhodz2theta(f_ps,f_theta_rhodz,f_theta)465 CALL divgrad (f_theta,f_dtheta_diss)466 CALL theta2theta_rhodz(f_ps,f_dtheta_diss,f_dtheta_rhodz_diss)467 468 IF(rayleigh_friction_type>0) THEN469 CALL pression(f_ps, f_p)470 CALL exner(f_ps, f_p, f_pks, f_pk)471 CALL geopotential(f_phis,f_pks,f_pk,f_theta,f_phi)472 END IF423 424 CALL divgrad_theta_rhodz(f_ps,f_theta_rhodz,f_dtheta_rhodz_diss) 425 426 ! later for openmp 427 ! IF(rayleigh_friction_type>0) THEN 428 ! CALL pression(f_ps, f_p) 429 ! CALL exner(f_ps, f_p, f_pks, f_pk) 430 ! CALL geopotential(f_phis,f_pks,f_pk,f_theta,f_phi) 431 ! END IF 473 432 474 433 DO ind=1,ndomain … … 480 439 dtheta_rhodz=f_dtheta_rhodz(ind) 481 440 dtheta_rhodz_diss=f_dtheta_rhodz_diss(ind) 482 483 DO l= 1,llm441 442 DO l=ll_begin,ll_end 484 443 DO j=jj_begin,jj_end 485 444 DO i=ii_begin,ii_end … … 495 454 ENDDO 496 455 497 IF(rayleigh_friction_type>0) THEN 498 phi=f_phi(ind) 499 ue=f_ue(ind) 500 DO l=1,llm 501 DO j=jj_begin,jj_end 502 DO i=ii_begin,ii_end 503 n=(j-1)*iim+i 504 CALL relax(t_right, u_right) 505 CALL relax(t_lup, u_lup) 506 CALL relax(t_ldown, u_ldown) 507 ENDDO 508 ENDDO 509 END DO 510 END IF 456 ! dtheta_rhodz=0 457 ! due=0 458 459 ! later for openmp 460 ! IF(rayleigh_friction_type>0) THEN 461 ! phi=f_phi(ind) 462 ! ue=f_ue(ind) 463 ! DO l=1,llm 464 ! DO j=jj_begin,jj_end 465 ! DO i=ii_begin,ii_end 466 ! n=(j-1)*iim+i 467 ! CALL relax(t_right, u_right) 468 ! CALL relax(t_lup, u_lup) 469 ! CALL relax(t_ldown, u_ldown) 470 ! ENDDO 471 ! ENDDO 472 ! END DO 473 ! END IF 511 474 END DO 512 475 513 476 CALL trace_end("dissip") 477 478 !$OMP BARRIER 514 479 515 480 CONTAINS … … 524 489 z = (phi(n,l)+phi(n+shift_t,l))/(2.*g) 525 490 IF(z>zh) THEN ! relax only in the sponge layer z>zh 526 ! PRINT *, 'z>zh : z,zh,l',z,zh,l 527 ! STOP 491 528 492 nn = n+shift_u 529 493 CALL xyz2lonlat(xyz_e(nn,:),lon,lat) … … 548 512 USE icosa 549 513 USE trace 514 USE omp_para 550 515 IMPLICIT NONE 551 516 TYPE(t_field),POINTER :: f_ue(:) … … 554 519 REAL(rstd),POINTER :: due(:,:) 555 520 INTEGER :: ind 556 INTEGER :: it 521 INTEGER :: it,i,j,l,ij 557 522 558 523 CALL trace_start("gradiv") … … 563 528 ue=f_ue(ind) 564 529 due=f_due(ind) 565 due=ue 530 DO l = ll_begin, ll_end 531 DO j=jj_begin,jj_end 532 DO i=ii_begin,ii_end 533 ij=(j-1)*iim+i 534 due(ij+u_right,l)=ue(ij+u_right,l) 535 due(ij+u_lup,l)=ue(ij+u_lup,l) 536 due(ij+u_ldown,l)=ue(ij+u_ldown,l) 537 ENDDO 538 ENDDO 539 ENDDO 566 540 ENDDO 567 541 568 542 DO it=1,nitergdiv 569 543 570 CALL transfert_request(f_due,req_e1_vect) 544 CALL send_message(f_due,req_due) 545 CALL wait_message(req_due) 571 546 572 547 DO ind=1,ndomain … … 574 549 CALL swap_geometry(ind) 575 550 due=f_due(ind) 576 CALL compute_gradiv(due,due,ll m)551 CALL compute_gradiv(due,due,ll_begin,ll_end) 577 552 ENDDO 578 553 ENDDO … … 586 561 USE icosa 587 562 USE trace 563 USE omp_para 588 564 IMPLICIT NONE 589 565 TYPE(t_field),POINTER :: f_ue(:) … … 592 568 REAL(rstd),POINTER :: due(:,:) 593 569 INTEGER :: ind 594 INTEGER :: it 570 INTEGER :: it,i,j,l,ij 595 571 596 572 CALL trace_start("gradrot") … … 601 577 ue=f_ue(ind) 602 578 due=f_due(ind) 603 due=ue 579 DO l = ll_begin, ll_end 580 DO j=jj_begin,jj_end 581 DO i=ii_begin,ii_end 582 ij=(j-1)*iim+i 583 due(ij+u_right,l)=ue(ij+u_right,l) 584 due(ij+u_lup,l)=ue(ij+u_lup,l) 585 due(ij+u_ldown,l)=ue(ij+u_ldown,l) 586 ENDDO 587 ENDDO 588 ENDDO 604 589 ENDDO 605 590 606 591 DO it=1,nitergrot 607 592 608 CALL transfert_request(f_due,req_e1_vect) 593 CALL send_message(f_due,req_due) 594 CALL wait_message(req_due) 609 595 610 596 DO ind=1,ndomain … … 612 598 CALL swap_geometry(ind) 613 599 due=f_due(ind) 614 CALL compute_gradrot(due,due,ll m)600 CALL compute_gradrot(due,due,ll_begin,ll_end) 615 601 ENDDO 616 602 … … 624 610 USE icosa 625 611 USE trace 612 USE omp_para 626 613 IMPLICIT NONE 627 614 TYPE(t_field),POINTER :: f_theta(:) … … 650 637 CALL swap_geometry(ind) 651 638 dtheta=f_dtheta(ind) 652 CALL compute_divgrad(dtheta,dtheta,ll m)639 CALL compute_divgrad(dtheta,dtheta,ll_begin,ll_end) 653 640 ENDDO 654 641 … … 659 646 END SUBROUTINE divgrad 660 647 661 662 663 ! SUBROUTINE compute_dissip(ue,due,ps,theta_rhodz,dtheta_rhodz) 664 ! USE icosa 665 ! USE theta2theta_rhodz_mod 666 ! IMPLICIT NONE 667 ! REAL(rstd) :: ue(3*iim*jjm,llm) 668 ! REAL(rstd) :: due(3*iim*jjm,llm) 669 ! REAL(rstd) :: ps(iim*jjm) 670 ! REAL(rstd) :: theta_rhodz(iim*jjm,llm) 671 ! REAL(rstd) :: dtheta_rhodz(iim*jjm,llm) 672 ! 673 ! REAL(rstd),SAVE,ALLOCATABLE :: theta(:,:) 674 ! REAL(rstd),SAVE,ALLOCATABLE :: du_dissip(:,:) 675 ! REAL(rstd),SAVE,ALLOCATABLE :: dtheta_dissip(:,:) 676 ! REAL(rstd),SAVE,ALLOCATABLE :: dtheta_rhodz_dissip(:,:) 677 ! 678 ! INTEGER :: ind 679 ! INTEGER :: l,i,j,n 680 ! 681 !!$OMP BARRIER 682 !!$OMP MASTER 683 ! ALLOCATE(theta(iim*jjm,llm)) 684 ! ALLOCATE(du_dissip(3*iim*jjm,llm)) 685 ! ALLOCATE(dtheta_dissip(iim*jjm,llm)) 686 ! ALLOCATE(dtheta_rhodz_dissip(iim*jjm,llm)) 687 !!$OMP END MASTER 688 !!$OMP BARRIER 689 ! 690 ! CALL gradiv(ue,du_dissip,llm) 691 ! DO l=1,llm 692 !!$OMP DO 693 ! DO j=jj_begin,jj_end 694 ! DO i=ii_begin,ii_end 695 ! n=(j-1)*iim+i 696 ! due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_graddiv(l)*0.5 697 ! due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_graddiv(l)*0.5 698 ! due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_graddiv(l)*0.5 699 ! ENDDO 700 ! ENDDO 701 ! ENDDO 702 ! 703 ! CALL gradrot(ue,du_dissip,llm) 704 ! 705 ! DO l=1,llm 706 !!$OMP DO 707 ! DO j=jj_begin,jj_end 708 ! DO i=ii_begin,ii_end 709 ! n=(j-1)*iim+i 710 ! due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_gradrot(l)*0.5 711 ! due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_gradrot(l)*0.5 712 ! due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_gradrot(l)*0.5 713 ! ENDDO 714 ! ENDDO 715 ! ENDDO 716 ! 717 ! CALL compute_theta_rhodz2theta(ps,theta_rhodz,theta,1) 718 ! CALL divgrad(theta,dtheta_dissip,llm) 719 ! CALL compute_theta2theta_rhodz(ps,dtheta_dissip,dtheta_rhodz_dissip,0) 720 ! 721 ! DO l=1,llm 722 !!$OMP DO 723 ! DO j=jj_begin,jj_end 724 ! DO i=ii_begin,ii_end 725 ! n=(j-1)*iim+i 726 ! dtheta_rhodz(n,l)=dtheta_rhodz(n,l)+dtheta_rhodz_dissip(n,l)/tau_divgrad(l)*0.5 727 ! ENDDO 728 ! ENDDO 729 ! ENDDO 730 ! 731 !!$OMP BARRIER 732 !!$OMP MASTER 733 ! DEALLOCATE(theta) 734 ! DEALLOCATE(du_dissip) 735 ! DEALLOCATE(dtheta_dissip) 736 ! DEALLOCATE(dtheta_rhodz_dissip) 737 !!$OMP END MASTER 738 !!$OMP BARRIER 739 ! 740 ! END SUBROUTINE compute_dissip 741 742 743 SUBROUTINE compute_gradiv(ue,gradivu_e,ll) 744 USE icosa 648 SUBROUTINE divgrad_theta_rhodz(f_ps,f_theta_rhodz,f_dtheta_rhodz) 649 USE icosa 650 USE trace 651 USE omp_para 652 USE disvert_mod 745 653 IMPLICIT NONE 746 INTEGER,INTENT(IN) :: ll 747 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,ll) 748 REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,ll) 749 REAL(rstd) :: divu_i(iim*jjm,ll) 654 TYPE(t_field),POINTER :: f_ps(:) 655 TYPE(t_field),POINTER :: f_theta_rhodz(:) 656 TYPE(t_field),POINTER :: f_dtheta_rhodz(:) 657 658 REAL(rstd),POINTER :: ps(:) 659 REAL(rstd),POINTER :: theta_rhodz(:,:) 660 REAL(rstd),POINTER :: dtheta_rhodz(:,:) 661 662 INTEGER :: ind 663 INTEGER :: it,i,j,l,ij 664 665 CALL trace_start("divgrad") 666 667 DO ind=1,ndomain 668 CALL swap_dimensions(ind) 669 CALL swap_geometry(ind) 670 ps=f_ps(ind) 671 theta_rhodz=f_theta_rhodz(ind) 672 dtheta_rhodz=f_dtheta_rhodz(ind) 673 DO l = ll_begin, ll_end 674 DO j=jj_begin,jj_end 675 DO i=ii_begin,ii_end 676 ij=(j-1)*iim+i 677 dtheta_rhodz(ij,l) = theta_rhodz(ij,l) / ( ap(l)-ap(l+1) + (bp(l)-bp(l+1))*ps(ij))/g 678 ENDDO 679 ENDDO 680 ENDDO 681 ENDDO 682 683 DO it=1,niterdivgrad 684 685 CALL send_message(f_dtheta_rhodz,req_dtheta) 686 CALL wait_message(req_dtheta) 687 DO ind=1,ndomain 688 CALL swap_dimensions(ind) 689 CALL swap_geometry(ind) 690 dtheta_rhodz=f_dtheta_rhodz(ind) 691 CALL compute_divgrad(dtheta_rhodz,dtheta_rhodz,ll_begin,ll_end) 692 ENDDO 693 694 ENDDO 695 696 DO ind=1,ndomain 697 CALL swap_dimensions(ind) 698 CALL swap_geometry(ind) 699 dtheta_rhodz=f_dtheta_rhodz(ind) 700 701 DO l = ll_begin, ll_end 702 DO j=jj_begin,jj_end 703 DO i=ii_begin,ii_end 704 ij=(j-1)*iim+i 705 dtheta_rhodz(ij,l) = dtheta_rhodz(ij,l) * ( ap(l)-ap(l+1) + (bp(l)-bp(l+1))*ps(ij))/g 706 ENDDO 707 ENDDO 708 ENDDO 709 ENDDO 710 711 712 CALL trace_end("divgrad") 713 714 END SUBROUTINE divgrad_theta_rhodz 715 716 SUBROUTINE compute_gradiv(ue,gradivu_e,llb,lle) 717 USE icosa 718 IMPLICIT NONE 719 INTEGER,INTENT(IN) :: llb 720 INTEGER,INTENT(IN) :: lle 721 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,llm) 722 REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,llm) 723 REAL(rstd) :: divu_i(iim*jjm,llb:lle) 750 724 751 725 INTEGER :: i,j,n,l 752 726 753 DO l= 1,ll727 DO l=llb,lle 754 728 DO j=jj_begin,jj_end 755 729 DO i=ii_begin,ii_end … … 765 739 ENDDO 766 740 767 DO l= 1,ll741 DO l=llb,lle 768 742 DO j=jj_begin,jj_end 769 743 DO i=ii_begin,ii_end … … 781 755 ENDDO 782 756 783 DO l= 1,ll757 DO l=llb,lle 784 758 DO j=jj_begin,jj_end 785 759 DO i=ii_begin,ii_end … … 795 769 END SUBROUTINE compute_gradiv 796 770 797 SUBROUTINE compute_divgrad(theta,divgrad_i,ll )771 SUBROUTINE compute_divgrad(theta,divgrad_i,llb,lle) 798 772 USE icosa 799 773 IMPLICIT NONE 800 INTEGER,INTENT(IN) :: ll 801 REAL(rstd),INTENT(IN) :: theta(iim*jjm,ll) 802 REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,ll) 803 REAL(rstd) :: grad_e(3*iim*jjm,ll) 774 INTEGER,INTENT(IN) :: llb 775 INTEGER,INTENT(IN) :: lle 776 REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm) 777 REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,llm) 778 REAL(rstd) :: grad_e(3*iim*jjm,llb:lle) 804 779 805 780 INTEGER :: i,j,n,l 806 781 807 782 808 DO l= 1,ll783 DO l=llb,lle 809 784 DO j=jj_begin-1,jj_end+1 810 785 DO i=ii_begin-1,ii_end+1 … … 823 798 824 799 825 DO l= 1,ll800 DO l=llb,lle 826 801 DO j=jj_begin,jj_end 827 802 DO i=ii_begin,ii_end … … 837 812 ENDDO 838 813 839 DO l= 1,ll814 DO l=llb,lle 840 815 DO j=jj_begin,jj_end 841 816 DO i=ii_begin,ii_end … … 849 824 850 825 851 SUBROUTINE compute_gradrot(ue,gradrot_e,ll )826 SUBROUTINE compute_gradrot(ue,gradrot_e,llb,lle) 852 827 USE icosa 853 828 IMPLICIT NONE 854 INTEGER,INTENT(IN) :: ll 855 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,ll) 856 REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,ll) 857 REAL(rstd) :: rot_v(2*iim*jjm,ll) 829 INTEGER,INTENT(IN) :: llb 830 INTEGER,INTENT(IN) :: lle 831 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,llm) 832 REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,llm) 833 REAL(rstd) :: rot_v(2*iim*jjm,llb:lle) 858 834 859 835 INTEGER :: i,j,n,l 860 836 861 DO l= 1,ll837 DO l=llb,lle 862 838 DO j=jj_begin-1,jj_end+1 863 839 DO i=ii_begin-1,ii_end+1 … … 876 852 ENDDO 877 853 878 DO l= 1,ll854 DO l=llb,lle 879 855 DO j=jj_begin,jj_end 880 856 DO i=ii_begin,ii_end … … 891 867 ENDDO 892 868 893 DO l= 1,ll869 DO l=llb,lle 894 870 DO j=jj_begin,jj_end 895 871 DO i=ii_begin,ii_end -
codes/icosagcm/trunk/src/domain.f90
r149 r151 71 71 SUBROUTINE create_domain 72 72 USE grid_param 73 USE mpipara 73 74 IMPLICIT NONE 74 75 INTEGER :: ind,nf,ni,nj,i,j … … 98 99 d%ii_end_glo=d%ii_begin_glo+d%ii_nb-1 99 100 100 IF (ni/= nsplit_i) THEN101 IF (ni/=1) THEN 101 102 d%ii_nb=d%ii_nb+1 102 d%ii_ end_glo=d%ii_end_glo+1103 d%ii_begin_glo=d%ii_begin_glo-1 103 104 ENDIF 104 105 … … 115 116 d%jj_end_glo=d%jj_begin_glo+d%jj_nb-1 116 117 117 IF (nj/= nsplit_j) THEN118 IF (nj/=1) THEN 118 119 d%jj_nb=d%jj_nb+1 119 d%jj_ end_glo=d%jj_end_glo+1120 d%jj_begin_glo=d%jj_begin_glo-1 120 121 ENDIF 121 122 … … 142 143 ALLOCATE(d%own(d%iim,d%jjm)) 143 144 ALLOCATE(d%ne(0:5,d%iim,d%jjm)) 145 146 IF (is_mpi_root) PRINT *,"Domain ",ind," : size ",d%ii_nb,"x",d%jj_nb 147 144 148 END DO 145 149 END DO … … 261 265 d%neighbour(:,k,i,j)=cell_glo(ind2)%xyz(:) 262 266 263 ! d%ne(k,i,j)=vertex_glo(ii,jj,nf)%ne(k)264 267 d%ne(k,i,j)=1-2*MOD(k,2) 265 268 … … 298 301 edge_glo(e)%assign_pos=k 299 302 edge_glo(e)%assign_delta=delta 300 ! PRINT*,"Assign_edge",ind_d,ind,i,j,k,e 303 301 304 END SUBROUTINE assign_edge 302 305 -
codes/icosagcm/trunk/src/dynetat0_gcm_mod.f90
r149 r151 18 18 CONTAINS 19 19 20 20 SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q) 21 21 USE icosa 22 USE caldyn_mod23 22 USE write_field 24 23 USE maxicosa … … 98 97 !---------------------------------------------------- 99 98 !------------- OUTPUT OF Variables 100 CALL un2ulonlat(f_u,f_buf_i3,f_buf1_i,f_buf2_i)101 CALL writefield("buf1",f_buf1_i)102 99 END SUBROUTINE etat0 103 100 -
codes/icosagcm/trunk/src/dynetat0_hz_mod.f90
r149 r151 2 2 USE genmod 3 3 USE icosa 4 USE caldyn_gcm_mod5 4 IMPLICIT NONE 6 5 PRIVATE … … 23 22 USE write_field 24 23 USE maxicosa 24 USE wind_mod 25 25 IMPLICIT NONE 26 26 TYPE(t_domain),POINTER :: d … … 97 97 ENDDO 98 98 !------------- OUTPUT OF Variables 99 CALL un2ulonlat(f_u,f_buf _i3,f_buf1_i,f_buf2_i)99 CALL un2ulonlat(f_u,f_buf1_i,f_buf2_i) 100 100 CALL writefield("buf1",f_buf1_i) 101 101 END SUBROUTINE etat0 -
codes/icosagcm/trunk/src/exner.f90
r133 r151 50 50 51 51 ! for llm layer 52 !$OMP DO53 52 DO j=jj_begin-offset,jj_end+offset 54 53 DO i=ii_begin-offset,ii_end+offset … … 61 60 ! for other layer 62 61 DO l = llm-1 , 2 , -1 63 !$OMP DO64 62 DO j=jj_begin-offset,jj_end+offset 65 63 DO i=ii_begin-offset,ii_end+offset … … 75 73 76 74 ! for first layer 77 !$OMP DO78 75 DO j=jj_begin-offset,jj_end+offset 79 76 DO i=ii_begin-offset,ii_end+offset … … 88 85 89 86 DO l = 2, llm 90 !$OMP DO91 87 DO j=jj_begin-offset,jj_end+offset 92 88 DO i=ii_begin-offset,ii_end+offset … … 99 95 ELSE ! Simple calculation of Exner pressure based on centered average 100 96 ! surface : pks 101 !$OMP DO102 97 DO j=jj_begin-offset,jj_end+offset 103 98 DO i=ii_begin-offset,ii_end+offset … … 109 104 ! 3D : pk 110 105 DO l = 1, llm 111 !$OMP DO112 106 DO j=jj_begin-offset,jj_end+offset 113 107 DO i=ii_begin-offset,ii_end+offset -
codes/icosagcm/trunk/src/geometry.f90
r146 r151 91 91 IMPLICIT NONE 92 92 INTEGER,INTENT(IN) :: ind 93 !$OMP MASTER 93 94 Ai=geom%Ai(ind) 94 95 xyz_i=geom%xyz_i(ind) … … 111 112 bi=geom%bi(ind) 112 113 fv=geom%fv(ind) 113 114 !$OMP END MASTER 115 !$OMP BARRIER 114 116 END SUBROUTINE swap_geometry 115 117 … … 213 215 ENDDO 214 216 ENDDO 215 ! i=ii_begin ; j=jj_begin ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j)216 ! i=ii_begin ; j=jj_end ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j)217 ! i=ii_end ; j=jj_begin ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j)218 ! PRINT *,"Pb ?? : "219 ! PRINT *, xyz_i(n,:), domain(ind)%xyz(:,i,j), norm(xyz_i(n,:)- domain(ind)%xyz(:,i,j))220 ! i=ii_end ; j=jj_end ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j)221 217 222 218 ENDDO 223 219 224 220 IF (check) THEN 225 ! sum=sum/(ndomain*ii_nb*jj_nb)226 221 PRINT *,"it = ",it," diff centroid circumcenter ",sum 227 222 ENDIF … … 287 282 ne(n,k+1)=d%ne(k,i,j) 288 283 ENDDO 289 290 ! xyz_i(n,:)=d%xyz(:,i,j)291 ! xyz_v(n+z_up,:)=d%vertex(:,vup-1,i,j)292 ! xyz_v(n+z_down,:)=d%vertex(:,vdown-1,i,j)293 284 294 285 vect(:,1)=xyz_v(n+z_rup,:) … … 309 300 bi(n)=0. 310 301 311 ! CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,right-1,i,j),de(n+u_right))312 ! CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,lup-1,i,j),de(n+u_lup))313 ! CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,ldown-1,i,j),de(n+u_ldown))314 315 302 CALL dist_cart(xyz_i(n,:),xyz_i(n+t_right,:),de(n+u_right)) 316 303 CALL dist_cart(xyz_i(n,:),xyz_i(n+t_lup,:),de(n+u_lup)) 317 304 CALL dist_cart(xyz_i(n,:),xyz_i(n+t_ldown,:),de(n+u_ldown)) 318 305 319 ! CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,right-1,i,j),0.5,xyz_e(n+u_right,:))320 ! CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,lup-1,i,j),0.5,xyz_e(n+u_lup,:))321 ! CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,ldown-1,i,j),0.5,xyz_e(n+u_ldown,:))322 323 306 CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_right,:),0.5,xyz_e(n+u_right,:)) 324 307 CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_lup,:),0.5,xyz_e(n+u_lup,:)) 325 308 CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_ldown,:),0.5,xyz_e(n+u_ldown,:)) 326 327 ! CALL dist_cart(d%vertex(:,vrdown-1,i,j),d%vertex(:,vrup-1,i,j),le(n+u_right))328 ! CALL dist_cart(d%vertex(:,vup-1,i,j),d%vertex(:,vlup-1,i,j),le(n+u_lup))329 ! CALL dist_cart(d%vertex(:,vldown-1,i,j),d%vertex(:,vdown-1,i,j),le(n+u_ldown))330 309 331 310 CALL dist_cart(xyz_v(n+z_rdown,:), xyz_v(n+z_rup,:),le(n+u_right)) … … 335 314 Ai(n)=0 336 315 DO k=0,5 337 ! CALL surf_triangle(d%xyz(:,i,j),d%neighbour(:,k,i,j),d%neighbour(:,MOD((k+1+6),6),i,j),surf_v(k+1))338 ! CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,MOD((k-1+6),6),i,j),d%vertex(:,k,i,j),surf(k+1))339 316 CALL surf_triangle(xyz_i(n,:),xyz_i(n+t_pos(k+1),:),xyz_i(n+t_pos(MOD((k+1+6),6)+1),:),surf_v(k+1)) 340 317 CALL surf_triangle(xyz_i(n,:),xyz_v(n+z_pos(MOD((k-1+6),6)+1),:),xyz_v(n+z_pos(k+1),:),surf(k+1)) … … 414 391 415 392 DO k=0,5 416 ! CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,k,i,j),d%neighbour(:,k,i,j),S1)417 ! CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,k,i,j),d%neighbour(:,MOD(k+1+6,6),i,j),S2)418 393 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(k+1),:),S1) 419 394 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(MOD(k+1+6,6)+1),:),S2) … … 516 491 CALL transfert_request(geom%centroid,req_i1) 517 492 CALL surf_triangle(d%xyz(:,ii_begin,jj_begin),d%xyz(:,ii_begin,jj_end),d%xyz(:,ii_end,jj_begin),S) 518 ! PRINT *,"Surf triangle : ",S*20/(4*Pi) 519 493 520 494 END SUBROUTINE set_geometry 521 495 -
codes/icosagcm/trunk/src/icosa_gcm.f90
r149 r151 6 6 USE wind_mod 7 7 USE mpipara 8 USE omp_para 8 9 USE vertical_interp_mod 10 USE trace 9 11 IMPLICIT NONE 10 12 … … 21 23 CALL init_earth_const 22 24 CALL init_grid_param 25 CALL init_omp_para 23 26 CALL compute_metric 24 27 CALL compute_domain 25 28 CALL init_transfert 26 29 CALL init_writefield 30 CALL init_trace 27 31 28 ! CALL allocate_field(sum_ne,field_T,type_real)29 ! CALL allocate_field_glo(sum_ne_glo,field_T,type_real)30 !31 ! DO ind=1,ndomain32 ! CALL swap_dimensions(ind)33 ! pt_sum_ne=sum_ne(ind)34 ! DO j=jj_begin,jj_end35 ! DO i=ii_begin,ii_end36 ! n=(j-1)*iim+i37 ! pt_sum_ne(n)=domloc_glo_ind(ind)38 ! ENDDO39 ! ENDDO40 ! ENDDO41 42 ! CALL WriteField("domain",sum_ne)43 ! CALL WriteField_mpi("domain",sum_ne)44 ! CALL transfert_request(sum_ne,req_i1)45 ! CALL WriteField_mpi("domain",sum_ne)46 ! CALL close_files47 ! CALL finalize_mpipara48 ! STOP49 32 50 33 CALL compute_geometry … … 80 63 81 64 CALL WriteField("Ai",geom%Ai) 82 ! CALL WriteField("sum_ne",sum_ne) 65 83 66 IF (is_mpi_root) CALL write_apbp 84 67 CALL init_time 68 69 CALL init_timeloop 70 71 !$OMP PARALLEL 85 72 CALL timeloop 73 !$OMP END PARALLEL 86 74 87 75 CALL close_files -
codes/icosagcm/trunk/src/mpi_mod.F90
r118 r151 11 11 INTEGER :: MPI_INFO_NULL 12 12 INTEGER :: MPI_STATUS_SIZE 13 INTEGER,PARAMETER :: MPI_ADDRESS_KIND=KIND(INTEGER) 13 14 #endif 14 15 … … 40 41 END 41 42 43 SUBROUTINE MPI_ISSEND 44 END 45 42 46 SUBROUTINE MPI_IRECV 43 47 END 44 48 45 49 SUBROUTINE MPI_WAITALL 50 END 51 52 SUBROUTINE MPI_TESTALL 46 53 END 47 54 … … 51 58 SUBROUTINE MPI_ALLGATHER 52 59 END 60 61 SUBROUTINE MPI_TYPE_EXTENT 62 END 63 64 SUBROUTINE MPI_ALLOC_MEM 65 END 53 66 54 67 #endif -
codes/icosagcm/trunk/src/mpipara.F90
r118 r151 8 8 LOGICAL,SAVE :: using_mpi 9 9 LOGICAL,SAVE :: is_mpi_root 10 11 INTERFACE allocate_mpi_buffer 12 MODULE PROCEDURE allocate_mpi_buffer_r2, allocate_mpi_buffer_r3,allocate_mpi_buffer_r4 13 END INTERFACE allocate_mpi_buffer 10 14 11 15 CONTAINS … … 48 52 END SUBROUTINE finalize_mpipara 49 53 54 55 SUBROUTINE allocate_mpi_buffer_r2(buffer,length) 56 USE ISO_C_BINDING 57 USE mpi_mod 58 USE prec 59 IMPLICIT NONE 60 REAL(rstd), POINTER :: buffer(:) 61 INTEGER,INTENT(IN) :: length 62 63 TYPE(C_PTR) :: base_ptr 64 INTEGER(KIND=MPI_ADDRESS_KIND) :: size 65 INTEGER :: real_size,ierr 66 67 CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 68 size=length*real_size 69 70 CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 71 CALL C_F_POINTER(base_ptr, buffer, (/ length /)) 72 73 END SUBROUTINE allocate_mpi_buffer_r2 74 75 SUBROUTINE allocate_mpi_buffer_r3(buffer,length,dim3) 76 USE ISO_C_BINDING 77 USE mpi_mod 78 USE prec 79 IMPLICIT NONE 80 REAL(rstd), POINTER :: buffer(:,:) 81 INTEGER,INTENT(IN) :: length 82 INTEGER,INTENT(IN) :: dim3 83 84 TYPE(C_PTR) :: base_ptr 85 INTEGER(KIND=MPI_ADDRESS_KIND) :: size 86 INTEGER :: real_size,ierr 87 88 CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 89 size=length*real_size*dim3 90 91 CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 92 CALL C_F_POINTER(base_ptr, buffer, (/ length,dim3 /)) 93 94 END SUBROUTINE allocate_mpi_buffer_r3 95 96 SUBROUTINE allocate_mpi_buffer_r4(buffer,length,dim3,dim4) 97 USE ISO_C_BINDING 98 USE mpi_mod 99 USE prec 100 IMPLICIT NONE 101 REAL(rstd), POINTER :: buffer(:,:,:) 102 INTEGER,INTENT(IN) :: length 103 INTEGER,INTENT(IN) :: dim3 104 INTEGER,INTENT(IN) :: dim4 105 106 TYPE(C_PTR) :: base_ptr 107 INTEGER(KIND=MPI_ADDRESS_KIND) :: size 108 INTEGER :: real_size,ierr 109 110 CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 111 size=length*real_size*dim3*dim4 112 113 CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 114 CALL C_F_POINTER(base_ptr, buffer, (/ length, dim3, dim4 /)) 115 116 END SUBROUTINE allocate_mpi_buffer_r4 50 117 51 118 END MODULE mpipara -
codes/icosagcm/trunk/src/pression.f90
r19 r151 33 33 34 34 DO l = 1, llm+1 35 !$OMP DO36 35 DO j=jj_begin-offset,jj_end+offset 37 36 DO i=ii_begin-offset,ii_end+offset -
codes/icosagcm/trunk/src/theta_rhodz.f90
r35 r151 83 83 REAL(rstd),ALLOCATABLE,SAVE :: p(:,:) 84 84 85 !$OMP BARRIER 86 !$OMP MASTER 87 ALLOCATE( p(iim*jjm,llm+1)) 88 !$OMP END MASTER 89 !$OMP BARRIER 90 85 ALLOCATE( p(iim*jjm,llm+1)) 91 86 CALL compute_pression(ps,p,offset) 92 87 93 88 DO l = 1, llm 94 !$OMP DO95 89 DO j=jj_begin-offset,jj_end+offset 96 90 DO i=ii_begin-offset,ii_end+offset … … 101 95 ENDDO 102 96 103 !$OMP BARRIER 104 !$OMP MASTER 105 DEALLOCATE( p) 106 !$OMP END MASTER 107 !$OMP BARRIER 97 DEALLOCATE( p) 108 98 109 99 END SUBROUTINE compute_theta2theta_rhodz … … 120 110 REAL(rstd),SAVE,ALLOCATABLE :: p(:,:) 121 111 122 !$OMP BARRIER 123 !$OMP MASTER 124 ALLOCATE( p(iim*jjm,llm+1)) 125 !$OMP END MASTER 126 !$OMP BARRIER 112 ALLOCATE( p(iim*jjm,llm+1)) 113 127 114 CALL compute_pression(ps,p,offset) 128 115 … … 136 123 ENDDO 137 124 138 !$OMP BARRIER 139 !$OMP MASTER 140 DEALLOCATE( p) 141 !$OMP END MASTER 142 !$OMP BARRIER 125 DEALLOCATE( p) 143 126 144 127 END SUBROUTINE compute_theta_rhodz2theta … … 193 176 DO i=ii_begin-offset,ii_end+offset 194 177 ij=(j-1)*iim+i 195 ! temp(ij,l) = ( theta_rhodz(ij,l) / ((p(ij,l)-p(ij,l+1))/g) ) * pk(ij,l) / cpp196 178 theta_rhodz(ij,l) = temp(ij,l) * ((p(ij,l)-p(ij,l+1))/g) / (pk(ij,l) / cpp ) 197 179 ENDDO -
codes/icosagcm/trunk/src/time.f90
r149 r151 119 119 INTEGER :: status 120 120 REAL(rstd) ::time_array(1) 121 122 !$OMP MASTER 121 123 time_array(1)=time 122 124 … … 126 128 status=NF90_SYNC(ncid) 127 129 ENDIF 130 !$OMP END MASTER 128 131 129 132 END SUBROUTINE update_time_counter -
codes/icosagcm/trunk/src/timeloop_gcm.f90
r149 r151 1 1 MODULE timeloop_gcm_mod 2 2 USE transfert_mod 3 USE icosa 3 4 PRIVATE 4 5 5 PUBLIC :: timeloop6 PUBLIC :: init_timeloop, timeloop 6 7 7 8 INTEGER, PARAMETER :: euler=1, rk4=2, mlf=3 8 9 INTEGER :: itau_sync=10 9 10 11 TYPE(t_message) :: req_ps0, req_theta_rhodz0, req_u0, req_q0 12 13 TYPE(t_field),POINTER :: f_phis(:) 14 TYPE(t_field),POINTER :: f_q(:) 15 TYPE(t_field),POINTER :: f_dtheta(:), f_rhodz(:) 16 TYPE(t_field),POINTER :: f_ps(:),f_psm1(:), f_psm2(:) 17 TYPE(t_field),POINTER :: f_u(:),f_um1(:),f_um2(:) 18 TYPE(t_field),POINTER :: f_theta_rhodz(:),f_theta_rhodzm1(:),f_theta_rhodzm2(:) 19 TYPE(t_field),POINTER :: f_dps(:),f_dpsm1(:), f_dpsm2(:) 20 TYPE(t_field),POINTER :: f_du(:),f_dum1(:),f_dum2(:) 21 TYPE(t_field),POINTER :: f_dtheta_rhodz(:),f_dtheta_rhodzm1(:),f_dtheta_rhodzm2(:) 22 TYPE(t_field),POINTER :: f_hflux(:), f_wflux(:), f_hfluxt(:), f_wfluxt(:) 23 24 INTEGER :: nb_stage, matsuno_period, scheme 25 26 REAL(rstd),SAVE :: jD_cur, jH_cur 27 REAL(rstd),SAVE :: start_time 28 10 29 CONTAINS 11 30 12 SUBROUTINE timeloop31 SUBROUTINE init_timeloop 13 32 USE icosa 14 33 USE dissip_gcm_mod … … 19 38 USE physics_mod 20 39 USE mpipara 21 USE IOIPSL 22 USE maxicosa 23 USE check_conserve_mod 40 USE omp_para 24 41 USE trace 25 42 USE transfert_mod 43 USE check_conserve_mod 44 USE ioipsl 26 45 IMPLICIT NONE 27 TYPE(t_field),POINTER :: f_phis(:) 28 ! TYPE(t_field),POINTER :: f_theta(:) 29 TYPE(t_field),POINTER :: f_q(:) 30 TYPE(t_field),POINTER :: f_dtheta(:), f_rhodz(:) 31 TYPE(t_field),POINTER :: f_ps(:),f_psm1(:), f_psm2(:) 32 TYPE(t_field),POINTER :: f_u(:),f_um1(:),f_um2(:) 33 TYPE(t_field),POINTER :: f_theta_rhodz(:),f_theta_rhodzm1(:),f_theta_rhodzm2(:) 34 TYPE(t_field),POINTER :: f_dps(:),f_dpsm1(:), f_dpsm2(:) 35 TYPE(t_field),POINTER :: f_du(:),f_dum1(:),f_dum2(:) 36 TYPE(t_field),POINTER :: f_dtheta_rhodz(:),f_dtheta_rhodzm1(:),f_dtheta_rhodzm2(:) 37 TYPE(t_field),POINTER :: f_hflux(:), f_wflux(:), f_hfluxt(:), f_wfluxt(:) 38 39 REAL(rstd),POINTER :: phis(:) 40 REAL(rstd),POINTER :: q(:,:,:) 41 REAL(rstd),POINTER :: ps(:) ,psm1(:), psm2(:) 42 REAL(rstd),POINTER :: u(:,:) , um1(:,:), um2(:,:) 43 REAL(rstd),POINTER :: rhodz(:,:), theta_rhodz(:,:) , theta_rhodzm1(:,:), theta_rhodzm2(:,:) 44 REAL(rstd),POINTER :: dps(:), dpsm1(:), dpsm2(:) 45 REAL(rstd),POINTER :: du(:,:), dum1(:,:), dum2(:,:) 46 REAL(rstd),POINTER :: dtheta_rhodz(:,:),dtheta_rhodzm1(:,:),dtheta_rhodzm2(:,:) 47 REAL(rstd),POINTER :: hflux(:,:),wflux(:,:),hfluxt(:,:),wfluxt(:,:) 48 ! REAL(rstd) :: dt, run_length 49 INTEGER :: ind 50 INTEGER :: it,i,j,n, nb_stage, stage, matsuno_period, scheme 51 CHARACTER(len=255) :: scheme_name 52 LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating fluxes in time 53 CHARACTER(len=7) :: first 54 REAL(rstd),SAVE :: jD_cur, jH_cur 55 REAL(rstd),SAVE :: start_time 56 LOGICAL, PARAMETER :: check=.FALSE. 57 ! INTEGER :: itaumax 58 ! REAL(rstd) ::write_period 59 ! INTEGER :: itau_out 60 61 ! dt=90. 62 ! CALL getin('dt',dt) 63 64 ! itaumax=100 65 ! CALL getin('itaumax',itaumax) 66 67 ! run_length=dt*itaumax 68 ! CALL getin('run_length',run_length) 69 ! itaumax=run_length/dt 70 ! PRINT *,'itaumax=',itaumax 71 ! dt=dt/scale_factor 72 73 ! Trends 74 CALL allocate_field(f_dps,field_t,type_real) 75 CALL allocate_field(f_du,field_u,type_real,llm) 76 CALL allocate_field(f_dtheta_rhodz,field_t,type_real,llm) 46 47 CHARACTER(len=255) :: scheme_name 48 49 CALL allocate_field(f_dps,field_t,type_real) 50 CALL allocate_field(f_du,field_u,type_real,llm) 51 CALL allocate_field(f_dtheta_rhodz,field_t,type_real,llm) 77 52 ! Model state at current time step (RK/MLF/Euler) 78 CALL allocate_field(f_phis,field_t,type_real)79 CALL allocate_field(f_ps,field_t,type_real)80 CALL allocate_field(f_u,field_u,type_real,llm)81 CALL allocate_field(f_theta_rhodz,field_t,type_real,llm)53 CALL allocate_field(f_phis,field_t,type_real) 54 CALL allocate_field(f_ps,field_t,type_real) 55 CALL allocate_field(f_u,field_u,type_real,llm) 56 CALL allocate_field(f_theta_rhodz,field_t,type_real,llm) 82 57 ! Model state at previous time step (RK/MLF) 83 CALL allocate_field(f_psm1,field_t,type_real)84 CALL allocate_field(f_um1,field_u,type_real,llm)85 CALL allocate_field(f_theta_rhodzm1,field_t,type_real,llm)58 CALL allocate_field(f_psm1,field_t,type_real) 59 CALL allocate_field(f_um1,field_u,type_real,llm) 60 CALL allocate_field(f_theta_rhodzm1,field_t,type_real,llm) 86 61 ! Tracers 87 CALL allocate_field(f_q,field_t,type_real,llm,nqtot)88 CALL allocate_field(f_rhodz,field_t,type_real,llm)62 CALL allocate_field(f_q,field_t,type_real,llm,nqtot) 63 CALL allocate_field(f_rhodz,field_t,type_real,llm) 89 64 ! Mass fluxes 90 CALL allocate_field(f_hflux,field_u,type_real,llm) ! instantaneous mass fluxes 91 CALL allocate_field(f_wflux,field_t,type_real,llm+1) ! computed by caldyn 92 CALL allocate_field(f_hfluxt,field_u,type_real,llm) ! mass "fluxes" accumulated in time 93 CALL allocate_field(f_wfluxt,field_t,type_real,llm+1) 65 CALL allocate_field(f_hflux,field_u,type_real,llm) ! instantaneous mass fluxes 66 CALL allocate_field(f_wflux,field_t,type_real,llm+1) ! computed by caldyn 67 CALL allocate_field(f_hfluxt,field_u,type_real,llm) ! mass "fluxes" accumulated in time 68 CALL allocate_field(f_wfluxt,field_t,type_real,llm+1) 69 94 70 95 71 !---------------------------------------------------- … … 145 121 !---------------------------------------------------- 146 122 147 scheme_name='runge_kutta' 148 CALL getin('scheme',scheme_name) 149 150 SELECT CASE (TRIM(scheme_name)) 151 CASE('euler') 152 scheme=euler 153 nb_stage=1 154 CASE ('runge_kutta') 155 scheme=rk4 156 nb_stage=4 157 CASE ('leapfrog_matsuno') 158 scheme=mlf 159 matsuno_period=5 160 CALL getin('matsuno_period',matsuno_period) 161 nb_stage=matsuno_period+1 123 124 125 126 127 scheme_name='runge_kutta' 128 CALL getin('scheme',scheme_name) 129 130 SELECT CASE (TRIM(scheme_name)) 131 CASE('euler') 132 scheme=euler 133 nb_stage=1 134 CASE ('runge_kutta') 135 scheme=rk4 136 nb_stage=4 137 CASE ('leapfrog_matsuno') 138 scheme=mlf 139 matsuno_period=5 140 CALL getin('matsuno_period',matsuno_period) 141 nb_stage=matsuno_period+1 162 142 ! Model state 2 time steps ago (MLF) 163 CALL allocate_field(f_psm2,field_t,type_real) 164 CALL allocate_field(f_theta_rhodzm2,field_t,type_real,llm) 165 CALL allocate_field(f_um2,field_u,type_real,llm) 166 CASE default 167 PRINT*,'Bad selector for variable scheme : <', TRIM(scheme_name), & 168 ' > options are <euler>, <runge_kutta>, <leapfrog_matsuno>' 169 STOP 170 END SELECT 143 CALL allocate_field(f_psm2,field_t,type_real) 144 CALL allocate_field(f_theta_rhodzm2,field_t,type_real,llm) 145 CALL allocate_field(f_um2,field_u,type_real,llm) 146 CASE default 147 PRINT*,'Bad selector for variable scheme : <', TRIM(scheme_name), & 148 ' > options are <euler>, <runge_kutta>, <leapfrog_matsuno>' 149 STOP 150 END SELECT 151 152 153 CALL init_dissip 154 CALL init_caldyn 155 CALL init_guided 156 CALL init_advect_tracer 157 CALL init_check_conserve 158 CALL init_physics 159 CALL etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q) 160 161 CALL transfert_request(f_phis,req_i0) 162 CALL transfert_request(f_phis,req_i1) 163 CALL writefield("phis",f_phis,once=.TRUE.) 164 165 CALL init_message(f_ps,req_i0,req_ps0) 166 CALL init_message(f_theta_rhodz,req_i0,req_theta_rhodz0) 167 CALL init_message(f_u,req_e0_vect,req_u0) 168 CALL init_message(f_q,req_i0,req_q0) 169 170 END SUBROUTINE init_timeloop 171 171 172 ! write_period=0 173 ! CALL getin('write_period',write_period) 174 ! write_period=write_period/scale_factor 175 ! itau_out=FLOOR(.5+write_period/dt) 176 ! PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out 177 178 ! Trends at previous time steps needed only by Adams-Bashforth 179 ! CALL allocate_field(f_dpsm1,field_t,type_real) 180 ! CALL allocate_field(f_dpsm2,field_t,type_real) 181 ! CALL allocate_field(f_dum1,field_u,type_real,llm) 182 ! CALL allocate_field(f_dum2,field_u,type_real,llm) 183 ! CALL allocate_field(f_dtheta_rhodzm1,field_t,type_real,llm) 184 ! CALL allocate_field(f_dtheta_rhodzm2,field_t,type_real,llm) 185 ! CALL allocate_field(f_theta,field_t,type_real,llm) 186 ! CALL allocate_field(f_dtheta,field_t,type_real,llm) 187 188 CALL init_dissip 189 CALL init_caldyn 190 CALL init_guided 191 CALL init_advect_tracer 192 CALL init_physics 193 !========================================= INITIALIZATION 194 ! CALL dynetat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q) 195 CALL etat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q) 196 CALL writefield("phis",f_phis,once=.TRUE.) 197 CALL transfert_request(f_q,req_i1) 198 172 SUBROUTINE timeloop 173 USE icosa 174 USE dissip_gcm_mod 175 USE caldyn_mod 176 USE etat0_mod 177 USE guided_mod 178 USE advect_tracer_mod 179 USE physics_mod 180 USE mpipara 181 USE omp_para 182 USE trace 183 USE transfert_mod 184 USE check_conserve_mod 185 IMPLICIT NONE 186 REAL(rstd),POINTER :: phis(:) 187 REAL(rstd),POINTER :: q(:,:,:) 188 REAL(rstd),POINTER :: ps(:) ,psm1(:), psm2(:) 189 REAL(rstd),POINTER :: u(:,:) , um1(:,:), um2(:,:) 190 REAL(rstd),POINTER :: rhodz(:,:), theta_rhodz(:,:) , theta_rhodzm1(:,:), theta_rhodzm2(:,:) 191 REAL(rstd),POINTER :: dps(:), dpsm1(:), dpsm2(:) 192 REAL(rstd),POINTER :: du(:,:), dum1(:,:), dum2(:,:) 193 REAL(rstd),POINTER :: dtheta_rhodz(:,:),dtheta_rhodzm1(:,:),dtheta_rhodzm2(:,:) 194 REAL(rstd),POINTER :: hflux(:,:),wflux(:,:),hfluxt(:,:),wfluxt(:,:) 195 196 INTEGER :: ind 197 INTEGER :: it,i,j,n, stage 198 CHARACTER(len=255) :: scheme_name 199 LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating fluxes in time 200 LOGICAL, PARAMETER :: check=.FALSE. 201 202 !$OMP BARRIER 199 203 DO ind=1,ndomain 200 204 CALL swap_dimensions(ind) 201 205 CALL swap_geometry(ind) 202 206 rhodz=f_rhodz(ind); ps=f_ps(ind) 203 CALL compute_rhodz(.TRUE., ps, rhodz) ! save rhodz for transport scheme before dynamics update ps207 CALL compute_rhodz(.TRUE., ps, rhodz) ! save rhodz for transport scheme before dynamics update ps 204 208 END DO 205 209 fluxt_zero=.TRUE. 206 210 207 ! check that rhodz is consistent with ps 208 CALL transfert_request(f_rhodz,req_i1) 209 CALL transfert_request(f_ps,req_i1) 210 DO ind=1,ndomain 211 CALL swap_dimensions(ind) 212 CALL swap_geometry(ind) 213 rhodz=f_rhodz(ind); ps=f_ps(ind) 214 CALL compute_rhodz(.FALSE., ps, rhodz) 215 END DO 216 217 CALL transfert_request(f_phis,req_i0) 218 CALL transfert_request(f_phis,req_i1) 219 CALL transfert_request(f_phis,req_i1) 211 ! check that rhodz is consistent with ps 212 ! CALL transfert_request(f_rhodz,req_i1) 213 ! CALL transfert_request(f_ps,req_i1) 214 ! DO ind=1,ndomain 215 ! CALL swap_dimensions(ind) 216 ! CALL swap_geometry(ind) 217 ! rhodz=f_rhodz(ind); ps=f_ps(ind) 218 ! CALL compute_rhodz(.FALSE., ps, rhodz) 219 ! END DO 220 220 221 221 222 DO it=0,itaumax 222 223 IF (MOD(it,itau_sync)==0) THEN 223 CALL transfert_request(f_ps,req_i0) 224 CALL transfert_request(f_theta_rhodz,req_i0) 225 CALL transfert_request(f_u,req_e0_vect) 226 CALL transfert_request(f_q,req_i0) 224 CALL send_message(f_ps,req_ps0) 225 CALL send_message(f_theta_rhodz,req_theta_rhodz0) 226 CALL send_message(f_u,req_u0) 227 CALL send_message(f_q,req_q0) 228 CALL wait_message(req_ps0) 229 CALL wait_message(req_theta_rhodz0) 230 CALL wait_message(req_u0) 231 CALL wait_message(req_q0) 227 232 ENDIF 228 233 234 ! IF (is_mpi_root) PRINT *,"It No :",It," t :",dt*It 229 235 IF (mod(it,itau_out)==0 ) THEN 230 ! IF (is_mpi_root) PRINT *,"It No :",It," t :",dt*It 236 CALL writefield("q",f_q) 231 237 CALL update_time_counter(dt*it) 232 CALL c ompute_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)238 CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it) 233 239 ENDIF 234 235 240 241 CALL guided(it*dt,f_ps,f_theta_rhodz,f_u,f_q) 236 242 237 243 DO stage=1,nb_stage … … 246 252 CASE (mlf) 247 253 CALL leapfrog_matsuno_scheme(stage) 254 248 255 ! CASE ('leapfrog') 249 ! CALL leapfrog_scheme256 ! CALL leapfrog_scheme 250 257 ! 251 258 ! CASE ('adam_bashforth') 252 ! CALL dissip(f_u,f_du,f_ps,f_phis, f_theta_rhodz,f_dtheta_rhodz)253 ! CALL adam_bashforth_scheme259 ! CALL dissip(f_u,f_du,f_ps,f_phis, f_theta_rhodz,f_dtheta_rhodz) 260 ! CALL adam_bashforth_scheme 254 261 CASE DEFAULT 255 262 STOP … … 263 270 264 271 IF(MOD(it+1,itau_adv)==0) THEN 265 ! CALL transfert_request(f_wfluxt,req_i1) ! FIXME266 ! CALL transfert_request(f_hfluxt,req_e1) ! FIXME267 272 268 273 CALL advect_tracer(f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz) ! update q and rhodz after RK step … … 271 276 ! FIXME : check that rhodz is consistent with ps 272 277 IF (check) THEN 273 CALL transfert_request(f_rhodz,req_i1)274 CALL transfert_request(f_ps,req_i1)275 CALL transfert_request(f_dps,req_i1) ! FIXME276 CALL transfert_request(f_wflux,req_i1) ! FIXME277 278 DO ind=1,ndomain 278 279 CALL swap_dimensions(ind) 279 280 CALL swap_geometry(ind) 280 rhodz=f_rhodz(ind); ps=f_ps(ind); dps=f_dps(ind); 281 wflux=f_wflux(ind); wfluxt=f_wfluxt(ind) 281 rhodz=f_rhodz(ind); ps=f_ps(ind); 282 282 CALL compute_rhodz(.FALSE., ps, rhodz) 283 283 END DO 284 284 ENDIF 285 285 286 END IF 287 288 289 286 290 !---------------------------------------------------- 287 jD_cur = jD_ref + day_ini - day_ref + it/day_step 288 jH_cur = jH_ref + start_time + mod(it,day_step)/float(day_step) 289 jD_cur = jD_cur + int(jH_cur) 290 jH_cur = jH_cur - int(jH_cur) 291 ! print*,"Just b4 phys" 292 CALL physics(it,jD_cur,jH_cur,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 293 !---------------------------------------------------- 291 ! jD_cur = jD_ref + day_ini - day_ref + it/day_step 292 ! jH_cur = jH_ref + start_time + mod(it,day_step)/float(day_step) 293 ! jD_cur = jD_cur + int(jH_cur) 294 ! jH_cur = jH_cur - int(jH_cur) 295 ! CALL physics(it,jD_cur,jH_cur,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 296 294 297 ! CALL physics(it,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 295 298 ENDDO 299 296 300 297 301 CONTAINS … … 310 314 ps=f_ps(ind) ; dps=f_dps(ind) ; 311 315 312 DO j=jj_begin,jj_end 313 DO i=ii_begin,ii_end 314 ij=(j-1)*iim+i 315 ps(ij)=ps(ij)+dt*dps(ij) 316 ENDDO 317 ENDDO 316 IF (omp_first) THEN 317 DO j=jj_begin,jj_end 318 DO i=ii_begin,ii_end 319 ij=(j-1)*iim+i 320 ps(ij)=ps(ij)+dt*dps(ij) 321 ENDDO 322 ENDDO 323 ENDIF 324 318 325 hflux=f_hflux(ind); hfluxt=f_hfluxt(ind) 319 326 wflux=f_wflux(ind); wfluxt=f_wfluxt(ind) … … 324 331 du=f_du(ind) ; dtheta_rhodz=f_dtheta_rhodz(ind) 325 332 326 DO l= 1,llm333 DO l=ll_begin,ll_end 327 334 DO j=jj_begin,jj_end 328 335 DO i=ii_begin,ii_end … … 342 349 343 350 SUBROUTINE RK_scheme(stage) 351 USE caldyn_gcm_mod 344 352 IMPLICIT NONE 345 353 INTEGER :: ind, stage … … 351 359 352 360 tau = dt*coef(stage) 361 362 DO ind=1,ndomain 363 CALL swap_dimensions(ind) 364 CALL swap_geometry(ind) 365 ps=f_ps(ind) 366 psm1=f_psm1(ind) 367 dps=f_dps(ind) 368 369 IF (stage==1) THEN ! first stage : save model state in XXm1 370 IF (omp_first) THEN 371 DO j=jj_begin,jj_end 372 DO i=ii_begin,ii_end 373 ij=(j-1)*iim+i 374 psm1(ij)=ps(ij) 375 ENDDO 376 ENDDO 377 ENDIF 378 END IF 379 380 ! updates are of the form x1 := x0 + tau*f(x1) 381 IF (omp_first) THEN 382 DO j=jj_begin,jj_end 383 DO i=ii_begin,ii_end 384 ij=(j-1)*iim+i 385 ps(ij)=psm1(ij)+tau*dps(ij) 386 ENDDO 387 ENDDO 388 ENDIF 389 390 ENDDO 391 392 CALL send_message(f_ps,req_ps) 393 394 353 395 354 396 DO ind=1,ndomain … … 360 402 361 403 IF (stage==1) THEN ! first stage : save model state in XXm1 362 363 DO j=jj_begin,jj_end364 DO i=ii_begin,ii_end365 ij=(j-1)*iim+i366 psm1(ij)=ps(ij)367 ENDDO368 ENDDO369 404 370 DO l=1,llm405 DO l=ll_begin,ll_end 371 406 DO j=jj_begin,jj_end 372 407 DO i=ii_begin,ii_end … … 382 417 END IF 383 418 ! updates are of the form x1 := x0 + tau*f(x1) 384 DO j=jj_begin,jj_end385 DO i=ii_begin,ii_end386 ij=(j-1)*iim+i387 ps(ij)=psm1(ij)+tau*dps(ij)388 ENDDO389 ENDDO390 419 391 DO l= 1,llm420 DO l=ll_begin,ll_end 392 421 DO j=jj_begin,jj_end 393 422 DO i=ii_begin,ii_end … … 468 497 469 498 470 ! IF (MOD(it,matsuno_period+1)==0) THEN471 499 IF (stage==1) THEN 472 500 psm1(:)=ps(:) ; um1(:,:)=u(:,:) ; theta_rhodzm1(:,:)=theta_rhodz(:,:) … … 475 503 theta_rhodz(:,:)=theta_rhodzm1(:,:)+tau*dtheta_rhodz(:,:) 476 504 477 ! ELSE IF (MOD(it,matsuno_period+1)==1) THEN478 505 ELSE IF (stage==2) THEN 479 506 … … 538 565 USE icosa 539 566 USE disvert_mod 567 USE omp_para 540 568 LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check 541 569 REAL(rstd), INTENT(IN) :: ps(iim*jjm) … … 544 572 INTEGER :: l,i,j,ij,dd 545 573 err=0. 546 IF(comp) THEN 547 dd=1 548 ELSE 549 ! dd=-1 550 dd=0 551 END IF 552 553 DO l = 1, llm 574 575 dd=0 576 577 DO l = ll_begin, ll_end 554 578 DO j=jj_begin-dd,jj_end+dd 555 579 DO i=ii_begin-dd,ii_end+dd 556 580 ij=(j-1)*iim+i 557 m = ( ap(l) - ap(l+1) + (bp(l)-bp(l+1))*ps(ij) )/g 581 m = ( ap(l) - ap(l+1) + (bp(l)-bp(l+1))*ps(ij) )/g 558 582 IF(comp) THEN 559 583 rhodz(ij,l) = m … … 570 594 STOP 571 595 ELSE 572 PRINT *, 'No discrepancy between ps and rhodz detected'596 ! PRINT *, 'No discrepancy between ps and rhodz detected' 573 597 END IF 574 598 END IF … … 578 602 SUBROUTINE accumulate_fluxes(hflux,wflux, hfluxt,wfluxt, tau,fluxt_zero) 579 603 USE icosa 604 USE omp_para 580 605 REAL(rstd), INTENT(IN) :: hflux(3*iim*jjm,llm), wflux(iim*jjm,llm+1) 581 606 REAL(rstd), INTENT(INOUT) :: hfluxt(3*iim*jjm,llm), wfluxt(iim*jjm,llm+1) … … 585 610 586 611 IF(fluxt_zero) THEN 587 ! PRINT *, 'Accumulating fluxes (first)' 612 588 613 fluxt_zero=.FALSE. 589 DO l=1,llm 614 615 DO l=ll_begin,ll_end 590 616 DO j=jj_begin-1,jj_end+1 591 617 DO i=ii_begin-1,ii_end+1 … … 598 624 ENDDO 599 625 600 DO l= 1,llm+1626 DO l=ll_begin,ll_endp1 601 627 DO j=jj_begin,jj_end 602 628 DO i=ii_begin,ii_end … … 607 633 ENDDO 608 634 ELSE 609 ! PRINT *, 'Accumulating fluxes (next)' 610 DO l= 1,llm635 636 DO l=ll_begin,ll_end 611 637 DO j=jj_begin-1,jj_end+1 612 638 DO i=ii_begin-1,ii_end+1 … … 619 645 ENDDO 620 646 621 DO l= 1,llm+1647 DO l=ll_begin,ll_endp1 622 648 DO j=jj_begin,jj_end 623 649 DO i=ii_begin,ii_end … … 629 655 630 656 END IF 657 631 658 END SUBROUTINE accumulate_fluxes 632 659 -
codes/icosagcm/trunk/src/trace.F90
r145 r151 1 1 MODULE trace 2 2 3 3 INTEGER,SAVE :: markId 4 4 5 CONTAINS 5 6 7 SUBROUTINE init_trace 8 IMPLICIT NONE 9 #ifdef VTRACE 10 #include <vt_user.inc> 11 #endif 12 13 #ifdef VTRACE 14 VT_MARKER_DEF("marker", VT_MARKER_TYPE_HINT, markId) 15 #endif 16 17 END SUBROUTINE init_trace 18 19 6 20 SUBROUTINE trace_start(name) 7 21 IMPLICIT NONE … … 11 25 #endif 12 26 27 !$OMP MASTER 13 28 #ifdef VTRACE 14 29 VT_USER_START(name) 15 30 #endif 31 !$OMP END MASTER 16 32 17 33 END SUBROUTINE trace_start … … 25 41 CHARACTER(LEN=*),INTENT(IN) :: name 26 42 43 !$OMP MASTER 27 44 #ifdef VTRACE 28 45 VT_USER_END(name) 29 46 #endif 47 !$OMP END MASTER 30 48 31 49 END SUBROUTINE trace_end 32 50 51 SUBROUTINE Marker(name) 52 IMPLICIT NONE 53 CHARACTER(LEN=*),INTENT(IN) :: name 54 #ifdef VTRACE 55 #include <vt_user.inc> 56 #endif 57 58 !$OMP MASTER 59 #ifdef VTRACE 60 VT_MARKER(markId,name) 61 #endif 62 !$OMP END MASTER 63 64 END SUBROUTINE Marker 65 33 66 END MODULE trace -
codes/icosagcm/trunk/src/transfert.F90
r148 r151 3 3 #ifdef CPP_USING_MPI 4 4 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_mpi, req_i1,req_e1_vect, & 5 req_e1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field 5 req_e1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field, & 6 t_message,init_message=>init_message_mpi,transfert_message=>transfert_message_mpi, & 7 send_message=>send_message_mpi,test_message=>test_message_mpi,wait_message=>wait_message_mpi,barrier 6 8 #else 7 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 USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_seq, req_i1,req_e1_vect, & 10 req_e1_scal,req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field, & 11 t_message,init_message=>init_message_seq,transfert_message=>transfert_message_seq, & 12 send_message=>send_message_seq,test_message=>test_message_seq,wait_message=>wait_message_seq,barrier 9 13 #endif 10 14 -
codes/icosagcm/trunk/src/transfert_mpi.f90
r148 r151 1 1 MODULE transfert_mpi_mod 2 2 USE genmod 3 USE field_mod 3 4 4 5 TYPE array … … 13 14 REAL,POINTER :: buffer_r4(:,:,:) 14 15 END TYPE array 16 17 TYPE t_buffer 18 REAL,POINTER :: r2(:) 19 REAL,POINTER :: r3(:,:) 20 REAL,POINTER :: r4(:,:,:) 21 END TYPE t_buffer 15 22 16 23 TYPE t_request … … 41 48 TYPE(t_request),POINTER :: req_e0_vect(:) 42 49 50 TYPE t_message 51 TYPE(t_request), POINTER :: request(:) 52 INTEGER :: nreq 53 INTEGER, POINTER :: mpi_req(:) 54 INTEGER, POINTER :: status(:,:) 55 TYPE(t_buffer),POINTER :: buffers(:) 56 TYPE(t_field),POINTER :: field(:) 57 LOGICAL :: completed 58 LOGICAL :: pending 59 END TYPE t_message 43 60 44 61 CONTAINS 45 62 46 63 SUBROUTINE init_transfert 47 64 USE domain_mod … … 70 87 DO j=jj_begin,jj_end+1 71 88 CALL request_add_point(ind,ii_begin-1,j,req_i1) 72 ENDDO73 74 DO i=ii_begin,ii_end75 ! CALL request_add_point(ind,i,jj_begin,req_i1)76 ENDDO77 78 DO j=jj_begin,jj_end79 ! CALL request_add_point(ind,ii_end,j,req_i1)80 ENDDO81 82 DO i=ii_begin,ii_end83 ! CALL request_add_point(ind,i,jj_end,req_i1)84 ENDDO85 86 DO j=jj_begin,jj_end87 ! CALL request_add_point(ind,ii_begin,j,req_i1)88 89 ENDDO 89 90 … … 142 143 ENDDO 143 144 144 DO i=ii_begin+1,ii_end-1145 ! CALL request_add_point(ind,i,jj_begin,req_e1_scal,right)146 ! CALL request_add_point(ind,i,jj_end,req_e1_scal,right)147 ENDDO148 149 DO j=jj_begin+1,jj_end-1150 ! CALL request_add_point(ind,ii_begin,j,req_e1_scal,rup)151 ! CALL request_add_point(ind,ii_end,j,req_e1_scal,rup)152 ENDDO153 154 ! CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_scal,left)155 ! CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_scal,ldown)156 ! CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_scal,left)157 ! CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_scal,ldown)158 159 145 ENDDO 160 146 … … 211 197 ENDDO 212 198 213 DO i=ii_begin+1,ii_end-1214 ! CALL request_add_point(ind,i,jj_begin,req_e1_vect,right)215 ! CALL request_add_point(ind,i,jj_end,req_e1_vect,right)216 ENDDO217 218 DO j=jj_begin+1,jj_end-1219 ! CALL request_add_point(ind,ii_begin,j,req_e1_vect,rup)220 ! CALL request_add_point(ind,ii_end,j,req_e1_vect,rup)221 ENDDO222 223 ! CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_vect,left)224 ! CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_vect,ldown)225 ! CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_vect,left)226 ! CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_vect,ldown)227 199 228 200 ENDDO … … 322 294 target_j=>req%target_j 323 295 target_sign=>req%target_sign 324 ! req%max_size=req%max_size*2 296 325 297 ALLOCATE(req%src_domain(req%max_size*2)) 326 298 ALLOCATE(req%src_ind(req%max_size*2)) … … 610 582 611 583 584 SUBROUTINE init_message_seq(field, request, message) 585 USE field_mod 586 USE domain_mod 587 USE mpi_mod 588 USE mpipara 589 USE mpi_mod 590 IMPLICIT NONE 591 TYPE(t_field),POINTER :: field(:) 592 TYPE(t_request),POINTER :: request(:) 593 TYPE(t_message) :: message 594 595 !$OMP MASTER 596 message%request=>request 597 !$OMP END MASTER 598 !$OMP BARRIER 599 600 END SUBROUTINE init_message_seq 601 602 SUBROUTINE send_message_seq(field,message) 603 USE field_mod 604 USE domain_mod 605 USE mpi_mod 606 USE mpipara 607 USE omp_para 608 USE trace 609 IMPLICIT NONE 610 TYPE(t_field),POINTER :: field(:) 611 TYPE(t_message) :: message 612 613 CALL transfert_request_seq(field,message%request) 614 615 END SUBROUTINE send_message_seq 616 617 SUBROUTINE test_message_seq(message) 618 IMPLICIT NONE 619 TYPE(t_message) :: message 620 END SUBROUTINE test_message_seq 621 622 623 SUBROUTINE wait_message_seq(message) 624 IMPLICIT NONE 625 TYPE(t_message) :: message 626 627 END SUBROUTINE wait_message_seq 628 629 SUBROUTINE transfert_message_seq(field,message) 630 USE field_mod 631 USE domain_mod 632 USE mpi_mod 633 USE mpipara 634 USE omp_para 635 USE trace 636 IMPLICIT NONE 637 TYPE(t_field),POINTER :: field(:) 638 TYPE(t_message) :: message 639 640 CALL send_message_seq(field,message) 641 642 END SUBROUTINE transfert_message_seq 643 644 645 SUBROUTINE init_message_mpi(field,request, message) 646 USE field_mod 647 USE domain_mod 648 USE mpi_mod 649 USE mpipara 650 USE mpi_mod 651 IMPLICIT NONE 652 653 TYPE(t_field),POINTER :: field(:) 654 TYPE(t_request),POINTER :: request(:) 655 TYPE(t_message) :: message 656 657 TYPE(ARRAY),POINTER :: recv,send 658 TYPE(t_request),POINTER :: req 659 INTEGER :: irecv,isend 660 INTEGER :: ireq,nreq 661 INTEGER :: ind 662 INTEGER :: dim3,dim4 663 664 !$OMP MASTER 665 message%request=>request 666 nreq=sum(request(:)%nsend)+sum(request(:)%nrecv) 667 message%nreq=nreq 668 ALLOCATE(message%mpi_req(nreq)) 669 ALLOCATE(message%buffers(nreq)) 670 ALLOCATE(message%status(MPI_STATUS_SIZE,nreq)) 671 672 message%pending=.FALSE. 673 message%completed=.FALSE. 674 675 IF (field(1)%data_type==type_real) THEN 676 677 IF (field(1)%ndim==2) THEN 678 679 ireq=0 680 DO ind=1,ndomain 681 req=>request(ind) 682 683 DO isend=1,req%nsend 684 ireq=ireq+1 685 send=>req%send(isend) 686 CALL allocate_mpi_buffer(message%buffers(ireq)%r2,send%size) 687 ENDDO 688 689 DO irecv=1,req%nrecv 690 ireq=ireq+1 691 recv=>req%recv(irecv) 692 CALL allocate_mpi_buffer(message%buffers(ireq)%r2,recv%size) 693 ENDDO 694 695 ENDDO 696 697 698 ELSE IF (field(1)%ndim==3) THEN 699 700 ireq=0 701 DO ind=1,ndomain 702 dim3=size(field(ind)%rval3d,2) 703 req=>request(ind) 704 705 DO isend=1,req%nsend 706 ireq=ireq+1 707 send=>req%send(isend) 708 CALL allocate_mpi_buffer(message%buffers(ireq)%r3,send%size,dim3) 709 ENDDO 710 711 DO irecv=1,req%nrecv 712 ireq=ireq+1 713 recv=>req%recv(irecv) 714 CALL allocate_mpi_buffer(message%buffers(ireq)%r3,recv%size,dim3) 715 716 ENDDO 717 718 ENDDO 719 720 721 ELSE IF (field(1)%ndim==4) THEN 722 723 ireq=0 724 DO ind=1,ndomain 725 dim3=size(field(ind)%rval4d,2) 726 dim4=size(field(ind)%rval4d,3) 727 req=>request(ind) 728 729 DO isend=1,req%nsend 730 ireq=ireq+1 731 send=>req%send(isend) 732 CALL allocate_mpi_buffer(message%buffers(ireq)%r4,send%size,dim3,dim4) 733 ENDDO 734 735 DO irecv=1,req%nrecv 736 ireq=ireq+1 737 recv=>req%recv(irecv) 738 CALL allocate_mpi_buffer(message%buffers(ireq)%r4,recv%size,dim3,dim4) 739 ENDDO 740 741 ENDDO 742 743 ENDIF 744 ENDIF 745 !$OMP END MASTER 746 !$OMP BARRIER 747 END SUBROUTINE init_message_mpi 748 749 SUBROUTINE barrier 750 USE mpi_mod 751 USE mpipara 752 IMPLICIT NONE 753 754 CALL MPI_BARRIER(comm_icosa,ierr) 755 756 END SUBROUTINE barrier 757 758 SUBROUTINE transfert_message_mpi(field,message) 759 USE field_mod 760 IMPLICIT NONE 761 TYPE(t_field),POINTER :: field(:) 762 TYPE(t_message) :: message 763 764 CALL send_message_mpi(field,message) 765 CALL wait_message_mpi(message) 766 767 END SUBROUTINE transfert_message_mpi 768 769 770 SUBROUTINE send_message_mpi(field,message) 771 USE field_mod 772 USE domain_mod 773 USE mpi_mod 774 USE mpipara 775 USE omp_para 776 USE trace 777 IMPLICIT NONE 778 TYPE(t_field),POINTER :: field(:) 779 TYPE(t_message) :: message 780 REAL(rstd),POINTER :: rval2d(:) 781 REAL(rstd),POINTER :: rval3d(:,:) 782 REAL(rstd),POINTER :: rval4d(:,:,:) 783 REAL(rstd),POINTER :: buffer_r2(:) 784 REAL(rstd),POINTER :: buffer_r3(:,:) 785 REAL(rstd),POINTER :: buffer_r4(:,:,:) 786 INTEGER,POINTER :: value(:) 787 INTEGER,POINTER :: sgn(:) 788 TYPE(ARRAY),POINTER :: recv,send 789 TYPE(t_request),POINTER :: req 790 INTEGER, ALLOCATABLE :: mpi_req(:) 791 INTEGER, ALLOCATABLE :: status(:,:) 792 INTEGER :: irecv,isend 793 INTEGER :: ireq,nreq 794 INTEGER :: ind,n,l,m 795 INTEGER :: dim3,dim4 796 797 !$OMP BARRIER 798 799 CALL trace_start("transfert_mpi") 800 801 nreq=message%nreq 802 message%field=>field 803 804 !$OMP MASTER 805 message%completed=.FALSE. 806 message%pending=.TRUE. 807 !$OMP END MASTER 808 809 IF (field(1)%data_type==type_real) THEN 810 IF (field(1)%ndim==2) THEN 811 812 ireq=0 813 DO ind=1,ndomain 814 rval2d=>field(ind)%rval2d 815 816 req=>message%request(ind) 817 DO isend=1,req%nsend 818 ireq=ireq+1 819 send=>req%send(isend) 820 buffer_r2=>message%buffers(ireq)%r2 821 value=>send%value 822 823 CALL trace_in 824 825 !$OMP DO SCHEDULE(STATIC) 826 DO n=1,send%size 827 buffer_r2(n)=rval2d(value(n)) 828 ENDDO 829 830 CALL trace_out 831 832 !$OMP MASTER 833 CALL MPI_ISSEND(buffer_r2,send%size,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 834 !$OMP END MASTER 835 ENDDO 836 837 DO irecv=1,req%nrecv 838 ireq=ireq+1 839 recv=>req%recv(irecv) 840 buffer_r2=>message%buffers(ireq)%r2 841 !$OMP MASTER 842 CALL MPI_IRECV(buffer_r2,recv%size,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 843 !$OMP END MASTER 844 ENDDO 845 846 ENDDO 847 848 ELSE IF (field(1)%ndim==3) THEN 849 850 ireq=0 851 DO ind=1,ndomain 852 dim3=size(field(ind)%rval3d,2) 853 rval3d=>field(ind)%rval3d 854 req=>message%request(ind) 855 856 DO isend=1,req%nsend 857 ireq=ireq+1 858 send=>req%send(isend) 859 buffer_r3=>message%buffers(ireq)%r3 860 value=>send%value 861 862 CALL trace_in 863 864 !$OMP DO SCHEDULE(STATIC) 865 DO n=1,send%size 866 buffer_r3(n,:)=rval3d(value(n),:) 867 ENDDO 868 869 CALL trace_out 870 871 !$OMP MASTER 872 CALL MPI_ISSEND(buffer_r3,send%size*dim3,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 873 !$OMP END MASTER 874 ENDDO 875 876 DO irecv=1,req%nrecv 877 ireq=ireq+1 878 recv=>req%recv(irecv) 879 buffer_r3=>message%buffers(ireq)%r3 880 !$OMP MASTER 881 CALL MPI_IRECV(buffer_r3,recv%size*dim3,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 882 !$OMP END MASTER 883 884 ENDDO 885 886 ENDDO 887 888 ELSE IF (field(1)%ndim==4) THEN 889 890 ireq=0 891 DO ind=1,ndomain 892 dim3=size(field(ind)%rval4d,2) 893 dim4=size(field(ind)%rval4d,3) 894 rval4d=>field(ind)%rval4d 895 req=>message%request(ind) 896 897 DO isend=1,req%nsend 898 ireq=ireq+1 899 send=>req%send(isend) 900 buffer_r4=>message%buffers(ireq)%r4 901 value=>send%value 902 903 CALL trace_in 904 905 !$OMP DO SCHEDULE(STATIC) 906 DO n=1,send%size 907 buffer_r4(n,:,:)=rval4d(value(n),:,:) 908 ENDDO 909 910 CALL trace_out 911 912 !$OMP MASTER 913 CALL MPI_ISSEND(buffer_r4,send%size*dim3*dim4,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 914 !$OMP END MASTER 915 ENDDO 916 917 DO irecv=1,req%nrecv 918 ireq=ireq+1 919 recv=>req%recv(irecv) 920 buffer_r4=>message%buffers(ireq)%r4 921 !$OMP MASTER 922 CALL MPI_IRECV(buffer_r4,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 923 !$OMP END MASTER 924 ENDDO 925 926 ENDDO 927 928 ENDIF 929 930 ENDIF 931 932 CALL trace_end("transfert_mpi") 933 !$OMP BARRIER 934 935 END SUBROUTINE send_message_mpi 936 937 SUBROUTINE test_message_mpi(message) 938 IMPLICIT NONE 939 TYPE(t_message) :: message 940 941 INTEGER :: ierr 942 !$OMP MASTER 943 IF (.NOT. message%pending) RETURN 944 !$OMP END MASTER 945 946 !$OMP MASTER 947 IF (.NOT. message%completed) CALL MPI_TESTALL(message%nreq,message%mpi_req,message%completed,message%status,ierr) 948 !$OMP END MASTER 949 END SUBROUTINE test_message_mpi 950 951 952 SUBROUTINE wait_message_mpi(message) 953 USE field_mod 954 USE domain_mod 955 USE mpi_mod 956 USE mpipara 957 USE omp_para 958 USE trace 959 IMPLICIT NONE 960 TYPE(t_message) :: message 961 962 TYPE(t_field),POINTER :: field(:) 963 REAL(rstd),POINTER :: rval2d(:) 964 REAL(rstd),POINTER :: rval3d(:,:) 965 REAL(rstd),POINTER :: rval4d(:,:,:) 966 REAL(rstd),POINTER :: buffer_r2(:) 967 REAL(rstd),POINTER :: buffer_r3(:,:) 968 REAL(rstd),POINTER :: buffer_r4(:,:,:) 969 INTEGER,POINTER :: value(:) 970 INTEGER,POINTER :: sgn(:) 971 TYPE(ARRAY),POINTER :: recv,send 972 TYPE(t_request),POINTER :: req 973 INTEGER, ALLOCATABLE :: mpi_req(:) 974 INTEGER, ALLOCATABLE :: status(:,:) 975 INTEGER :: irecv,isend 976 INTEGER :: ireq,nreq 977 INTEGER :: ind,n,l,m 978 INTEGER :: dim3,dim4 979 980 !$OMP BARRIER 981 982 CALL trace_start("transfert_mpi") 983 984 IF (.NOT. message%pending) RETURN 985 986 field=>message%field 987 nreq=message%nreq 988 989 IF (field(1)%data_type==type_real) THEN 990 IF (field(1)%ndim==2) THEN 991 992 !$OMP MASTER 993 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 994 !$OMP END MASTER 995 !$OMP BARRIER 996 997 ireq=0 998 DO ind=1,ndomain 999 rval2d=>field(ind)%rval2d 1000 req=>message%request(ind) 1001 1002 DO isend=1,req%nsend 1003 ireq=ireq+1 1004 ENDDO 1005 1006 DO irecv=1,req%nrecv 1007 ireq=ireq+1 1008 recv=>req%recv(irecv) 1009 buffer_r2=>message%buffers(ireq)%r2 1010 value=>recv%value 1011 sgn=>recv%sign 1012 1013 CALL trace_in 1014 1015 !$OMP DO SCHEDULE(STATIC) 1016 DO n=1,recv%size 1017 rval2d(value(n))=buffer_r2(n)*sgn(n) 1018 ENDDO 1019 1020 CALL trace_out 1021 1022 ENDDO 1023 1024 ENDDO 1025 1026 1027 ELSE IF (field(1)%ndim==3) THEN 1028 1029 !$OMP MASTER 1030 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1031 !$OMP END MASTER 1032 !$OMP BARRIER 1033 1034 ireq=0 1035 DO ind=1,ndomain 1036 rval3d=>field(ind)%rval3d 1037 req=>message%request(ind) 1038 1039 DO isend=1,req%nsend 1040 ireq=ireq+1 1041 ENDDO 1042 1043 DO irecv=1,req%nrecv 1044 ireq=ireq+1 1045 recv=>req%recv(irecv) 1046 buffer_r3=>message%buffers(ireq)%r3 1047 value=>recv%value 1048 sgn=>recv%sign 1049 1050 CALL trace_in 1051 1052 !$OMP DO SCHEDULE(STATIC) 1053 DO n=1,recv%size 1054 rval3d(value(n),:)=buffer_r3(n,:)*sgn(n) 1055 ENDDO 1056 1057 CALL trace_out 1058 1059 ENDDO 1060 1061 ENDDO 1062 1063 ELSE IF (field(1)%ndim==4) THEN 1064 !$OMP MASTER 1065 IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 1066 !$OMP END MASTER 1067 !$OMP BARRIER 1068 1069 ireq=0 1070 DO ind=1,ndomain 1071 rval4d=>field(ind)%rval4d 1072 req=>message%request(ind) 1073 1074 DO isend=1,req%nsend 1075 ireq=ireq+1 1076 ENDDO 1077 1078 DO irecv=1,req%nrecv 1079 ireq=ireq+1 1080 recv=>req%recv(irecv) 1081 buffer_r4=>message%buffers(ireq)%r4 1082 value=>recv%value 1083 sgn=>recv%sign 1084 1085 CALL trace_in 1086 1087 !$OMP DO SCHEDULE(STATIC) 1088 DO n=1,recv%size 1089 rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n) 1090 ENDDO 1091 1092 CALL trace_out 1093 1094 ENDDO 1095 1096 ENDDO 1097 1098 ENDIF 1099 1100 ENDIF 1101 1102 !$OMP MASTER 1103 message%pending=.FALSE. 1104 !$OMP END MASTER 1105 1106 CALL trace_end("transfert_mpi") 1107 !$OMP BARRIER 1108 1109 END SUBROUTINE wait_message_mpi 1110 1111 612 1112 SUBROUTINE transfert_request_mpi(field,request) 613 1113 USE field_mod … … 637 1137 638 1138 CALL trace_start("transfert_mpi") 639 1139 640 1140 IF (field(1)%data_type==type_real) THEN 641 1141 IF (field(1)%ndim==2) THEN … … 675 1175 676 1176 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 677 ! DO ind=1,ndomain678 ! field(ind)%rval2d(:)=0.679 ! ENDDO680 1177 681 1178 DO ind=1,ndomain … … 739 1236 740 1237 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 741 ! DO ind=1,ndomain742 ! field(ind)%rval2d(:)=0.743 ! ENDDO744 1238 745 1239 DO ind=1,ndomain … … 803 1297 804 1298 CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 805 ! DO ind=1,ndomain806 ! field(ind)%rval2d(:)=0.807 ! ENDDO808 1299 809 1300 DO ind=1,ndomain … … 837 1328 END SUBROUTINE transfert_request_mpi 838 1329 839 SUBROUTINE transfert_request (field,request)1330 SUBROUTINE transfert_request_seq(field,request) 840 1331 USE field_mod 841 1332 USE domain_mod … … 875 1366 ENDDO 876 1367 877 END SUBROUTINE transfert_request 1368 END SUBROUTINE transfert_request_seq 878 1369 879 1370 … … 949 1440 950 1441 END SUBROUTINE gather_field 951 1442 1443 1444 SUBROUTINE trace_in 1445 USE trace 1446 IMPLICIT NONE 1447 1448 CALL trace_start("transfert_buffer") 1449 END SUBROUTINE trace_in 1450 1451 SUBROUTINE trace_out 1452 USE trace 1453 IMPLICIT NONE 1454 1455 CALL trace_end("transfert_buffer") 1456 END SUBROUTINE trace_out 952 1457 953 1458 END MODULE transfert_mpi_mod -
codes/icosagcm/trunk/src/wind.f90
r49 r151 3 3 CONTAINS 4 4 5 SUBROUTINE un2ulonlat(f_u, f_ulon, f_ulat) 6 USE icosa 7 IMPLICIT NONE 8 TYPE(t_field), POINTER :: f_u(:) ! IN : normal velocity components on edges 9 TYPE(t_field), POINTER :: f_ulon(:), f_ulat(:) ! OUT : velocity reconstructed at hexagons 10 11 REAL(rstd),POINTER :: u(:,:), ulon(:,:), ulat(:,:) 12 INTEGER :: ind 13 14 DO ind=1,ndomain 15 CALL swap_dimensions(ind) 16 CALL swap_geometry(ind) 17 u=f_u(ind) 18 ulon=f_ulon(ind) 19 ulat=f_ulat(ind) 20 CALL compute_un2ulonlat(u,ulon, ulat) 21 END DO 22 23 END SUBROUTINE un2ulonlat 5 24 6 25 … … 214 233 END SUBROUTINE compute_wind_centered_lonlat_compound 215 234 235 SUBROUTINE compute_un2ulonlat(un, ulon, ulat) 236 USE icosa 237 238 IMPLICIT NONE 239 REAL(rstd),INTENT(IN) :: un(3*iim*jjm,llm) 240 REAL(rstd),INTENT(OUT) :: ulon(iim*jjm,llm) 241 REAL(rstd),INTENT(OUT) :: ulat(iim*jjm,llm) 242 243 REAL(rstd) :: uc(iim*jjm,3,llm) 244 245 CALL compute_wind_centered(un,uc) 246 CALL compute_wind_centered_lonlat_compound(uc, ulon, ulat) 247 248 END SUBROUTINE compute_un2ulonlat 216 249 217 250 END MODULE wind_mod -
codes/icosagcm/trunk/src/write_field.f90
r119 r151 75 75 76 76 TYPE(t_field),POINTER :: field_glo(:) 77 77 78 !$OMP MASTER 78 79 IF(PRESENT(once)) THEN 79 80 once_=once … … 101 102 102 103 CALL deallocate_field_glo(field_glo) 104 !$OMP END MASTER 103 105 104 106 END SUBROUTINE writefield … … 333 335 USE domain_mod 334 336 USE field_mod 335 ! USE dimensions336 ! USE geometry337 337 IMPLICIT NONE 338 338 CHARACTER(LEN=*),INTENT(IN) :: name_in … … 482 482 ENDIF 483 483 484 ! PRINT *,NF90_STRERROR(status)485 ! ncell=ncell+n486 487 ! ENDDO488 484 489 485 ELSE IF (Field(ind_b)%field_type==field_Z) THEN … … 604 600 ENDDO 605 601 ENDIF 606 607 ! PRINT *,NF90_STRERROR(status)608 ! ncell=ncell+n609 !610 ! ENDDO611 602 612 603 ENDIF … … 712 703 ENDDO 713 704 ENDDO 714 ! DO l=1,size(field(ind)%rval3d,2) 715 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d, & 705 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d, & 716 706 start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval3d,2),1 /)) 717 ! ENDDO718 707 DEALLOCATE(field_val3d) 708 719 709 ELSE IF (field(1)%ndim==4) THEN 720 710 … … 732 722 ENDDO 733 723 ENDDO 734 ! DO l=1,size(field(ind)%rval4d,2) 724 735 725 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d(:,l), & 736 726 start=(/ displ+ncell,l,FieldIndex(Index) /), count=(/n,size(field(ind)%rval4d,2),1 /)) 737 ! ENDDO738 727 DEALLOCATE(field_val3d) 739 728 ENDDO 740 729 ENDIF 741 730 742 ! PRINT *,NF90_STRERROR(status)743 731 ncell=ncell+n 744 732 … … 810 798 ENDDO 811 799 ENDDO 812 ! DO l=1,size(field(ind)%rval3d,2) 800 813 801 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d, & 814 802 start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval3d,2),1 /)) 815 ! ENDDO816 803 DEALLOCATE(field_val3d) 804 817 805 ELSE IF (field(1)%ndim==4) THEN 818 806 … … 836 824 ENDDO 837 825 838 ! DO l=1,size(field(ind)%rval4d,2)839 840 826 status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d, & 841 827 start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval4d,2),1 /)) 842 ! ENDDO843 828 DEALLOCATE(field_val3d) 844 829 ENDDO 845 830 ENDIF 846 831 847 ! PRINT *,NF90_STRERROR(status)848 832 ncell=ncell+n 849 833 … … 1159 1143 USE metric 1160 1144 USE spherical_geom_mod 1161 ! USE dimensions1162 ! USE geometry1163 1145 IMPLICIT NONE 1164 1146 CHARACTER(LEN=*),INTENT(IN) :: name_in … … 1292 1274 1293 1275 status = NF90_ENDDEF(ncid) 1294 1295 ! ncell=1 1296 ! DO ind=ind_b,ind_e 1297 ! d=>domain_type(ind) 1298 1299 ! n=0 1300 ! DO j=d%jj_begin-halo_size,d%jj_end+halo_size 1301 ! DO i=d%ii_begin-halo_size,d%ii_end+halo_size 1302 ! IF (single .OR. d%assign_domain(i,j)==ind) n=n+1 1303 ! ENDDO 1304 ! ENDDO 1305 1276 1306 1277 ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 1307 1278 … … 1330 1301 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1331 1302 1332 ! ncell=ncell+n1333 1303 DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 1334 ! END DO1335 1304 1336 1305 ELSE IF (Field(ind_b)%field_type==field_Z) THEN … … 1416 1385 status = NF90_ENDDEF(ncid) 1417 1386 1418 ! ncell=11419 ! DO ind=ind_b,ind_e1420 ! d=>domain_type(ind)1421 !1422 ! n=01423 ! DO j=d%jj_begin+1,d%jj_end1424 ! DO i=d%ii_begin,d%ii_end-11425 ! n=n+11426 ! ENDDO1427 ! ENDDO1428 !1429 ! DO j=d%jj_begin,d%jj_end-11430 ! DO i=d%ii_begin+1,d%ii_end1431 ! n=n+11432 ! ENDDO1433 ! ENDDO1434 1435 ! ALLOCATE(lon(n),lat(n),bounds_lon(0:nvert-1,n),bounds_lat(0:nvert-1,n))1436 1387 ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 1437 1388 … … 1446 1397 CALL xyz2lonlat(d%vertex(:,vdown,i,j),lon(n),lat(n)) 1447 1398 lon(n)=lon(n)*180/Pi 1448 ! IF (lon(n)<0) lon(n)=lon(n)+3601449 1399 lat(n)=lat(n)*180/Pi 1450 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n))1451 ! CALL xyz2lonlat(xyz_i(nij+t_ldown,:)/radius,bounds_lon(1,n), bounds_lat(1,n))1452 ! CALL xyz2lonlat(xyz_i(nij+t_rdown,:)/radius,bounds_lon(2,n), bounds_lat(2,n))1453 1400 1454 1401 CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) … … 1459 1406 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1460 1407 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1461 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+3601462 1408 ENDDO 1463 1409 ENDDO … … 1468 1414 nij=(j-1)*d%iim+i 1469 1415 n=n+1 1470 ! CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n))1471 1416 CALL xyz2lonlat(d%vertex(:,vup,i,j),lon(n),lat(n)) 1472 1417 lon(n)=lon(n)*180/Pi 1473 ! IF (lon(n)<0) lon(n)=lon(n)+3601474 1418 lat(n)=lat(n)*180/Pi 1475 ! CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n))1476 ! CALL xyz2lonlat(xyz_i(nij+t_rup,:)/radius,bounds_lon(1,n), bounds_lat(1,n))1477 ! CALL xyz2lonlat(xyz_i(nij+t_lup,:)/radius,bounds_lon(2,n), bounds_lat(2,n))1478 1419 CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) 1479 1420 CALL xyz2lonlat(d%xyz(:,i,j+1),bounds_lon(1,n), bounds_lat(1,n)) … … 1483 1424 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1484 1425 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1485 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+3601486 1426 ENDDO 1487 1427 ENDDO … … 1494 1434 status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 1495 1435 1496 ! ncell=ncell+n1497 1436 DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 1498 ! END DO 1499 ENDIF 1500 1501 1502 1503 ! status = NF90_CLOSE(ncid) 1437 ENDIF 1438 1504 1439 1505 1440 END SUBROUTINE Create_Header_gen … … 1783 1718 CALL xyz2lonlat(xyz_v(nij+z_down,:)/radius,lon(n),lat(n)) 1784 1719 lon(n)=lon(n)*180/Pi 1785 ! IF (lon(n)<0) lon(n)=lon(n)+3601786 1720 lat(n)=lat(n)*180/Pi 1787 1721 CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) … … 1792 1726 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1793 1727 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1794 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+3601795 1728 ENDDO 1796 1729 ENDDO … … 1803 1736 CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n)) 1804 1737 lon(n)=lon(n)*180/Pi 1805 ! IF (lon(n)<0) lon(n)=lon(n)+3601806 1738 lat(n)=lat(n)*180/Pi 1807 1739 CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) … … 1812 1744 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 1813 1745 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 1814 ! IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+3601815 1746 ENDDO 1816 1747 ENDDO … … 1829 1760 1830 1761 1831 1832 ! status = NF90_CLOSE(ncid) 1833 1834 end subroutine Create_Header_mpi 1762 END SUBROUTINE Create_Header_mpi 1835 1763 1836 1764 SUBROUTINE Close_files
Note: See TracChangeset
for help on using the changeset viewer.