source: branches/publications/ORCHIDEE_gmd-2018-182/src_parallel/ioipsl_para.f90 @ 7326

Last change on this file since 7326 was 1078, checked in by anne.cozic, 12 years ago

Merge between branche OpenMP2 at revision 1076 and trunk revision 1062

this merge doesn't change results for Orchidee with compilation MPI

test with OFFLINE and LMDZOR

There is still a bug when the modele is compile with OpenMP

  • Property svn:keywords set to HeadURL Date Author Revision
File size: 16.3 KB
Line 
1! Overlap of IOIPSL functions for specific parallel use in ORCHIDEE.
2
3!-
4!< $HeadURL$
5!< $Date$
6!< $Author$
7!< $Revision$
8!-
9
10MODULE ioipsl_para
11  USE ioipsl
12  USE mod_orchidee_para
13!-
14  IMPLICIT NONE
15
16  INTEGER, SAVE :: orch_domain_id 
17!-
18   INTEGER :: orch_ipslout=6, orch_ilv_cur=0, orch_ilv_max=0
19!$OMP THREADPRIVATE( orch_ipslout, orch_ilv_cur, orch_ilv_max )
20
21!-
22!-
23#include "src_parallel.h"
24!-
25  INTERFACE getin_p
26    MODULE PROCEDURE getin_p_c,getin_p_c1,   &
27         getin_p_i,getin_p_i1,getin_p_i2,&
28         getin_p_r,getin_p_r1,getin_p_r2,&
29         getin_p_l,getin_p_l1,getin_p_l2
30  END INTERFACE
31!-
32  INTERFACE restput_p
33     MODULE PROCEDURE &
34          restput_p_r3d, restput_p_r2d, restput_p_r1d, &
35          restput_p_opp_r2d, restput_p_opp_r1d
36  END INTERFACE
37!-
38  INTERFACE restget_p
39     MODULE PROCEDURE &
40          restget_p_r3d, restget_p_r2d, restget_p_r1d, &
41          restget_p_opp_r2d, restget_p_opp_r1d
42  END INTERFACE
43
44
45  INTERFACE histwrite_p
46     MODULE PROCEDURE &
47     histwrite_r1d_p,histwrite_r2d_p,histwrite_r3d_p     
48  END INTERFACE
49
50CONTAINS
51
52
53
54  SUBROUTINE Init_ioipsl_para
55
56    USE mod_orchidee_mpi_data
57    USE mod_orchidee_omp_data
58    IMPLICIT NONE
59   
60    INTEGER,DIMENSION(2) :: ddid
61    INTEGER,DIMENSION(2) :: dsg
62    INTEGER,DIMENSION(2) :: dsl
63    INTEGER,DIMENSION(2) :: dpf
64    INTEGER,DIMENSION(2) :: dpl
65    INTEGER,DIMENSION(2) :: dhs
66    INTEGER,DIMENSION(2) :: dhe 
67
68    IF (is_omp_root) THEN
69      ddid=(/ 1,2 /)
70      dsg=(/ iim_g, jjm_g /)
71      dsl=(/ iim_g, jj_nb /)
72      dpf=(/ 1,jj_begin /)
73      dpl=(/ iim_g, jj_end /)
74      dhs=(/ ii_begin-1,0 /)
75      if (mpi_rank==mpi_size-1) then
76        dhe=(/0,0/)
77      else
78         dhe=(/ iim_g-ii_end,0 /) 
79      endif
80   
81      call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
82                        'APPLE',orch_domain_id)
83     ENDIF
84     
85  END SUBROUTINE Init_ioipsl_para
86
87!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
88!!   Definition de ioconf_setatt_p      !!
89!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
90
91SUBROUTINE ioconf_setatt_p (attname,attvalue)
92!---------------------------------------------------------------------
93  IMPLICIT NONE
94!-
95  CHARACTER(LEN=*), INTENT(in) :: attname,attvalue
96!---------------------------------------------------------------------
97
98  IF (is_root_prc) THEN
99     CALL ioconf_setatt(attname,attvalue)
100  ENDIF
101
102END SUBROUTINE ioconf_setatt_p
103
104!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
105!!   Definition de parallel ipslerr functions    !!
106!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
107!===
108SUBROUTINE ipslnlf_p (new_number,old_number)
109!!--------------------------------------------------------------------
110!! The "ipslnlf" routine allows to know and modify
111!! the current logical number for the messages.
112!!
113!! SUBROUTINE ipslnlf (new_number,old_number)
114!!
115!! Optional INPUT argument
116!!
117!! (I) new_number : new logical number of the file
118!!
119!! Optional OUTPUT argument
120!!
121!! (I) old_number : current logical number of the file
122!!--------------------------------------------------------------------
123  IMPLICIT NONE
124!-
125  INTEGER,OPTIONAL,INTENT(IN)  :: new_number
126  INTEGER,OPTIONAL,INTENT(OUT) :: old_number
127!---------------------------------------------------------------------
128  IF (PRESENT(old_number)) THEN
129#ifndef CPP_OMP
130    CALL ipslnlf(old_number=orch_ipslout)
131#endif
132    old_number = orch_ipslout
133  ENDIF
134  IF (PRESENT(new_number)) THEN
135    orch_ipslout = new_number
136#ifndef CPP_OMP
137    CALL ipslnlf(new_number=orch_ipslout)
138#endif
139  ENDIF
140!---------------------
141END SUBROUTINE ipslnlf_p
142!===
143SUBROUTINE ipslerr_p (plev,pcname,pstr1,pstr2,pstr3)
144!---------------------------------------------------------------------
145!! The "ipslerr_p" routine
146!! allows to handle the messages to the user.
147!!
148!! parallel version of IOIPSL ipslerr
149!!
150!! INPUT
151!!
152!! plev   : Category of message to be reported to the user
153!!          1 = Note to the user
154!!          2 = Warning to the user
155!!          3 = Fatal error
156!! pcname : Name of subroutine which has called ipslerr
157!! pstr1   
158!! pstr2  : Strings containing the explanations to the user
159!! pstr3
160!---------------------------------------------------------------------
161   IMPLICIT NONE
162!-
163   INTEGER :: plev
164   CHARACTER(LEN=*) :: pcname,pstr1,pstr2,pstr3
165!-
166   CHARACTER(LEN=30),DIMENSION(3) :: pemsg = &
167  &  (/ "NOTE TO THE USER FROM ROUTINE ", &
168  &     "WARNING FROM ROUTINE          ", &
169  &     "FATAL ERROR FROM ROUTINE      " /)
170!---------------------------------------------------------------------
171   IF ( (plev >= 1).AND.(plev <= 3) ) THEN
172     orch_ilv_cur = plev
173     orch_ilv_max = MAX(orch_ilv_max,plev)
174     WRITE(orch_ipslout,'(/,A," ",A)') TRIM(pemsg(plev)),TRIM(pcname)
175     WRITE(orch_ipslout,'(3(" --> ",A,/))') TRIM(pstr1),TRIM(pstr2),TRIM(pstr3)
176   ENDIF
177   IF (plev == 3) THEN
178     WRITE(orch_ipslout,'("Fatal error from ORCHIDEE. STOP in ipslerr_p with code")')
179#ifdef CPP_PARA
180    CALL MPI_ABORT(plev)
181#endif     
182    STOP 'Fatal error from ORCHIDEE'
183   ENDIF
184!---------------------
185END SUBROUTINE ipslerr_p
186
187!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
188!!   Definition des getin -> bcast      !!
189!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
190
191!! -- Les chaines de caracteres -- !!
192 
193  SUBROUTINE getin_p_c(VarIn,VarOut)
194    IMPLICIT NONE   
195    CHARACTER(LEN=*),INTENT(IN) :: VarIn
196    CHARACTER(LEN=*),INTENT(INOUT) :: VarOut   
197
198    IF (is_root_prc) CALL getin(VarIn,VarOut)
199    CALL bcast(VarOut)
200  END SUBROUTINE getin_p_c 
201
202
203  SUBROUTINE getin_p_c1(VarIn,VarOut)
204    IMPLICIT NONE   
205    CHARACTER(LEN=*),INTENT(IN) :: VarIn
206    CHARACTER(LEN=*),INTENT(INOUT) :: VarOut(:)   
207
208    IF (is_root_prc) CALL getin(VarIn,VarOut)
209    CALL bcast(VarOut)
210  END SUBROUTINE getin_p_c1 
211
212!! -- Les entiers -- !!
213 
214  SUBROUTINE getin_p_i(VarIn,VarOut)
215    IMPLICIT NONE   
216    CHARACTER(LEN=*),INTENT(IN) :: VarIn
217    INTEGER,INTENT(INOUT) :: VarOut   
218
219    IF (is_root_prc) CALL getin(VarIn,VarOut)
220    CALL bcast(VarOut)
221  END SUBROUTINE getin_p_i
222
223  SUBROUTINE getin_p_i1(VarIn,VarOut)
224    IMPLICIT NONE   
225    CHARACTER(LEN=*),INTENT(IN) :: VarIn
226    INTEGER,INTENT(INOUT) :: VarOut(:)
227
228    IF (is_root_prc) CALL getin(VarIn,VarOut)
229    CALL bcast(VarOut)
230  END SUBROUTINE getin_p_i1
231
232  SUBROUTINE getin_p_i2(VarIn,VarOut)
233    IMPLICIT NONE   
234    CHARACTER(LEN=*),INTENT(IN) :: VarIn
235    INTEGER,INTENT(INOUT) :: VarOut(:,:)
236
237    IF (is_root_prc) CALL getin(VarIn,VarOut)
238    CALL bcast(VarOut)
239  END SUBROUTINE getin_p_i2
240
241!! -- Les flottants -- !!
242 
243  SUBROUTINE getin_p_r(VarIn,VarOut)
244    IMPLICIT NONE   
245    CHARACTER(LEN=*),INTENT(IN) :: VarIn
246    REAL,INTENT(INOUT) :: VarOut
247
248    IF (is_root_prc) CALL getin(VarIn,VarOut)
249    CALL bcast(VarOut)
250  END SUBROUTINE getin_p_r
251
252  SUBROUTINE getin_p_r1(VarIn,VarOut)
253    IMPLICIT NONE   
254    CHARACTER(LEN=*),INTENT(IN) :: VarIn
255    REAL,INTENT(INOUT) :: VarOut(:)
256
257    IF (is_root_prc) CALL getin(VarIn,VarOut)
258    CALL bcast(VarOut)
259  END SUBROUTINE getin_p_r1
260
261  SUBROUTINE getin_p_r2(VarIn,VarOut)
262    IMPLICIT NONE   
263    CHARACTER(LEN=*),INTENT(IN) :: VarIn
264    REAL,INTENT(INOUT) :: VarOut(:,:)
265
266    IF (is_root_prc) CALL getin(VarIn,VarOut)
267    CALL bcast(VarOut)
268  END SUBROUTINE getin_p_r2
269
270!! -- Les Booleens -- !!
271 
272  SUBROUTINE getin_p_l(VarIn,VarOut)
273    IMPLICIT NONE   
274    CHARACTER(LEN=*),INTENT(IN) :: VarIn
275    LOGICAL,INTENT(INOUT) :: VarOut
276
277    IF (is_root_prc) CALL getin(VarIn,VarOut)
278    CALL bcast(VarOut)
279  END SUBROUTINE getin_p_l
280
281  SUBROUTINE getin_p_l1(VarIn,VarOut)
282    IMPLICIT NONE   
283    CHARACTER(LEN=*),INTENT(IN) :: VarIn
284    LOGICAL,INTENT(INOUT) :: VarOut(:)
285
286    IF (is_root_prc) CALL getin(VarIn,VarOut)
287    CALL bcast(VarOut)
288  END SUBROUTINE getin_p_l1
289
290  SUBROUTINE getin_p_l2(VarIn,VarOut)
291    IMPLICIT NONE   
292    CHARACTER(LEN=*),INTENT(IN) :: VarIn
293    LOGICAL,INTENT(INOUT) :: VarOut(:,:)
294
295    IF (is_root_prc) CALL getin(VarIn,VarOut)
296    CALL bcast(VarOut)
297  END SUBROUTINE getin_p_l2
298!-
299!-----------------------------
300!-----------------------------
301!-----------------------------
302!-
303  SUBROUTINE restget_p_opp_r1d &
304  (fid, vname_q, iim, jjm, llm, itau, def_beha, &
305   var, MY_OPERATOR, nbindex, ijndex)
306! DO NOT USE THIS FUNCTION WITH NON GRID VARIABLE !
307    IMPLICIT NONE
308!-
309    INTEGER :: fid
310    CHARACTER(LEN=*) :: vname_q
311    INTEGER :: iim, jjm, llm, itau
312    LOGICAL def_beha
313    REAL :: var(:)
314    CHARACTER(LEN=*) :: MY_OPERATOR
315    INTEGER :: nbindex, ijndex(nbindex)
316    !-----------------------------
317    REAL, ALLOCATABLE, DIMENSION(:) :: temp_g
318
319    IF (is_root_prc) THEN
320       ALLOCATE( temp_g(iim*jjm*llm) )
321    ELSE
322       ALLOCATE( temp_g(1) )
323    ENDIF
324       
325    IF (is_root_prc) THEN
326       CALL restget &
327            (fid, vname_q, iim, jjm, llm, itau, def_beha, &
328            temp_g, MY_OPERATOR, nbindex, ijndex)
329    ENDIF
330    CALL scatter(temp_g,var)
331    DEALLOCATE(temp_g)
332  END SUBROUTINE restget_p_opp_r1d
333!-
334!===
335!-
336  SUBROUTINE restget_p_opp_r2d &
337  (fid, vname_q, iim, jjm, llm, itau, def_beha, &
338   var, MY_OPERATOR, nbindex, ijndex)
339    IMPLICIT NONE
340    !-
341    INTEGER :: fid
342    CHARACTER(LEN=*) :: vname_q
343    INTEGER :: iim, jjm, llm, itau
344    LOGICAL def_beha
345    REAL :: var(:,:)
346    CHARACTER(LEN=*) :: MY_OPERATOR
347    INTEGER :: nbindex, ijndex(nbindex)
348    !-----------------------------
349    REAL, ALLOCATABLE, DIMENSION(:,:) :: temp_g
350
351    IF (is_root_prc) THEN
352       ALLOCATE( temp_g(iim,jjm) )
353    ELSE
354      ALLOCATE( temp_g(1,1) )
355    ENDIF
356
357    IF (is_root_prc) THEN
358       CALL restget &
359            (fid, vname_q, iim, jjm, llm, itau, def_beha, &
360            temp_g, MY_OPERATOR, nbindex, ijndex)
361    ENDIF
362    CALL scatter(temp_g,var)
363    DEALLOCATE(temp_g)
364  END SUBROUTINE restget_p_opp_r2d
365!-
366!===
367!-
368  SUBROUTINE restget_p_r1d &
369  (fid,vname_q,iim,jjm,llm,itau,def_beha,var)
370! DO NOT USE THIS FUNCTION WITH NON GRID VARIABLE !
371    IMPLICIT NONE
372!-
373    INTEGER :: fid
374    CHARACTER(LEN=*) :: vname_q
375    INTEGER :: iim, jjm, llm, itau
376    LOGICAL :: def_beha
377    REAL :: var(:)
378    !-------------------------
379    REAL, ALLOCATABLE, DIMENSION(:) :: temp_g
380
381    IF (is_root_prc) THEN
382       ALLOCATE( temp_g(iim*jjm*llm) )
383    ELSE
384       ALLOCATE( temp_g(1) )
385    ENDIF
386
387    IF (is_root_prc) THEN
388       CALL restget &
389            (fid,vname_q,iim,jjm,llm,itau,def_beha,temp_g)
390    ENDIF
391    CALL scatter(temp_g,var)
392    DEALLOCATE(temp_g)
393  END SUBROUTINE restget_p_r1d
394!-
395!===
396!-
397  SUBROUTINE restget_p_r2d &
398  (fid,vname_q,iim,jjm,llm,itau,def_beha,var)
399    IMPLICIT NONE
400!-
401    INTEGER :: fid
402    CHARACTER(LEN=*) :: vname_q
403    INTEGER :: iim, jjm, llm, itau
404    LOGICAL :: def_beha
405    REAL :: var(:,:)
406    !-------------------------
407    REAL, ALLOCATABLE, DIMENSION(:,:) :: temp_g
408
409    IF (is_root_prc) THEN
410       ALLOCATE( temp_g(iim,jjm) )
411    ELSE
412       ALLOCATE( temp_g(1,1) )
413    ENDIF
414    IF (is_root_prc) THEN
415       CALL restget &
416            (fid,vname_q,iim,jjm,llm,itau,def_beha,temp_g)
417    ENDIF
418    CALL scatter(temp_g,var)
419    DEALLOCATE(temp_g)
420  END SUBROUTINE restget_p_r2d
421!-
422!===
423!-
424  SUBROUTINE restget_p_r3d &
425  (fid,vname_q,iim,jjm,llm,itau,def_beha,var)
426    IMPLICIT NONE
427!-
428    INTEGER :: fid
429    CHARACTER(LEN=*) :: vname_q
430    INTEGER :: iim, jjm, llm, itau
431    LOGICAL def_beha
432    REAL :: var(:,:,:)
433    !-------------------------
434    REAL, ALLOCATABLE, DIMENSION(:,:,:) :: temp_g
435
436    IF (is_root_prc) THEN
437       ALLOCATE( temp_g(iim,jjm,llm) )
438    ELSE
439       ALLOCATE( temp_g(1,1,1) )
440    ENDIF
441   
442    IF (is_root_prc) THEN
443       CALL restget &
444            (fid,vname_q,iim,jjm,llm,itau,def_beha,temp_g)
445    ENDIF
446    CALL scatter(temp_g,var)
447    DEALLOCATE(temp_g)
448  END SUBROUTINE restget_p_r3d
449!-
450!-----------------------------
451!-----------------------------
452!-
453  SUBROUTINE restput_p_opp_r1d &
454  (fid, vname_q, iim, jjm, llm, itau, var, MY_OPERATOR, nbindex, ijndex)
455    IMPLICIT NONE
456!-
457    INTEGER :: fid
458    CHARACTER(LEN=*) :: vname_q
459    INTEGER :: iim, jjm, llm, itau
460    REAL :: var(:)
461    CHARACTER(LEN=*) :: MY_OPERATOR
462    INTEGER :: nbindex, ijndex(nbindex)
463    !-----------------------------
464    REAL, ALLOCATABLE, DIMENSION(:) :: temp_g
465
466    IF (is_root_prc) THEN
467      ALLOCATE( temp_g(iim*jjm*llm) )
468    ELSE
469      ALLOCATE ( temp_g(1) )
470    ENDIF
471   
472    CALL gather(var,temp_g)
473    IF (is_root_prc) THEN
474       CALL restput &
475            (fid, vname_q, iim, jjm, llm, itau, temp_g, MY_OPERATOR, nbindex, ijndex)
476    ENDIF
477
478    DEALLOCATE( temp_g )
479         
480  END SUBROUTINE restput_p_opp_r1d
481!-
482!===
483!-
484  SUBROUTINE restput_p_opp_r2d &
485  (fid, vname_q, iim, jjm, llm, itau, var, MY_OPERATOR, nbindex, ijndex)
486    IMPLICIT NONE
487!-
488    INTEGER :: fid
489    CHARACTER(LEN=*) :: vname_q
490    INTEGER :: iim, jjm, llm, itau
491    REAL :: var(:,:)
492    CHARACTER(LEN=*) :: MY_OPERATOR
493    INTEGER :: nbindex, ijndex(nbindex)
494    !-----------------------------
495    REAL, ALLOCATABLE, DIMENSION(:,:) :: temp_g
496
497    IF (is_root_prc) THEN
498      ALLOCATE( temp_g(iim,jjm) )
499    ELSE
500      ALLOCATE( temp_g(1,1) )
501    ENDIF
502         
503    CALL gather(var,temp_g)
504    IF (is_root_prc) THEN
505       CALL restput &
506            (fid, vname_q, iim, jjm, llm, itau, temp_g, MY_OPERATOR, nbindex, ijndex)
507    ENDIF
508    DEALLOCATE( temp_g )
509         
510  END SUBROUTINE restput_p_opp_r2d
511!-
512!===
513!-
514  SUBROUTINE restput_p_r1d (fid,vname_q,iim,jjm,llm,itau,var)
515    IMPLICIT NONE
516!-
517    INTEGER :: fid
518    CHARACTER(LEN=*) :: vname_q
519    INTEGER :: iim, jjm, llm, itau
520    REAL :: var(:)
521    !-----------------------------
522    REAL, ALLOCATABLE, DIMENSION(:) :: temp_g
523
524    IF (is_root_prc) THEN
525      ALLOCATE( temp_g(iim*jjm*llm) )
526    ELSE
527      ALLOCATE( temp_g(1) )
528    ENDIF
529   
530    CALL gather(var,temp_g)
531    IF (is_root_prc) THEN
532       CALL restput (fid,vname_q,iim,jjm,llm,itau,temp_g)
533    ENDIF
534    DEALLOCATE( temp_g )
535         
536  END SUBROUTINE restput_p_r1d
537!-
538!===
539!-
540  SUBROUTINE restput_p_r2d (fid,vname_q,iim,jjm,llm,itau,var)
541    IMPLICIT NONE
542!-
543    INTEGER :: fid
544    CHARACTER(LEN=*) :: vname_q
545    INTEGER :: iim, jjm, llm, itau
546    REAL :: var(:,:)
547    !-------------------------
548    REAL, ALLOCATABLE, DIMENSION(:,:) :: temp_g
549
550    IF (is_root_prc) THEN
551      ALLOCATE( temp_g(iim,jjm) )
552    ELSE
553      ALLOCATE( temp_g(1,1) )
554    ENDIF
555   
556    CALL gather(var,temp_g)
557    IF (is_root_prc) THEN
558       CALL restput (fid,vname_q,iim,jjm,llm,itau,temp_g)
559    ENDIF
560    DEALLOCATE( temp_g )
561         
562  END SUBROUTINE restput_p_r2d
563!-
564!===
565!-
566  SUBROUTINE restput_p_r3d (fid,vname_q,iim,jjm,llm,itau,var)
567    IMPLICIT NONE
568!-
569    INTEGER :: fid
570    CHARACTER(LEN=*) :: vname_q
571    INTEGER :: iim, jjm, llm, itau
572    REAL :: var(:,:,:)
573    !-------------------------
574    REAL, ALLOCATABLE, DIMENSION(:,:,:) :: temp_g
575
576    IF (is_root_prc) THEN
577      ALLOCATE( temp_g(iim,jjm,llm) )
578    ELSE
579      ALLOCATE( temp_g(iim,jjm,llm) )
580    ENDIF
581   
582    CALL gather(var,temp_g)
583    IF (is_root_prc) THEN
584       CALL restput (fid,vname_q,iim,jjm,llm,itau,temp_g)
585    ENDIF
586    DEALLOCATE( temp_g )
587         
588  END SUBROUTINE restput_p_r3d
589
590
591  SUBROUTINE histwrite_r1d_p(pfileid,pvarname,pitau,pdata,nbindex,nindex)
592    IMPLICIT NONE
593!-
594    INTEGER,INTENT(IN) :: pfileid, pitau, nbindex, nindex(nbindex)
595    REAL,DIMENSION(:),INTENT(IN) :: pdata
596    CHARACTER(LEN=*),INTENT(IN) :: pvarname
597   
598    REAL,DIMENSION(nbp_mpi)    :: pdata_mpi
599   
600    CALL gather_omp(pdata,pdata_mpi)
601    IF (is_omp_root) THEN
602      CALL histwrite(pfileid,pvarname,pitau,pdata_mpi,nbp_mpi,kindex_mpi) 
603    ENDIF
604     
605  END SUBROUTINE histwrite_r1d_p
606 
607
608  SUBROUTINE histwrite_r2d_p(pfileid,pvarname,pitau,pdata,nbindex,nindex)
609    IMPLICIT NONE
610!-
611    INTEGER,INTENT(IN) :: pfileid, pitau, nbindex, nindex(nbindex)
612    REAL,DIMENSION(:,:),INTENT(IN) :: pdata
613    CHARACTER(LEN=*),INTENT(IN) :: pvarname
614
615    CALL body(size(pdata,2),nindex)
616 
617  CONTAINS
618
619    SUBROUTINE body(dim,nindex)
620    INTEGER :: dim
621    INTEGER :: nindex(nbp_omp,dim)
622   
623    INTEGER :: nindex_mpi(nbp_mpi,dim)
624    REAL    :: pdata_mpi(nbp_mpi,dim)
625   
626      CALL gather_omp(pdata,pdata_mpi)
627      CALL gather_omp(nindex,nindex_mpi)
628   
629      IF (is_omp_root) THEN
630       CALL histwrite(pfileid,pvarname,pitau,pdata_mpi,nbp_mpi*dim,reshape(nindex_mpi,(/nbp_mpi*dim/)))
631      ENDIF
632    END SUBROUTINE body
633       
634  END SUBROUTINE histwrite_r2d_p
635
636 
637  SUBROUTINE histwrite_r3d_p(pfileid,pvarname,pitau,pdata,nbindex,nindex)
638    IMPLICIT NONE
639!-
640    INTEGER,INTENT(IN) :: pfileid, pitau, nbindex, nindex(nbindex)
641    REAL,DIMENSION(:,:,:),INTENT(IN) :: pdata
642    CHARACTER(LEN=*),INTENT(IN) :: pvarname
643 
644    STOP 'histwrite_r3d_p !!!'
645   
646  END SUBROUTINE histwrite_r3d_p
647
648
649END MODULE ioipsl_para
Note: See TracBrowser for help on using the repository browser.