Changeset 954
- Timestamp:
- 07/15/19 12:29:31 (5 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/dissip/dissip_gcm.F90
r953 r954 207 207 u=f_u(ind) 208 208 du=f_du(ind) 209 CALL compute_gradiv_inplace(u, 1,1)209 CALL compute_gradiv_inplace(u,Ai,ne,le,de,1,1) 210 210 ! This should be ported on GPU but we are running into compiler issues... 211 211 !$acc update host(u(:)) wait … … 306 306 u=f_u(ind) 307 307 du=f_du(ind) 308 CALL compute_gradrot_inplace(u, 1,1)308 CALL compute_gradrot_inplace(u,Av,ne,le,de,1,1) 309 309 ! This should be ported on GPU but we are running into compiler issues... 310 310 !$acc update host(u(:)) wait … … 401 401 theta=f_theta(ind) 402 402 dtheta=f_dtheta(ind) 403 CALL compute_divgrad_inplace(theta, 1,1)403 CALL compute_divgrad_inplace(theta,Ai,ne,le,de,1,1) 404 404 ! This should be ported on GPU but we are running into compiler issues... 405 405 !$acc update host(theta(:)) wait … … 707 707 CALL swap_geometry(ind) 708 708 due=f_due(ind) 709 CALL compute_gradiv_inplace(due, ll_begin,ll_end)709 CALL compute_gradiv_inplace(due,Ai,ne,le,de,ll_begin,ll_end) 710 710 ENDDO 711 711 ENDDO … … 757 757 CALL swap_geometry(ind) 758 758 due=f_due(ind) 759 CALL compute_gradrot_inplace(due, ll_begin,ll_end)759 CALL compute_gradrot_inplace(due,Av,ne,le,de,ll_begin,ll_end) 760 760 ENDDO 761 761 … … 805 805 CALL swap_geometry(ind) 806 806 dtheta=f_dtheta(ind) 807 CALL compute_divgrad_inplace(dtheta, ll_begin,ll_end)807 CALL compute_divgrad_inplace(dtheta,Ai,ne,le,de,ll_begin,ll_end) 808 808 ENDDO 809 809 … … 857 857 CALL swap_geometry(ind) 858 858 dtheta_rhodz=f_dtheta_rhodz(ind) 859 CALL compute_divgrad_inplace(dtheta_rhodz, ll_begin,ll_end)859 CALL compute_divgrad_inplace(dtheta_rhodz,Ai,ne,le,de,ll_begin,ll_end) 860 860 ENDDO 861 861 … … 884 884 END SUBROUTINE divgrad_theta_rhodz 885 885 886 SUBROUTINE compute_gradiv(ue,gradivu_e, llb,lle)886 SUBROUTINE compute_gradiv(ue,gradivu_e,Ai,ne,le,de,llb,lle) 887 887 INTEGER,INTENT(IN) :: llb 888 888 INTEGER,INTENT(IN) :: lle 889 889 REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,llm) 890 890 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,llm) 891 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 892 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 893 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 894 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 891 895 892 896 gradivu_e = ue 893 CALL compute_gradiv_inplace(gradivu_e, llb,lle)897 CALL compute_gradiv_inplace(gradivu_e,Ai,ne,le,de,llb,lle) 894 898 895 899 END SUBROUTINE compute_gradiv 896 900 897 SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,llb,lle) 898 USE geometry, ONLY : Ai, ne, le, de 901 SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,Ai,ne,le,de,llb,lle) 899 902 INTEGER,INTENT(IN) :: llb 900 903 INTEGER,INTENT(IN) :: lle 901 904 REAL(rstd),INTENT(INOUT) :: ue_gradivu_e(iim*3*jjm,llm) 905 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 906 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 907 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 908 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 902 909 REAL(rstd) :: divu_i(iim*jjm,llb:lle) 903 910 … … 945 952 END SUBROUTINE compute_gradiv_inplace 946 953 947 SUBROUTINE compute_divgrad(theta,divgrad_i, llb,lle)954 SUBROUTINE compute_divgrad(theta,divgrad_i,Ai,ne,le,de,llb,lle) 948 955 INTEGER,INTENT(IN) :: llb 949 956 INTEGER,INTENT(IN) :: lle 950 957 REAL(rstd),INTENT(IN) :: theta(iim*jjm,1:lle) 951 958 REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,1:lle) 959 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 960 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 961 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 962 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 952 963 953 964 divgrad_i = theta 954 CALL compute_divgrad_inplace(divgrad_i, llb,lle)965 CALL compute_divgrad_inplace(divgrad_i,Ai,ne,le,de,llb,lle) 955 966 END SUBROUTINE compute_divgrad 956 967 957 SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,llb,lle) 958 USE geometry, ONLY : Ai, ne, le, de 968 SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,Ai,ne,le,de,llb,lle) 959 969 INTEGER,INTENT(IN) :: llb 960 970 INTEGER,INTENT(IN) :: lle 961 971 REAL(rstd),INTENT(INOUT) :: theta_divgrad_i(iim*jjm,1:lle) 972 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 973 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 974 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 975 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 962 976 REAL(rstd) :: grad_e(3*iim*jjm,llb:lle) 963 977 … … 1003 1017 END SUBROUTINE compute_divgrad_inplace 1004 1018 1005 SUBROUTINE compute_gradrot(ue,gradrot_e, llb,lle)1019 SUBROUTINE compute_gradrot(ue,gradrot_e,Av,ne,le,de,llb,lle) 1006 1020 INTEGER,INTENT(IN) :: llb 1007 1021 INTEGER,INTENT(IN) :: lle 1008 1022 REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,lle) 1009 1023 REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,lle) 1024 REAL(rstd),INTENT(IN) :: Av(2*iim*jjm) 1025 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 1026 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 1027 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 1010 1028 1011 1029 gradrot_e = ue 1012 CALL compute_gradrot_inplace(gradrot_e, llb,lle)1030 CALL compute_gradrot_inplace(gradrot_e,Av,ne,le,de,llb,lle) 1013 1031 END SUBROUTINE compute_gradrot 1014 1032 1015 SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,llb,lle) 1016 USE geometry, ONLY : Av, ne, le, de 1033 SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,Av,ne,le,de,llb,lle) 1017 1034 INTEGER,INTENT(IN) :: llb 1018 1035 INTEGER,INTENT(IN) :: lle 1019 1036 REAL(rstd),INTENT(INOUT) :: ue_gradrot_e(iim*3*jjm,lle) 1037 REAL(rstd),INTENT(IN) :: Av(2*iim*jjm) 1038 INTEGER,INTENT(IN) :: ne(iim*jjm,6) 1039 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 1040 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 1020 1041 REAL(rstd) :: rot_v(2*iim*jjm,llb:lle) 1021 1042 -
codes/icosagcm/trunk/src/dynamics/caldyn_gcm.F90
r953 r954 188 188 f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 189 189 USE observable_mod 190 USE disvert_mod, ONLY : caldyn_eta, eta_mass 190 USE disvert_mod, ONLY : caldyn_eta, eta_mass, bp 191 191 USE trace 192 192 LOGICAL,INTENT(IN) :: write_out … … 319 319 wwuu=f_wwuu(ind) 320 320 dps=f_dps(ind) 321 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz(:,:,1), du )321 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz(:,:,1), du, bp) 322 322 END IF 323 323 ENDDO … … 348 348 wwuu=f_wwuu(ind) 349 349 dps=f_dps(ind) 350 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du )350 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du, bp) 351 351 END IF 352 352 ENDDO -
codes/icosagcm/trunk/src/dynamics/caldyn_hevi.F90
r953 r954 16 16 USE icosa 17 17 USE observable_mod 18 USE disvert_mod, ONLY : caldyn_eta, eta_mass 18 USE disvert_mod, ONLY : caldyn_eta, eta_mass, bp, mass_dak, mass_dbk 19 19 USE vorticity_mod 20 20 USE kinetic_mod … … 110 110 mass=f_mass(ind) 111 111 theta = f_theta(ind) 112 CALL compute_theta(ps,theta_rhodz, mass,theta )112 CALL compute_theta(ps,theta_rhodz, mass,theta, mass_dak, mass_dbk) 113 113 pk = f_pk(ind) 114 114 geopot = f_geopot(ind) … … 145 145 qu=f_qu(ind) 146 146 qv=f_qv(ind) 147 CALL compute_pvort_only(u,mass,qu,qv )147 CALL compute_pvort_only(u,mass,qu,qv,Av,Riv2,fv) 148 148 ENDDO 149 149 … … 165 165 166 166 IF(hydrostatic) THEN 167 CALL compute_caldyn_slow_hydro(u,mass,hflux,du, .TRUE.)167 CALL compute_caldyn_slow_hydro(u,mass,hflux,du,Ai,le_de, .TRUE.) 168 168 ELSE 169 169 CALL abort_acc("HEVI_scheme/!hydrostatic") … … 177 177 CALL compute_caldyn_slow_NH(u,mass,geopot,W, F_el,gradPhi2,w_il, hflux,du,dPhi,dW) 178 178 END IF 179 CALL compute_caldyn_Coriolis(hflux,theta,qu,convm,dtheta_rhodz,du )179 CALL compute_caldyn_Coriolis(hflux,theta,qu,convm,dtheta_rhodz,du,Ai,wee) 180 180 181 181 IF(caldyn_eta==eta_mass) THEN … … 183 183 wwuu=f_wwuu(ind) 184 184 dps=f_dps(ind) 185 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du )185 CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du, bp) 186 186 IF(.NOT.hydrostatic) THEN 187 187 CALL abort_acc("HEVI_scheme/!hydrostatic") -
codes/icosagcm/trunk/src/dynamics/caldyn_kernels_base.F90
r953 r954 209 209 END SUBROUTINE compute_geopot 210 210 211 SUBROUTINE compute_caldyn_vert(u, theta, rhodz, convm, wflux, wwuu, dps, dtheta_rhodz, du) 212 USE disvert_mod, ONLY : bp 211 SUBROUTINE compute_caldyn_vert(u, theta, rhodz, convm, wflux, wwuu, dps, dtheta_rhodz, du, bp) 213 212 REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm) 214 213 REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm,nqdyn) … … 221 220 REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 222 221 REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 222 REAL(rstd),INTENT(IN) :: bp(llm) 223 223 224 224 ! temporary variable -
codes/icosagcm/trunk/src/dynamics/caldyn_kernels_hevi.F90
r953 r954 20 20 CONTAINS 21 21 22 SUBROUTINE compute_theta(ps,theta_rhodz, rhodz,theta) 23 USE disvert_mod, ONLY : mass_dbk, mass_dak 22 SUBROUTINE compute_theta(ps,theta_rhodz, rhodz,theta, mass_dak, mass_dbk) 24 23 REAL(rstd),INTENT(IN) :: ps(iim*jjm) 25 24 REAL(rstd),INTENT(IN) :: theta_rhodz(iim*jjm,llm,nqdyn) 26 25 REAL(rstd),INTENT(INOUT) :: rhodz(iim*jjm,llm) 27 26 REAL(rstd),INTENT(OUT) :: theta(iim*jjm,llm,nqdyn) 27 REAL(rstd),INTENT(IN) :: mass_dak(llm) 28 REAL(rstd),INTENT(IN) :: mass_dbk(llm) 28 29 INTEGER :: ij,l,iq 29 30 REAL(rstd) :: m … … 59 60 END SUBROUTINE compute_theta 60 61 61 SUBROUTINE compute_pvort_only(u,rhodz,qu,qv) 62 USE geometry, ONLY : Av, Riv2, fv 62 SUBROUTINE compute_pvort_only(u,rhodz,qu,qv,Av,Riv2,fv) 63 63 REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm) 64 64 REAL(rstd),INTENT(INOUT) :: rhodz(iim*jjm,llm) 65 65 REAL(rstd),INTENT(OUT) :: qu(iim*3*jjm,llm) 66 66 REAL(rstd),INTENT(OUT) :: qv(iim*2*jjm,llm) 67 REAL(rstd),INTENT(IN) :: Av(2*iim*jjm) 68 REAL(rstd),INTENT(IN) :: Riv2(iim*jjm,6) 69 REAL(rstd),INTENT(IN) :: fv(2*iim*jjm) 67 70 68 71 INTEGER :: ij,l … … 551 554 END SUBROUTINE compute_caldyn_fast 552 555 553 SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du) 554 USE geometry, ONLY : Ai, wee 556 SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du,Ai,wee) 555 557 REAL(rstd),INTENT(IN) :: hflux(3*iim*jjm,llm) ! hflux in kg/s 556 558 REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm,nqdyn) ! active scalars … … 559 561 REAL(rstd),INTENT(OUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 560 562 REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 563 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 564 REAL(rstd),INTENT(IN) :: wee(3*iim*jjm,5,2) 561 565 562 566 REAL(rstd) :: Ftheta(3*iim*jjm,llm) ! potential temperature flux … … 730 734 END SUBROUTINE compute_caldyn_Coriolis 731 735 732 SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hflux,du,zero) 733 USE geometry, ONLY : Ai, le_de 736 SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hflux,du,Ai,le_de,zero) 734 737 LOGICAL, INTENT(IN) :: zero 735 738 REAL(rstd),INTENT(IN) :: u(3*iim*jjm,llm) ! prognostic "velocity" … … 737 740 REAL(rstd),INTENT(OUT) :: hflux(3*iim*jjm,llm) ! hflux in kg/s 738 741 REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 742 REAL(rstd),INTENT(IN) :: Ai(iim*jjm) 743 REAL(rstd),INTENT(IN) :: le_de(3*iim*jjm) 739 744 740 745 REAL(rstd) :: berni(iim*jjm,llm) ! Bernoulli function -
codes/icosagcm/trunk/src/transport/advect.F90
r953 r954 49 49 !======================================================================================= 50 50 51 SUBROUTINE compute_gradq3d(qi,sqrt_leng,gradq3d,xyz_i, 51 SUBROUTINE compute_gradq3d(qi,sqrt_leng,gradq3d,xyz_i,xyz_v) 52 52 USE trace 53 53 USE omp_para … … 348 348 349 349 ! Backward trajectories, for use with Miura approach 350 SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc)351 USE geometry, ONLY : xyz_e, de, wee, le350 SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc, & 351 xyz_e, de, wee, le ) ! metrics terms 352 352 USE trace 353 353 USE omp_para … … 358 358 REAL(rstd),INTENT(OUT) :: cc(3*iim*jjm,llm,3) ! start of backward trajectory 359 359 REAL(rstd),INTENT(IN) :: tau 360 ! metrics terms 361 REAL(rstd),INTENT(IN) :: xyz_e(iim*3*jjm,3) 362 REAL(rstd),INTENT(IN) :: de(iim*3*jjm) 363 REAL(rstd),INTENT(IN) :: wee(iim*3*jjm,5,2) 364 REAL(rstd),INTENT(IN) :: le(iim*3*jjm) 360 365 361 366 REAL(rstd) :: v_e(3), up_e … … 427 432 ! Horizontal transport (S. Dubey, T. Dubos) 428 433 ! Slope-limited van Leer approach with hexagons 429 SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass, qi, qfluxt) 434 SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass, qi, qfluxt, & 435 Ai, xyz_i) ! metrics terms 430 436 USE trace 431 437 USE omp_para 432 438 USE abort_mod 433 USE geometry, only : Ai, xyz_i434 439 IMPLICIT NONE 435 440 LOGICAL, INTENT(IN) :: update_mass, diagflux_on … … 441 446 REAL(rstd), INTENT(INOUT) :: qfluxt(3*iim*jjm,MERGE(llm,1,diagflux_on)) ! time-integrated tracer flux 442 447 ! metrics terms 448 REAL(rstd), INTENT(IN) :: Ai(iim*jjm) 449 REAL(rstd), INTENT(IN) :: xyz_i(iim*jjm,3) 443 450 444 451 REAL(rstd) :: dq,dmass,qe,newmass -
codes/icosagcm/trunk/src/transport/advect_tracer.F90
r953 r954 143 143 END DO 144 144 145 CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc) 145 CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc, & 146 xyz_e, de, wee, le ) ! metrics terms 146 147 END DO 147 148 … … 193 194 END IF 194 195 END IF 195 CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k)) 196 CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k), & 197 Ai, xyz_i) ! metrics terms 196 198 END DO 197 199
Note: See TracChangeset
for help on using the changeset viewer.