Changeset 599 for codes/icosagcm/trunk/src/transport/advect_tracer.f90
- Timestamp:
- 10/19/17 17:04:26 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/transport/advect_tracer.f90
r548 r599 1 1 MODULE advect_tracer_mod 2 2 USE icosa 3 USE advect_mod 3 4 IMPLICIT NONE 4 5 PRIVATE … … 25 26 26 27 SUBROUTINE init_advect_tracer 27 USE advect_mod28 28 USE omp_para 29 29 REAL(rstd),POINTER :: tangent(:,:) … … 54 54 END SUBROUTINE init_advect_tracer 55 55 56 SUBROUTINE advect_tracer(f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz )57 USE advect_mod58 USE mpipara56 SUBROUTINE advect_tracer(f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz,& 57 frac, f_masst,f_qmasst,f_massfluxt,f_qfluxt) 58 USE omp_para 59 59 USE trace 60 60 USE write_field_mod 61 61 USE tracer_mod 62 IMPLICIT NONE63 64 62 TYPE(t_field),POINTER :: f_hfluxt(:) ! time-integrated horizontal mass flux 65 63 TYPE(t_field),POINTER :: f_wfluxt(:) ! time-integrated vertical mass flux … … 67 65 TYPE(t_field),POINTER :: f_q(:) ! tracer 68 66 TYPE(t_field),POINTER :: f_rhodz(:) ! mass field at beginning of macro time step 67 REAL(rstd), INTENT(in):: frac ! ratio itau_adv/itau_out or 0. if not diagflux_on 68 TYPE(t_field),POINTER :: f_masst(:) ! time-integrated mass 69 TYPE(t_field),POINTER :: f_qmasst(:) ! time-integrated tracer mass 70 TYPE(t_field),POINTER :: f_massfluxt(:)! time-integrated horizontal mass flux 71 TYPE(t_field),POINTER :: f_qfluxt(:) ! time-integrated horizontal tracer flux 69 72 70 73 REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 71 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 74 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), masst(:,:), qmasst(:,:,:), massfluxt(:,:), qfluxt(:,:,:) 72 75 REAL(rstd),POINTER :: rhodz(:,:), u(:,:) 73 76 ! temporary shared variable for vlz … … 77 80 REAL(rstd),POINTER :: wq(:,:) ! time-integrated flux of q 78 81 79 82 INTEGER :: ind,k, nq_last 80 83 LOGICAL,SAVE :: first=.TRUE. 81 84 !$OMP THREADPRIVATE(first) … … 141 144 CALL send_message(f_cc,req_cc) 142 145 143 144 146 ! horizontal transport - split in two to place transfer of gradq3d 145 147 DO k = 1, nqtot … … 154 156 sqrt_leng=f_sqrt_leng(ind) 155 157 CALL compute_gradq3d(q(:,:,k),sqrt_leng,gradq3d,xyz_i,xyz_v) 156 157 158 END DO 158 159 … … 160 161 CALL wait_message(req_cc) 161 162 CALL wait_message(req_gradq3d) 162 163 163 164 164 DO ind=1,ndomain … … 170 170 rhodz = f_rhodz(ind) 171 171 hfluxt = f_hfluxt(ind) 172 qfluxt = f_qfluxt(ind) 172 173 gradq3d = f_gradq3d(ind) 173 CALL compute_advect_horiz(k==nq_last,hfluxt,cc,gradq3d, rhodz,q(:,:,k)) 174 175 IF(frac>0.) THEN ! accumulate mass, mass flux and tracer mass 176 qmasst = f_qmasst(ind) 177 qmasst(:,ll_begin:ll_end,k) = qmasst(:,ll_begin:ll_end,k) + & 178 frac*rhodz(:,ll_begin:ll_end)*q(:,ll_begin:ll_end,k) 179 IF(k==nq_last) THEN 180 masst = f_masst(ind) 181 massfluxt = f_massfluxt(ind) 182 masst(:,ll_begin:ll_end) = masst(:,ll_begin:ll_end)+frac*rhodz(:,ll_begin:ll_end) 183 massfluxt(:,ll_begin:ll_end) = massfluxt(:,ll_begin:ll_end)+hfluxt(:,ll_begin:ll_end) 184 END IF 185 END IF 186 CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k)) 174 187 END DO 188 175 189 ENDIF 176 190 END DO … … 214 228 USE trace 215 229 USE omp_para 216 IMPLICIT NONE217 230 LOGICAL, INTENT(IN) :: update_mass 218 231 REAL(rstd), INTENT(IN) :: fac, wfluxt(iim*jjm,llm+1) ! vertical mass flux
Note: See TracChangeset
for help on using the changeset viewer.