1 | MODULE compute_temperature_mod |
---|
2 | USE icosa |
---|
3 | IMPLICIT NONE |
---|
4 | PRIVATE |
---|
5 | SAVE |
---|
6 | |
---|
7 | PUBLIC :: temperature, compute_temperature |
---|
8 | |
---|
9 | CONTAINS |
---|
10 | |
---|
11 | SUBROUTINE temperature(f_pmid,f_q,f_temp) |
---|
12 | TYPE(t_field), POINTER :: f_pmid(:) ! IN |
---|
13 | TYPE(t_field), POINTER :: f_q(:) ! IN |
---|
14 | TYPE(t_field), POINTER :: f_temp(:) ! INOUT |
---|
15 | |
---|
16 | REAL(rstd), POINTER :: pmid(:,:) |
---|
17 | REAL(rstd), POINTER :: q(:,:,:) |
---|
18 | REAL(rstd), POINTER :: temp(:,:) |
---|
19 | INTEGER :: ind |
---|
20 | |
---|
21 | DO ind=1,ndomain |
---|
22 | IF (.NOT. assigned_domain(ind)) CYCLE |
---|
23 | CALL swap_dimensions(ind) |
---|
24 | CALL swap_geometry(ind) |
---|
25 | pmid=f_pmid(ind) |
---|
26 | q=f_q(ind) |
---|
27 | temp=f_temp(ind) |
---|
28 | CALL compute_temperature(pmid,q,temp) |
---|
29 | END DO |
---|
30 | END SUBROUTINE temperature |
---|
31 | |
---|
32 | SUBROUTINE compute_temperature(pmid,q,temp) |
---|
33 | USE omp_para |
---|
34 | REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm) |
---|
35 | REAL(rstd),INTENT(IN) :: q(iim*jjm,llm,nqtot) |
---|
36 | REAL(rstd),INTENT(INOUT) :: temp(iim*jjm,llm) |
---|
37 | |
---|
38 | REAL(rstd) :: Rd, p_ik, theta_ik, temp_ik, qv, chi, Rmix |
---|
39 | INTEGER :: ij,l |
---|
40 | |
---|
41 | Rd = kappa*cpp |
---|
42 | DO l=ll_begin,ll_end |
---|
43 | DO ij=ij_begin,ij_end |
---|
44 | p_ik = pmid(ij,l) |
---|
45 | theta_ik = temp(ij,l) |
---|
46 | qv = q(ij,l,1) ! water vapor mixing ratio = mv/md |
---|
47 | SELECT CASE(caldyn_thermo) |
---|
48 | CASE(thermo_theta) |
---|
49 | temp_ik = theta_ik*((p_ik/preff)**kappa) |
---|
50 | CASE(thermo_entropy) |
---|
51 | temp_ik = Treff*exp((theta_ik + Rd*log(p_ik/preff))/cpp) |
---|
52 | CASE(thermo_moist) |
---|
53 | Rmix = Rd+qv*Rv |
---|
54 | chi = ( theta_ik + Rmix*log(p_ik/preff) ) / (cpp + qv*cppv) ! log(T/Treff) |
---|
55 | temp_ik = Treff*exp(chi) |
---|
56 | END SELECT |
---|
57 | IF(physics_thermo==thermo_fake_moist) temp_ik=temp_ik/(1+0.608*qv) |
---|
58 | temp(ij,l)=temp_ik |
---|
59 | END DO |
---|
60 | END DO |
---|
61 | END SUBROUTINE compute_temperature |
---|
62 | |
---|
63 | SUBROUTINE Tv2T(f_Tv, f_q, f_T) |
---|
64 | TYPE(t_field), POINTER :: f_TV(:) |
---|
65 | TYPE(t_field), POINTER :: f_q(:) |
---|
66 | TYPE(t_field), POINTER :: f_T(:) |
---|
67 | |
---|
68 | REAL(rstd),POINTER :: Tv(:,:), q(:,:,:), T(:,:) |
---|
69 | INTEGER :: ind |
---|
70 | |
---|
71 | DO ind=1,ndomain |
---|
72 | IF (.NOT. assigned_domain(ind)) CYCLE |
---|
73 | CALL swap_dimensions(ind) |
---|
74 | CALL swap_geometry(ind) |
---|
75 | Tv=f_Tv(ind) |
---|
76 | T=f_T(ind) |
---|
77 | SELECT CASE(physics_thermo) |
---|
78 | CASE(thermo_dry) |
---|
79 | T=Tv |
---|
80 | CASE(thermo_fake_moist) |
---|
81 | q=f_q(ind) |
---|
82 | T=Tv/(1+0.608*q(:,:,1)) |
---|
83 | END SELECT |
---|
84 | END DO |
---|
85 | END SUBROUTINE Tv2T |
---|
86 | |
---|
87 | END MODULE compute_temperature_mod |
---|