source: codes/icosagcm/trunk/src/physics/physics_external.F90

Last change on this file was 904, checked in by adurocher, 5 years ago

trunk : Fixed compilation without xios

File size: 5.5 KB
Line 
1MODULE physics_external_mod
2  USE field_mod
3 
4  INTEGER,SAVE :: it
5!$OMP THREADPRIVATE(it)
6
7  TYPE(t_field),POINTER,SAVE :: f_phis(:)
8  TYPE(t_field),POINTER,SAVE :: f_ps(:)
9  TYPE(t_field),POINTER,SAVE :: f_theta_rhodz(:)
10  TYPE(t_field),POINTER,SAVE :: f_u(:)
11  TYPE(t_field),POINTER,SAVE :: f_wflux(:)
12  TYPE(t_field),POINTER,SAVE :: f_q(:)
13
14  TYPE(t_field),POINTER,SAVE :: f_theta_rhodz0(:)
15  TYPE(t_field),POINTER,SAVE :: f_u0(:)
16  TYPE(t_field),POINTER,SAVE :: f_q0(:)
17 
18  TYPE(t_field),POINTER,SAVE :: f_dtheta_rhodz(:)
19  TYPE(t_field),POINTER,SAVE :: f_du(:)
20  TYPE(t_field),POINTER,SAVE :: f_dq(:)
21
22  TYPE(t_field),POINTER,SAVE :: f_rhodz(:)
23  TYPE(t_field),POINTER,SAVE :: f_rhodz0(:)
24 
25  LOGICAL,SAVE :: phys_smooth_tendency
26!$OMP THREADPRIVATE(phys_smooth_tendency) 
27
28
29CONTAINS
30
31  SUBROUTINE init_physics
32  USE icosa
33  IMPLICIT NONE
34
35    CALL initialize_external_physics
36!$OMP PARALLEL   
37    CALL allocate_field(f_theta_rhodz0, field_t, type_real, llm, nqdyn, name='theta_rhodz0')
38    CALL allocate_field(f_u0,field_u,type_real,llm,name='u0')
39    CALL allocate_field(f_q0,field_t,type_real,llm,nqtot,'q0')
40
41    CALL allocate_field(f_dtheta_rhodz, field_t, type_real, llm, nqdyn, name='theta_rhodz0')
42    CALL allocate_field(f_du,field_u,type_real,llm,name='u0')
43    CALL allocate_field(f_dq,field_t,type_real,llm,nqtot,'q0')
44
45    CALL allocate_field(f_rhodz, field_t, type_real, llm, name='rhodz')
46   
47    phys_smooth_tendency=.FALSE.
48    CALL getin("phys_smooth_tendency",phys_smooth_tendency)
49!$OMP END PARALLEL   
50       
51  END SUBROUTINE init_physics
52 
53  SUBROUTINE physics(it_,f_phis_, f_ps_, f_theta_rhodz_, f_u_, f_wflux_, f_q_)
54  USE icosa
55  USE field_mod
56  USE mpipara
57  USE omp_para
58  !USE xios
59  USE domain_mod
60  USE time_mod
61  USE disvert_mod
62  IMPLICIT NONE
63    INTEGER,INTENT(IN)    :: it_
64    TYPE(t_field),POINTER :: f_phis_(:)
65    TYPE(t_field),POINTER :: f_ps_(:)
66    TYPE(t_field),POINTER :: f_theta_rhodz_(:)
67    TYPE(t_field),POINTER :: f_u_(:)
68    TYPE(t_field),POINTER :: f_wflux_(:)
69    TYPE(t_field),POINTER :: f_q_(:)
70
71    REAL(rstd),POINTER    :: theta_rhodz(:,:,:), theta_rhodz0(:,:,:), dtheta_rhodz(:,:,:) 
72    REAL(rstd),POINTER    :: u(:,:), u0(:,:), du(:,:)
73    REAL(rstd),POINTER    :: q(:,:,:),q0(:,:,:),dq(:,:,:)
74    REAL(rstd),POINTER    :: ps(:)
75    REAL(rstd),POINTER    :: rhodz(:,:)
76    INTEGER :: ind, iq
77   
78   
79!$OMP BARRIER
80!$OMP MASTER
81    f_phis=>f_phis_
82    f_ps=>f_ps_
83    f_theta_rhodz=>f_theta_rhodz_
84    f_u=>f_u_
85    f_wflux=>f_wflux_
86    f_q=>f_q_
87!$OMP END MASTER
88!$OMP BARRIER
89
90    IF (phys_smooth_tendency) THEN
91
92      IF (MOD(it_,itau_physics)==1) THEN
93        DO ind=1, ndomain
94          IF (.NOT. assigned_domain(ind)) CYCLE
95          CALL swap_dimensions(ind)
96          CALL swap_geometry(ind)
97          theta_rhodz=f_theta_rhodz(ind)
98          theta_rhodz0=f_theta_rhodz0(ind)
99          u=f_u(ind)
100          u0=f_u0(ind)
101          q=f_q(ind)
102          q0=f_q0(ind)
103          ps=f_ps(ind)
104          rhodz=f_rhodz(ind)
105       
106          theta_rhodz0(:,ll_begin:ll_end,1)=theta_rhodz(:,ll_begin:ll_end,1)
107          u0(:,ll_begin:ll_end)=u(:,ll_begin:ll_end)
108          q0(:,ll_begin:ll_end,:)=q(:,ll_begin:ll_end,:)
109          CALL compute_rhodz(.TRUE., ps, rhodz)
110        ENDDO
111     
112!        IF (is_omp_master) CALL xios_timer_suspend("dynamico")
113        it = it_-1 + itau_physics
114        CALL external_physics
115!        IF (is_omp_master) CALL xios_timer_resume("dynamico")
116
117        DO ind=1, ndomain
118          IF (.NOT. assigned_domain(ind)) CYCLE
119          CALL swap_dimensions(ind) 
120          CALL swap_geometry(ind) 
121          theta_rhodz=f_theta_rhodz(ind)
122          theta_rhodz0=f_theta_rhodz0(ind)
123          u=f_u(ind)
124          u0=f_u0(ind)
125          q=f_q(ind)
126          q0=f_q0(ind)
127          dtheta_rhodz=f_dtheta_rhodz(ind)
128          du=f_du(ind)
129          dq=f_dq(ind)
130          rhodz=f_rhodz(ind)
131       
132          dtheta_rhodz(:,ll_begin:ll_end,1)=(theta_rhodz(:,ll_begin:ll_end,1)-theta_rhodz0(:,ll_begin:ll_end,1))/itau_physics
133         
134          du(:,ll_begin:ll_end)=(u(:,ll_begin:ll_end)-u0(:,ll_begin:ll_end))/itau_physics
135         
136          DO iq=1, nqtot
137            dq(:,ll_begin:ll_end,iq)=((q(:,ll_begin:ll_end,iq)-q0(:,ll_begin:ll_end,iq))/itau_physics)*rhodz(:,ll_begin:ll_end)
138          ENDDO
139         
140          theta_rhodz(:,ll_begin:ll_end,1)=theta_rhodz0(:,ll_begin:ll_end,1)
141          u(:,ll_begin:ll_end)=u0(:,ll_begin:ll_end)
142          q(:,ll_begin:ll_end,:)=q0(:,ll_begin:ll_end,:)
143        ENDDO
144     ENDIF
145   
146     DO ind=1, ndomain
147       IF (.NOT. assigned_domain(ind)) CYCLE
148       CALL swap_dimensions(ind)
149       CALL swap_geometry(ind)
150         
151       theta_rhodz=f_theta_rhodz(ind)
152       u=f_u(ind)
153       q=f_q(ind)
154       dtheta_rhodz=f_dtheta_rhodz(ind)
155       du=f_du(ind)
156       dq=f_dq(ind)
157       rhodz=f_rhodz(ind)
158       ps=f_ps(ind)
159
160       u(:,ll_begin:ll_end)=u(:,ll_begin:ll_end)+du(:,ll_begin:ll_end)
161       theta_rhodz(:,ll_begin:ll_end,1)=theta_rhodz(:,ll_begin:ll_end,1)+dtheta_rhodz(:,ll_begin:ll_end,1)
162       CALL compute_rhodz(.TRUE., ps, rhodz)
163       DO iq=1, nqtot
164         q(:,ll_begin:ll_end,iq)=q(:,ll_begin:ll_end,iq)+dq(:,ll_begin:ll_end,iq)/rhodz(:,ll_begin:ll_end)
165       ENDDO
166     ENDDO
167!$OMP BARRIER
168   
169   ELSE
170       
171     IF (MOD(it_,itau_physics)==0) THEN
172       it=it_
173!       IF (is_omp_master) CALL xios_timer_suspend("dynamico")
174       CALL external_physics
175!       IF (is_omp_master) CALL xios_timer_resume("dynamico")
176     ENDIF
177   
178   ENDIF     
179
180
181  END SUBROUTINE physics
182 
183 
184END MODULE physics_external_mod
185   
186 
Note: See TracBrowser for help on using the repository browser.