Changeset 592 for codes/icosagcm/devel/src/transport/advect_tracer.f90
- Timestamp:
- 10/17/17 23:11:14 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/src/transport/advect_tracer.f90
r583 r592 54 54 END SUBROUTINE init_advect_tracer 55 55 56 SUBROUTINE advect_tracer(diagflux_on, f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz,f_qfluxt) 57 USE mpipara 56 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 58 59 USE trace 59 60 USE write_field_mod 60 61 USE tracer_mod 61 LOGICAL, INTENT(IN) :: diagflux_on62 62 TYPE(t_field),POINTER :: f_hfluxt(:) ! time-integrated horizontal mass flux 63 63 TYPE(t_field),POINTER :: f_wfluxt(:) ! time-integrated vertical mass flux … … 65 65 TYPE(t_field),POINTER :: f_q(:) ! tracer 66 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 67 71 TYPE(t_field),POINTER :: f_qfluxt(:) ! time-integrated horizontal tracer flux 68 72 69 73 REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 70 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), qfluxt(:,:,:)74 REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), masst(:,:), qmasst(:,:,:), massfluxt(:,:), qfluxt(:,:,:) 71 75 REAL(rstd),POINTER :: rhodz(:,:), u(:,:) 72 76 ! temporary shared variable for vlz … … 76 80 REAL(rstd),POINTER :: wq(:,:) ! time-integrated flux of q 77 81 78 82 INTEGER :: ind,k, nq_last 79 83 LOGICAL,SAVE :: first=.TRUE. 80 84 !$OMP THREADPRIVATE(first) … … 140 144 CALL send_message(f_cc,req_cc) 141 145 142 143 146 ! horizontal transport - split in two to place transfer of gradq3d 144 147 DO k = 1, nqtot … … 153 156 sqrt_leng=f_sqrt_leng(ind) 154 157 CALL compute_gradq3d(q(:,:,k),sqrt_leng,gradq3d,xyz_i,xyz_v) 155 156 158 END DO 157 159 … … 159 161 CALL wait_message(req_cc) 160 162 CALL wait_message(req_gradq3d) 161 162 163 163 164 DO ind=1,ndomain … … 171 172 qfluxt = f_qfluxt(ind) 172 173 gradq3d = f_gradq3d(ind) 173 CALL compute_advect_horiz(k==nq_last,diagflux_on, hfluxt,cc,gradq3d, rhodz,q(:,:,k),qfluxt(:,:,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
Note: See TracChangeset
for help on using the changeset viewer.