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

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

Bugfix : memory leak in transfert_mpi / New : detect send_message not paired with wait_message

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("Ai",geom%Ai)
40    !       CALL output_field("dps",f_dps)
41    !CALL output_field("mass",f_mass)
42    !       CALL output_field("dmass",f_dmass)
43    !       CALL output_field("vort",f_qv)
44    CALL output_field("theta",f_theta)
45    !       CALL output_field("exner",f_pk)
46    !       CALL output_field("pv",f_qv)
47    CALL output_field("q",f_q)
48  END SUBROUTINE write_output_fields_basic
49 
50  SUBROUTINE write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, &
51       f_buf_i, f_buf_v, f_buf_i3, f_buf1_i, f_buf2_i, f_buf_s, f_buf_p)
52    USE icosa
53    USE vorticity_mod
54    USE theta2theta_rhodz_mod
55    USE pression_mod
56    USE omega_mod
57    USE write_field_mod
58    USE vertical_interp_mod
59    USE wind_mod
60    TYPE(t_field),POINTER :: f_ps(:), f_phis(:), f_u(:), f_theta_rhodz(:), f_q(:), f_dps(:), &
61         f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:)
62   
63    REAL(rstd) :: out_pression_level
64    CHARACTER(LEN=255) :: str_pression
65    CHARACTER(LEN=255) :: physics_type
66   
67    out_pression_level=0.
68    CALL getin("out_pression_level",out_pression_level) 
69    WRITE(str_pression,*) INT(out_pression_level/100)
70    str_pression=ADJUSTL(str_pression)
71   
72    CALL writefield("ps",f_ps)
73    CALL writefield("dps",f_dps)
74    CALL writefield("phis",f_phis)
75    CALL vorticity(f_u,f_buf_v)
76    CALL writefield("vort",f_buf_v)
77
78    CALL w_omega(f_ps, f_u, f_buf_i)
79    CALL writefield('omega', f_buf_i)
80    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
81      CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level)
82      CALL writefield("omega"//TRIM(str_pression),f_buf_s)
83    ENDIF
84   
85    ! Temperature
86!    CALL theta_rhodz2temperature(f_ps,f_theta_rhodz,f_buf_i) ; ! FIXME
87     
88    CALL getin('physics',physics_type)
89    IF (TRIM(physics_type)=='dcmip') THEN
90      CALL Tv2T(f_buf_i,f_q,f_buf1_i) 
91      CALL writefield("T",f_buf1_i)
92      IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
93        CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level)
94        CALL writefield("T"//TRIM(str_pression),f_buf_s)
95      ENDIF
96    ELSE
97      CALL writefield("T",f_buf_i)
98      IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
99        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level)
100        CALL writefield("T"//TRIM(str_pression),f_buf_s)
101      ENDIF
102    ENDIF
103   
104    ! velocity components
105    CALL un2ulonlat(f_u, f_buf1_i, f_buf2_i)
106    CALL writefield("ulon",f_buf1_i)
107    CALL writefield("ulat",f_buf2_i)
108
109    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN
110      CALL vertical_interp(f_ps,f_buf1_i,f_buf_s,out_pression_level)
111      CALL writefield("ulon"//TRIM(str_pression),f_buf_s)
112      CALL vertical_interp(f_ps,f_buf2_i,f_buf_s,out_pression_level)
113      CALL writefield("ulat"//TRIM(str_pression),f_buf_s)
114    ENDIF
115   
116    ! geopotential ! FIXME
117    CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i)
118    CALL writefield("p",f_buf_p)
119!    CALL writefield("phi",f_geopot)   ! geopotential
120    CALL writefield("theta",f_buf1_i) ! potential temperature
121    CALL writefield("pk",f_buf2_i)    ! Exner pressure
122 
123  END SUBROUTINE write_output_fields
124 
125  SUBROUTINE thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_pks,f_p,f_theta,f_pk,f_phi) 
126    USE field_mod
127    USE pression_mod
128    USE exner_mod
129    USE geopotential_mod
130    USE theta2theta_rhodz_mod
131    TYPE(t_field), POINTER :: f_ps(:), f_phis(:), f_theta_rhodz(:), &  ! IN
132         f_pks(:), f_p(:), f_theta(:), f_pk(:), f_phi(:)               ! OUT
133    REAL(rstd),POINTER :: pk(:,:), p(:,:), theta(:,:), theta_rhodz(:,:), &
134         phi(:,:), phis(:), ps(:), pks(:)
135    INTEGER :: ind
136   
137    DO ind=1,ndomain
138       IF (.NOT. assigned_domain(ind)) CYCLE
139       CALL swap_dimensions(ind)
140       CALL swap_geometry(ind)
141       ps = f_ps(ind)
142       p  = f_p(ind)
143!$OMP BARRIER
144       CALL compute_pression(ps,p,0)
145       pk = f_pk(ind)
146       pks = f_pks(ind)
147!$OMP BARRIER
148       CALL compute_exner(ps,p,pks,pk,0)
149!$OMP BARRIER
150       theta_rhodz = f_theta_rhodz(ind)
151       theta = f_theta(ind)
152       CALL compute_theta_rhodz2theta(ps, theta_rhodz,theta,0)
153       phis = f_phis(ind)
154       phi = f_phi(ind)
155       CALL compute_geopotential(phis,pks,pk,theta,phi,0)
156    END DO
157
158  END SUBROUTINE thetarhodz2geopot
159 
160  SUBROUTINE Tv2T(f_Tv, f_q, f_T)
161    TYPE(t_field), POINTER :: f_TV(:)
162    TYPE(t_field), POINTER :: f_q(:)
163    TYPE(t_field), POINTER :: f_T(:)
164   
165    REAL(rstd),POINTER :: Tv(:,:), q(:,:,:), T(:,:)
166    INTEGER :: ind
167   
168    DO ind=1,ndomain
169       IF (.NOT. assigned_domain(ind)) CYCLE
170       CALL swap_dimensions(ind)
171       CALL swap_geometry(ind)
172       Tv=f_Tv(ind)
173       q=f_q(ind)
174       T=f_T(ind)
175       T=Tv/(1+0.608*q(:,:,1))
176    END DO
177   
178  END SUBROUTINE Tv2T
179 
180END MODULE observable_mod
Note: See TracBrowser for help on using the repository browser.