Changeset 148 for codes/icosagcm/trunk/src/advect_tracer.f90
- Timestamp:
- 03/18/13 15:44:08 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/advect_tracer.f90
r146 r148 8 8 TYPE(t_field),POINTER :: f_gradq3d(:) 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 REAL(rstd), PARAMETER :: pente_max=2.0 ! for vlz 12 13 … … 19 20 REAL(rstd),POINTER :: tangent(:,:) 20 21 REAL(rstd),POINTER :: normal(:,:) 22 REAL(rstd),POINTER :: one_over_sqrt_leng(:) 21 23 INTEGER :: ind 22 24 … … 25 27 CALL allocate_field(f_gradq3d,field_t,type_real,llm,3, name='gradq3d') 26 28 CALL allocate_field(f_cc,field_u,type_real,llm,3, name='cc') 29 CALL allocate_field(f_one_over_sqrt_leng,field_t,type_real, name='one_over_sqrt_leng') 27 30 28 31 DO ind=1,ndomain … … 31 34 normal=f_normal(ind) 32 35 tangent=f_tangent(ind) 33 CALL init_advect(normal,tangent) 36 one_over_sqrt_leng=f_one_over_sqrt_leng(ind) 37 CALL init_advect(normal,tangent,one_over_sqrt_leng) 34 38 END DO 35 39 … … 49 53 TYPE(t_field),POINTER :: f_rhodz(:) ! mass field at beginning of macro time step 50 54 51 REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), gradq3d(:,:,:), cc(:,:,:)55 REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), one_over_sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 52 56 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 53 57 REAL(rstd),POINTER :: rhodz(:,:), u(:,:) … … 106 110 rhodz = f_rhodz(ind) 107 111 wfluxt = f_wfluxt(ind) 112 108 113 DO k = 1, nqtot 109 CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k)) 110 END DO 114 CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k),1) 115 END DO 116 111 117 CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc) 112 118 END DO 113 119 114 CALL transfert_request(f_q,req_i1) ! necessary ?115 CALL transfert_request(f_rhodz,req_i1) ! necessary ?120 ! CALL transfert_request(f_q,req_i1) ! necessary ? 121 ! CALL transfert_request(f_rhodz,req_i1) ! necessary ? 116 122 117 123 ! horizontal transport - split in two to place transfer of gradq3d … … 123 129 q = f_q(ind) 124 130 gradq3d = f_gradq3d(ind) 125 CALL compute_gradq3d(q(:,:,k),gradq3d) 131 one_over_sqrt_leng=f_one_over_sqrt_leng(ind) 132 CALL compute_gradq3d(q(:,:,k),one_over_sqrt_leng,gradq3d) 126 133 END DO 127 134 128 135 CALL transfert_request(f_gradq3d,req_i1) 136 137 129 138 130 139 DO ind=1,ndomain … … 140 149 END DO 141 150 142 CALL transfert_request(f_q,req_i1) ! necessary ?143 CALL transfert_request(f_rhodz,req_i1) ! necessary ?151 ! CALL transfert_request(f_q,req_i1) ! necessary ? 152 ! CALL transfert_request(f_rhodz,req_i1) ! necessary ? 144 153 145 154 ! 1/2 vertical transport … … 151 160 wfluxt = f_wfluxt(ind) 152 161 DO k = 1,nqtot 153 CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k) )162 CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k),0) 154 163 END DO 155 164 END DO … … 159 168 END SUBROUTINE advect_tracer 160 169 161 SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q )170 SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q, halo) 162 171 ! 163 172 ! Auteurs: P.Le Van, F.Hourdin, F.Forget, T. Dubos … … 168 177 ! wfluxt >0 for upward transport 169 178 ! ******************************************************************** 179 USE trace 170 180 IMPLICIT NONE 171 181 LOGICAL, INTENT(IN) :: update_mass … … 173 183 REAL(rstd), INTENT(INOUT) :: mass(iim*jjm,llm) 174 184 REAL(rstd), INTENT(INOUT) :: q(iim*jjm,llm) 185 INTEGER, INTENT(IN) :: halo 175 186 176 187 REAL(rstd) :: dq(iim*jjm,llm), & ! increase of q … … 182 193 INTEGER :: i,ij,l,j 183 194 195 CALL trace_start("vlz") 196 184 197 ! finite difference of q 185 198 DO l=2,llm 186 DO j=jj_begin- 1,jj_end+1187 DO i=ii_begin- 1,ii_end+1199 DO j=jj_begin-halo,jj_end+halo 200 DO i=ii_begin-halo,ii_end+halo 188 201 ij=(j-1)*iim+i 189 202 dzqw(ij,l)=q(ij,l)-q(ij,l-1) … … 196 209 ! dzq = slope*dz, i.e. the reconstructed q varies by dzq inside level l 197 210 DO l=2,llm-1 198 DO j=jj_begin- 1,jj_end+1199 DO i=ii_begin- 1,ii_end+1211 DO j=jj_begin-halo,jj_end+halo 212 DO i=ii_begin-halo,ii_end+halo 200 213 ij=(j-1)*iim+i 201 214 IF(dzqw(ij,l)*dzqw(ij,l+1).gt.0.) THEN … … 211 224 212 225 ! 0 slope in top and bottom layers 213 DO j=jj_begin- 1,jj_end+1214 DO i=ii_begin- 1,ii_end+1226 DO j=jj_begin-halo,jj_end+halo 227 DO i=ii_begin-halo,ii_end+halo 215 228 ij=(j-1)*iim+i 216 229 dzq(ij,1)=0. … … 222 235 ! then amount of q leaving level l/l+1 = wq = w * qq 223 236 DO l = 1,llm-1 224 DO j=jj_begin- 1,jj_end+1225 DO i=ii_begin- 1,ii_end+1237 DO j=jj_begin-halo,jj_end+halo 238 DO i=ii_begin-halo,ii_end+halo 226 239 ij=(j-1)*iim+i 227 240 w = fac*wfluxt(ij,l+1) … … 238 251 END DO 239 252 ! wq = 0 at top and bottom 240 DO j=jj_begin- 1,jj_end+1241 DO i=ii_begin- 1,ii_end+1253 DO j=jj_begin-halo,jj_end+halo 254 DO i=ii_begin-halo,ii_end+halo 242 255 ij=(j-1)*iim+i 243 256 wq(ij,llm+1)=0. … … 248 261 ! update q, mass is updated only after all q's have been updated 249 262 DO l=1,llm 250 DO j=jj_begin- 1,jj_end+1251 DO i=ii_begin- 1,ii_end+1263 DO j=jj_begin-halo,jj_end+halo 264 DO i=ii_begin-halo,ii_end+halo 252 265 ij=(j-1)*iim+i 253 266 newmass = mass(ij,l) + fac*(wfluxt(ij,l)-wfluxt(ij,l+1)) … … 258 271 END DO 259 272 273 CALL trace_end("vlz") 274 260 275 END SUBROUTINE vlz 261 276
Note: See TracChangeset
for help on using the changeset viewer.