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

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

devel/unstructured : OpenMP bugfix

File size: 5.5 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 INDICES1 ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right
11#define INDICES2 ij_up,ij_down,itrisk,edge_trisk,kup,kdown
12#define DECLARE_INDICES INTEGER INDICES1,INDICES2
13#define PHI_BOT(ij) Phi_bot
14#define PHI_BOT_VAR 0.
15
16#define BINDC_(thename) BIND(C, name=#thename)
17#define BINDC(thename) BINDC_(dynamico_ ## thename)
18
19#define DBL REAL(C_DOUBLE)
20#define DOUBLE1(m) DBL, DIMENSION(m)
21#define DOUBLE2(m,n) DBL, DIMENSION(m,n)
22#define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)
23
24#define FIELD_PS      DOUBLE1(primal_num)
25#define FIELD_MASS    DOUBLE2(llm, primal_num)
26#define FIELD_Z       DOUBLE2(llm, dual_num)
27#define FIELD_U       DOUBLE2(llm, edge_num)
28#define FIELD_UL      DOUBLE2(llm+1, edge_num)
29#define FIELD_THETA   DOUBLE3(llm, primal_num, nqdyn)
30#define FIELD_GEOPOT  DOUBLE2(llm+1, primal_num)
31
32#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20))
33
34!----------------------------- Non-Hydrostatic -----------------------------
35
36SUBROUTINE compute_NH_geopot(tau,dummy, m_ik, m_il, theta, W_il, Phi_il)
37  FIELD_MASS   :: m_ik, theta, p_ik, A_ik, C_ik   ! IN*2,LOCAL*3
38  FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il, R_il, x_il, B_il, D_il  ! IN,INOUT*2, LOCAL*5
39  DBL :: tau, dummy, gamma, rho_ij, X_ij, Y_ij, wil, tau2_g, g2, gm2, ml_g2, c2_mik
40  DECLARE_INDICES
41  INTEGER :: iter
42#include "../kernels_unst/compute_NH_geopot.k90"
43END SUBROUTINE compute_NH_geopot
44
45SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, hflux,du,dPhi,dW)
46  FIELD_U      :: u, hflux, du   ! IN, OUT, OUT
47  FIELD_MASS   :: rhodz, berni   ! IN, LOCAL
48  FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, LOCAL
49  FIELD_UL     :: DePhil, v_el, G_el, F_el ! LOCAL
50  DECLARE_INDICES
51  DBL :: W_el, W2_el, gPhi2, dP, divG, u2, uu
52#include "../kernels_unst/caldyn_slow_NH.k90"
53END SUBROUTINE compute_caldyn_slow_NH
54
55SUBROUTINE compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi,dW,du)
56  DBL, INTENT(IN) :: tau
57  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, LOCAL
58  FIELD_THETA  :: theta                  ! IN
59  FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, LOCAL
60  FIELD_U      :: du                     ! OUT
61  DECLARE_INDICES
62  DBL :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff
63#include "../kernels_unst/caldyn_solver.k90"
64END SUBROUTINE compute_caldyn_solver
65
66SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, du,dPhi,dW)
67  FIELD_MASS   :: mass, eta_dot, wcov, W_etadot
68  FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW
69  FIELD_U      :: du
70  DECLARE_INDICES
71  DBL :: w_ij, wflux_ij
72#include "../kernels_unst/caldyn_vert_NH.k90"
73END SUBROUTINE compute_caldyn_vert_NH
74
75!----------------------------- Hydrostatic -------------------------------
76
77SUBROUTINE compute_geopot(rhodz,theta,ps,pk,geopot)
78  FIELD_MASS  :: rhodz,pk   ! IN, OUT
79  FIELD_THETA :: theta      ! IN
80  FIELD_GEOPOT :: geopot    ! IN(l=1)/OUT(l>1)
81  FIELD_PS     :: ps        ! OUT
82  DECLARE_INDICES
83  DBL :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix
84#include "../kernels_unst/compute_geopot.k90"
85END SUBROUTINE compute_geopot
86!
87SUBROUTINE compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du)
88  FIELD_MASS  :: rhodz,berni! IN
89  FIELD_THETA :: theta      ! IN
90  FIELD_U     :: u,hflux,du ! IN, OUT, OUT
91  DECLARE_INDICES
92  LOGICAL, PARAMETER :: zero=.TRUE.
93  DBL :: ke, uu
94#include "../kernels_unst/caldyn_slow_hydro.k90"
95END SUBROUTINE compute_caldyn_slow_hydro
96
97!---------------------------------- Generic ------------------------------
98
99SUBROUTINE caldyn_vert(convm,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du, wwuu)
100  FIELD_PS    :: dmass_col
101  FIELD_MASS  :: convm, rhodz
102  FIELD_U     :: u,du
103  FIELD_THETA :: dtheta_rhodz, theta
104  FIELD_GEOPOT :: wflux
105  FIELD_UL     :: wwuu
106  DECLARE_INDICES
107  DBL :: dF_deta, dFu_deta
108  wwuu=0.
109  !$OMP BARRIER
110#include "../kernels_unst/caldyn_wflux.k90"
111#include "../kernels_unst/caldyn_dmass.k90"
112#include "../kernels_unst/caldyn_vert.k90"
113END SUBROUTINE caldyn_vert
114
115SUBROUTINE compute_coriolis(hflux,theta,qu,Ftheta, convm,dtheta_rhodz,du)
116  FIELD_U     :: hflux, Ftheta, qu, du
117  FIELD_MASS  :: convm
118  FIELD_THETA :: theta, dtheta_rhodz
119  DECLARE_INDICES
120  DBL :: divF, du_trisk
121#include "../kernels_unst/coriolis.k90"
122END SUBROUTINE
123
124SUBROUTINE compute_theta(mass_col,rhodz,theta_rhodz, theta)
125  FIELD_PS :: mass_col
126  FIELD_MASS :: rhodz
127  FIELD_THETA :: theta, theta_rhodz
128  DECLARE_INDICES
129  DBL :: m
130#include "../kernels_unst/theta.k90"
131END SUBROUTINE
132
133SUBROUTINE compute_pvort_only(rhodz,u,qv,qu)
134  FIELD_MASS :: rhodz
135  FIELD_U    :: u,qu
136  FIELD_Z    :: qv
137  DECLARE_INDICES
138  DBL :: etav, hv
139#include "../kernels_unst/pvort_only.k90"
140END SUBROUTINE compute_pvort_only
141
142SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u)
143  DBL, INTENT(IN) :: tau
144  FIELD_MASS   :: pk,berni  ! INOUT, OUT
145  FIELD_THETA  :: theta     ! IN
146  FIELD_GEOPOT :: geopot    ! IN
147  FIELD_U      :: u,du      ! INOUT,INOUT
148  DECLARE_INDICES
149  DBL          :: due
150
151#include "../kernels_unst/caldyn_fast.k90"
152
153END SUBROUTINE compute_caldyn_fast
154
155!----------------------------- Unused -----------------------------
156
157SUBROUTINE gradient(b,grad) BINDC(gradient)
158  DOUBLE2(llm,primal_num) :: b
159  DOUBLE2(llm,edge_num)  :: grad
160  DECLARE_INDICES
161#include "../kernels_unst/gradient.k90"
162END SUBROUTINE
163!
164SUBROUTINE div(u,divu) BINDC(div)
165  DOUBLE2(llm,primal_num) :: divu
166  DOUBLE2(llm,edge_num)  :: u
167  DECLARE_INDICES
168  DBL :: div_ij
169  !$OMP PARALLEL NUM_THREADS(nb_threads)
170#include "../kernels_unst/div.k90"
171  !$OMP END PARALLEL
172END SUBROUTINE
173
174END MODULE caldyn_unstructured_mod
Note: See TracBrowser for help on using the repository browser.