source: codes/icosagcm/trunk/src/observable.f90 @ 354

Last change on this file since 354 was 354, checked in by dubos, 9 years ago

Moved output of dyn fields out of caldyn_gcm

File size: 6.2 KB
Line 
1MODULE observable_mod
2  USE icosa
3  IMPLICIT NONE
4  PRIVATE
5
6  TYPE(t_field),POINTER, SAVE :: f_buf_i(:), f_buf_ulon(:), f_buf_ulat(:), f_buf_u3d(:)
7  TYPE(t_field),POINTER, SAVE :: f_buf1_i(:), f_buf2_i(:)
8  TYPE(t_field),POINTER, SAVE :: f_buf_v(:), f_buf_s(:), f_buf_p(:)
9
10! temporary shared variable for caldyn
11  TYPE(t_field),POINTER, SAVE :: f_theta(:)
12
13  PUBLIC init_observable, write_output_fields_basic, f_theta
14
15CONTAINS
16 
17  SUBROUTINE init_observable
18    CALL allocate_field(f_buf_i,   field_t,type_real,llm,name="buffer_i")
19    CALL allocate_field(f_buf_p,   field_t,type_real,llm+1) 
20    CALL allocate_field(f_buf_u3d, field_t,type_real,3,llm)  ! 3D vel at cell centers
21    CALL allocate_field(f_buf_ulon,field_t,type_real,llm, name="buf_ulon")
22    CALL allocate_field(f_buf_ulat,field_t,type_real,llm, name="buf_ulat")
23    CALL allocate_field(f_buf_v,   field_z,type_real,llm)
24    CALL allocate_field(f_buf_s,   field_t,type_real)
25
26    CALL allocate_field(f_theta, field_t,type_real,llm,  name='theta')   ! potential temperature
27  END SUBROUTINE init_observable
28 
29  SUBROUTINE write_output_fields_basic(f_ps, f_u, f_q)
30    USE wind_mod
31    USE output_field_mod
32    USE omp_para
33    TYPE(t_field),POINTER :: f_ps(:), f_u(:), f_q(:)
34    IF (is_master) PRINT *,'CALL write_output_fields_basic'
35    CALL un2ulonlat(f_u, f_buf_ulon, f_buf_ulat)
36    CALL output_field("ulon",f_buf_ulon)
37    CALL output_field("ulat",f_buf_ulat)
38    CALL output_field("ps",f_ps)
39    !       CALL output_field("dps",f_dps)
40    !CALL output_field("mass",f_mass)
41    !       CALL output_field("dmass",f_dmass)
42    !       CALL output_field("vort",f_qv)
43    CALL output_field("theta",f_theta)
44    !       CALL output_field("exner",f_pk)
45    !       CALL output_field("pv",f_qv)
46    CALL output_field("q",f_q)
47  END SUBROUTINE write_output_fields_basic
48 
49  SUBROUTINE write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, &
50       f_buf_i, f_buf_v, f_buf_i3, f_buf1_i, f_buf2_i, f_buf_s, f_buf_p)
51    USE icosa
52    USE vorticity_mod
53    USE theta2theta_rhodz_mod
54    USE pression_mod
55    USE omega_mod
56    USE write_field_mod
57    USE vertical_interp_mod
58    USE wind_mod
59    TYPE(t_field),POINTER :: f_ps(:), f_phis(:), f_u(:), f_theta_rhodz(:), f_q(:), f_dps(:), &
60         f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:)
61   
62    REAL(rstd) :: out_pression_level
63    CHARACTER(LEN=255) :: str_pression
64    CHARACTER(LEN=255) :: physics_type
65   
66    out_pression_level=0.
67    CALL getin("out_pression_level",out_pression_level) 
68    WRITE(str_pression,*) INT(out_pression_level/100)
69    str_pression=ADJUSTL(str_pression)
70   
71    CALL writefield("ps",f_ps)
72    CALL writefield("dps",f_dps)
73    CALL writefield("phis",f_phis)
74    CALL vorticity(f_u,f_buf_v)
75    CALL writefield("vort",f_buf_v)
76
77    CALL w_omega(f_ps, f_u, f_buf_i)
78    CALL writefield('omega', f_buf_i)
79    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
80      CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level)
81      CALL writefield("omega"//TRIM(str_pression),f_buf_s)
82    ENDIF
83   
84    ! Temperature
85!    CALL theta_rhodz2temperature(f_ps,f_theta_rhodz,f_buf_i) ; ! FIXME
86     
87    CALL getin('physics',physics_type)
88    IF (TRIM(physics_type)=='dcmip') THEN
89      CALL Tv2T(f_buf_i,f_q,f_buf1_i) 
90      CALL writefield("T",f_buf1_i)
91      IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
92        CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level)
93        CALL writefield("T"//TRIM(str_pression),f_buf_s)
94      ENDIF
95    ELSE
96      CALL writefield("T",f_buf_i)
97      IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
98        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level)
99        CALL writefield("T"//TRIM(str_pression),f_buf_s)
100      ENDIF
101    ENDIF
102   
103    ! velocity components
104    CALL un2ulonlat(f_u, f_buf1_i, f_buf2_i)
105    CALL writefield("ulon",f_buf1_i)
106    CALL writefield("ulat",f_buf2_i)
107
108    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
109      CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level)
110      CALL writefield("ulon"//TRIM(str_pression),f_buf_s)
111      CALL vertical_interp(f_ps,f_buf2_i,f_buf_s,out_pression_level)
112      CALL writefield("ulat"//TRIM(str_pression),f_buf_s)
113    ENDIF
114   
115    ! geopotential ! FIXME
116    CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i)
117    CALL writefield("p",f_buf_p)
118!    CALL writefield("phi",f_geopot)   ! geopotential
119    CALL writefield("theta",f_buf1_i) ! potential temperature
120    CALL writefield("pk",f_buf2_i)    ! Exner pressure
121 
122  END SUBROUTINE write_output_fields
123 
124  SUBROUTINE thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_pks,f_p,f_theta,f_pk,f_phi) 
125    USE field_mod
126    USE pression_mod
127    USE exner_mod
128    USE geopotential_mod
129    USE theta2theta_rhodz_mod
130    TYPE(t_field), POINTER :: f_ps(:), f_phis(:), f_theta_rhodz(:), &  ! IN
131         f_pks(:), f_p(:), f_theta(:), f_pk(:), f_phi(:)               ! OUT
132    REAL(rstd),POINTER :: pk(:,:), p(:,:), theta(:,:), theta_rhodz(:,:), &
133         phi(:,:), phis(:), ps(:), pks(:)
134    INTEGER :: ind
135   
136    DO ind=1,ndomain
137       IF (.NOT. assigned_domain(ind)) CYCLE
138       CALL swap_dimensions(ind)
139       CALL swap_geometry(ind)
140       ps = f_ps(ind)
141       p  = f_p(ind)
142!$OMP BARRIER
143       CALL compute_pression(ps,p,0)
144       pk = f_pk(ind)
145       pks = f_pks(ind)
146!$OMP BARRIER
147       CALL compute_exner(ps,p,pks,pk,0)
148!$OMP BARRIER
149       theta_rhodz = f_theta_rhodz(ind)
150       theta = f_theta(ind)
151       CALL compute_theta_rhodz2theta(ps, theta_rhodz,theta,0)
152       phis = f_phis(ind)
153       phi = f_phi(ind)
154       CALL compute_geopotential(phis,pks,pk,theta,phi,0)
155    END DO
156
157  END SUBROUTINE thetarhodz2geopot
158 
159  SUBROUTINE Tv2T(f_Tv, f_q, f_T)
160    TYPE(t_field), POINTER :: f_TV(:)
161    TYPE(t_field), POINTER :: f_q(:)
162    TYPE(t_field), POINTER :: f_T(:)
163   
164    REAL(rstd),POINTER :: Tv(:,:), q(:,:,:), T(:,:)
165    INTEGER :: ind
166   
167    DO ind=1,ndomain
168       IF (.NOT. assigned_domain(ind)) CYCLE
169       CALL swap_dimensions(ind)
170       CALL swap_geometry(ind)
171       Tv=f_Tv(ind)
172       q=f_q(ind)
173       T=f_T(ind)
174       T=Tv/(1+0.608*q(:,:,1))
175    END DO
176   
177  END SUBROUTINE Tv2T
178 
179END MODULE observable_mod
Note: See TracBrowser for help on using the repository browser.