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

Last change on this file since 784 was 784, checked in by jisesh, 6 years ago

devel/unstructured : laplacian operator

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