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

Last change on this file since 935 was 935, checked in by dubos, 5 years ago

devel : interfaces for caldyn_fast and caldyn_slow_hydro

File size: 7.3 KB
RevLine 
[615]1MODULE caldyn_unstructured_mod
2  USE ISO_C_BINDING
3  USE OMP_LIB
[836]4  USE earth_const
[638]5  USE data_unstructured_mod
[615]6  IMPLICIT NONE
7  SAVE
[833]8  PRIVATE
[615]9
[833]10  PUBLIC :: compute_NH_geopot, compute_caldyn_slow_NH, compute_caldyn_solver, &
11       compute_caldyn_vert_NH, compute_geopot, compute_caldyn_slow_hydro, &
12       caldyn_vert, compute_coriolis, compute_theta, compute_pvort_only, &
13       compute_caldyn_fast, gradient, div, &
14       compute_scalar_laplacian, compute_curl_laplacian
15
[638]16CONTAINS
17
[688]18#include "unstructured.h90"
[650]19
[638]20#define PHI_BOT(ij) Phi_bot
21
22!----------------------------- Non-Hydrostatic -----------------------------
[615]23
[658]24SUBROUTINE compute_NH_geopot(tau, m_ik, m_il, theta, W_il, Phi_il)
25  FIELD_MASS   :: m_ik, theta   ! IN*2
[665]26  FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il  ! IN,INOUT*2, LOCAL
[688]27  NUM :: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff
[658]28  INTEGER :: iter
[749]29  LOGICAL :: debug_hevi_solver
[615]30  DECLARE_INDICES
[688]31  NUM :: rho_ij, X_ij, Y_ij, wil, rho_c2_mik, c2_mik, ml_g2
[658]32#define COLUMN 0
33#if COLUMN 
[688]34  NUM1(llm)  :: pk, Ak, Ck
35  NUM1(llm+1):: Rl, Bl, Dl, xl
[658]36#define p_ik(l,ij) pk(l)
37#define A_ik(l,ij) Ak(l)
38#define C_ik(l,ij) Ck(l)
39#define R_il(l,ij) Rl(l)
40#define B_il(l,ij) Bl(l)
41#define D_il(l,ij) Dl(l)
42#define x_il(l,ij) xl(l)
43#else
44  FIELD_MASS :: p_ik, A_ik, C_ik
45  FIELD_GEOPOT :: R_il, B_il, D_il, x_il
46#endif
47
[749]48  debug_hevi_solver=.FALSE.
49!$OMP MASTER
50  debug_hevi_solver = debug_hevi_solver_
51!$OMP END MASTER
52
[658]53  START_TRACE(id_NH_geopot, 7,0,0)
[615]54#include "../kernels_unst/compute_NH_geopot.k90"
[658]55  STOP_TRACE 
56
[749]57!$OMP MASTER
58  debug_hevi_solver_ = debug_hevi_solver
59!$OMP END MASTER
60
[658]61#if COLUMN
62#undef p_ik
63#undef A_ik
64#undef C_ik
65#undef R_il
66#undef B_il
67#undef D_il
68#undef x_il
69#endif
70#undef COLUMN
[615]71END SUBROUTINE compute_NH_geopot
[638]72
[665]73SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, w_il,berni,gradPhi2,DePhil,v_el,G_el,F_el, hflux,du,dPhi,dW)
[615]74  FIELD_U      :: u, hflux, du   ! IN, OUT, OUT
[665]75  FIELD_MASS   :: rhodz, berni   ! IN, BUF
76  FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, BUF*2
77  FIELD_UL     :: DePhil, v_el, G_el, F_el ! BUF*4
[615]78  DECLARE_INDICES
[650]79  DECLARE_EDGES
[688]80  NUM :: W_el, W2_el, gPhi2, dP, divG, u2, uu
[658]81  START_TRACE(id_slow_NH, 5,0,3)
[615]82#include "../kernels_unst/caldyn_slow_NH.k90"
[658]83  STOP_TRACE
[615]84END SUBROUTINE compute_caldyn_slow_NH
[638]85
[665]86SUBROUTINE compute_caldyn_solver(tau,rhodz,theta, berni,pres,m_il, pk,geopot,W,dPhi,dW,du)
[688]87  NUM, INTENT(IN) :: tau
[665]88  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, BUF*2
[615]89  FIELD_THETA  :: theta                  ! IN
[665]90  FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, BUF
[615]91  FIELD_U      :: du                     ! OUT
92  DECLARE_INDICES
[688]93  NUM :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff, Rd_preff
[658]94#include "../kernels_unst/caldyn_mil.k90"
95  IF(tau>0) THEN ! solve implicit problem for geopotential
96    CALL compute_NH_geopot(tau, rhodz, m_il, theta, W, geopot)
97  END IF
98  START_TRACE(id_solver, 7,0,1)
[615]99#include "../kernels_unst/caldyn_solver.k90"
[658]100  STOP_TRACE
[615]101END SUBROUTINE compute_caldyn_solver
[638]102
[665]103SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, eta_dot,wcov,W_etadot, du,dPhi,dW)
104  FIELD_MASS   :: mass, eta_dot, wcov, W_etadot ! IN, BUF*3
105  FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW ! IN*3, INOUT*2
106  FIELD_U      :: du ! INOUT
[615]107  DECLARE_INDICES
[688]108  NUM :: w_ij, wflux_ij
[658]109  START_TRACE(id_vert_NH, 6,0,1)
[615]110#include "../kernels_unst/caldyn_vert_NH.k90"
[658]111  STOP_TRACE
[615]112END SUBROUTINE compute_caldyn_vert_NH
[638]113
[615]114!----------------------------- Hydrostatic -------------------------------
[638]115
[615]116SUBROUTINE compute_geopot(rhodz,theta,ps,pk,geopot)
117  FIELD_MASS  :: rhodz,pk   ! IN, OUT
118  FIELD_THETA :: theta      ! IN
119  FIELD_GEOPOT :: geopot    ! IN(l=1)/OUT(l>1)
120  FIELD_PS     :: ps        ! OUT
121  DECLARE_INDICES
[836]122  NUM :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix, Cp_ik
[658]123  START_TRACE(id_geopot, 3,0,3)
[615]124#include "../kernels_unst/compute_geopot.k90"
[658]125  STOP_TRACE
[615]126END SUBROUTINE compute_geopot
127!
128SUBROUTINE compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du)
129  FIELD_MASS  :: rhodz,berni! IN
130  FIELD_THETA :: theta      ! IN
131  FIELD_U     :: u,hflux,du ! IN, OUT, OUT
132  DECLARE_INDICES
[650]133  DECLARE_EDGES
[615]134  LOGICAL, PARAMETER :: zero=.TRUE.
[688]135  NUM :: ke, uu
[658]136  START_TRACE(id_slow_hydro, 3,0,3)
[615]137#include "../kernels_unst/caldyn_slow_hydro.k90"
[658]138  STOP_TRACE
[615]139END SUBROUTINE compute_caldyn_slow_hydro
[638]140
[615]141!---------------------------------- Generic ------------------------------
[638]142
[615]143SUBROUTINE caldyn_vert(convm,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du, wwuu)
144  FIELD_PS    :: dmass_col
145  FIELD_MASS  :: convm, rhodz
146  FIELD_U     :: u,du
147  FIELD_THETA :: dtheta_rhodz, theta
148  FIELD_GEOPOT :: wflux
[642]149  FIELD_UL     :: wwuu
[615]150  DECLARE_INDICES
[688]151  NUM :: dF_deta, dFu_deta
[615]152  wwuu=0.
[645]153  !$OMP BARRIER
[658]154  START_TRACE(id_vert, 5,0,3)
[624]155#include "../kernels_unst/caldyn_wflux.k90"
156#include "../kernels_unst/caldyn_dmass.k90"
[615]157#include "../kernels_unst/caldyn_vert.k90"
[658]158  STOP_TRACE
[615]159END SUBROUTINE caldyn_vert
[638]160
[645]161SUBROUTINE compute_coriolis(hflux,theta,qu,Ftheta, convm,dtheta_rhodz,du)
[615]162  FIELD_U     :: hflux, Ftheta, qu, du
163  FIELD_MASS  :: convm
164  FIELD_THETA :: theta, dtheta_rhodz
165  DECLARE_INDICES
[650]166  DECLARE_EDGES
[688]167  NUM :: divF, du_trisk
[658]168  START_TRACE(id_coriolis, 3,4,0) ! primal, dual, edge
[615]169#include "../kernels_unst/coriolis.k90"
[658]170  STOP_TRACE
[615]171END SUBROUTINE
[638]172
[615]173SUBROUTINE compute_theta(mass_col,rhodz,theta_rhodz, theta)
174  FIELD_PS :: mass_col
175  FIELD_MASS :: rhodz
176  FIELD_THETA :: theta, theta_rhodz
177  DECLARE_INDICES
[688]178  NUM :: m
[658]179  START_TRACE(id_theta, 3,0,0) ! primal, dual, edge
[615]180#include "../kernels_unst/theta.k90"
[658]181  STOP_TRACE
[615]182END SUBROUTINE
[638]183
[615]184SUBROUTINE compute_pvort_only(rhodz,u,qv,qu)
185  FIELD_MASS :: rhodz
186  FIELD_U    :: u,qu
187  FIELD_Z    :: qv
188  DECLARE_INDICES
[650]189  DECLARE_EDGES
190  DECLARE_VERTICES
[688]191  NUM :: etav, hv
[658]192  START_TRACE(id_pvort_only, 1,1,2) ! primal, dual, edge
[615]193#include "../kernels_unst/pvort_only.k90"
[658]194  STOP_TRACE
[615]195END SUBROUTINE compute_pvort_only
[638]196
[615]197SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u)
[688]198  NUM, INTENT(IN) :: tau
[615]199  FIELD_MASS   :: pk,berni  ! INOUT, OUT
200  FIELD_THETA  :: theta     ! IN
201  FIELD_GEOPOT :: geopot    ! IN
202  FIELD_U      :: u,du      ! INOUT,INOUT
203  DECLARE_INDICES
[650]204  DECLARE_EDGES
[935]205  NUM          :: due, cp_ik, Phi_ik
[658]206  START_TRACE(id_fast, 4,0,2) ! primal, dual, edge
[615]207#include "../kernels_unst/caldyn_fast.k90"
[658]208  STOP_TRACE
[615]209END SUBROUTINE compute_caldyn_fast
[638]210
[615]211!----------------------------- Unused -----------------------------
[638]212
[615]213SUBROUTINE gradient(b,grad) BINDC(gradient)
[688]214  FIELD_MASS :: b
[698]215  FIELD_U    :: grad
[615]216  DECLARE_INDICES
217#include "../kernels_unst/gradient.k90"
218END SUBROUTINE
219!
220SUBROUTINE div(u,divu) BINDC(div)
[688]221  FIELD_MASS :: divu
[698]222  FIELD_U    :: u
[615]223  DECLARE_INDICES
[650]224  DECLARE_EDGES
[688]225  NUM :: div_ij
[615]226  !$OMP PARALLEL NUM_THREADS(nb_threads)
227#include "../kernels_unst/div.k90"
228  !$OMP END PARALLEL
229END SUBROUTINE
230
[784]231SUBROUTINE compute_scalar_laplacian(b,grad,divu)
232  FIELD_MASS   :: b, divu ! IN, OUT
233  FIELD_U      :: grad ! BUF
234  DECLARE_INDICES
235  DECLARE_EDGES
236  NUM :: div_ij
237  START_TRACE(id_scalar_laplacian, 0,0,1)
238#include "../kernels_unst/scalar_laplacian.k90"
239  STOP_TRACE
240END SUBROUTINE compute_scalar_laplacian
241
[792]242SUBROUTINE compute_curl_laplacian(u,qv,curlcurl)
243  FIELD_Z   :: qv ! BUF
244  FIELD_U   :: u, curlcurl ! IN,OUT
245  DECLARE_INDICES
246  DECLARE_EDGES
247  DECLARE_VERTICES
248  NUM :: etav
249  START_TRACE(id_scalar_laplacian, 0,0,1)
250#include "../kernels_unst/curl_laplacian.k90"
251  STOP_TRACE
252END SUBROUTINE compute_curl_laplacian
253
[615]254END MODULE caldyn_unstructured_mod
Note: See TracBrowser for help on using the repository browser.