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

Last change on this file since 651 was 650, checked in by dubos, 7 years ago

devel/unstructured : more loop unrolling

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