source: LMDZ6/trunk/libf/phylmd/oasis.F90 @ 4629

Last change on this file since 4629 was 4619, checked in by yann meurdesoif, 15 months ago

Suppress usage of preprocessing key CPP_XIOS.
Wrapper file is used to suppress XIOS symbol when xios is not linked and not used (-io ioipsl)
The CPP_XIOS key is replaced in model by "using_xios" boolean variable to switch between IOIPSL or XIOS output.

YM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.4 KB
RevLine 
[782]1!
2MODULE oasis
3!
4! This module contains subroutines for initialization, sending and receiving
5! towards the coupler OASIS3. It also contains some parameters for the coupling.
6!
7! This module should always be compiled. With the coupler OASIS3 available the cpp key
8! CPP_COUPLE should be set and the entier of this file will then be compiled.
9! In a forced mode CPP_COUPLE should not be defined and the compilation ends before
10! the CONTAINS, without compiling the subroutines.
11!
12  USE dimphy
13  USE mod_phys_lmdz_para
14  USE write_field_phy
15
16#ifdef CPP_COUPLE
[1965]17! Use of Oasis-MCT coupler
18#if defined CPP_OMCT
19  USE mod_prism
20! Use of Oasis3 coupler
21#else
[782]22  USE mod_prism_proto
23  USE mod_prism_def_partition_proto
24  USE mod_prism_get_proto
25  USE mod_prism_put_proto
26#endif
[4247]27#ifdef CPP_CPLOCNINCA
28  USE incaoasis, ONLY : inforcv
[1965]29#endif
[4247]30#endif
[782]31 
32  IMPLICIT NONE
[1279]33 
34  ! Id for fields sent to ocean
35  INTEGER, PARAMETER :: ids_tauxxu = 1
36  INTEGER, PARAMETER :: ids_tauyyu = 2
37  INTEGER, PARAMETER :: ids_tauzzu = 3
38  INTEGER, PARAMETER :: ids_tauxxv = 4
39  INTEGER, PARAMETER :: ids_tauyyv = 5
40  INTEGER, PARAMETER :: ids_tauzzv = 6
41  INTEGER, PARAMETER :: ids_windsp = 7
42  INTEGER, PARAMETER :: ids_shfice = 8
43  INTEGER, PARAMETER :: ids_shfoce = 9
44  INTEGER, PARAMETER :: ids_shftot = 10
45  INTEGER, PARAMETER :: ids_nsfice = 11
46  INTEGER, PARAMETER :: ids_nsfoce = 12
47  INTEGER, PARAMETER :: ids_nsftot = 13
48  INTEGER, PARAMETER :: ids_dflxdt = 14
49  INTEGER, PARAMETER :: ids_totrai = 15
50  INTEGER, PARAMETER :: ids_totsno = 16
51  INTEGER, PARAMETER :: ids_toteva = 17
52  INTEGER, PARAMETER :: ids_icevap = 18
53  INTEGER, PARAMETER :: ids_ocevap = 19
54  INTEGER, PARAMETER :: ids_calvin = 20
55  INTEGER, PARAMETER :: ids_liqrun = 21
56  INTEGER, PARAMETER :: ids_runcoa = 22
57  INTEGER, PARAMETER :: ids_rivflu = 23
58  INTEGER, PARAMETER :: ids_atmco2 = 24
59  INTEGER, PARAMETER :: ids_taumod = 25
[2872]60  INTEGER, PARAMETER :: ids_qraioc = 26
61  INTEGER, PARAMETER :: ids_qsnooc = 27
62  INTEGER, PARAMETER :: ids_qraiic = 28
63  INTEGER, PARAMETER :: ids_qsnoic = 29
[4370]64  INTEGER, PARAMETER :: ids_delta_sst = 30, ids_delta_sal = 31, ids_dter = 32, &
65       ids_dser = 33, ids_dt_ds = 34
[1279]66 
[4370]67  INTEGER, PARAMETER :: maxsend    = 34  ! Maximum number of fields to send
[3815]68 
[1279]69  ! Id for fields received from ocean
[3815]70
[1279]71  INTEGER, PARAMETER :: idr_sisutw = 1
72  INTEGER, PARAMETER :: idr_icecov = 2
73  INTEGER, PARAMETER :: idr_icealw = 3
74  INTEGER, PARAMETER :: idr_icetem = 4
75  INTEGER, PARAMETER :: idr_curenx = 5
76  INTEGER, PARAMETER :: idr_cureny = 6
77  INTEGER, PARAMETER :: idr_curenz = 7
78  INTEGER, PARAMETER :: idr_oceco2 = 8
[3815]79
80  INTEGER, PARAMETER :: idr_sss = 9
81  ! bulk salinity of the surface layer of the ocean, in ppt
82
83  INTEGER, PARAMETER :: maxrecv    = 9  ! Maximum number of fields to receive
[1279]84 
[4247]85#ifdef CPP_CPLOCNINCA
86  INTEGER, PARAMETER :: idr_ocedms = 1
87  INTEGER, PARAMETER :: maxrcv = 1
88#endif
[782]89
[1279]90  TYPE, PUBLIC ::   FLD_CPL            ! Type for coupling field information
91     CHARACTER(len = 8) ::   name      ! Name of the coupling field   
92     LOGICAL            ::   action    ! To be exchanged or not
93     INTEGER            ::   nid       ! Id of the field
94  END TYPE FLD_CPL
[782]95
[1279]96  TYPE(FLD_CPL), DIMENSION(maxsend), SAVE, PUBLIC :: infosend   ! Information for sending coupling fields
[2916]97!$OMP THREADPRIVATE(infosend)
[1279]98  TYPE(FLD_CPL), DIMENSION(maxrecv), SAVE, PUBLIC :: inforecv   ! Information for receiving coupling fields
[2916]99!$OMP THREADPRIVATE(inforecv)
[1279]100 
101  LOGICAL,SAVE :: cpl_current
102!$OMP THREADPRIVATE(cpl_current)
[782]103
104#ifdef CPP_COUPLE
105
106CONTAINS
107
108  SUBROUTINE inicma
109!************************************************************************************
110!**** *INICMA*  - Initialize coupled mode communication for atmosphere
111!                 and exchange some initial information with Oasis
112!
113!     Rewrite to take the PRISM/psmile library into account
114!     LF 09/2003
115!
[1067]116    USE IOIPSL
[996]117    USE surface_data, ONLY : version_ocean
[1279]118    USE carbon_cycle_mod, ONLY : carbon_cycle_cpl
[2054]119    USE wxios, ONLY : wxios_context_init
[4619]120    USE lmdz_xios 
[2311]121    USE print_control_mod, ONLY: lunout
[3465]122    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, grid_type, unstructured, regular_lonlat
123    USE geometry_mod, ONLY: ind_cell_glo                   
124    USE mod_phys_lmdz_mpi_data, ONLY: klon_mpi_para_nb
[3815]125    use config_ocean_skin_m, only: activate_ocean_skin
[1279]126
[782]127! Local variables
128!************************************************************************************
129    INTEGER                            :: comp_id
130    INTEGER                            :: ierror, il_commlocal
131    INTEGER                            :: il_part_id
[3465]132    INTEGER, ALLOCATABLE               :: ig_paral(:)
[782]133    INTEGER, DIMENSION(2)              :: il_var_nodims
134    INTEGER, DIMENSION(4)              :: il_var_actual_shape
135    INTEGER                            :: il_var_type
136    INTEGER                            :: jf
137    CHARACTER (len = 6)                :: clmodnam
138    CHARACTER (len = 20)               :: modname = 'inicma'
139    CHARACTER (len = 80)               :: abort_message
[1997]140    LOGICAL, SAVE                      :: cpl_current_omp
[4596]141    INTEGER, DIMENSION(klon_mpi)       :: ind_cell_glo_mpi
[782]142
143!*    1. Initializations
144!        ---------------
145!************************************************************************************
[1279]146    WRITE(lunout,*) ' '
147    WRITE(lunout,*) ' '
148    WRITE(lunout,*) ' ROUTINE INICMA'
149    WRITE(lunout,*) ' **************'
150    WRITE(lunout,*) ' '
151    WRITE(lunout,*) ' '
[782]152
153!
154! Define the model name
155!
[3465]156    IF (grid_type==unstructured) THEN
157        clmodnam = 'icosa'                 ! as in $NBMODEL in Cpl/Nam/namcouple.tmp
158    ELSE IF (grid_type==regular_lonlat) THEN
159        clmodnam = 'LMDZ'                  ! as in $NBMODEL in Cpl/Nam/namcouple.tmp
160    ELSE
161        abort_message='Pb : type of grid unknown'
162        CALL abort_physic(modname,abort_message,1)
163    ENDIF
[1067]164
[1279]165
[782]166!************************************************************************************
[1067]167! Define if coupling ocean currents or not
168!************************************************************************************
169!$OMP MASTER
170    cpl_current_omp = .FALSE.
171    CALL getin('cpl_current', cpl_current_omp)
172!$OMP END MASTER
173!$OMP BARRIER
174    cpl_current = cpl_current_omp
[1279]175    WRITE(lunout,*) 'Couple ocean currents, cpl_current = ',cpl_current
[1067]176
177!************************************************************************************
[4596]178! Gather global index to be used for oasis decomposition
179!************************************************************************************
180    CALL gather_omp(ind_cell_glo,ind_cell_glo_mpi)
181
182!************************************************************************************
[1279]183! Define coupling variables
184!************************************************************************************
185
186! Atmospheric variables to send
187
188!$OMP MASTER
189    infosend(:)%action = .FALSE.
190
191    infosend(ids_tauxxu)%action = .TRUE. ; infosend(ids_tauxxu)%name = 'COTAUXXU'
192    infosend(ids_tauyyu)%action = .TRUE. ; infosend(ids_tauyyu)%name = 'COTAUYYU'
193    infosend(ids_tauzzu)%action = .TRUE. ; infosend(ids_tauzzu)%name = 'COTAUZZU'
194    infosend(ids_tauxxv)%action = .TRUE. ; infosend(ids_tauxxv)%name = 'COTAUXXV'
195    infosend(ids_tauyyv)%action = .TRUE. ; infosend(ids_tauyyv)%name = 'COTAUYYV'
196    infosend(ids_tauzzv)%action = .TRUE. ; infosend(ids_tauzzv)%name = 'COTAUZZV'
197    infosend(ids_windsp)%action = .TRUE. ; infosend(ids_windsp)%name = 'COWINDSP'
198    infosend(ids_shfice)%action = .TRUE. ; infosend(ids_shfice)%name = 'COSHFICE'
199    infosend(ids_nsfice)%action = .TRUE. ; infosend(ids_nsfice)%name = 'CONSFICE'
200    infosend(ids_dflxdt)%action = .TRUE. ; infosend(ids_dflxdt)%name = 'CODFLXDT'
201    infosend(ids_calvin)%action = .TRUE. ; infosend(ids_calvin)%name = 'COCALVIN'
202   
[3815]203    if (activate_ocean_skin == 2) then
204       infosend(ids_delta_sst)%action = .TRUE.
205       infosend(ids_delta_sst)%name = 'CODELSST'
206       infosend(ids_delta_sal)%action = .TRUE.
207       infosend(ids_delta_sal)%name = 'CODELSSS'
[4370]208       infosend(ids_dter)%action = .TRUE.
209       infosend(ids_dter)%name = 'CODELTER'
210       infosend(ids_dser)%action = .TRUE.
211       infosend(ids_dser)%name = 'CODELSER'
212       infosend(ids_dt_ds)%action = .TRUE.
213       infosend(ids_dt_ds)%name = 'CODTDS'
[3815]214    end if
215           
[1279]216    IF (version_ocean=='nemo') THEN
217        infosend(ids_shftot)%action = .TRUE. ; infosend(ids_shftot)%name = 'COQSRMIX'
218        infosend(ids_nsftot)%action = .TRUE. ; infosend(ids_nsftot)%name = 'COQNSMIX'
219        infosend(ids_totrai)%action = .TRUE. ; infosend(ids_totrai)%name = 'COTOTRAI'
220        infosend(ids_totsno)%action = .TRUE. ; infosend(ids_totsno)%name = 'COTOTSNO'
221        infosend(ids_toteva)%action = .TRUE. ; infosend(ids_toteva)%name = 'COTOTEVA'
222        infosend(ids_icevap)%action = .TRUE. ; infosend(ids_icevap)%name = 'COICEVAP'
223        infosend(ids_liqrun)%action = .TRUE. ; infosend(ids_liqrun)%name = 'COLIQRUN'
224        infosend(ids_taumod)%action = .TRUE. ; infosend(ids_taumod)%name = 'COTAUMOD'
225        IF (carbon_cycle_cpl) THEN
226            infosend(ids_atmco2)%action = .TRUE. ; infosend(ids_atmco2)%name = 'COATMCO2'
227        ENDIF
[2872]228        infosend(ids_qraioc)%action = .TRUE. ; infosend(ids_qraioc)%name = 'COQRAIOC'
229        infosend(ids_qsnooc)%action = .TRUE. ; infosend(ids_qsnooc)%name = 'COQSNOOC'
230        infosend(ids_qraiic)%action = .TRUE. ; infosend(ids_qraiic)%name = 'COQRAIIC'
231        infosend(ids_qsnoic)%action = .TRUE. ; infosend(ids_qsnoic)%name = 'COQSNOIC'
[1279]232       
233    ELSE IF (version_ocean=='opa8') THEN
234        infosend(ids_shfoce)%action = .TRUE. ; infosend(ids_shfoce)%name = 'COSHFOCE'
235        infosend(ids_nsfoce)%action = .TRUE. ; infosend(ids_nsfoce)%name = 'CONSFOCE'
236        infosend(ids_icevap)%action = .TRUE. ; infosend(ids_icevap)%name = 'COTFSICE'
237        infosend(ids_ocevap)%action = .TRUE. ; infosend(ids_ocevap)%name = 'COTFSOCE'
238        infosend(ids_totrai)%action = .TRUE. ; infosend(ids_totrai)%name = 'COTOLPSU'
239        infosend(ids_totsno)%action = .TRUE. ; infosend(ids_totsno)%name = 'COTOSPSU'
240        infosend(ids_runcoa)%action = .TRUE. ; infosend(ids_runcoa)%name = 'CORUNCOA'
241        infosend(ids_rivflu)%action = .TRUE. ; infosend(ids_rivflu)%name = 'CORIVFLU'
242   ENDIF
243       
244! Oceanic variables to receive
245
246   inforecv(:)%action = .FALSE.
247
248   inforecv(idr_sisutw)%action = .TRUE. ; inforecv(idr_sisutw)%name = 'SISUTESW'
249   inforecv(idr_icecov)%action = .TRUE. ; inforecv(idr_icecov)%name = 'SIICECOV'
250   inforecv(idr_icealw)%action = .TRUE. ; inforecv(idr_icealw)%name = 'SIICEALW'
251   inforecv(idr_icetem)%action = .TRUE. ; inforecv(idr_icetem)%name = 'SIICTEMW'
[3815]252
253   if (activate_ocean_skin >= 1) then
254      inforecv(idr_sss)%action = .TRUE.
255      inforecv(idr_sss)%name = 'SISUSALW'
256   end if
[1279]257   
258   IF (cpl_current ) THEN
259       inforecv(idr_curenx)%action = .TRUE. ; inforecv(idr_curenx)%name = 'CURRENTX'
260       inforecv(idr_cureny)%action = .TRUE. ; inforecv(idr_cureny)%name = 'CURRENTY'
261       inforecv(idr_curenz)%action = .TRUE. ; inforecv(idr_curenz)%name = 'CURRENTZ'
262   ENDIF
263
264   IF (carbon_cycle_cpl ) THEN
265       inforecv(idr_oceco2)%action = .TRUE. ; inforecv(idr_oceco2)%name = 'SICO2FLX'
266   ENDIF
[4247]267#ifdef CPP_CPLOCNINCA
268       inforcv(idr_ocedms)%action = .TRUE. ; inforcv(idr_ocedms)%name = 'SIDMSFLX'
269#endif
[1279]270
271!************************************************************************************
[782]272! Here we go: psmile initialisation
273!************************************************************************************
274    IF (is_sequential) THEN
275       CALL prism_init_comp_proto (comp_id, clmodnam, ierror)
276       
277       IF (ierror .NE. PRISM_Ok) THEN
278          abort_message=' Probleme init dans prism_init_comp '
[2311]279          CALL abort_physic(modname,abort_message,1)
[782]280       ELSE
[1279]281          WRITE(lunout,*) 'inicma : init psmile ok '
[782]282       ENDIF
283    ENDIF
284
285    CALL prism_get_localcomm_proto (il_commlocal, ierror)
286!************************************************************************************
287! Domain decomposition
288!************************************************************************************
[3465]289    IF (grid_type==unstructured) THEN
[782]290
[3465]291      ALLOCATE( ig_paral(klon_mpi_para_nb(mpi_rank) + 2) )
292
293      ig_paral(1) = 4                                      ! points partition for //
294      ig_paral(2) = klon_mpi_para_nb(mpi_rank)             ! nb of local cells
295
296      DO jf=1, klon_mpi_para_nb(mpi_rank)
[4596]297        ig_paral(2+jf) = ind_cell_glo_mpi(jf)
[3465]298      ENDDO
299
300    ELSE IF (grid_type==regular_lonlat) THEN
301
302      ALLOCATE( ig_paral(3) )
303
304      ig_paral(1) = 1                            ! apple partition for //
305      ig_paral(2) = (jj_begin-1)*nbp_lon+ii_begin-1  ! offset
306      ig_paral(3) = (jj_end*nbp_lon+ii_end) - (jj_begin*nbp_lon+ii_begin) + 1
307
308      IF (mpi_rank==mpi_size-1) ig_paral(3)=ig_paral(3)+nbp_lon-1
309    ELSE
310      abort_message='Pb : type of grid unknown'
311      CALL abort_physic(modname,abort_message,1)
312    ENDIF
313
314
[1279]315    WRITE(lunout,*) mpi_rank,'ig_paral--->',ig_paral(2),ig_paral(3)
[782]316   
317    ierror=PRISM_Ok
318    CALL prism_def_partition_proto (il_part_id, ig_paral, ierror)
319
320    IF (ierror .NE. PRISM_Ok) THEN
321       abort_message=' Probleme dans prism_def_partition '
[2311]322       CALL abort_physic(modname,abort_message,1)
[782]323    ELSE
[1279]324       WRITE(lunout,*) 'inicma : decomposition domaine psmile ok '
[782]325    ENDIF
326
[3465]327    il_var_nodims(1) = 2                        ! rank of field array (1d or 2d)
328    il_var_nodims(2) = 1                        ! always 1 in current oasis version" doc oasis3mct p18
[782]329
[3465]330    il_var_actual_shape(1) = 1                  ! min of 1st dimension (always 1)
331    il_var_actual_shape(2) = nbp_lon            ! max of 1st dimension
332    il_var_actual_shape(3) = 1                  ! min of 2nd dimension (always 1)
333    il_var_actual_shape(4) = nbp_lat            ! max of 2nd dimension
[782]334   
335    il_var_type = PRISM_Real
336
337!************************************************************************************
[1279]338! Oceanic Fields to receive
339! Loop over all possible variables
[782]340!************************************************************************************
[1279]341    DO jf=1, maxrecv
342       IF (inforecv(jf)%action) THEN
343          CALL prism_def_var_proto(inforecv(jf)%nid, inforecv(jf)%name, il_part_id, &
344               il_var_nodims, PRISM_In, il_var_actual_shape, il_var_type, &
345               ierror)
346          IF (ierror .NE. PRISM_Ok) THEN
347             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
348                  inforecv(jf)%name
349             abort_message=' Problem in call to prism_def_var_proto for fields to receive'
[2311]350             CALL abort_physic(modname,abort_message,1)
[1279]351          ENDIF
[782]352       ENDIF
353    END DO
[4247]354
355! Now, if also coupling CPL with INCA, initialize here fields to be exchanged.
356#ifdef CPP_CPLOCNINCA
357    DO jf=1,maxrcv
358       IF (inforcv(jf)%action) THEN
359          CALL prism_def_var_proto(inforcv(jf)%nid, inforcv(jf)%name, il_part_id, &
360               il_var_nodims, PRISM_In, il_var_actual_shape, il_var_type, &
361               ierror)
362          IF (ierror .NE. PRISM_Ok) THEN
363             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
364                  inforcv(jf)%name
365             abort_message=' Problem in call to prism_def_var_proto for fields to receive'
366             CALL abort_physic(modname,abort_message,1)
367          ENDIF
368       ENDIF
369    END DO
370#endif
371 
[782]372!************************************************************************************
[1279]373! Atmospheric Fields to send
374! Loop over all possible variables
[782]375!************************************************************************************
[1279]376    DO jf=1,maxsend
377       IF (infosend(jf)%action) THEN
378          CALL prism_def_var_proto(infosend(jf)%nid, infosend(jf)%name, il_part_id, &
379               il_var_nodims, PRISM_Out, il_var_actual_shape, il_var_type, &
380               ierror)
381          IF (ierror .NE. PRISM_Ok) THEN
382             WRITE(lunout,*) 'inicma : Problem with prism_def_var_proto for field : ',&
383                  infosend(jf)%name
384             abort_message=' Problem in call to prism_def_var_proto for fields to send'
[2311]385             CALL abort_physic(modname,abort_message,1)
[1279]386          ENDIF
[782]387       ENDIF
388    END DO
[1279]389   
[782]390!************************************************************************************
391! End definition
392!************************************************************************************
[4619]393
394    IF (using_xios) CALL xios_oasis_enddef()
395
[782]396    CALL prism_enddef_proto(ierror)
397    IF (ierror .NE. PRISM_Ok) THEN
[1279]398       abort_message=' Problem in call to prism_endef_proto'
[2311]399       CALL abort_physic(modname,abort_message,1)
[782]400    ELSE
[1279]401       WRITE(lunout,*) 'inicma : endef psmile ok '
[782]402    ENDIF
[1279]403
[4619]404S!$OMP END MASTER
[782]405   
406  END SUBROUTINE inicma
407
408!
409!************************************************************************************
410!
411
412  SUBROUTINE fromcpl(ktime, tab_get)
413! ======================================================================
414! L. Fairhead (09/2003) adapted From L.Z.X Li: this subroutine reads the SST
415! and Sea-Ice provided by the coupler. Adaptation to psmile library
416!======================================================================
417!
[2311]418    USE print_control_mod, ONLY: lunout
[2371]419    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
[782]420! Input arguments
421!************************************************************************************
422    INTEGER, INTENT(IN)                               ::  ktime
423
424! Output arguments
425!************************************************************************************
[2346]426    REAL, DIMENSION(nbp_lon, jj_nb,maxrecv), INTENT(OUT) :: tab_get
[782]427
428! Local variables
429!************************************************************************************
430    INTEGER                       :: ierror, i
431    INTEGER                       :: istart,iend
432    CHARACTER (len = 20)          :: modname = 'fromcpl'
433    CHARACTER (len = 80)          :: abort_message
[2346]434    REAL, DIMENSION(nbp_lon*jj_nb)    :: field
[782]435
436!************************************************************************************
[1279]437    WRITE (lunout,*) ' '
438    WRITE (lunout,*) 'Fromcpl: Reading fields from CPL, ktime=',ktime
439    WRITE (lunout,*) ' '
[782]440   
441    istart=ii_begin
[2429]442    IF (is_south_pole_dyn) THEN
[2346]443       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
[782]444    ELSE
[2346]445       iend=(jj_end-jj_begin)*nbp_lon+ii_end
[782]446    ENDIF
447   
[1279]448    DO i = 1, maxrecv
[1965]449      IF (inforecv(i)%action .AND. inforecv(i)%nid .NE. -1) THEN
[1279]450          field(:) = -99999.
451          CALL prism_get_proto(inforecv(i)%nid, ktime, field(istart:iend), ierror)
[2346]452          tab_get(:,:,i) = RESHAPE(field(:),(/nbp_lon,jj_nb/))
[782]453       
[1279]454          IF (ierror .NE. PRISM_Ok .AND. ierror.NE.PRISM_Recvd .AND. &
455             ierror.NE.PRISM_FromRest &
456             .AND. ierror.NE.PRISM_Input .AND. ierror.NE.PRISM_RecvOut &
457             .AND. ierror.NE.PRISM_FromRestOut) THEN
458              WRITE (lunout,*)  'Error with receiving filed : ', inforecv(i)%name, ktime   
459              abort_message=' Problem in prism_get_proto '
[2311]460              CALL abort_physic(modname,abort_message,1)
[1279]461          ENDIF
462      ENDIF
[782]463    END DO
464   
465   
466  END SUBROUTINE fromcpl
467
468!
469!************************************************************************************
470!
471
472  SUBROUTINE intocpl(ktime, last, tab_put)
473! ======================================================================
474! L. Fairhead (09/2003) adapted From L.Z.X Li: this subroutine provides the
475! atmospheric coupling fields to the coupler with the psmile library.
476! IF last time step, writes output fields to binary files.
477! ======================================================================
478!
479!
[2311]480    USE print_control_mod, ONLY: lunout
[2371]481    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
[782]482! Input arguments
483!************************************************************************************
[1279]484    INTEGER, INTENT(IN)                              :: ktime
485    LOGICAL, INTENT(IN)                              :: last
[2346]486    REAL, DIMENSION(nbp_lon, jj_nb, maxsend), INTENT(IN) :: tab_put
[782]487
488! Local variables
489!************************************************************************************
[987]490    LOGICAL                          :: checkout
491    INTEGER                          :: istart,iend
492    INTEGER                          :: wstart,wend
493    INTEGER                          :: ierror, i
[2346]494    REAL, DIMENSION(nbp_lon*jj_nb)       :: field
[987]495    CHARACTER (len = 20),PARAMETER   :: modname = 'intocpl'
496    CHARACTER (len = 80)             :: abort_message
[782]497
498!************************************************************************************
[987]499    checkout=.FALSE.
[782]500
[1279]501    WRITE(lunout,*) ' '
502    WRITE(lunout,*) 'Intocpl: sending fields to CPL, ktime= ', ktime
503    WRITE(lunout,*) 'last = ', last
504    WRITE(lunout,*)
[782]505
506
507    istart=ii_begin
[2429]508    IF (is_south_pole_dyn) THEN
[2346]509       iend=(jj_end-jj_begin)*nbp_lon+nbp_lon
[782]510    ELSE
[2346]511       iend=(jj_end-jj_begin)*nbp_lon+ii_end
[782]512    ENDIF
513   
514    IF (checkout) THEN   
515       wstart=istart
516       wend=iend
[2429]517       IF (is_north_pole_dyn) wstart=istart+nbp_lon-1
518       IF (is_south_pole_dyn) wend=iend-nbp_lon+1
[782]519       
[1279]520       DO i = 1, maxsend
521          IF (infosend(i)%action) THEN
[2346]522             field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
[1279]523             CALL writefield_phy(infosend(i)%name,field(wstart:wend),1)
524          END IF
525       END DO
526    END IF
527
[782]528!************************************************************************************
529! PRISM_PUT
530!************************************************************************************
531
[1279]532    DO i = 1, maxsend
[1965]533      IF (infosend(i)%action .AND. infosend(i)%nid .NE. -1 ) THEN
[2346]534          field = RESHAPE(tab_put(:,:,i),(/nbp_lon*jj_nb/))
[1279]535          CALL prism_put_proto(infosend(i)%nid, ktime, field(istart:iend), ierror)
536         
537          IF (ierror .NE. PRISM_Ok .AND. ierror.NE.PRISM_Sent .AND. ierror.NE.PRISM_ToRest &
538             .AND. ierror.NE.PRISM_LocTrans .AND. ierror.NE.PRISM_Output .AND. &
539             ierror.NE.PRISM_SentOut .AND. ierror.NE.PRISM_ToRestOut) THEN
540              WRITE (lunout,*) 'Error with sending field :', infosend(i)%name, ktime   
541              abort_message=' Problem in prism_put_proto '
[2311]542              CALL abort_physic(modname,abort_message,1)
[1279]543          ENDIF
544      ENDIF
[782]545    END DO
546   
547!************************************************************************************
548! Finalize PSMILE for the case is_sequential, if parallel finalization is done
549! from Finalize_parallel in dyn3dpar/parallel.F90
550!************************************************************************************
551
552    IF (last) THEN
553       IF (is_sequential) THEN
554          CALL prism_terminate_proto(ierror)
555          IF (ierror .NE. PRISM_Ok) THEN
[1279]556             abort_message=' Problem in prism_terminate_proto '
[2311]557             CALL abort_physic(modname,abort_message,1)
[782]558          ENDIF
559       ENDIF
560    ENDIF
561   
562   
563  END SUBROUTINE intocpl
564
565#endif
566 
567END MODULE oasis
Note: See TracBrowser for help on using the repository browser.