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

Last change on this file since 635 was 635, checked in by dubos, 6 years ago

devel : set nb_threads to OMP_NUM_THREADS by default

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