source: codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90 @ 663

Last change on this file since 663 was 658, checked in by dubos, 6 years ago

devel/unstructured : updated kernels

File size: 7.4 KB
Line 
1MODULE caldyn_unstructured_mod
2  USE ISO_C_BINDING
3  USE OMP_LIB
4  USE data_unstructured_mod
5  IMPLICIT NONE
6  SAVE
7
8CONTAINS
9
10#define DBL REAL(C_DOUBLE)
11
12#define INDICES1 ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right
13#define INDICES2 ij_up,ij_down,itrisk,edge_trisk,kup,kdown
14#define EDGES edge1,edge2,edge3,edge4,edge5,edge6
15#define VERTICES vertex1,vertex2,vertex3,vertex4,vertex5,vertex6
16#define SIGNS sign1,sign2,sign3,sign4,sign5,sign6
17#define EDGE_ENDS ij_up1,ij_up2,ij_up3,ij_up4,ij_up5,ij_up6,ij_down1,ij_down2,ij_down3,ij_down4,ij_down5,ij_down6
18#define LENGTHS le_de1,le_de2,le_de3,le_de4,le_de5,le_de6
19#define DECLARE_INDICES INTEGER INDICES1,INDICES2
20#define DECLARE_EDGES DBL SIGNS,LENGTHS ; INTEGER EDGES, EDGE_ENDS
21#define DECLARE_VERTICES INTEGER VERTICES
22#define PHI_BOT(ij) Phi_bot
23
24#define BINDC_(thename) BIND(C, name=#thename)
25#define BINDC(thename) BINDC_(dynamico_ ## thename)
26
27#define DOUBLE1(m) DBL, DIMENSION(m)
28#define DOUBLE2(m,n) DBL, DIMENSION(m,n)
29#define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)
30
31#define FIELD_PS      DOUBLE1(primal_num)
32#define FIELD_MASS    DOUBLE2(llm, primal_num)
33#define FIELD_Z       DOUBLE2(llm, dual_num)
34#define FIELD_U       DOUBLE2(llm, edge_num)
35#define FIELD_UL      DOUBLE2(llm+1, edge_num)
36#define FIELD_THETA   DOUBLE3(llm, primal_num, nqdyn)
37#define FIELD_GEOPOT  DOUBLE2(llm+1, primal_num)
38
39#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20))
40
41#define START_TRACE(id,nprimal,ndual,nedge) CALL enter_trace(id, 8*llm*((nprimal)*primal_num+(ndual)*dual_num+(nedge)*edge_num) )
42#define STOP_TRACE CALL exit_trace()
43
44!----------------------------- Non-Hydrostatic -----------------------------
45
46SUBROUTINE compute_NH_geopot(tau, m_ik, m_il, theta, W_il, Phi_il)
47  FIELD_MASS   :: m_ik, theta   ! IN*2
48  FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il  ! IN,INOUT*2, LOCAL*5
49  DBL :: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff
50  INTEGER :: iter
51  DECLARE_INDICES
52  DBL :: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g2
53#define COLUMN 0
54#if COLUMN 
55  DOUBLE1(llm)  :: pk, Ak, Ck
56  DOUBLE1(llm+1):: Rl, Bl, Dl, xl
57#define p_ik(l,ij) pk(l)
58#define A_ik(l,ij) Ak(l)
59#define C_ik(l,ij) Ck(l)
60#define R_il(l,ij) Rl(l)
61#define B_il(l,ij) Bl(l)
62#define D_il(l,ij) Dl(l)
63#define x_il(l,ij) xl(l)
64#else
65  FIELD_MASS :: p_ik, A_ik, C_ik
66  FIELD_GEOPOT :: R_il, B_il, D_il, x_il
67#endif
68
69  START_TRACE(id_NH_geopot, 7,0,0)
70#include "../kernels_unst/compute_NH_geopot.k90"
71  STOP_TRACE 
72
73#if COLUMN
74#undef p_ik
75#undef A_ik
76#undef C_ik
77#undef R_il
78#undef B_il
79#undef D_il
80#undef x_il
81#endif
82#undef COLUMN
83END SUBROUTINE compute_NH_geopot
84
85SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, hflux,du,dPhi,dW)
86  FIELD_U      :: u, hflux, du   ! IN, OUT, OUT
87  FIELD_MASS   :: rhodz, berni   ! IN, LOCAL
88  FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, LOCAL
89  FIELD_UL     :: DePhil, v_el, G_el, F_el ! LOCAL
90  DECLARE_INDICES
91  DECLARE_EDGES
92  DBL :: W_el, W2_el, gPhi2, dP, divG, u2, uu
93  START_TRACE(id_slow_NH, 5,0,3)
94#include "../kernels_unst/caldyn_slow_NH.k90"
95  STOP_TRACE
96END SUBROUTINE compute_caldyn_slow_NH
97
98SUBROUTINE compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi,dW,du)
99  DBL, INTENT(IN) :: tau
100  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, LOCAL
101  FIELD_THETA  :: theta                  ! IN
102  FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, LOCAL
103  FIELD_U      :: du                     ! OUT
104  DECLARE_INDICES
105  DBL :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff
106#include "../kernels_unst/caldyn_mil.k90"
107  IF(tau>0) THEN ! solve implicit problem for geopotential
108    CALL compute_NH_geopot(tau, rhodz, m_il, theta, W, geopot)
109  END IF
110  START_TRACE(id_solver, 7,0,1)
111#include "../kernels_unst/caldyn_solver.k90"
112  STOP_TRACE
113END SUBROUTINE compute_caldyn_solver
114
115SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, du,dPhi,dW)
116  FIELD_MASS   :: mass, eta_dot, wcov, W_etadot
117  FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW
118  FIELD_U      :: du
119  DECLARE_INDICES
120  DBL :: w_ij, wflux_ij
121  START_TRACE(id_vert_NH, 6,0,1)
122#include "../kernels_unst/caldyn_vert_NH.k90"
123  STOP_TRACE
124END SUBROUTINE compute_caldyn_vert_NH
125
126!----------------------------- Hydrostatic -------------------------------
127
128SUBROUTINE compute_geopot(rhodz,theta,ps,pk,geopot)
129  FIELD_MASS  :: rhodz,pk   ! IN, OUT
130  FIELD_THETA :: theta      ! IN
131  FIELD_GEOPOT :: geopot    ! IN(l=1)/OUT(l>1)
132  FIELD_PS     :: ps        ! OUT
133  DECLARE_INDICES
134  DBL :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix
135  START_TRACE(id_geopot, 3,0,3)
136#include "../kernels_unst/compute_geopot.k90"
137  STOP_TRACE
138END SUBROUTINE compute_geopot
139!
140SUBROUTINE compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du)
141  FIELD_MASS  :: rhodz,berni! IN
142  FIELD_THETA :: theta      ! IN
143  FIELD_U     :: u,hflux,du ! IN, OUT, OUT
144  DECLARE_INDICES
145  DECLARE_EDGES
146  LOGICAL, PARAMETER :: zero=.TRUE.
147  DBL :: ke, uu
148  START_TRACE(id_slow_hydro, 3,0,3)
149#include "../kernels_unst/caldyn_slow_hydro.k90"
150  STOP_TRACE
151END SUBROUTINE compute_caldyn_slow_hydro
152
153!---------------------------------- Generic ------------------------------
154
155SUBROUTINE caldyn_vert(convm,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du, wwuu)
156  FIELD_PS    :: dmass_col
157  FIELD_MASS  :: convm, rhodz
158  FIELD_U     :: u,du
159  FIELD_THETA :: dtheta_rhodz, theta
160  FIELD_GEOPOT :: wflux
161  FIELD_UL     :: wwuu
162  DECLARE_INDICES
163  DBL :: dF_deta, dFu_deta
164  wwuu=0.
165  !$OMP BARRIER
166  START_TRACE(id_vert, 5,0,3)
167#include "../kernels_unst/caldyn_wflux.k90"
168#include "../kernels_unst/caldyn_dmass.k90"
169#include "../kernels_unst/caldyn_vert.k90"
170  STOP_TRACE
171END SUBROUTINE caldyn_vert
172
173SUBROUTINE compute_coriolis(hflux,theta,qu,Ftheta, convm,dtheta_rhodz,du)
174  FIELD_U     :: hflux, Ftheta, qu, du
175  FIELD_MASS  :: convm
176  FIELD_THETA :: theta, dtheta_rhodz
177  DECLARE_INDICES
178  DECLARE_EDGES
179  DBL :: divF, du_trisk
180  START_TRACE(id_coriolis, 3,4,0) ! primal, dual, edge
181#include "../kernels_unst/coriolis.k90"
182  STOP_TRACE
183END SUBROUTINE
184
185SUBROUTINE compute_theta(mass_col,rhodz,theta_rhodz, theta)
186  FIELD_PS :: mass_col
187  FIELD_MASS :: rhodz
188  FIELD_THETA :: theta, theta_rhodz
189  DECLARE_INDICES
190  DBL :: m
191  START_TRACE(id_theta, 3,0,0) ! primal, dual, edge
192#include "../kernels_unst/theta.k90"
193  STOP_TRACE
194END SUBROUTINE
195
196SUBROUTINE compute_pvort_only(rhodz,u,qv,qu)
197  FIELD_MASS :: rhodz
198  FIELD_U    :: u,qu
199  FIELD_Z    :: qv
200  DECLARE_INDICES
201  DECLARE_EDGES
202  DECLARE_VERTICES
203  DBL :: etav, hv
204  START_TRACE(id_pvort_only, 1,1,2) ! primal, dual, edge
205#include "../kernels_unst/pvort_only.k90"
206  STOP_TRACE
207END SUBROUTINE compute_pvort_only
208
209SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u)
210  DBL, INTENT(IN) :: tau
211  FIELD_MASS   :: pk,berni  ! INOUT, OUT
212  FIELD_THETA  :: theta     ! IN
213  FIELD_GEOPOT :: geopot    ! IN
214  FIELD_U      :: u,du      ! INOUT,INOUT
215  DECLARE_INDICES
216  DECLARE_EDGES
217  DBL          :: due
218  START_TRACE(id_fast, 4,0,2) ! primal, dual, edge
219#include "../kernels_unst/caldyn_fast.k90"
220  STOP_TRACE
221END SUBROUTINE compute_caldyn_fast
222
223!----------------------------- Unused -----------------------------
224
225SUBROUTINE gradient(b,grad) BINDC(gradient)
226  DOUBLE2(llm,primal_num) :: b
227  DOUBLE2(llm,edge_num)  :: grad
228  DECLARE_INDICES
229#include "../kernels_unst/gradient.k90"
230END SUBROUTINE
231!
232SUBROUTINE div(u,divu) BINDC(div)
233  DOUBLE2(llm,primal_num) :: divu
234  DOUBLE2(llm,edge_num)  :: u
235  DECLARE_INDICES
236  DECLARE_EDGES
237  DBL :: div_ij
238  !$OMP PARALLEL NUM_THREADS(nb_threads)
239#include "../kernels_unst/div.k90"
240  !$OMP END PARALLEL
241END SUBROUTINE
242
243END MODULE caldyn_unstructured_mod
Note: See TracBrowser for help on using the repository browser.