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

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

devel/unstructured : import Python layer from HEAT

File size: 16.1 KB
Line 
1MODULE caldyn_unstructured_mod
2  USE ISO_C_BINDING
3  USE OMP_LIB
4  USE xios
5  IMPLICIT NONE
6  PRIVATE
7  SAVE
8
9#define BINDC(thename) BIND(C, name='dynamico_' // #thename)
10!
11#define DBL REAL(C_DOUBLE)
12#define DOUBLE1(m) DBL, DIMENSION(m)
13#define DOUBLE2(m,n) DBL, DIMENSION(m,n)
14#define DOUBLE3(m,n,p) DBL, DIMENSION(m,n,p)
15#define INDEX INTEGER(C_INT)
16#define PHI_BOT(ij) Phi_bot
17#define PHI_BOT_VAR 0.d0
18!
19  INTEGER, PARAMETER :: eta_mass=1, eta_lag=2, thermo_theta=1, thermo_entropy=2, thermo_moist=3, thermo_boussinesq=4
20  INTEGER(C_INT),  BIND(C) :: caldyn_thermo=thermo_theta, caldyn_eta=eta_lag, nb_threads=1
21  LOGICAL(C_BOOL), BIND(C) :: hydrostatic=.TRUE., debug_hevi_solver=.TRUE., rigid=.TRUE.
22!
23  INDEX, BIND(C) :: llm, nqdyn, edge_num, primal_num, dual_num, &
24       max_primal_deg, max_dual_deg, max_trisk_deg
25  INDEX, ALLOCATABLE, PRIVATE :: & ! deg(ij) = nb of vertices = nb of edges of primal/dual cell ij
26       primal_deg(:), primal_edge(:,:), primal_vertex(:,:), primal_ne(:,:), & 
27       dual_deg(:), dual_edge(:,:), dual_vertex(:,:), dual_ne(:,:), &
28       trisk_deg(:), trisk(:,:), &
29       left(:), right(:), up(:), down(:)
30  ! left and right are adjacent primal cells
31  ! flux is positive when going from left to right
32  ! up and down are adjacent dual cells
33  ! circulation is positive when going from down to up
34!
35  DBL, BIND(C) :: elapsed, g, ptop, cpp, cppv, Rd, Rv, preff, Treff, &
36      pbot, Phi_bot, rho_bot
37  DBL :: kappa
38  DOUBLE1(:), ALLOCATABLE, PRIVATE   :: le_de, fv, Av, Ai
39  DOUBLE2(:,:), ALLOCATABLE, PRIVATE :: Riv2, wee, ap,bp, mass_bl, mass_dak, mass_dbk
40!
41  INTEGER(C_INT), BIND(C) :: comm_icosa
42  TYPE(xios_context) :: ctx_hdl
43
44CONTAINS
45!
46!-------------------------------------- KERNELS --------------------------------------
47!
48!
49#define DECLARE_INDICES INTEGER ij,l,iq,iedge,edge,ivertex,vertex,ij_left,ij_right,ij_up,ij_down,itrisk,edge_trisk,kup,kdown
50
51#define FIELD_PS      DOUBLE1(primal_num)
52#define FIELD_MASS    DOUBLE2(llm, primal_num)
53#define FIELD_Z       DOUBLE2(llm, dual_num)
54#define FIELD_U       DOUBLE2(llm, edge_num)
55#define FIELD_UL      DOUBLE2(llm+1, edge_num)
56#define FIELD_THETA   DOUBLE3(llm, primal_num, nqdyn)
57#define FIELD_GEOPOT  DOUBLE2(llm+1, primal_num)
58!
59#define HASNAN(field) (ANY(.NOT.ABS(field)<1e20))
60!
61SUBROUTINE caldyn_unstructured(tau, mass_col,rhodz,theta_rhodz,u,geopot,w, & ! IN : flow state
62                               theta,ps,pk,hflux,qv, &    ! OUT : diags (except surface geopot : IN)
63                               dmass_col,drhodz,dtheta_rhodz,du_fast,du_slow, &
64                               dPhi_fast, dPhi_slow, dW_fast, dW_slow) BINDC(caldyn_unstructured) ! OUT : tendencies
65  DBL, VALUE :: tau
66  FIELD_MASS   :: rhodz, drhodz, pk, berni         ! IN, OUT, DIAG
67  FIELD_THETA  :: theta_rhodz, dtheta_rhodz, theta ! IN, OUT, DIAG
68  FIELD_GEOPOT :: wflux, w, geopot, &              ! DIAG, INOUT
69       dPhi_fast, dPhi_slow, dW_fast, dW_slow      ! OUT
70  FIELD_U      :: u,du_fast,du_slow,hflux,qu       ! INOUT,OUT,OUT,DIAG
71  FIELD_Z      :: qv                               ! DIAG
72  FIELD_PS     :: ps,dmass_col,mass_col            ! OUT,OUT,IN (if eta_mass) or OUT,UNUSED,UNUSED (if eta_lag)
73  DOUBLE2(llm+1, edge_num) :: wwuu
74  DBL          :: time1,time2
75  INTEGER :: ij
76
77  !CALL CPU_TIME(time1)
78  time1=OMP_GET_WTIME()
79
80  IF(hydrostatic) THEN
81
82    !$OMP PARALLEL NUM_THREADS(nb_threads)
83    !$OMP DO SCHEDULE(STATIC)
84    DO ij=1,edge_num
85      du_fast(:,ij)=0.
86      du_slow(:,ij)=0.
87    END DO
88    !$OMP END DO
89    CALL compute_theta(mass_col,rhodz,theta_rhodz, theta)
90    CALL compute_geopot(rhodz,theta, ps,pk,geopot)
91
92    CALL compute_caldyn_fast(tau, pk,berni,theta,geopot, du_fast,u)
93
94    CALL compute_pvort_only(rhodz,u,qv,qu)
95    CALL compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du_slow)
96    CALL compute_coriolis(hflux,theta,qu, drhodz,dtheta_rhodz,du_slow)
97    IF(caldyn_eta == eta_mass) THEN
98       CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,wwuu)
99    END IF
100    !$OMP END PARALLEL
101
102  ELSE ! NH
103    DO ij=1,edge_num
104      du_fast(:,ij)=0.
105      du_slow(:,ij)=0.
106    END DO
107    DO ij=1,primal_num
108      wflux(1,ij)=0.
109      wflux(llm+1,ij)=0.
110    END DO
111    CALL compute_theta(mass_col,rhodz,theta_rhodz, theta)
112    CALL compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi_fast,dW_fast,du_fast)
113    CALL compute_caldyn_fast(tau, pk,berni,theta,geopot, du_fast,u)
114    CALL compute_pvort_only(rhodz,u,qv,qu)
115    CALL compute_caldyn_slow_NH(u,rhodz,geopot,W, hflux,du_slow,dPhi_slow,dW_slow) 
116    CALL compute_coriolis(hflux,theta,qu, drhodz,dtheta_rhodz,du_slow)
117    IF(caldyn_eta == eta_mass) THEN
118       CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,wwuu)
119       CALL compute_caldyn_vert_NH(rhodz,geopot,W,wflux, du_slow,dPhi_slow,dW_slow)
120    END IF
121  END IF
122 
123  time2=OMP_GET_WTIME()
124!  CALL CPU_TIME(time2)
125  elapsed = elapsed + time2-time1
126END SUBROUTINE caldyn_unstructured
127!
128!----------------------------- Non-Hydrostatic -----------------------------
129!
130SUBROUTINE compute_NH_geopot(tau,dummy, m_ik, m_il, theta, W_il, Phi_il)
131  FIELD_MASS   :: m_ik, theta, p_ik, A_ik, C_ik   ! IN*2,LOCAL*3
132  FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il, R_il, x_il, B_il, D_il  ! IN,INOUT*2, LOCAL*5
133  DBL :: tau, dummy, gamma, rho_ij, X_ij, Y_ij, wil, tau2_g, g2, gm2, ml_g2, c2_mik
134  DECLARE_INDICES
135  INTEGER :: iter
136#include "../kernels_unst/compute_NH_geopot.k90"
137END SUBROUTINE compute_NH_geopot
138!
139SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, hflux,du,dPhi,dW)
140  FIELD_U      :: u, hflux, du   ! IN, OUT, OUT
141  FIELD_MASS   :: rhodz, berni   ! IN, LOCAL
142  FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, LOCAL
143  FIELD_UL     :: DePhil, v_el, G_el, F_el ! LOCAL
144  DECLARE_INDICES
145  DBL :: W_el, W2_el, gPhi2, dP, divG, u2, uu
146#include "../kernels_unst/caldyn_slow_NH.k90"
147END SUBROUTINE compute_caldyn_slow_NH
148!
149SUBROUTINE compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi,dW,du)
150  DBL, INTENT(IN) :: tau
151  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, LOCAL
152  FIELD_THETA  :: theta                  ! IN
153  FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, LOCAL
154  FIELD_U      :: du                     ! OUT
155  DECLARE_INDICES
156  DBL :: X_ij, rho_ij, T_ij, gamma, Cvd, vreff
157#include "../kernels_unst/caldyn_solver.k90"
158END SUBROUTINE compute_caldyn_solver
159!
160SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, du,dPhi,dW)
161  FIELD_MASS   :: mass, eta_dot, wcov, W_etadot
162  FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW
163  FIELD_U      :: du
164  DECLARE_INDICES
165  DBL :: w_ij, wflux_ij
166#include "../kernels_unst/caldyn_vert_NH.k90"
167END SUBROUTINE compute_caldyn_vert_NH
168!
169!----------------------------- Hydrostatic -------------------------------
170!
171SUBROUTINE compute_geopot(rhodz,theta,ps,pk,geopot)
172  FIELD_MASS  :: rhodz,pk   ! IN, OUT
173  FIELD_THETA :: theta      ! IN
174  FIELD_GEOPOT :: geopot    ! IN(l=1)/OUT(l>1)
175  FIELD_PS     :: ps        ! OUT
176  DECLARE_INDICES
177  DBL :: gdz, ke, uu, chi, gv, exner_ik, temp_ik, p_ik, qv, Rmix
178#include "../kernels_unst/compute_geopot.k90"
179END SUBROUTINE compute_geopot
180!
181SUBROUTINE compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du)
182  FIELD_MASS  :: rhodz,berni! IN
183  FIELD_THETA :: theta      ! IN
184  FIELD_U     :: u,hflux,du ! IN, OUT, OUT
185  DECLARE_INDICES
186  LOGICAL, PARAMETER :: zero=.TRUE.
187  DBL :: ke, uu
188#include "../kernels_unst/caldyn_slow_hydro.k90"
189END SUBROUTINE compute_caldyn_slow_hydro
190!
191!---------------------------------- Generic ------------------------------
192!
193SUBROUTINE caldyn_vert(convm,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du, wwuu)
194  FIELD_PS    :: dmass_col
195  FIELD_MASS  :: convm, rhodz
196  FIELD_U     :: u,du
197  FIELD_THETA :: dtheta_rhodz, theta
198  FIELD_GEOPOT :: wflux
199  DOUBLE2(llm+1, edge_num) :: wwuu
200  DECLARE_INDICES
201  wwuu=0.
202#include "../kernels_unst/caldyn_vert.k90"
203END SUBROUTINE caldyn_vert
204!
205SUBROUTINE compute_coriolis(hflux,theta,qu, convm,dtheta_rhodz,du)
206  FIELD_U     :: hflux, Ftheta, qu, du
207  FIELD_MASS  :: convm
208  FIELD_THETA :: theta, dtheta_rhodz
209  DECLARE_INDICES
210  DBL :: divF, du_trisk
211#include "../kernels_unst/coriolis.k90"
212END SUBROUTINE
213!
214SUBROUTINE compute_theta(mass_col,rhodz,theta_rhodz, theta)
215  FIELD_PS :: mass_col
216  FIELD_MASS :: rhodz
217  FIELD_THETA :: theta, theta_rhodz
218  DECLARE_INDICES
219  DBL :: m
220#include "../kernels_unst/theta.k90"
221END SUBROUTINE
222!
223SUBROUTINE compute_pvort_only(rhodz,u,qv,qu)
224  FIELD_MASS :: rhodz
225  FIELD_U    :: u,qu
226  FIELD_Z    :: qv
227  DECLARE_INDICES
228  DBL :: etav, hv
229#include "../kernels_unst/pvort_only.k90"
230END SUBROUTINE compute_pvort_only
231!
232SUBROUTINE compute_caldyn_fast(tau, pk,berni,theta,geopot, du,u)
233  DBL, INTENT(IN) :: tau
234  FIELD_MASS   :: pk,berni  ! INOUT, OUT
235  FIELD_THETA  :: theta     ! IN
236  FIELD_GEOPOT :: geopot    ! IN
237  FIELD_U      :: u,du      ! INOUT,INOUT
238  DECLARE_INDICES
239  DBL          :: due
240
241#include "../kernels_unst/caldyn_fast.k90"
242
243END SUBROUTINE compute_caldyn_fast
244!
245!----------------------------- Unused -----------------------------
246!
247SUBROUTINE gradient(b,grad) BINDC(gradient)
248  DOUBLE2(llm,primal_num) :: b
249  DOUBLE2(llm,edge_num)  :: grad
250  DECLARE_INDICES
251#include "../kernels_unst/gradient.k90"
252END SUBROUTINE
253!
254SUBROUTINE div(u,divu) BINDC(div)
255  DOUBLE2(llm,primal_num) :: divu
256  DOUBLE2(llm,edge_num)  :: u
257  DECLARE_INDICES
258  DBL :: div_ij
259  !$OMP PARALLEL NUM_THREADS(nb_threads)
260#include "../kernels_unst/div.k90"
261  !$OMP END PARALLEL
262END SUBROUTINE
263!
264!---------------------------- CONTEXT INITIALIZATION --------------------------
265!
266#define ALLOC1(v,n1) IF(ALLOCATED(v)) DEALLOCATE(v) ; ALLOCATE(v(n1))
267#define ALLOC2(v,n1,n2) IF(ALLOCATED(v)) DEALLOCATE(v) ; ALLOCATE(v(n1,n2))
268
269SUBROUTINE init_mesh( & 
270     primal_deg_, primal_edge_, primal_ne_, &
271     dual_deg_, dual_edge_, dual_ne_, dual_vertex_, &
272     left_, right_, up_, down_ ,&
273     trisk_deg_, trisk_) BINDC(init_mesh)
274  INDEX :: primal_deg_(primal_num), primal_edge_(max_primal_deg,primal_num), &
275       primal_ne_(max_primal_deg,primal_num), &
276       dual_deg_(dual_num), dual_edge_(max_dual_deg,dual_num), &
277       dual_ne_(max_dual_deg,dual_num), &
278       dual_vertex_(max_dual_deg,dual_num), &
279       trisk_deg_(edge_num), trisk_(max_trisk_deg, edge_num)
280  INDEX, DIMENSION(edge_num) :: left_, right_, down_, up_
281
282  PRINT *, 'init_mesh ...'
283  PRINT *, 'Primal mesh : ', primal_num, max_primal_deg
284  PRINT *, 'Dual mesh   : ', dual_num, max_dual_deg
285  PRINT *, 'Edge mesh   : ', edge_num, max_trisk_deg
286  PRINT *, 'Vertical levels :', llm
287  ALLOC1(primal_deg, primal_num)
288  ALLOC2(primal_edge, max_primal_deg,primal_num)
289  ALLOC2(primal_ne, max_primal_deg,primal_num)
290  ALLOC1(dual_deg,dual_num)
291  ALLOC2(dual_edge, max_dual_deg,dual_num)
292  ALLOC2(dual_ne, max_dual_deg,dual_num)
293  ALLOC2(dual_vertex, max_dual_deg,dual_num)
294  ALLOC1(trisk_deg, edge_num)
295  ALLOC2(trisk, max_trisk_deg, edge_num)
296  PRINT *, SHAPE(trisk), edge_num
297  ALLOC1(left, edge_num)
298  ALLOC1(right, edge_num)
299  ALLOC1(up, edge_num)
300  ALLOC1(down, edge_num)
301  primal_deg(:) = primal_deg_(:)
302  primal_edge(:,:) = primal_edge_(:,:)
303  primal_ne(:,:) = primal_ne_(:,:)
304  dual_deg(:) = dual_deg_(:)
305  dual_edge(:,:) = dual_edge_(:,:)
306  dual_ne(:,:) = dual_ne_(:,:)
307  dual_vertex(:,:) = dual_vertex_(:,:)
308  IF(MINVAL(dual_deg)<3) THEN
309     STOP 'At least one dual cell has less than 3 vertices'
310  END IF
311  IF(MINVAL(primal_deg)<3) THEN
312     STOP 'At least one primal cell has less than 3 vertices'
313  END IF
314  left(:)=left_(:)
315  right(:)=right_(:)
316  down(:)=down_(:)
317  up=up_(:)
318  trisk_deg(:)=trisk_deg_(:)
319  trisk(:,:)=trisk_(:,:)
320  PRINT *, MAXVAL(primal_edge), edge_num
321  PRINT *, MAXVAL(dual_edge), edge_num
322  PRINT *, MAXVAL(dual_vertex), dual_num
323  PRINT *, MAXVAL(trisk), edge_num
324  PRINT *, MAX(MAXVAL(left),MAXVAL(right)), primal_num
325  PRINT *, MAX(MAXVAL(up),MAXVAL(down)), dual_num
326  PRINT *, SHAPE(trisk), edge_num
327  PRINT *,' ... Done.'
328END SUBROUTINE init_mesh
329
330SUBROUTINE init_metric(Ai_, Av_, fv_, le_de_, Riv2_, wee_) BINDC(init_metric)
331  DOUBLE1(primal_num) :: Ai_
332  DOUBLE1(dual_num)   :: Av_, fv_
333  DOUBLE1(edge_num)   :: le_de_
334  DOUBLE2(max_dual_deg,dual_num) :: Riv2_
335  DOUBLE2(max_trisk_deg,edge_num) :: wee_
336  PRINT *, 'init_metric ...'
337  ALLOC1(Ai,primal_num)
338  ALLOC1(Av,dual_num)
339  ALLOC1(fv,dual_num)
340  ALLOC1(le_de,edge_num)
341  ALLOC2(Riv2, max_dual_deg, dual_num)
342  ALLOC2(wee, max_trisk_deg, edge_num)
343  Ai(:) = Ai_(:)
344  Av(:) = Av_(:)
345  fv(:) = fv_(:)
346  le_de(:) = le_de_(:)
347  Riv2(:,:)=Riv2_(:,:)
348  wee(:,:) = wee_(:,:)
349  PRINT *, MAXVAL(ABS(Ai))
350  PRINT *, MAXVAL(ABS(Av))
351  PRINT *, MAXVAL(ABS(fv))
352  PRINT *, MAXVAL(ABS(le_de))
353  PRINT *, MAXVAL(ABS(Riv2))
354  PRINT *, MAXVAL(ABS(wee))
355  PRINT *, MINVAL(right), MAXVAL(right)
356  PRINT *, MINVAL(right), MAXVAL(left)
357  PRINT *,' ... Done.'
358  PRINT *,'OpenMP : max_threads, num_procs, nb_threads', OMP_GET_MAX_THREADS(), omp_get_num_procs(), nb_threads
359
360END SUBROUTINE init_metric
361!
362SUBROUTINE init_params() BINDC(init_params)
363  PRINT *, 'Setting physical parameters ...'
364  IF(hydrostatic) THEN
365     PRINT *, 'Hydrostatic dynamics (HPE)'
366  ELSE
367     PRINT *, 'Non-hydrostatic dynamics (Euler)'
368  END IF
369  kappa = Rd/cpp
370  PRINT *, 'g = ',g
371  PRINT *, 'preff = ',preff
372  PRINT *, 'Treff = ',Treff
373  PRINT *, 'Rd = ',Rd
374  PRINT *, 'cpp = ',cpp
375  PRINT *, 'kappa = ',kappa
376  PRINT *, '... Done'
377END SUBROUTINE init_params
378!
379SUBROUTINE init_hybrid(bl,dak,dbk) BINDC(init_hybrid)
380  DOUBLE2(llm+1, primal_num) :: bl
381  DOUBLE2(llm, primal_num) :: dak,dbk
382  PRINT *, 'Setting hybrid coefficients ...'
383  ALLOC2(mass_bl, llm+1, primal_num)
384  ALLOC2(mass_dak, llm, primal_num)
385  ALLOC2(mass_dbk, llm, primal_num)
386  mass_bl(:,:)  = bl(:,:)
387  mass_dak(:,:) = dak(:,:)
388  mass_dbk(:,:) = dbk(:,:)
389  PRINT *, '... Done, llm = ', llm
390END SUBROUTINE Init_hybrid
391
392!---------------------------------------------- XIOS -----------------------------------------
393
394  SUBROUTINE setup_xios() BINDC(setup_xios)
395    ! MPI_INIT / MPI_finalize are assumed to be called BEFORE/AFTER this routine
396    ! This is the case when calling from Python after importing mpi4py
397    INTEGER :: ierr, mpi_threading_mode
398   
399    PRINT *, 'Initialize XIOS and obtain our communicator'
400    CALL xios_initialize("icosagcm",return_comm=comm_icosa)
401   
402    PRINT *, 'Initialize our XIOS context'
403   
404    CALL xios_context_initialize("icosagcm",comm_icosa)
405    CALL xios_get_handle("icosagcm",ctx_hdl)
406    CALL xios_set_current_context(ctx_hdl)
407    !   CALL xios_set_axis_attr("lev",n_glo=llm ,value=lev_value) ;
408    !   CALL xios_set_axis_attr("levp1",n_glo=llm+1 ,value=lev_valuep1) ;
409    !   CALL xios_set_axis_attr("nq",n_glo=nqtot, value=nq_value) ;
410    !   CALL xios_set_domaingroup_attr("i",ni_glo=ncell_tot, ibegin=displ, ni=ncell)
411    !   CALL xios_set_domaingroup_attr("i", data_dim=1, type='unstructured' , nvertex=6, i_index=ind_glo)
412    !   CALL xios_set_domaingroup_attr("i",lonvalue_1d=lon, latvalue_1d=lat, bounds_lon_1d=bounds_lon, bounds_lat_1d=bounds_lat)
413    !   CALL xios_set_domain_attr("u",ni_glo=ncell_tot, ibegin=displ, ni=ncell)
414    !   CALL xios_set_domain_attr("u", data_dim=1, type='unstructured' , nvertex=2, i_index=ind_glo)
415    !  CALL xios_set_domain_attr("u",lonvalue_1d=lon, latvalue_1d=lat, bounds_lon_1d=bounds_lon, bounds_lat_1d=bounds_lat)
416    !   CALL xios_set_domain_attr("v",ni_glo=ncell_tot, ibegin=displ, ni=ncell)
417    !   CALL xios_set_domain_attr("v", data_dim=1, type='unstructured' , nvertex=3)
418    !   CALL xios_set_domain_attr("v",lonvalue_1d=lon, latvalue_1d=lat, bounds_lon_1d=bounds_lon, bounds_lat_1d=bounds_lat)
419    !   CALL xios_set_timestep(dtime) 
420    !   CALL xios_set_fieldgroup_attr("standard_output", freq_op=itau_out*xios_timestep, freq_offset=(itau_out-1)*xios_timestep)   
421    ! CALL xios_close_context_definition()
422   
423    ! PRINT *, 'Read data'
424    ! CALL xios_recv_field(name,field)
425   
426    ! PRINT *,'Write data'
427    ! CALL xios_send_field(name,field_tmp)
428   
429   !   PRINT *, 'Flush to disk, clean up and die'
430   !   CALL xios_context_finalize
431  END SUBROUTINE setup_xios
432!
433  SUBROUTINE call_xios_set_timestep(dt) BINDC(xios_set_timestep)
434    DBL, VALUE :: dt
435    TYPE(xios_duration)      :: dtime
436    dtime%second=dt
437    CALL xios_set_timestep(dtime)
438  END SUBROUTINE call_xios_set_timestep
439
440  SUBROUTINE call_xios_update_calendar(step) BINDC(xios_update_calendar)
441    INDEX, value :: step
442    CALL xios_update_calendar(step)
443  END SUBROUTINE call_xios_update_calendar
444
445END MODULE caldyn_unstructured_mod
Note: See TracBrowser for help on using the repository browser.