- Timestamp:
- 06/14/16 21:54:26 (8 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/caldyn_kernels.f90
r362 r428 33 33 USE icosa 34 34 USE disvert_mod, ONLY : mass_dak, mass_dbk, caldyn_eta, eta_mass 35 USE exner_mod36 35 USE trace 37 36 USE omp_para … … 121 120 USE icosa 122 121 USE disvert_mod 123 USE exner_mod124 122 USE trace 125 123 USE omp_para -
codes/icosagcm/trunk/src/etat0_academic.f90
r295 r428 1 1 MODULE etat0_academic_mod 2 3 4 5 2 USE icosa 3 IMPLICIT NONE 4 5 PRIVATE 6 7 PUBLIC :: etat0 8 6 9 CONTAINS 7 10 … … 9 12 USE icosa 10 13 USE kinetic_mod 11 IMPLICIT NONE12 14 TYPE(t_field),POINTER,SAVE :: f_ps(:) 13 15 TYPE(t_field),POINTER,SAVE :: f_phis(:) … … 21 23 REAL(rstd),POINTER :: temp(:) 22 24 INTEGER :: ind 23 24 25 25 26 CALL allocate_field(f_ps,field_t,type_real) 26 27 CALL allocate_field(f_phis,field_t,type_real) … … 40 41 41 42 END SUBROUTINE test_etat0_academic 42 43 43 44 44 SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q) 45 45 USE icosa 46 IMPLICIT NONE47 46 TYPE(t_field),POINTER :: f_ps(:) 48 47 TYPE(t_field),POINTER :: f_phis(:) … … 56 55 REAL(rstd),POINTER :: u(:,:) 57 56 INTEGER :: ind 58 57 58 PRINT *, 'etat0_academic needs an upgrade for 4D theta' 59 PRINT *, 'STOP in etat0_academic.f90/etat0' 60 STOP 61 59 62 DO ind=1,ndomain 60 63 IF (.NOT. assigned_domain(ind)) CYCLE … … 77 80 USE geopotential_mod 78 81 USE theta2theta_rhodz_mod 79 IMPLICIT NONE80 82 REAL(rstd),INTENT(OUT) :: ps(iim*jjm) 81 83 REAL(rstd),INTENT(OUT) :: phis(iim*jjm) … … 99 101 REAL(rstd) :: fact(3*iim*jjm) 100 102 REAL(rstd) :: ut(3*iim*jjm,llm) 101 102 103 103 104 DO l=1,llm 104 105 zsig=ap(l)/preff+bp(l) … … 137 138 CALL compute_pression(ps,p,1) 138 139 !$OMP BARRIER 139 CALL compute_exner(ps,p,pks,pk,1) 140 !$OMP BARRIER 141 CALL compute_geopotential(phis,pks,pk,theta,phi,1) 140 CALL compute_geopotential(phis,ps,theta,phi,1) 142 141 143 142 -
codes/icosagcm/trunk/src/etat0_heldsz.f90
r359 r428 23 23 24 24 SUBROUTINE test_etat0_heldsz 25 USE icosa26 25 USE kinetic_mod 27 IMPLICIT NONE28 26 TYPE(t_field),POINTER :: f_ps(:) 29 27 TYPE(t_field),POINTER :: f_phis(:) … … 50 48 51 49 SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q) 52 USE icosa53 50 USE theta2theta_rhodz_mod 54 51 IMPLICIT NONE … … 99 96 100 97 SUBROUTINE init_Teq 101 USE icosa102 98 USE disvert_mod, ONLY : ap,bp 103 IMPLICIT NONE104 99 REAL(rstd),POINTER :: clat(:) 105 100 REAL(rstd),POINTER :: theta_eq(:,:) … … 159 154 160 155 SUBROUTINE compute_Teq(lat,theta_eq) 161 USE icosa162 156 USE disvert_mod 163 IMPLICIT NONE164 157 REAL(rstd),INTENT(IN) :: lat(iim*jjm) 165 158 REAL(rstd),INTENT(OUT) :: theta_eq(iim*jjm,llm) … … 184 177 185 178 SUBROUTINE compute_etat0_heldsz(theta_eq, theta) 186 USE icosa187 179 USE disvert_mod 188 USE pression_mod189 USE exner_mod190 USE geopotential_mod191 USE theta2theta_rhodz_mod192 IMPLICIT NONE193 180 REAL(rstd),INTENT(IN) :: theta_eq(iim*jjm,llm) 194 181 REAL(rstd),INTENT(OUT) :: theta(iim*jjm,llm) … … 211 198 212 199 SUBROUTINE held_suarez(f_ps,f_theta_rhodz,f_u) 213 USE icosa214 IMPLICIT NONE215 200 TYPE(t_field),POINTER :: f_theta_rhodz(:) 216 201 TYPE(t_field),POINTER :: f_u(:) … … 238 223 239 224 SUBROUTINE compute_heldsz(ps,theta_eq,lat, theta_rhodz,u, theta) 240 USE icosa241 225 USE theta2theta_rhodz_mod 242 IMPLICIT NONE243 226 REAL(rstd),INTENT(IN) :: ps(iim*jjm) 244 227 REAL(rstd),INTENT(IN) :: theta_eq(iim*jjm,llm) -
codes/icosagcm/trunk/src/exner.f90
r295 r428 11 11 USE icosa 12 12 IMPLICIT NONE 13 TYPE(t_field), POINTER :: f_ps(:) 14 TYPE(t_field), POINTER :: f_p(:) 15 TYPE(t_field), POINTER :: f_pks(:) 16 TYPE(t_field), POINTER :: f_pk(:) 13 TYPE(t_field), POINTER :: f_ps(:) ! IN 14 TYPE(t_field), POINTER :: f_p(:) ! IN 15 TYPE(t_field), POINTER :: f_pks(:) ! OUT 16 TYPE(t_field), POINTER :: f_pk(:) ! OUT 17 17 18 18 REAL(rstd), POINTER :: ps(:) … … 49 49 INTEGER,INTENT(IN) :: offset 50 50 INTEGER :: i,j,ij,l 51 REAL(rstd) :: alpha(iim*jjm,llm),beta(iim*jjm,llm)52 REAL(rstd) :: delta53 51 54 IF(caldyn_exner == lmdz) THEN ! LMD-Z style calculation of Exner pressure55 !! Compute Alpha and Beta52 ! surface : pks 53 IF (is_omp_level_master) THEN 56 54 57 IF (is_omp_level_master) THEN 58 ! for llm layer 59 DO j=jj_begin-offset,jj_end+offset 60 DO i=ii_begin-offset,ii_end+offset 61 ij=(j-1)*iim+i 62 alpha(ij,llm) = 0. 63 beta (ij,llm) = 1./ (1+ 2*kappa) 64 ENDDO 65 ENDDO 55 DO j=jj_begin-offset,jj_end+offset 56 DO i=ii_begin-offset,ii_end+offset 57 ij=(j-1)*iim+i 58 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 59 ENDDO 60 ENDDO 66 61 67 ! for other layer 68 DO l = llm-1 , 2 , -1 69 DO j=jj_begin-offset,jj_end+offset 70 DO i=ii_begin-offset,ii_end+offset 71 ij=(j-1)*iim+i 72 delta = p(ij,l)* (1+2*kappa) + p(ij,l+1)* ( beta(ij,l+1)- (1+2*kappa) ) 73 alpha(ij,l) = - p(ij,l+1) / delta * alpha(ij,l+1) 74 beta (ij,l) = p(ij,l ) / delta 75 ENDDO 76 ENDDO 77 ENDDO 78 79 !! Compute pk 80 81 ! for first layer 82 DO j=jj_begin-offset,jj_end+offset 83 DO i=ii_begin-offset,ii_end+offset 84 ij=(j-1)*iim+i 85 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 86 pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) ) / & 87 ( p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-(1.+2*kappa) )* p(ij,2) ) 88 ENDDO 89 ENDDO 90 91 ! for other layers 92 93 DO l = 2, llm 94 DO j=jj_begin-offset,jj_end+offset 95 DO i=ii_begin-offset,ii_end+offset 96 ij=(j-1)*iim+i 97 pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1) 98 ENDDO 99 ENDDO 100 ENDDO 101 102 ENDIF 103 104 ELSE ! Simple calculation of Exner pressure based on centered average 105 ! surface : pks 106 IF (is_omp_level_master) THEN 107 108 DO j=jj_begin-offset,jj_end+offset 109 DO i=ii_begin-offset,ii_end+offset 110 ij=(j-1)*iim+i 111 pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 112 ENDDO 113 ENDDO 114 115 ENDIF 116 117 ! 3D : pk 118 DO l = 1, llm 119 DO j=jj_begin-offset,jj_end+offset 120 DO i=ii_begin-offset,ii_end+offset 121 ij=(j-1)*iim+i 122 pk(ij,l) = cpp * ((.5/preff)*(p(ij,l)+p(ij,l+1))) ** kappa 62 ENDIF 63 64 ! 3D : pk 65 DO l = 1, llm 66 DO j=jj_begin-offset,jj_end+offset 67 DO i=ii_begin-offset,ii_end+offset 68 ij=(j-1)*iim+i 69 pk(ij,l) = cpp * ((.5/preff)*(p(ij,l)+p(ij,l+1))) ** kappa 123 70 ENDDO 124 71 ENDDO 125 72 ENDDO 126 127 END IF 128 73 129 74 END SUBROUTINE compute_exner 130 75 -
codes/icosagcm/trunk/src/geopotential_mod.f90
r354 r428 2 2 IMPLICIT NONE 3 3 PRIVATE 4 4 5 5 PUBLIC :: compute_geopotential 6 6 CONTAINS 7 8 SUBROUTINE thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_p,f_theta,f_phi) ! FIXME : never called, dry only 9 USE icosa 10 USE omp_para 11 USE pression_mod 12 USE theta2theta_rhodz_mod 13 TYPE(t_field), POINTER :: f_ps(:), f_phis(:), f_theta_rhodz(:), & ! IN 14 f_p(:), f_theta(:), f_phi(:) ! OUT 15 REAL(rstd),POINTER :: pk(:,:), p(:,:), theta(:,:,:), theta_rhodz(:,:,:), & 16 phi(:,:), phis(:), ps(:) 17 INTEGER :: ind 18 19 DO ind=1,ndomain 20 IF (.NOT. assigned_domain(ind)) CYCLE 21 CALL swap_dimensions(ind) 22 CALL swap_geometry(ind) 23 ps = f_ps(ind) 24 p = f_p(ind) 25 !$OMP BARRIER 26 CALL compute_pression(ps,p,0) 27 !$OMP BARRIER 28 theta_rhodz = f_theta_rhodz(ind) 29 theta = f_theta(ind) 30 CALL compute_theta_rhodz2theta(ps, theta_rhodz,theta,0) 31 phis = f_phis(ind) 32 phi = f_phi(ind) 33 CALL compute_geopotential(phis,p,theta,phi,0) 34 END DO 7 35 8 SUBROUTINE geopotential(f_phis,f_pks,f_pk,f_theta,f_phi) ! ORPHAN 9 USE icosa 10 TYPE(t_field), POINTER :: f_phis(:) 11 TYPE(t_field), POINTER :: f_pks(:) 12 TYPE(t_field), POINTER :: f_pk(:) 13 TYPE(t_field), POINTER :: f_theta(:) 14 TYPE(t_field), POINTER :: f_phi(:) 15 16 REAL(rstd), POINTER :: phis(:) 17 REAL(rstd), POINTER :: pks(:) 18 REAL(rstd), POINTER :: pk(:,:) 19 REAL(rstd), POINTER :: theta(:,:) 20 REAL(rstd), POINTER :: phi(:,:) 21 INTEGER :: ind 36 END SUBROUTINE thetarhodz2geopot 22 37 23 DO ind=1,ndomain 24 IF (.NOT. assigned_domain(ind)) CYCLE 25 CALL swap_dimensions(ind) 26 CALL swap_geometry(ind) 27 phis=f_phis(ind) 28 pks=f_pks(ind) 29 pk=f_pk(ind) 30 theta=f_theta(ind) 31 phi=f_phi(ind) 32 CALL compute_geopotential(phis,pks,pk,theta,phi,0) 33 ENDDO 34 35 END SUBROUTINE geopotential 36 37 SUBROUTINE compute_geopotential(phis,pks,pk,theta,phi,offset) 38 USE icosa 39 USE omp_para 40 IMPLICIT NONE 38 39 SUBROUTINE compute_geopotential(phis,p,theta,phi,offset) 40 USE icosa 41 USE omp_para 42 REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 41 43 REAL(rstd),INTENT(IN) :: phis(iim*jjm) 42 REAL(rstd),INTENT(IN) :: pks(iim*jjm) 43 REAL(rstd),INTENT(IN) :: pk(iim*jjm,llm) 44 REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm) 44 REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm,nqdyn) 45 45 REAL(rstd),INTENT(OUT) :: phi(iim*jjm,llm) 46 46 INTEGER,INTENT(IN) :: offset 47 47 INTEGER :: i,j,ij,l 48 REAL(rstd) :: mg_ij, p_ij, exner_ij 48 49 49 50 !!! Compute geopotential … … 57 58 ! flush pks, pk thetha, phis 58 59 !$OMP BARRIER 59 IF(is_omp_level_master) THEN60 DO j=jj_begin-offset,jj_end+offset61 DO i=ii_begin-offset,ii_end+offset62 ij=(j-1)*iim+i63 phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1))64 ENDDO65 ENDDO60 IF(is_omp_level_master) THEN 61 DO j=jj_begin-offset,jj_end+offset 62 DO i=ii_begin-offset,ii_end+offset 63 ij=(j-1)*iim+i 64 phi( ij,1 ) = phis( ij ) 65 END DO 66 END DO 66 67 67 68 ! for other layers 68 DO l = 2, llm69 DO l = 1, llm-1 69 70 DO j=jj_begin-offset,jj_end+offset 70 71 DO i=ii_begin-offset,ii_end+offset 71 72 ij=(j-1)*iim+i 72 phi(ij,l) = phi(ij,l-1) + 0.5 * ( theta(ij,l) + theta(ij,l-1) ) & 73 * ( pk(ij,l-1) - pk(ij,l) ) 73 mg_ij = p(ij,l+1)-p(ij,l) 74 ! v=RT/p=(kappa.cpp).Theta.(p/preff)**kappa /p 75 p_ij=.5*(p(ij,l+1)+p(ij,l)) 76 exner_ij = (p_ij/preff)**kappa ! NB : no cpp factor 77 phi(ij,l+1) = phi(ij,l) + (kappa*cpp)*mg_ij*theta(ij,l,1)*exner_ij/p_ij 74 78 ENDDO 75 79 ENDDO -
codes/icosagcm/trunk/src/observable.f90
r418 r428 158 158 END SUBROUTINE write_output_fields_basic 159 159 160 SUBROUTINE write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 161 f_buf_i, f_buf_v, f_buf_i3, f_buf1_i, f_buf2_i, f_buf_s, f_buf_p) 162 USE vorticity_mod 163 USE theta2theta_rhodz_mod 164 USE pression_mod 165 USE omega_mod 166 USE write_field_mod 167 USE vertical_interp_mod 168 USE wind_mod 169 TYPE(t_field),POINTER :: f_ps(:), f_phis(:), f_u(:), f_theta_rhodz(:), f_q(:), f_dps(:), & 170 f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:) 171 172 REAL(rstd) :: out_pression_level 173 CHARACTER(LEN=255) :: str_pression 174 CHARACTER(LEN=255) :: physics_type 175 176 out_pression_level=0. 177 CALL getin("out_pression_level",out_pression_level) 178 WRITE(str_pression,*) INT(out_pression_level/100) 179 str_pression=ADJUSTL(str_pression) 180 181 CALL writefield("ps",f_ps) 182 CALL writefield("dps",f_dps) 183 CALL writefield("phis",f_phis) 184 CALL vorticity(f_u,f_buf_v) 185 CALL writefield("vort",f_buf_v) 186 187 CALL w_omega(f_ps, f_u, f_buf_i) 188 CALL writefield('omega', f_buf_i) 189 IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 190 CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level) 191 CALL writefield("omega"//TRIM(str_pression),f_buf_s) 192 ENDIF 193 194 ! Temperature 195 ! CALL theta_rhodz2temperature(f_ps,f_theta_rhodz,f_buf_i) ; ! FIXME 196 197 CALL getin('physics',physics_type) 198 IF (TRIM(physics_type)=='dcmip') THEN 199 CALL Tv2T(f_buf_i,f_q,f_buf1_i) 200 CALL writefield("T",f_buf1_i) 201 IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 202 CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level) 203 CALL writefield("T"//TRIM(str_pression),f_buf_s) 204 ENDIF 205 ELSE 206 CALL writefield("T",f_buf_i) 207 IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 208 CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level) 209 CALL writefield("T"//TRIM(str_pression),f_buf_s) 210 ENDIF 211 ENDIF 212 213 ! velocity components 214 CALL un2ulonlat(f_u, f_buf1_i, f_buf2_i) 215 CALL writefield("ulon",f_buf1_i) 216 CALL writefield("ulat",f_buf2_i) 217 218 IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 219 CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level) 220 CALL writefield("ulon"//TRIM(str_pression),f_buf_s) 221 CALL vertical_interp(f_ps,f_buf2_i,f_buf_s,out_pression_level) 222 CALL writefield("ulat"//TRIM(str_pression),f_buf_s) 223 ENDIF 224 225 ! geopotential ! FIXME 226 CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i) 227 CALL writefield("p",f_buf_p) 228 ! CALL writefield("phi",f_geopot) ! geopotential 229 CALL writefield("theta",f_buf1_i) ! potential temperature 230 CALL writefield("pk",f_buf2_i) ! Exner pressure 231 232 END SUBROUTINE write_output_fields 233 234 !------------------- Conversion from prognostic to observable variables ------------------ 160 !------------------- Conversion from prognostic to observable variables ------------------ 235 161 236 162 SUBROUTINE progonostic_vel_to_horiz(f_geopot, f_ps, f_rhodz, f_u, f_W, f_uh, f_uz) … … 308 234 END SUBROUTINE compute_prognostic_vel_to_horiz 309 235 310 SUBROUTINE thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_pks,f_p,f_theta,f_pk,f_phi)311 USE field_mod312 USE pression_mod313 USE exner_mod314 USE geopotential_mod315 USE theta2theta_rhodz_mod316 TYPE(t_field), POINTER :: f_ps(:), f_phis(:), f_theta_rhodz(:), & ! IN317 f_pks(:), f_p(:), f_theta(:), f_pk(:), f_phi(:) ! OUT318 REAL(rstd),POINTER :: pk(:,:), p(:,:), theta(:,:), theta_rhodz(:,:,:), &319 phi(:,:), phis(:), ps(:), pks(:)320 INTEGER :: ind321 322 DO ind=1,ndomain323 IF (.NOT. assigned_domain(ind)) CYCLE324 CALL swap_dimensions(ind)325 CALL swap_geometry(ind)326 ps = f_ps(ind)327 p = f_p(ind)328 !$OMP BARRIER329 CALL compute_pression(ps,p,0)330 pk = f_pk(ind)331 pks = f_pks(ind)332 !$OMP BARRIER333 CALL compute_exner(ps,p,pks,pk,0)334 !$OMP BARRIER335 theta_rhodz = f_theta_rhodz(ind)336 theta = f_theta(ind)337 CALL compute_theta_rhodz2theta(ps, theta_rhodz(:,:,1),theta,0)338 phis = f_phis(ind)339 phi = f_phi(ind)340 CALL compute_geopotential(phis,pks,pk,theta,phi,0)341 END DO342 343 END SUBROUTINE thetarhodz2geopot344 345 236 SUBROUTINE Tv2T(f_Tv, f_q, f_T) 346 237 TYPE(t_field), POINTER :: f_TV(:) -
codes/icosagcm/trunk/src/theta_rhodz.f90
r387 r428 1 1 MODULE theta2theta_rhodz_mod 2 2 USE field_mod 3 3 PRIVATE 4 4 TYPE(t_field), POINTER, SAVE :: f_p(:) 5 TYPE(t_field), POINTER, SAVE :: f_pks(:) 6 TYPE(t_field), POINTER, SAVE :: f_pk(:) 7 8 PRIVATE :: f_p,f_pk,f_pks 5 6 PUBLIC :: init_theta2theta_rhodz, theta_rhodz2theta, & 7 theta_rhodz2temperature, temperature2theta_rhodz, & 8 theta2theta_rhodz, & 9 compute_theta2theta_rhodz, compute_theta_rhodz2theta 9 10 10 11 CONTAINS … … 14 15 USE field_mod 15 16 IMPLICIT NONE 16 CALL allocate_field(f_p,field_t,type_real,llm+1,name='p (theta2theta_rhodz_mod)') 17 CALL allocate_field(f_pk,field_t,type_real,llm,name='pk (theta2theta_rhodz_mod)') 18 CALL allocate_field(f_pks,field_t,type_real,name='pks (theta2theta_rhodz_mod)') 19 17 CALL allocate_field(f_p,field_t,type_real,llm+1,name='p (theta2theta_rhodz_mod)') 20 18 END SUBROUTINE init_theta2theta_rhodz 21 22 19 23 20 … … 61 58 REAL(rstd), POINTER :: temp(:,:) 62 59 REAL(rstd), POINTER :: p(:,:) 63 REAL(rstd), POINTER :: pk(:,:)64 REAL(rstd), POINTER :: pks(:)65 60 INTEGER :: ind 66 61 … … 71 66 ps=f_ps(ind) 72 67 p=f_p(ind) 73 pks=f_pks(ind)74 pk=f_pk(ind)75 68 theta_rhodz=f_theta_rhodz(ind) 76 69 temp=f_temp(ind) … … 79 72 CALL compute_pression(ps,p,0) 80 73 !$OMP BARRIER 81 CALL compute_exner(ps,p,pks,pk,0) 82 !$OMP BARRIER 83 CALL compute_theta_rhodz2temperature(p, pk, theta_rhodz(:,:,1),temp,0) 74 CALL compute_theta_rhodz2temperature(p, theta_rhodz(:,:,1),temp,0) 84 75 ENDDO 85 76 !$OMP BARRIER … … 100 91 REAL(rstd), POINTER :: temp(:,:) 101 92 REAL(rstd), POINTER :: p(:,:) 102 REAL(rstd), POINTER :: pk(:,:)103 REAL(rstd), POINTER :: pks(:)104 93 INTEGER :: ind 105 94 … … 110 99 ps=f_ps(ind) 111 100 p=f_p(ind) 112 pks=f_pks(ind)113 pk=f_pk(ind)114 101 theta_rhodz=f_theta_rhodz(ind) 115 102 temp=f_temp(ind) … … 118 105 CALL compute_pression(ps,p,0) 119 106 !$OMP BARRIER 120 CALL compute_exner(ps,p,pks,pk,0) 121 !$OMP BARRIER 122 CALL compute_temperature2theta_rhodz(p, pk, temp, theta_rhodz(:,:,1), 0) 107 CALL compute_temperature2theta_rhodz(p, temp, theta_rhodz(:,:,1), 0) 123 108 ENDDO 124 109 !$OMP BARRIER … … 213 198 214 199 215 SUBROUTINE compute_theta_rhodz2temperature(p, pk,theta_rhodz,temp,offset)200 SUBROUTINE compute_theta_rhodz2temperature(p,theta_rhodz,temp,offset) 216 201 USE icosa 217 202 USE pression_mod … … 220 205 IMPLICIT NONE 221 206 REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 222 REAL(rstd),INTENT(IN) :: pk(iim*jjm,llm)223 207 REAL(rstd),INTENT(IN) :: theta_rhodz(iim*jjm,llm) 224 208 REAL(rstd),INTENT(OUT) :: temp(iim*jjm,llm) 225 209 INTEGER,INTENT(IN) :: offset 210 REAL(rstd) :: pk_ij 226 211 INTEGER :: i,j,ij,l 227 212 … … 232 217 DO i=ii_begin-offset,ii_end+offset 233 218 ij=(j-1)*iim+i 234 temp(ij,l) = ( theta_rhodz(ij,l) / ((p(ij,l)-p(ij,l+1))/g) ) * pk(ij,l) / cpp 219 pk_ij=((.5/preff)*(p(ij,l)+p(ij,l+1)))**kappa 220 temp(ij,l) = ( theta_rhodz(ij,l) / ((p(ij,l)-p(ij,l+1))/g) ) * pk_ij 235 221 ENDDO 236 222 ENDDO … … 241 227 END SUBROUTINE compute_theta_rhodz2temperature 242 228 243 SUBROUTINE compute_temperature2theta_rhodz(p, pk,temp,theta_rhodz,offset)229 SUBROUTINE compute_temperature2theta_rhodz(p,temp,theta_rhodz,offset) 244 230 USE icosa 245 231 USE pression_mod … … 248 234 IMPLICIT NONE 249 235 REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 250 REAL(rstd),INTENT(IN) :: pk(iim*jjm,llm)251 236 REAL(rstd),INTENT(OUT) :: theta_rhodz(iim*jjm,llm) 252 237 REAL(rstd),INTENT(IN) :: temp(iim*jjm,llm) 253 238 INTEGER,INTENT(IN) :: offset 239 REAL(rstd) :: pk_ij 254 240 INTEGER :: i,j,ij,l 255 241 … … 262 248 DO i=ii_begin-offset,ii_end+offset 263 249 ij=(j-1)*iim+i 264 theta_rhodz(ij,l) = temp(ij,l) * ((p(ij,l)-p(ij,l+1))/g) / (pk(ij,l) / cpp ) 250 pk_ij=((.5/preff)*(p(ij,l)+p(ij,l+1)))**kappa 251 theta_rhodz(ij,l) = temp(ij,l) * ((p(ij,l)-p(ij,l+1))/g) / pk_ij 265 252 ENDDO 266 253 ENDDO
Note: See TracChangeset
for help on using the changeset viewer.