source: LMDZ6/branches/Portage_acc/libf/phylmd/oasis.F90 @ 5004

Last change on this file since 5004 was 4743, checked in by Laurent Fairhead, 9 months ago

Merge of ACC branch with 4740 revision from trunk

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