[615] | 1 | MODULE 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] | 8 | CONTAINS |
---|
| 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 | |
---|
| 44 | SUBROUTINE 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" |
---|
| 51 | END SUBROUTINE compute_NH_geopot |
---|
[638] | 52 | |
---|
[615] | 53 | SUBROUTINE 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" |
---|
| 62 | END SUBROUTINE compute_caldyn_slow_NH |
---|
[638] | 63 | |
---|
[615] | 64 | SUBROUTINE 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" |
---|
| 73 | END SUBROUTINE compute_caldyn_solver |
---|
[638] | 74 | |
---|
[615] | 75 | SUBROUTINE 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" |
---|
| 82 | END SUBROUTINE compute_caldyn_vert_NH |
---|
[638] | 83 | |
---|
[615] | 84 | !----------------------------- Hydrostatic ------------------------------- |
---|
[638] | 85 | |
---|
[615] | 86 | SUBROUTINE 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" |
---|
| 94 | END SUBROUTINE compute_geopot |
---|
| 95 | ! |
---|
| 96 | SUBROUTINE 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" |
---|
| 105 | END SUBROUTINE compute_caldyn_slow_hydro |
---|
[638] | 106 | |
---|
[615] | 107 | !---------------------------------- Generic ------------------------------ |
---|
[638] | 108 | |
---|
[615] | 109 | SUBROUTINE 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" |
---|
| 123 | END SUBROUTINE caldyn_vert |
---|
[638] | 124 | |
---|
[645] | 125 | SUBROUTINE 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" |
---|
| 133 | END SUBROUTINE |
---|
[638] | 134 | |
---|
[615] | 135 | SUBROUTINE 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" |
---|
| 142 | END SUBROUTINE |
---|
[638] | 143 | |
---|
[615] | 144 | SUBROUTINE 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" |
---|
| 153 | END SUBROUTINE compute_pvort_only |
---|
[638] | 154 | |
---|
[615] | 155 | SUBROUTINE 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 | |
---|
| 167 | END SUBROUTINE compute_caldyn_fast |
---|
[638] | 168 | |
---|
[615] | 169 | !----------------------------- Unused ----------------------------- |
---|
[638] | 170 | |
---|
[615] | 171 | SUBROUTINE 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" |
---|
| 176 | END SUBROUTINE |
---|
| 177 | ! |
---|
| 178 | SUBROUTINE 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 |
---|
| 187 | END SUBROUTINE |
---|
| 188 | |
---|
| 189 | END MODULE caldyn_unstructured_mod |
---|