prismdrv_init_smioc_struct.F90

Go to the documentation of this file.
00001 !------------------------------------------------------------------------
00002 ! Copyright 2006-2010, CERFACS, Toulouse, France.
00003 !-----------------------------------------------------------------------
00004 !BOP
00005 !
00006 ! !ROUTINE: PRISMDrv_Init_smioc_struct
00007 !
00008 ! !INTERFACE
00009 SUBROUTINE PRISMDrv_Init_smioc_struct(id_err)
00010 
00011 !
00012 ! !USES:
00013 !
00014   USE PRISMDrv, dummy_interface => PRISMDrv_Init_smioc_struct
00015   USE PSMILE_smioc
00016   USE PSMILE_smioc_interface
00017 !
00018   IMPLICIT NONE
00019 
00020 !
00021 ! !PARAMETERS:
00022 !
00023 
00024 !
00025 ! ! RETURN VALUE
00026 !
00027   INTEGER, INTENT (Out)               :: id_err   ! error value
00028 
00029 ! External routines (written in C)  
00030   INTEGER :: sasa_c_read_file, sasa_c_close
00031 
00032 ! !DESCRIPTION
00033 ! Subroutine "PRISMDrv_init_smioc_struct" initialize and set the driver
00034 ! smioc structures using the smioc api.
00035 !
00036 ! !REVISED HISTORY
00037 !   Date      Programmer   Description
00038 ! ----------  ----------   -----------
00039 ! 13/10/2003  S. Valcke     Creation
00040 ! 30/12/2003  D. Declat     Included in the driver
00041 ! 22/03/2010  JM Epitalon   Simultaneous access to multiple SMIOC files
00042 !
00043 ! EOP
00044 !----------------------------------------------------------------------
00045 ! $Id: prismdrv_init_smioc_struct.F90 2685 2010-10-28 14:05:10Z coquart $
00046 ! $Author: coquart $
00047 !----------------------------------------------------------------------
00048 !
00049 ! 0. Local declarations
00050 !
00051   CHARACTER(LEN=80), SAVE  :: mycvs = 
00052      '$Id'
00053 
00054 ! Number of input and output transients and standard names per transients
00055 ! the ila arrays are local arrays used to fill up the global iga arrays 
00056   INTEGER, DIMENSION(:), ALLOCATABLE   :: ila_comp_nb_stand_name
00057   INTEGER, DIMENSION(:), ALLOCATABLE   :: ila_comp_nb_transi_in
00058   INTEGER, DIMENSION(:), ALLOCATABLE   :: ila_comp_nb_transi_out
00059  
00060 ! Definition of the different arrays used in the driver to store the
00061 ! SMIOC Informations.
00062 ! The sla/ila structures are component structures used to fill up the global 
00063 ! sga/iga structures
00064 !
00065 ! Informations about the Fortran unit numbers
00066   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_driver_unitsets
00067 !
00068 ! Informations about the grids
00069   TYPE(smioc_grid), DIMENSION(:), ALLOCATABLE :: sla_driver_grids
00070 
00071 ! Informations about the transients
00072   TYPE(transient), DIMENSION(:), ALLOCATABLE, TARGET :: sla_driver_transi
00073 
00074 ! Informations about the persistents
00075   TYPE(persistent), DIMENSION(:), ALLOCATABLE :: sla_driver_persis
00076 
00077 ! Loop indices
00078   INTEGER :: ib_c, ib_nt, ib_a, ib_g, ib_ntt, ib_ntt2, ib_nin, ib, ib_nout
00079 
00080 ! Count integers
00081   INTEGER :: il_nu, il_ng, il_ntr, il_npe, ib_p, il_combi, il_source
00082   INTEGER :: il_npartinid, il_npartoutid, il_index1, il_index2
00083   INTEGER :: il_ntr_xml
00084 
00085 ! Logical
00086   LOGICAL :: ll_combi, ll_source
00087 
00088 ! arrays used for the smioc information exchanges
00089   INTEGER :: il_smioc_send_size_i, il_smioc_send_size_c, il_smioc_send_size_d
00090   INTEGER :: il_index_i, il_index_c, il_index_d
00091 
00092   INTEGER :: il_nb_int_i_fix, il_nb_int_i_in, il_nb_int_i_out
00093   INTEGER :: il_nb_int_d_fix, il_nb_int_d_in, il_nb_int_d_out
00094   INTEGER :: il_nb_int_c_fix, il_nb_int_c_in, il_nb_int_c_out
00095 
00096   CHARACTER(LEN=max_name) :: cla_file_name
00097 
00098   CHARACTER(LEN=max_name), DIMENSION(:), ALLOCATABLE :: cla_smioc_send
00099   INTEGER, DIMENSION(:), ALLOCATABLE                 :: ila_smioc_send
00100   INTEGER, DIMENSION(ig_nb_tot_pes)                  :: ila_tgt_proc
00101   DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE        :: dla_smioc_send
00102   REAL, DIMENSION(:), ALLOCATABLE                    :: rla_smioc_send
00103 
00104   INTEGER :: il_index, ib_bis, ib_ter, il_nb_comp_pes
00105   INTEGER :: il_length
00106 ! Search of used_defined interpolations ( first pass / second pass in XML )
00107   LOGICAL :: ll_userdef_details
00108 
00109 !     ... for error handling
00110   INTEGER, PARAMETER  :: nerrp = 2
00111   INTEGER             :: ierrp (nerrp)
00112 !
00113 ! arrays used to transfer the infos about the post id and info attributions
00114 !
00115   INTEGER, DIMENSION(7) :: ila_dim_size
00116   INTEGER               :: il_orig_index, il_dest_index, il_loc_index 
00117   INTEGER               :: il_trans_orig_index, il_trans_dest_index
00118   INTEGER               :: il_cpl_rst_file_index, il_trans_interp_index
00119 
00120   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_orig_comp_id
00121   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_dest_comp_id
00122   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_combi_loc
00123   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_trans_orig_id
00124   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_trans_dest_id
00125 
00126   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_cpl_rst_file
00127   DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: dla_cpl_rst_file
00128   CHARACTER(len=max_name), DIMENSION(:,:), ALLOCATABLE :: cla_cpl_rst_file
00129 
00130   INTEGER, DIMENSION(:,:), ALLOCATABLE :: ila_trans_interp
00131   DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE :: dla_trans_interp
00132   CHARACTER(len=max_name), DIMENSION(:,:), ALLOCATABLE :: cla_trans_interp
00133 !
00134 !----------------------------------------------------------------------
00135 !----------------------------------------------------------------------
00136 !
00137 !
00138 #ifdef VERBOSE
00139   PRINT *, '| | Enter PRISMDrv_init_smioc_struct'
00140   call psmile_flushstd
00141 #endif
00142 !
00143    nullify (sga_smioc_comp)
00144 !
00145 !-----------------------------------------------------------------------
00146 !
00147 ! 1. Get the number of grids, transient variables and persistent variables
00148 !
00149 #ifdef VERBOSE
00150   PRINT *, '| | |  '
00151   PRINT *, '| | | Get the dimensionning numbers : first pass for transients'
00152   PRINT *, '| | | Count the number of user-defined interpolations, if any'
00153   call psmile_flushstd
00154 #endif
00155 ! 1.1. Initialize the total numbers
00156   ig_nb_tot_unitsets   = 0
00157   ig_nb_tot_grids      = 0
00158   ig_nb_tot_xml_grids  = 0
00159   ig_nb_tot_transi     = 0
00160   ig_nb_tot_xml_transi = 0
00161   ig_nb_tot_persis     = 0
00162 
00163 ! 1.2. Initialize the XML doc id array per component
00164   ALLOCATE( iga_comp_id_doc_XML(ig_nb_tot_comps), stat=id_err )
00165   IF (id_err > 0) THEN
00166       ierrp (1) = id_err
00167       ierrp (2) = ig_nb_tot_comps
00168       id_err = 13
00169 
00170       call psmile_error_common ( id_err, 'iga_comp_id_doc_XML', &
00171          ierrp, 2, __FILE__, __LINE__ )
00172       RETURN
00173   ENDIF
00174 
00175 ! 1.3. Initialize the count arrays for the numbers per component
00176 
00177 ! Grids : total number of grids (XML + Userdef for UD transients)
00178   ALLOCATE( iga_comp_nb_grids(ig_nb_tot_comps), stat=id_err )
00179   IF (id_err > 0) THEN
00180       ierrp (1) = id_err
00181       ierrp (2) = ig_nb_tot_comps
00182       id_err = 13
00183 
00184       call psmile_error_common ( id_err, 'iga_comp_nb_grids', &
00185          ierrp, 2, __FILE__, __LINE__ )
00186       RETURN
00187   ENDIF
00188 ! Grids : Keep values of first pass (XML only) for init during second pass
00189   ALLOCATE( iga_xml_comp_nb_grids(ig_nb_tot_comps), stat=id_err )
00190   IF (id_err > 0) THEN
00191       ierrp (1) = id_err
00192       ierrp (2) = ig_nb_tot_comps
00193       id_err = 13
00194 
00195       call psmile_error_common ( id_err, 'iga_xml_comp_nb_grids', &
00196          ierrp, 2, __FILE__, __LINE__ )
00197       RETURN
00198   ENDIF
00199 
00200 ! Transients : Used during first and second pass 
00201   ALLOCATE( iga_comp_nb_transi(ig_nb_tot_comps), stat=id_err )
00202   IF (id_err > 0) THEN
00203       ierrp (1) = id_err
00204       ierrp (2) = ig_nb_tot_comps
00205       id_err = 13
00206 
00207       call psmile_error_common ( id_err, 'iga_comp_nb_transi', &
00208          ierrp, 2, __FILE__, __LINE__ )
00209       RETURN
00210   ENDIF
00211 ! Transients : Keep values of first pass for copy during second pass
00212   ALLOCATE( iga_xml_comp_nb_transi(ig_nb_tot_comps), stat=id_err )
00213   IF (id_err > 0) THEN
00214       ierrp (1) = id_err
00215       ierrp (2) = ig_nb_tot_comps
00216       id_err = 13
00217 
00218       call psmile_error_common ( id_err, 'iga_xml_comp_nb_transi', &
00219          ierrp, 2, __FILE__, __LINE__ )
00220       RETURN
00221   ENDIF
00222 
00223 ! transients "user-defined-interpolation" per component
00224   ALLOCATE( iga_comp_nb_udef(ig_nb_tot_comps), stat=id_err )
00225   IF (id_err > 0) THEN
00226       ierrp (1) = id_err
00227       ierrp (2) = ig_nb_tot_comps
00228       id_err = 13
00229 
00230       call psmile_error_common ( id_err, 'iga_comp_nb_udef', &
00231          ierrp, 2, __FILE__, __LINE__ )
00232       RETURN
00233   ENDIF
00234 
00235 ! Persistents
00236   ALLOCATE( iga_comp_nb_persis(ig_nb_tot_comps), stat=id_err )
00237   IF (id_err > 0) THEN
00238       ierrp (1) = id_err
00239       ierrp (2) = ig_nb_tot_comps
00240       id_err = 13
00241 
00242       call psmile_error_common ( id_err, 'iga_comp_nb_persis', &
00243          ierrp, 2, __FILE__, __LINE__ )
00244       RETURN
00245   ENDIF
00246 
00247 ! Fortran Units sets
00248   ALLOCATE( iga_comp_nb_unitsets(ig_nb_tot_comps), stat=id_err )
00249   IF (id_err > 0) THEN
00250       ierrp (1) = id_err
00251       ierrp (2) = ig_nb_tot_comps
00252       id_err = 13
00253 
00254       call psmile_error_common ( id_err, 'iga_comp_nb_unitsets', &
00255          ierrp, 2, __FILE__, __LINE__ )
00256       RETURN
00257   ENDIF
00258 
00259 ! Structures for infos on "user_defined_interpolation" transients
00260   ALLOCATE( sga_comp_udef_idx(ig_nb_tot_comps), stat=id_err )
00261   IF (id_err > 0) THEN
00262       ierrp (1) = id_err
00263       ierrp (2) = ig_nb_tot_comps
00264       id_err = 13
00265 
00266       call psmile_error_common ( id_err, 'sga_comp_udef_idx', &
00267          ierrp, 2, __FILE__, __LINE__ )
00268       RETURN
00269   ENDIF
00270 !
00271 ! 1.4. For each comp (ie SMIOC) get the number of Fortran unit sets
00272 !      the number of grids, transients and
00273 !      persistents and compute the total numbers
00274 !
00275 !      * * *  First Pass : read XML files * * *
00276 !
00277 !      User_defined interpolations must be first detected  :
00278 !      For each transient, and for each origin input or for each output using 
00279 !      this interpolation a new "gridless" function must be created.
00280 !
00281 ! Initialize numbers of "udef" transients
00282   iga_comp_nb_udef(:) = 0 
00283 ! Initialize transient and grids counters
00284   iga_xml_comp_nb_transi(:) = 0 
00285   iga_xml_comp_nb_grids(:) = 0
00286 
00287 ! Open ALL SMIOC files and store the document handles into memory
00288   DO ib_c = 1, ig_nb_tot_comps
00289     call prismdrv_get_smioc_file_name(ib_c, cla_file_name, il_length, id_err)
00290 #ifdef VERBOSE
00291     PRINT *, '| | | Get the cla_file_name ', TRIM(cla_file_name)
00292     call psmile_flushstd
00293 #endif
00294 
00295     iga_comp_id_doc_XML(ib_c) = sasa_c_read_file  (cla_file_name, il_length);
00296   END DO
00297 
00298 ! Count transients, origins and outputs involving a User_defined interpolation
00299 ! This is the "first pass" for extracting informations from the XML SMIOC files
00300 ! Compute the total numbers including "gridless" transients 
00301 ! Global structure is kept for copy during second pass (XML files are explored only once)
00302 
00303   call prismdrv_get_udef_transients ( id_err )
00304 !
00305 !
00306 !     * * *  Second Pass : create udef transients if necessary and associated grids  * * *
00307 !            From now on we are in the "second pass" in XML routines
00308 !
00309   DO ib_c = 1, ig_nb_tot_comps
00310 !
00311 !  Set flag  for second pass : get total numbers (XML + User_defined)
00312     ll_userdef_details = .true.
00313     call get_smioc_numbers ( iga_comp_id_doc_XML(ib_c),  &
00314                              iga_comp_nb_unitsets(ib_c), &
00315                              iga_comp_nb_grids(ib_c),    &
00316                              iga_comp_nb_transi(ib_c),   &
00317                              iga_comp_nb_persis(ib_c),   &
00318                              ib_c,                       &
00319                              ll_userdef_details,         &
00320                              id_err )
00321     IF (id_err .ne. 0) THEN
00322        PRINT *, '| | |WARNING: Pb in get_smioc_numbers'
00323     ENDIF
00324 #ifdef VERBOSE
00325        PRINT *, '| | |  Component index: ', ib_c,' flag: ',ll_userdef_details
00326        PRINT *, '| | |  Nb of Fortran unit sets ',  iga_comp_nb_unitsets(ib_c)
00327        PRINT *, '| | |  Nb of grids      (+u_gl)',  iga_comp_nb_grids(ib_c)
00328        PRINT *, '| | |  Nb of transients (+u_gl)',  iga_comp_nb_transi(ib_c)  
00329        PRINT *, '| | |  Nb of persistents ',        iga_comp_nb_persis(ib_c)
00330        PRINT *, '| | |  * * *  Second pass for this Component  * * * '
00331        PRINT *, '| | |   '
00332 #endif
00333 
00334     ig_nb_tot_unitsets = ig_nb_tot_unitsets + iga_comp_nb_unitsets(ib_c)  
00335 ! Here iga_comp_nb_grids(ib_c) contains the number of xml + userdef grids
00336     ig_nb_tot_grids = ig_nb_tot_grids + iga_comp_nb_grids(ib_c)
00337 ! Here iga_comp_nb_transi(ib_c) contains the number of xml + userdef transients
00338     ig_nb_tot_transi = ig_nb_tot_transi + iga_comp_nb_transi(ib_c)
00339     ig_nb_tot_persis = ig_nb_tot_persis + iga_comp_nb_persis(ib_c)
00340 
00341 ! 1.5. Send this information to the different components
00342     ALLOCATE(ila_smioc_send(4), stat=id_err)
00343     IF (id_err > 0) THEN
00344         ierrp (1) = id_err
00345         ierrp (2) = 4
00346         id_err = 13
00347 
00348         call psmile_error_common ( id_err, 'ila_smioc_send', &
00349            ierrp, 2, __FILE__, __LINE__ )
00350         RETURN
00351     ENDIF
00352 
00353     ila_smioc_send(1) = iga_comp_nb_unitsets(ib_c)
00354     ila_smioc_send(2) = iga_comp_nb_grids(ib_c)
00355     ila_smioc_send(3) = iga_comp_nb_transi(ib_c)
00356     ila_smioc_send(4) = iga_comp_nb_persis(ib_c)
00357 
00358     ila_tgt_proc(:) = -1
00359     il_nb_comp_pes = 0
00360 !   for all processes except driver processes
00361     DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
00362       IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
00363         DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
00364            IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
00365               il_nb_comp_pes = il_nb_comp_pes + 1
00366               ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
00367            END IF
00368         END DO
00369       END IF
00370     END DO
00371 
00372     IF (il_nb_comp_pes .eq. 0) THEN
00373         call prismdrv_get_smioc_file_name(ib_c, cla_file_name, &
00374            il_length, id_err)
00375         PRINT *, '| | | The smioc information for file ', TRIM(cla_file_name),&
00376            ' has not been sent'
00377       ierrp(1) = il_nb_comp_pes
00378       ierrp(2) = Drv_Procs(ib)%comps_per_rank
00379       call psmile_error_common ( id_err, 'prismdrv_init_smioc_struct', &
00380          ierrp, 2, __FILE__, __LINE__ )
00381     END IF
00382 
00383     DO ib = 1, il_nb_comp_pes
00384 
00385       CALL MPI_Send (ila_smioc_send, 4, MPI_Integer, &
00386          ila_tgt_proc(ib), 1, comm_drv_trans, id_err)
00387 #ifdef VERBOSE
00388       PRINT *, '| | | The transfer of smioc information from file ', &
00389          TRIM(cla_file_name), ' to process rank ', ila_tgt_proc(ib), ' begins.'
00390       PRINT *, '| | | '
00391 #endif
00392     END DO
00393 
00394     DEALLOCATE(ila_smioc_send, stat=id_err)
00395     IF (id_err > 0) THEN
00396         ierrp (1) = id_err
00397         id_err = 14
00398 
00399         call psmile_error_common ( id_err, 'ila_smioc_send', &
00400            ierrp, 1, __FILE__, __LINE__ )
00401         RETURN
00402     ENDIF
00403 
00404   END DO    !  ib_c    loop on components : 1 to ig_nb_tot_comps
00405 #ifdef DEBUG
00406    PRINT *, '| | |Nb of unitsets total    : ', ig_nb_tot_unitsets
00407    PRINT *, '| | |Nb of grids total       : ', ig_nb_tot_grids
00408    PRINT *, '| | |Nb of transients total  : ', ig_nb_tot_transi
00409    PRINT *, '| | |Nb of persistents total : ', ig_nb_tot_persis
00410 #endif
00411 
00412   Number_of_Grids_drv = ig_nb_tot_grids
00413 
00414 #ifdef DEBUG
00415   PRINT *, '| | |   '
00416   PRINT *, '| | |  Got the dimensionning numbers - End of Second Pass '
00417   call psmile_flushstd
00418 #endif
00419 ! 1.5. Allocate the global structures 
00420   IF ( .not. ASSOCIATED(sga_smioc_comp) ) &
00421   ALLOCATE(sga_smioc_comp(1), stat=id_err )
00422   IF (id_err > 0) THEN
00423       ierrp (1) = id_err
00424       ierrp (2) = 1
00425       id_err = 13
00426       call psmile_error_common ( id_err, 'sga_smioc_comp', &
00427          ierrp, 2, __FILE__, __LINE__ )
00428       RETURN
00429   ENDIF
00430   NULLIFY(sga_smioc_comp(1)%iga_smioc_unitsets)
00431   NULLIFY(sga_smioc_comp(1)%sga_smioc_grids)
00432   NULLIFY(sga_smioc_comp(1)%sga_smioc_transi)
00433   NULLIFY(sga_smioc_comp(1)%sga_smioc_persis)
00434 !
00435   iga_smioc_unitsets => sga_smioc_comp(1)%iga_smioc_unitsets
00436   sga_smioc_grids => sga_smioc_comp(1)%sga_smioc_grids
00437   sga_smioc_transi => sga_smioc_comp(1)%sga_smioc_transi
00438   sga_smioc_persis => sga_smioc_comp(1)%sga_smioc_persis
00439 !
00440   ALLOCATE ( iga_smioc_unitsets (ig_nb_tot_unitsets, 3), stat=id_err )
00441   IF (id_err > 0) THEN
00442       ierrp (1) = id_err
00443       ierrp (2) = ig_nb_tot_unitsets
00444       id_err = 13
00445 
00446       call psmile_error_common ( id_err, 'iga_smioc_unitsets', &
00447          ierrp, 2, __FILE__, __LINE__ )
00448       RETURN
00449   ENDIF
00450 
00451   ALLOCATE ( sga_smioc_grids (ig_nb_tot_grids), stat=id_err )
00452   IF (id_err > 0) THEN
00453       ierrp (1) = id_err
00454       ierrp (2) = ig_nb_tot_grids
00455       id_err = 13
00456 
00457       call psmile_error_common ( id_err, 'sga_smioc_grids', &
00458          ierrp, 2, __FILE__, __LINE__ )
00459       RETURN
00460   ENDIF
00461 
00462   ALLOCATE ( sga_smioc_transi (ig_nb_tot_transi), stat=id_err )
00463   IF (id_err > 0) THEN
00464       ierrp (1) = id_err
00465       ierrp (2) = ig_nb_tot_transi
00466       id_err = 13
00467 
00468       call psmile_error_common ( id_err, 'sga_smioc_transi', &
00469          ierrp, 2, __FILE__, __LINE__ )
00470       RETURN
00471   ENDIF
00472 
00473   ALLOCATE ( sga_smioc_persis (ig_nb_tot_persis), stat=id_err )
00474   IF (id_err > 0) THEN
00475       ierrp (1) = id_err
00476       ierrp (2) = ig_nb_tot_persis
00477       id_err = 13
00478 
00479       call psmile_error_common ( id_err, 'sga_smioc_persis', &
00480          ierrp, 2, __FILE__, __LINE__ )
00481       RETURN
00482   ENDIF
00483 
00484 #ifdef VERBOSE
00485   PRINT *, '| | |  '
00486   PRINT *, '| | | Global structures allocated'
00487   call psmile_flushstd
00488 #endif
00489 !
00490 !-----------------------------------------------------------------------
00491 !
00492 ! 2. Get the Fortran unit sets component per component
00493 !
00494 #ifdef VERBOSE
00495   PRINT *, '| | |  '
00496   PRINT *, '| | | Get the Fortran unit sets component per component'
00497 #endif
00498   il_nu = 0
00499 
00500   DO ib_c = 1, ig_nb_tot_comps
00501 
00502     IF (iga_comp_nb_unitsets(ib_c) .gt. 0) THEN
00503 
00504 ! 2.1. allocate the local structure
00505         ALLOCATE ( ila_driver_unitsets(iga_comp_nb_unitsets(ib_c),3), &
00506            stat=id_err )
00507         IF (id_err > 0) THEN
00508             ierrp (1) = id_err
00509             ierrp (2) = iga_comp_nb_unitsets(ib_c)*3
00510             id_err = 13
00511 
00512             call psmile_error_common ( id_err, 'ila_driver_unitsets', &
00513                ierrp, 2, __FILE__, __LINE__ )
00514             RETURN
00515         ENDIF
00516 
00517 ! 2.2. get the Fortran unit sets information for the component
00518         CALL get_unitsets_details ( iga_comp_id_doc_XML(ib_c),   &
00519                                     iga_comp_nb_unitsets(ib_c),  &
00520                                     ila_driver_unitsets ,        &
00521                                     id_err )
00522         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_unitsets_details'
00523 
00524 ! 2.3. Fill the global structure
00525         iga_smioc_unitsets (il_nu+1:il_nu+iga_comp_nb_unitsets(ib_c),:) = &
00526            ila_driver_unitsets (:,:)
00527 
00528         il_nu = il_nu + iga_comp_nb_unitsets(ib_c)
00529 
00530 ! 2.4. send the structure to the component
00531         ALLOCATE(ila_smioc_send(iga_comp_nb_unitsets(ib_c)*3), stat=id_err)
00532         IF (id_err > 0) THEN
00533             ierrp (1) = id_err
00534             ierrp (2) = iga_comp_nb_unitsets(ib_c)*3
00535             id_err = 13
00536 
00537             call psmile_error_common ( id_err, 'ila_smioc_send', &
00538                ierrp, 2, __FILE__, __LINE__ )
00539             RETURN
00540         ENDIF
00541 
00542         il_index = 1
00543         DO ib= 1, iga_comp_nb_unitsets(ib_c)
00544 
00545           ila_smioc_send(il_index)   = ila_driver_unitsets(ib,1)
00546           ila_smioc_send(il_index+1) = ila_driver_unitsets(ib,2)
00547           ila_smioc_send(il_index+2) = ila_driver_unitsets(ib,3)
00548 
00549           il_index = il_index + 3
00550 
00551         END DO
00552 
00553         ila_tgt_proc(:) = -1    
00554         il_nb_comp_pes = 0
00555 !       for all processes except driver processes
00556         DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
00557           IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
00558             DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
00559                IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
00560                   il_nb_comp_pes = il_nb_comp_pes + 1
00561                   ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
00562                END IF
00563             END DO
00564           END IF
00565         END DO
00566 
00567         DO ib = 1, il_nb_comp_pes
00568 
00569           CALL MPI_Send (ila_smioc_send, iga_comp_nb_unitsets(ib_c)*3, &
00570              MPI_Integer, ila_tgt_proc(ib), 2, comm_drv_trans, id_err)
00571 
00572         END DO
00573 
00574         DEALLOCATE(ila_smioc_send, stat=id_err)
00575         IF (id_err > 0) THEN
00576             ierrp (1) = id_err
00577             id_err = 14
00578 
00579             call psmile_error_common ( id_err, 'ila_smioc_send', &
00580                ierrp, 1, __FILE__, __LINE__ )
00581             RETURN
00582         ENDIF
00583 
00584 ! 2.5 deallocate the local structure
00585         DEALLOCATE ( ila_driver_unitsets, stat=id_err)
00586         IF (id_err > 0) THEN
00587             ierrp (1) = id_err
00588             id_err = 14
00589 
00590             call psmile_error_common ( id_err, 'ila_driver_unitsets', &
00591                ierrp, 1, __FILE__, __LINE__ )
00592             RETURN
00593         ENDIF
00594 
00595     END IF
00596 
00597   END DO
00598 #ifdef VERBOSE
00599   PRINT *, '| | |  '
00600   PRINT *, '| | |  Got the Fortran unit sets component per component'
00601   call psmile_flushstd
00602 #endif
00603 !
00604 !-----------------------------------------------------------------------
00605 !
00606 ! 3. Get the grids details component per component
00607 !
00608 #ifdef VERBOSE
00609   PRINT *, '| | |  '
00610   PRINT *, '| | | Get the grids details component per component'
00611   call psmile_flushstd
00612 #endif
00613 ! 3.0 Initialize global structure for grids
00614   CALL init_grids (ig_nb_tot_grids, sga_smioc_grids, id_err )
00615   IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in init_grids'
00616 
00617   il_ng = 0
00618   DO ib_c = 1, ig_nb_tot_comps
00619   
00620     IF (iga_comp_nb_grids(ib_c) .gt. 0) THEN
00621 
00622 ! 3.1. allocate the local structure
00623         ALLOCATE ( sla_driver_grids(iga_comp_nb_grids(ib_c)) )
00624         IF (id_err > 0) THEN
00625             ierrp (1) = id_err
00626             ierrp (2) = iga_comp_nb_grids(ib_c)
00627             id_err = 13
00628 
00629             call psmile_error_common ( id_err, 'sla_driver_grids', &
00630                ierrp, 2, __FILE__, __LINE__ )
00631             RETURN
00632         ENDIF
00633 
00634 ! 3.2. initialize and get the grid informations
00635         CALL init_grids (iga_comp_nb_grids(ib_c), sla_driver_grids, id_err )
00636         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in init_grids'
00637 
00638         CALL get_grids_details ( iga_comp_id_doc_XML(ib_c),     &
00639                                  iga_xml_comp_nb_grids(ib_c),   &
00640                                  sla_driver_grids,              &
00641                                  id_err )
00642         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_grids_details'
00643         
00644         CALL prismdrv_get_all_grids ( iga_comp_nb_grids(ib_c),     &
00645                                       iga_xml_comp_nb_grids(ib_c), &
00646                                       sla_driver_grids(:),         &
00647                                       ib_c,                        &
00648                                       id_err )
00649         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_all_grids'
00650 
00651 ! 3.3. set the comp_id and global_grid_id in the grids structure
00652         sla_driver_grids(:)%ig_comp_id = ib_c
00653         DO ib = 1, iga_comp_nb_grids(ib_c)
00654           sla_driver_grids(ib)%ig_grid_id = il_ng+ib
00655         ENDDO
00656 
00657 ! 3.4. Fill the global structure
00658         sga_smioc_grids (il_ng+1:il_ng+iga_comp_nb_grids(ib_c)) = &
00659            sla_driver_grids
00660 
00661         il_ng = il_ng + iga_comp_nb_grids(ib_c)
00662 
00663 ! 3.5. send the structure to the component
00664         ALLOCATE(ila_smioc_send(5*iga_comp_nb_grids(ib_c)), stat=id_err)
00665         IF (id_err > 0) THEN
00666             ierrp (1) = id_err
00667             ierrp (2) = 3*iga_comp_nb_grids(ib_c)
00668             id_err = 13
00669 
00670             call psmile_error_common ( id_err, 'ila_smioc_send', &
00671                ierrp, 2, __FILE__, __LINE__ )
00672             RETURN
00673         ENDIF
00674         ALLOCATE(cla_smioc_send(iga_comp_nb_grids(ib_c)), stat=id_err)
00675         IF (id_err > 0) THEN
00676             ierrp (1) = id_err
00677             ierrp (2) = iga_comp_nb_grids(ib_c)
00678             id_err = 13
00679 
00680             call psmile_error_common ( id_err, 'cla_smioc_send', &
00681                ierrp, 2, __FILE__, __LINE__ )
00682             RETURN
00683         ENDIF
00684         DO ib = 1, iga_comp_nb_grids(ib_c)
00685 
00686           ila_smioc_send(1 + (ib-1)*5) = sla_driver_grids(ib)%ig_grid_id 
00687           ila_smioc_send(2 + (ib-1)*5) = sla_driver_grids(ib)%ig_comp_id 
00688           DO ib_bis = 1, 3
00689             ila_smioc_send(2 + ib_bis + (ib-1)*5) = &
00690                sla_driver_grids(ib)%iga_periodic(ib_bis)
00691           END DO
00692 
00693           cla_smioc_send(ib) = &
00694              sla_driver_grids(ib)%cg_grid_name
00695 
00696         END DO
00697         
00698         ila_tgt_proc(:) = -1    
00699         il_nb_comp_pes = 0
00700 !       for all processes except driver processes
00701         DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
00702           IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
00703             DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
00704               IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
00705                  il_nb_comp_pes = il_nb_comp_pes + 1
00706                  ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
00707               END IF
00708             END DO
00709           END IF
00710         END DO
00711 
00712         DO ib = 1, il_nb_comp_pes
00713           
00714           CALL MPI_Send (ila_smioc_send, 3*iga_comp_nb_grids(ib_c), &
00715              MPI_Integer, ila_tgt_proc(ib), 3, comm_drv_trans, id_err)
00716           
00717           CALL MPI_Send (cla_smioc_send, max_name*iga_comp_nb_grids(ib_c), &
00718              MPI_Character, ila_tgt_proc(ib), 4, comm_drv_trans, id_err)
00719           
00720         END DO
00721 
00722         DEALLOCATE(ila_smioc_send, stat=id_err)
00723         IF (id_err > 0) THEN
00724             ierrp (1) = id_err
00725             id_err = 14
00726 
00727             call psmile_error_common ( id_err, 'ila_smioc_send', &
00728                ierrp, 1, __FILE__, __LINE__ )
00729             RETURN
00730         ENDIF
00731 
00732         DEALLOCATE(cla_smioc_send, stat=id_err)
00733         IF (id_err > 0) THEN
00734             ierrp (1) = id_err
00735             id_err = 14
00736 
00737             call psmile_error_common ( id_err, 'cla_smioc_send', &
00738                ierrp, 1, __FILE__, __LINE__ )
00739             RETURN
00740         ENDIF
00741 
00742 ! 3.6 deallocate the local structure
00743         DEALLOCATE ( sla_driver_grids, stat=id_err)
00744         IF (id_err > 0) THEN
00745             ierrp (1) = id_err
00746             id_err = 14
00747 
00748             call psmile_error_common ( id_err, 'sla_driver_grids', &
00749                ierrp, 1, __FILE__, __LINE__ )
00750             RETURN
00751         ENDIF
00752 
00753     END IF
00754 
00755   END DO
00756 #ifdef VERBOSE
00757   PRINT *, '| | |  '
00758   PRINT *, '| | |  Got the grids details component per component'
00759   call psmile_flushstd
00760 #endif
00761 !
00762 !-----------------------------------------------------------------------
00763 !
00764 ! 4. Get the number of times the transient variables are sent and
00765 !    the number of time they are received to allocate the global structure
00766 !
00767 #ifdef VERBOSE
00768   PRINT *, '| | |  '
00769   PRINT *, '| | | Get the transient numbers '
00770   call psmile_flushstd
00771 #endif
00772 ! 4.1. Allocate the total count arrays 
00773 !      for numbers of standard names, inputs and outputs
00774   ALLOCATE (iga_comp_nb_stand_name(ig_nb_tot_transi), stat=id_err)
00775   IF (id_err > 0) THEN
00776       ierrp (1) = id_err
00777       ierrp (2) = ig_nb_tot_transi
00778       id_err = 13
00779 
00780       call psmile_error_common ( id_err, 'iga_comp_nb_stand_name', &
00781          ierrp, 2, __FILE__, __LINE__ )
00782       RETURN
00783   ENDIF
00784   ALLOCATE (iga_comp_nb_transi_in(ig_nb_tot_transi), stat=id_err)
00785   IF (id_err > 0) THEN
00786       ierrp (1) = id_err
00787       ierrp (2) = ig_nb_tot_transi
00788       id_err = 13
00789 
00790       call psmile_error_common ( id_err, 'iga_comp_nb_transi_in', &
00791          ierrp, 2, __FILE__, __LINE__ )
00792       RETURN
00793   ENDIF
00794   ALLOCATE (iga_comp_nb_transi_out(ig_nb_tot_transi), stat=id_err)
00795   IF (id_err > 0) THEN
00796       ierrp (1) = id_err
00797       ierrp (2) = ig_nb_tot_transi
00798       id_err = 13
00799 
00800       call psmile_error_common ( id_err, 'Nb tot transi', &
00801          ierrp, 2, __FILE__, __LINE__ )
00802       RETURN
00803   ENDIF
00804 
00805   il_ntr = 0
00806 
00807   ! 4.3. For each comp
00808   DO ib_c = 1, ig_nb_tot_comps
00809 
00810     IF (iga_comp_nb_transi(ib_c) .gt. 0) THEN
00811 
00812 ! 4.3.1. Allocate the local count arrays
00813     ALLOCATE (ila_comp_nb_stand_name(iga_comp_nb_transi(ib_c)), stat=id_err) 
00814     IF (id_err > 0) THEN
00815         ierrp (1) = id_err
00816         ierrp (2) = iga_comp_nb_transi(ib_c)
00817         id_err = 13
00818 
00819         call psmile_error_common ( id_err, 'ila_comp_nb_stand_name', &
00820            ierrp, 2, __FILE__, __LINE__ )
00821         RETURN
00822     ENDIF
00823     ALLOCATE (ila_comp_nb_transi_in(iga_comp_nb_transi(ib_c)), stat=id_err) 
00824     IF (id_err > 0) THEN
00825         ierrp (1) = id_err
00826         ierrp (2) = iga_comp_nb_transi(ib_c)
00827         id_err = 13
00828 
00829         call psmile_error_common ( id_err, 'ila_comp_nb_transi_in', &
00830            ierrp, 2, __FILE__, __LINE__ )
00831         RETURN
00832     ENDIF
00833     ALLOCATE (ila_comp_nb_transi_out(iga_comp_nb_transi(ib_c)), stat=id_err)
00834     IF (id_err > 0) THEN
00835         ierrp (1) = id_err
00836         ierrp (2) = iga_comp_nb_transi(ib_c)
00837         id_err = 13
00838 
00839         call psmile_error_common ( id_err, 'ila_comp_nb_transi_out', &
00840            ierrp, 2, __FILE__, __LINE__ )
00841         RETURN
00842     ENDIF
00843 
00844 ! 4.3.2. For all transients of the component, get the number of times they
00845 !        are sent and the number of time they are received
00846 !
00847 !  Set flag for second pass
00848     ll_userdef_details = .false.
00849     CALL get_transi_io_numbers ( iga_comp_id_doc_XML(ib_c),  &
00850                                  iga_comp_nb_transi(ib_c),   &
00851                                  ila_comp_nb_stand_name(:),  &
00852                                  ila_comp_nb_transi_in(:),   &
00853                                  ila_comp_nb_transi_out(:),  &
00854                                  ib_c,                       &
00855                                  ll_userdef_details,         &
00856                                  id_err )
00857     IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_transi_io_numbers'
00858 
00859 ! 4.3.3. set the global count array for transient in and out
00860 #ifdef DEBUG
00861    print *, 'ib_c, iga_comp_nb_transi(ib_c) = ',ib_c, iga_comp_nb_transi(ib_c)
00862    print *, 'il_ntr = ', il_ntr
00863 #endif
00864     iga_comp_nb_stand_name  &
00865        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c)) &
00866        = ila_comp_nb_stand_name(:)
00867     iga_comp_nb_transi_in  &
00868        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c)) &
00869        = ila_comp_nb_transi_in(:)
00870     iga_comp_nb_transi_out  &
00871        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c)) &
00872        = ila_comp_nb_transi_out(:)
00873 
00874     il_ntr = il_ntr + iga_comp_nb_transi(ib_c)
00875 
00876 ! 4.3.4. Send this information to the different components
00877     ALLOCATE(ila_smioc_send(3*iga_comp_nb_transi(ib_c)), stat=id_err)
00878     IF (id_err > 0) THEN
00879         ierrp (1) = id_err
00880         ierrp (2) = iga_comp_nb_transi(ib_c)
00881         id_err = 13
00882 
00883         call psmile_error_common ( id_err, 'ila_smioc_send', &
00884            ierrp, 2, __FILE__, __LINE__ )
00885         RETURN
00886     ENDIF
00887 
00888     DO ib = 1, iga_comp_nb_transi(ib_c)
00889 
00890       ila_smioc_send(1 + (ib-1)*3) = ila_comp_nb_stand_name(ib)
00891       ila_smioc_send(2 + (ib-1)*3) = ila_comp_nb_transi_in(ib)
00892       ila_smioc_send(3 + (ib-1)*3) = ila_comp_nb_transi_out(ib)
00893 
00894     END DO
00895     
00896     ila_tgt_proc(:) = -1    
00897     il_nb_comp_pes = 0
00898 !   for all processes except driver processes
00899     DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
00900       IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
00901         DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
00902           IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
00903             il_nb_comp_pes = il_nb_comp_pes + 1
00904             ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
00905           END IF
00906         END DO
00907       END IF
00908     END DO
00909 
00910 
00911     DO ib = 1, il_nb_comp_pes
00912 
00913       CALL MPI_Send (ila_smioc_send, 3*iga_comp_nb_transi(ib_c), MPI_Integer, &
00914          ila_tgt_proc(ib), 6, comm_drv_trans, id_err)
00915 
00916     END DO
00917 
00918     DEALLOCATE(ila_smioc_send, stat=id_err)
00919     IF (id_err > 0) THEN
00920         ierrp (1) = id_err
00921         id_err = 14
00922         
00923         call psmile_error_common ( id_err, 'ila_smioc_send', &
00924            ierrp, 1, __FILE__, __LINE__ )
00925         RETURN
00926     ENDIF
00927 
00928 ! 4.3.5. Deallocate component local counters
00929     DEALLOCATE (ila_comp_nb_stand_name, stat=id_err) 
00930     IF (id_err > 0) THEN
00931         ierrp (1) = id_err
00932         id_err = 14
00933 
00934         call psmile_error_common ( id_err, 'ila_comp_nb_stand_name', &
00935            ierrp, 1, __FILE__, __LINE__ )
00936         RETURN
00937     ENDIF
00938     DEALLOCATE (ila_comp_nb_transi_in, stat=id_err) 
00939     IF (id_err > 0) THEN
00940         ierrp (1) = id_err
00941         id_err = 14
00942 
00943         call psmile_error_common ( id_err, 'ila_comp_nb_transi_in', &
00944            ierrp, 1, __FILE__, __LINE__ )
00945         RETURN
00946     ENDIF
00947     DEALLOCATE (ila_comp_nb_transi_out, stat=id_err)
00948     IF (id_err > 0) THEN
00949         ierrp (1) = id_err
00950         id_err = 14
00951 
00952         call psmile_error_common ( id_err, 'ila_comp_nb_transi_out', &
00953            ierrp, 1, __FILE__, __LINE__ )
00954         RETURN
00955     ENDIF
00956 
00957   END IF
00958 
00959   ENDDO   ! loop on components ib_c = 1, ig_nb_tot_comps
00960 #ifdef DEBUG
00961   print *,' iga_comp_nb_stand_name = ', iga_comp_nb_stand_name(:)
00962   print *,' iga_comp_nb_transi_in (incl extra userdef) = ', iga_comp_nb_transi_in(:)
00963   print *,' iga_comp_nb_transi_out (incl extra userdef) = ', iga_comp_nb_transi_out(:)
00964 #endif
00965 
00966 ! 4.4. Allocate standard name, transient_out, and transient_in 
00967 !      in global transient structure
00968   DO ib_ntt = 1, ig_nb_tot_transi
00969     ALLOCATE (sga_smioc_transi(ib_ntt)%sg_transi_in%sga_in_orig &
00970        (iga_comp_nb_transi_in(ib_ntt)), stat=id_err)
00971     IF (id_err > 0) THEN
00972         ierrp (1) = id_err
00973         ierrp (2) = iga_comp_nb_transi_in(ib_ntt)
00974         id_err = 13
00975 
00976         call psmile_error_common ( id_err, 'sga_in_orig', &
00977            ierrp, 2, __FILE__, __LINE__ )
00978         RETURN
00979     ENDIF
00980     ALLOCATE (sga_smioc_transi(ib_ntt)%sga_transi_out &
00981        (iga_comp_nb_transi_out(ib_ntt)), stat=id_err)
00982     IF (id_err > 0) THEN
00983         ierrp (1) = id_err
00984         ierrp (2) = iga_comp_nb_transi_out(ib_ntt)
00985         id_err = 13
00986 
00987         call psmile_error_common ( id_err, 'sga_transi_out', &
00988            ierrp, 2, __FILE__, __LINE__ )
00989         RETURN
00990     ENDIF
00991     ALLOCATE (sga_smioc_transi(ib_ntt)%cga_stand_name &
00992        (iga_comp_nb_stand_name(ib_ntt)), stat=id_err)
00993     IF (id_err > 0) THEN
00994         ierrp (1) = id_err
00995         ierrp (2) = iga_comp_nb_stand_name(ib_ntt)
00996         id_err = 13
00997 
00998         call psmile_error_common ( id_err, 'cga_stand_name', &
00999            ierrp, 2, __FILE__, __LINE__ )
01000         RETURN
01001     ENDIF
01002   ENDDO
01003 
01004 ! 4.5. Initialize the global transient structure
01005 #ifdef VERBOSE
01006   PRINT *, '| | |  Before init_transi for gloabl structure sga_smioc_transi'
01007   call psmile_flushstd
01008 #endif
01009   CALL init_transi (ig_nb_tot_transi,        &
01010                     iga_comp_nb_stand_name,  &
01011                     iga_comp_nb_transi_in,   &
01012                     iga_comp_nb_transi_out,  &
01013                     sga_smioc_transi,        &
01014                     id_err )
01015 #ifdef VERBOSE
01016   PRINT *, '| | |  After init_transi'
01017   call psmile_flushstd
01018 #endif
01019   IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in init_transi'
01020 
01021 ! 5. Get the transient details  (2nd pass)
01022   il_ntr = 0
01023   il_ntr_xml = 0
01024   il_npartinid = 0
01025   il_npartoutid = 0
01026   DO ib_c = 1, ig_nb_tot_comps        ! Loop on all components
01027 
01028 ! 5.1. Allocate and fill component transient structure 
01029     ALLOCATE (ila_comp_nb_stand_name(iga_comp_nb_transi(ib_c)), stat=id_err)
01030     IF (id_err > 0) THEN
01031         ierrp (1) = id_err
01032         ierrp (2) = iga_comp_nb_transi(ib_c)
01033         id_err = 13
01034 
01035         call psmile_error_common ( id_err, 'ila_comp_nb_stand_name', &
01036            ierrp, 2, __FILE__, __LINE__ )
01037         RETURN
01038     ENDIF
01039     ALLOCATE (ila_comp_nb_transi_in(iga_comp_nb_transi(ib_c)), stat=id_err)
01040     IF (id_err > 0) THEN
01041         ierrp (1) = id_err
01042         ierrp (2) = iga_comp_nb_transi(ib_c)
01043         id_err = 13
01044 
01045         call psmile_error_common ( id_err, 'ila_comp_nb_transi_in', &
01046            ierrp, 2, __FILE__, __LINE__ )
01047         RETURN
01048     ENDIF
01049     ALLOCATE (ila_comp_nb_transi_out(iga_comp_nb_transi(ib_c)), stat=id_err)
01050     IF (id_err > 0) THEN
01051         ierrp (1) = id_err
01052         ierrp (2) = iga_comp_nb_transi(ib_c)
01053         id_err = 13
01054 
01055         call psmile_error_common ( id_err, 'ila_comp_nb_transi_out', &
01056            ierrp, 2, __FILE__, __LINE__ )
01057         RETURN
01058     ENDIF
01059     ALLOCATE (sla_driver_transi (iga_comp_nb_transi(ib_c)), stat=id_err)
01060     IF (id_err > 0) THEN
01061         ierrp (1) = id_err
01062         ierrp (2) = iga_comp_nb_transi(ib_c)
01063         id_err = 13
01064 
01065         call psmile_error_common ( id_err, 'sla_driver_transi', &
01066            ierrp, 2, __FILE__, __LINE__ )
01067         RETURN
01068     ENDIF
01069 
01070     ila_comp_nb_stand_name(:) = iga_comp_nb_stand_name  &
01071        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c))
01072     ila_comp_nb_transi_in(:) = iga_comp_nb_transi_in  &
01073        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c))
01074     ila_comp_nb_transi_out(:) = iga_comp_nb_transi_out  &
01075        (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c))
01076 
01077 ! 5.3. Allocate standard name and transient_out and transient_in 
01078 !      in component transient structure
01079     DO ib_nt = 1, iga_comp_nb_transi(ib_c)
01080       ALLOCATE (sla_driver_transi(ib_nt)%sg_transi_in%sga_in_orig(ila_comp_nb_transi_in(ib_nt)), stat=id_err)
01081       IF (id_err > 0) THEN
01082           ierrp (1) = id_err
01083           ierrp (2) = ila_comp_nb_transi_in(ib_nt)
01084           id_err = 13
01085 
01086           call psmile_error_common ( id_err, 'sga_in_orig', &
01087              ierrp, 2, __FILE__, __LINE__ )
01088           RETURN
01089       ENDIF
01090       ALLOCATE (sla_driver_transi(ib_nt)%sga_transi_out(ila_comp_nb_transi_out(ib_nt)), stat=id_err)
01091       IF (id_err > 0) THEN
01092           ierrp (1) = id_err
01093           ierrp (2) = ila_comp_nb_transi_out(ib_nt)
01094           id_err = 13
01095 
01096           call psmile_error_common ( id_err, 'sga_transi_out', &
01097              ierrp, 2, __FILE__, __LINE__ )
01098           RETURN
01099       ENDIF
01100       ALLOCATE (sla_driver_transi(ib_nt)%cga_stand_name(ila_comp_nb_stand_name(ib_nt)), stat=id_err)
01101       IF (id_err > 0) THEN
01102           ierrp (1) = id_err
01103           ierrp (2) = ila_comp_nb_stand_name(ib_nt)
01104           id_err = 13
01105 
01106           call psmile_error_common ( id_err, 'cga_stand_name', &
01107              ierrp, 2, __FILE__, __LINE__ )
01108           RETURN
01109       ENDIF
01110     ENDDO
01111 
01112 ! 5.4. Initialize the component transient structure
01113 #ifdef VERBOSE
01114   PRINT *, '| | |  Before init_transi bis for local (per component) sla_driver_transi'
01115   call psmile_flushstd
01116 #endif
01117     CALL init_transi (iga_comp_nb_transi(ib_c),  &
01118                       ila_comp_nb_stand_name,    &
01119                       ila_comp_nb_transi_in,     &
01120                       ila_comp_nb_transi_out,    &
01121                       sla_driver_transi,         &
01122                       id_err )
01123 #ifdef VERBOSE
01124   PRINT *, '| | |  After init_transi bis'
01125   call psmile_flushstd
01126 #endif
01127     IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in init_transi'
01128 
01129 ! 5.5. Get transient details for all transients of the component (2nd pass)
01130 !
01131 ! 5.5.1 Get details for all transients 
01132 #ifdef VERBOSE
01133   PRINT *, '| | |  Before get_transi_details  second pass (XML + Udef transients)'
01134   call psmile_flushstd
01135 #endif
01136 !
01137 !   Copy global structure for XML transients (from 1st pass) into sla_driver_transi
01138 !
01139 #ifdef DEBUG
01140   print *, ' ib_c il_ntr_xml nb_transi = ', ib_c, il_ntr_xml, iga_xml_comp_nb_transi(ib_c)
01141 #endif
01142     sla_driver_transi(1:iga_xml_comp_nb_transi(ib_c)) =   &
01143         sga_xml_smioc_transi(il_ntr_xml+1:il_ntr_xml+iga_xml_comp_nb_transi(ib_c))
01144 !
01145 !   create the additional "udef" transients (if any) from existing XML transients
01146     CALL prismdrv_get_all_transi ( iga_comp_nb_transi(ib_c),   &
01147                                    sla_driver_transi(:),       &
01148                                    ib_c,                       &
01149                                    id_err )
01150 !   Now, sla_driver_transi contains all transients including "udef" transients
01151 #ifdef VERBOSE
01152   PRINT *, '| | |  After get_transi'
01153   call psmile_flushstd
01154 #endif
01155     IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_transi_details'
01156 
01157 ! 5.5.2 Set the component, transient, grid, transient in and transient out ids 
01158 !       Component id 
01159     sla_driver_transi(:)%ig_comp_id = ib_c
01160     DO ib_nt = 1, iga_comp_nb_transi(ib_c)
01161       ib_a = il_ntr+ib_nt
01162       !     Transient id
01163       sla_driver_transi(ib_nt)%ig_transi_id = ib_a
01164       ! Transient in id
01165       DO ib_nin= 1, sla_driver_transi(ib_nt)%sg_transi_in%ig_nb_in_orig
01166         sla_driver_transi(ib_nt)%sg_transi_in%sga_in_orig(ib_nin)%ig_transi_in_id &
01167            = il_npartinid + ib_nin
01168       ENDDO
01169       il_npartinid = il_npartinid + sla_driver_transi(ib_nt)%sg_transi_in%ig_nb_in_orig
01170       ! Transient out id
01171       DO ib_nout= 1, sla_driver_transi(ib_nt)%ig_nb_transi_out
01172         sla_driver_transi(ib_nt)%sga_transi_out(ib_nout)%ig_transi_out_id &
01173            = il_npartoutid + ib_nout
01174       ENDDO
01175       il_npartoutid = il_npartoutid + sla_driver_transi(ib_nt)%ig_nb_transi_out
01176     ENDDO
01177 
01178     ! 5.6. Put local transient details in global structure
01179     sga_smioc_transi (il_ntr+1:il_ntr+iga_comp_nb_transi(ib_c)) = &
01180        sla_driver_transi(:)
01181 
01182     ! 5.7. Set the sizes for the exchanges
01183     il_nb_int_i_fix = 27
01184     il_nb_int_i_in  = 54
01185     il_nb_int_i_out = 82
01186 
01187     il_smioc_send_size_i = 0
01188     DO ib = 1, iga_comp_nb_transi(ib_c)
01189       il_smioc_send_size_i = il_smioc_send_size_i       &
01190          + il_nb_int_i_fix                              &
01191          + il_nb_int_i_in * ila_comp_nb_transi_in(ib)   &
01192          + il_nb_int_i_out * ila_comp_nb_transi_out(ib)
01193     END DO
01194     ALLOCATE(ila_smioc_send(il_smioc_send_size_i), stat=id_err)
01195     IF (id_err > 0) THEN
01196         ierrp (1) = id_err
01197         ierrp (2) = il_smioc_send_size_i
01198         id_err = 13
01199         
01200         call psmile_error_common ( id_err, 'ila_smioc_send', &
01201            ierrp, 2, __FILE__, __LINE__ )
01202         RETURN
01203     ENDIF
01204 
01205     il_nb_int_d_fix = 6
01206     il_nb_int_d_in  = 15
01207     il_nb_int_d_out = 19
01208 
01209     il_smioc_send_size_d = 0
01210     DO ib = 1, iga_comp_nb_transi(ib_c)
01211       il_smioc_send_size_d = il_smioc_send_size_d       &
01212          + il_nb_int_d_fix                              &
01213          + il_nb_int_d_in * ila_comp_nb_transi_in(ib)   &
01214          + il_nb_int_d_out * ila_comp_nb_transi_out(ib)
01215     END DO
01216     ALLOCATE(dla_smioc_send(il_smioc_send_size_d), stat=id_err)
01217     IF (id_err > 0) THEN
01218         ierrp (1) = id_err
01219         ierrp (2) = il_smioc_send_size_d
01220         id_err = 13
01221         
01222         call psmile_error_common ( id_err, 'dla_smioc_send', &
01223            ierrp, 2, __FILE__, __LINE__ )
01224         RETURN
01225     ENDIF
01226 
01227     il_nb_int_c_fix = 4
01228     il_nb_int_c_in  = 10
01229     il_nb_int_c_out = 9
01230 
01231     il_smioc_send_size_c = 0
01232     DO ib = 1, iga_comp_nb_transi(ib_c)
01233       il_smioc_send_size_c = il_smioc_send_size_c       &
01234          + il_nb_int_c_fix                              &
01235          + ila_comp_nb_stand_name(ib)                   &
01236          + il_nb_int_c_in * ila_comp_nb_transi_in(ib)   &
01237          + il_nb_int_c_out * ila_comp_nb_transi_out(ib)
01238     END DO
01239     ALLOCATE(cla_smioc_send(il_smioc_send_size_c), stat=id_err)
01240     IF (id_err > 0) THEN
01241         ierrp (1) = id_err
01242         ierrp (2) = il_smioc_send_size_c
01243         id_err = 13
01244         
01245         call psmile_error_common ( id_err, 'cla_smioc_send', &
01246            ierrp, 2, __FILE__, __LINE__ )
01247         RETURN
01248     ENDIF
01249 
01250     ! 5.8. Set and Send the transient structure to the component
01251     il_index_i = 0
01252     il_index_c = 0
01253     il_index_d = 0
01254 
01255     DO ib = 1, iga_comp_nb_transi(ib_c)
01256 
01257       ! transient infos
01258       ila_smioc_send(1 + il_index_i) = sla_driver_transi(ib)%ig_nb_stand_name
01259       ila_smioc_send(2 + il_index_i) = sla_driver_transi(ib)%ig_comp_id
01260       ila_smioc_send(3 + il_index_i) = sla_driver_transi(ib)%ig_transi_id
01261       ila_smioc_send(4 + il_index_i) = sla_driver_transi(ib)%ig_transi_type
01262       ila_smioc_send(5 + il_index_i) = sla_driver_transi(ib)%ig_nb_bndl
01263       ila_smioc_send(6 + il_index_i) = sla_driver_transi(ib)%ig_datatype
01264       ila_smioc_send(7 + il_index_i) = sla_driver_transi(ib)%ig_nb_transi_out
01265       
01266       ! transient_in infos
01267       ila_smioc_send(8 + il_index_i) = &
01268          sla_driver_transi(ib)%sg_transi_in%ig_nb_in_orig
01269       ila_smioc_send(9 + il_index_i) = &
01270          sla_driver_transi(ib)%sg_transi_in%ig_exch_date_type
01271       ila_smioc_send(10 + il_index_i) = &
01272          sla_driver_transi(ib)%sg_transi_in%ig_debugmode
01273       ila_smioc_send(11 + il_index_i) = &
01274          sla_driver_transi(ib)%sg_transi_in%ig_tgt_timeop
01275       
01276       DO ib_ter = 1, 3
01277         ila_smioc_send(11 + ib_ter + il_index_i) = &
01278            sla_driver_transi(ib)%sg_transi_in%iga_stats(ib_ter)
01279       END DO
01280 
01281       ! min period infos
01282       ila_smioc_send(17 + il_index_i) = &
01283          sla_driver_transi(ib)%sg_transi_in%sg_min_period%minute
01284       ila_smioc_send(18 + il_index_i) = &
01285          sla_driver_transi(ib)%sg_transi_in%sg_min_period%hour
01286       ila_smioc_send(19 + il_index_i) = &
01287          sla_driver_transi(ib)%sg_transi_in%sg_min_period%day
01288       ila_smioc_send(20 + il_index_i) = &
01289          sla_driver_transi(ib)%sg_transi_in%sg_min_period%month
01290       ila_smioc_send(21 + il_index_i) = &
01291          sla_driver_transi(ib)%sg_transi_in%sg_min_period%year
01292         
01293       ! tgt local trans
01294       ila_smioc_send(22 + il_index_i) = &
01295          sla_driver_transi(ib)%sg_transi_in%sg_tgt_local_trans%ig_gather
01296       
01297       ! PSMILe exch date
01298       ila_smioc_send(23 + il_index_i) = &
01299          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%minute
01300       ila_smioc_send(24 + il_index_i) = &
01301          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%hour
01302       ila_smioc_send(25 + il_index_i) = &
01303          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%day
01304       ila_smioc_send(26 + il_index_i) = &
01305          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%month
01306       ila_smioc_send(27 + il_index_i) = &
01307          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%year
01308 
01309       il_index_i = il_index_i + 27
01310 
01311       DO ib_bis = 1, ila_comp_nb_transi_in(ib)
01312 
01313         ! transi_in infos
01314         ila_smioc_send(1 + il_index_i) =                                &
01315            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01316            ig_transi_in_id
01317         ila_smioc_send(2 + il_index_i) =                                &
01318            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01319            ig_orig_type
01320         ila_smioc_send(3 + il_index_i) =                                &
01321            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01322            ig_orig_transi_id
01323         ila_smioc_send(4 + il_index_i) =                                &
01324            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01325            ig_orig_comp_id
01326         ila_smioc_send(5 + il_index_i) =                                &
01327            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01328            ig_conserv
01329 
01330         ! PSMILe_file_struct
01331         ila_smioc_send(6 + il_index_i) =                                &
01332            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01333            sg_orig_file%ig_suffix
01334         ila_smioc_send(7 + il_index_i) =                                &
01335            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01336            sg_orig_file%ig_file_format
01337         ila_smioc_send(8 + il_index_i) =                                &
01338            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01339            sg_orig_file%ig_file_set
01340         ila_smioc_send(9 + il_index_i) =                                &
01341            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01342            sg_orig_file%ig_file_iomode
01343         ila_smioc_send(10 + il_index_i) =                                &
01344            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01345            sg_orig_file%ig_file_pack
01346 
01347         ! PSMILe_file_struct
01348         ila_smioc_send(11 + il_index_i) =                                &
01349            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01350            sg_cpl_rst_file%ig_suffix
01351         ila_smioc_send(12 + il_index_i) =                                &
01352            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01353            sg_cpl_rst_file%ig_file_format
01354         ila_smioc_send(13 + il_index_i) =                                &
01355            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01356            sg_cpl_rst_file%ig_file_set
01357         ila_smioc_send(14 + il_index_i) =                                &
01358            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01359            sg_cpl_rst_file%ig_file_iomode
01360         ila_smioc_send(15 + il_index_i) =                                &
01361            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01362            sg_cpl_rst_file%ig_file_pack
01363 
01364         ! PSMILe_interp
01365         ila_smioc_send(16 + il_index_i) =                                &
01366            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01367            sg_interp%ig_interp_type
01368         DO ib_ter = 1, 3
01369           ila_smioc_send(16 + ib_ter + il_index_i) =                        &
01370              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01371              sg_interp%iga_interp_meth(ib_ter)
01372           ila_smioc_send(19 + ib_ter + il_index_i) =                        &
01373              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01374              sg_interp%iga_arg1(ib_ter)
01375           ila_smioc_send(22 + ib_ter + il_index_i) =                        &
01376              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01377              sg_interp%iga_arg2(ib_ter)
01378           ila_smioc_send(25 + ib_ter + il_index_i) =                        &
01379              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01380              sg_interp%iga_arg3(ib_ter)
01381           ila_smioc_send(28 + ib_ter + il_index_i) =                        &
01382              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01383              sg_interp%iga_arg4(ib_ter)
01384           ila_smioc_send(31 + ib_ter + il_index_i) =                        &
01385              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01386              sg_interp%iga_arg5(ib_ter)
01387           ila_smioc_send(34 + ib_ter + il_index_i) =                        &
01388              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01389              sg_interp%iga_arg6(ib_ter)
01390           ila_smioc_send(37 + ib_ter + il_index_i) =                        &
01391              sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01392              sg_interp%iga_arg7(ib_ter)
01393         END DO
01394 
01395         ! PSMILe_file_struct
01396         ila_smioc_send(41 + il_index_i) =                                &
01397            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01398            sg_interp%sg_arg10%ig_suffix
01399         ila_smioc_send(42 + il_index_i) =                                &
01400            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01401            sg_interp%sg_arg10%ig_file_format
01402         ila_smioc_send(43 + il_index_i) =                                &
01403            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01404            sg_interp%sg_arg10%ig_file_set
01405         ila_smioc_send(44 + il_index_i) =                                &
01406            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01407            sg_interp%sg_arg10%ig_file_iomode
01408         ila_smioc_send(45 + il_index_i) =                                &
01409            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01410            sg_interp%sg_arg10%ig_file_pack
01411 
01412         ! PSMILe_combi_struct
01413         ila_smioc_send(46 + il_index_i) =                                &
01414            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01415            sg_combi%sg_ext_mask_file%ig_suffix
01416         ila_smioc_send(47 + il_index_i) =                                &
01417            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01418            sg_combi%sg_ext_mask_file%ig_file_format
01419         ila_smioc_send(48 + il_index_i) =                                &
01420            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01421            sg_combi%sg_ext_mask_file%ig_file_set
01422         ila_smioc_send(49 + il_index_i) =                                &
01423            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01424            sg_combi%sg_ext_mask_file%ig_file_iomode
01425         ila_smioc_send(50 + il_index_i) =                                &
01426            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01427            sg_combi%sg_ext_mask_file%ig_file_pack
01428         ila_smioc_send(51 + il_index_i) =                                &
01429            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01430            sg_combi%ig_location
01431         ila_smioc_send(52 + il_index_i) =                                &
01432            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01433            sg_combi%ig_operand
01434         ila_smioc_send(53 + il_index_i) =                                &
01435            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01436            sg_combi%ig_mask_type
01437         ila_smioc_send(54 + il_index_i) =                                &
01438            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01439            sg_combi%ig_combi_meth
01440            
01441         il_index_i = il_index_i + 54
01442 
01443       END DO
01444 
01445       DO ib_bis = 1, ila_comp_nb_transi_out(ib)
01446 
01447         ! transi_out infos
01448         ila_smioc_send(1 + il_index_i) =             &
01449            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01450            ig_transi_out_id
01451         ila_smioc_send(2 + il_index_i) =             &
01452            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01453            ig_dest_type
01454         ila_smioc_send(3 + il_index_i) =             &
01455            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01456            ig_dest_transi_id
01457         ila_smioc_send(4 + il_index_i) =             &
01458            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01459            ig_dest_comp_id
01460         ila_smioc_send(5 + il_index_i) =             &
01461            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01462            ig_exch_date_type
01463         ila_smioc_send(6 + il_index_i) =             &
01464            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01465            ig_debugmode
01466         ila_smioc_send(7 + il_index_i) =             &
01467            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01468            ig_lag
01469         ila_smioc_send(8 + il_index_i) =             &
01470            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01471            ig_src_timeop
01472         ila_smioc_send(9 + il_index_i) =             &
01473            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01474            ig_conserv
01475         DO ib_ter = 1, 3
01476           ila_smioc_send(9 + ib_ter + il_index_i) =             &
01477              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01478              iga_stats(ib_ter)
01479         END DO
01480 
01481         ! PSMILe_file_struct        
01482         ila_smioc_send(15 + il_index_i) =             &
01483            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01484            sg_dest_file%ig_suffix
01485         ila_smioc_send(16 + il_index_i) =             &
01486            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01487            sg_dest_file%ig_file_format
01488         ila_smioc_send(17 + il_index_i) =             &
01489            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01490            sg_dest_file%ig_file_set
01491         ila_smioc_send(18 + il_index_i) =             &
01492            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01493            sg_dest_file%ig_file_iomode
01494         ila_smioc_send(19 + il_index_i) =             &
01495            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01496            sg_dest_file%ig_file_pack
01497 
01498         ! PSMILe_file_struct        
01499         ila_smioc_send(20 + il_index_i) =             &
01500            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01501            sg_cpl_rst_file%ig_suffix
01502         ila_smioc_send(21 + il_index_i) =             &
01503            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01504            sg_cpl_rst_file%ig_file_format
01505         ila_smioc_send(22 + il_index_i) =             &
01506            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01507            sg_cpl_rst_file%ig_file_set
01508         ila_smioc_send(23 + il_index_i) =             &
01509            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01510            sg_cpl_rst_file%ig_file_iomode
01511         ila_smioc_send(24 + il_index_i) =             &
01512            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01513            sg_cpl_rst_file%ig_file_pack
01514 
01515         ! PRISM_time_struct
01516         ila_smioc_send(25 + il_index_i) =             &
01517            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01518            sg_min_period%minute
01519         ila_smioc_send(26 + il_index_i) =             &
01520            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01521            sg_min_period%hour
01522         ila_smioc_send(27 + il_index_i) =             &
01523            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01524            sg_min_period%day
01525         ila_smioc_send(28 + il_index_i) =             &
01526            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01527            sg_min_period%month
01528         ila_smioc_send(29 + il_index_i) =             &
01529            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01530            sg_min_period%year
01531 
01532         ! PSMILe_exch_date
01533         ila_smioc_send(30 + il_index_i) =             &
01534            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01535            sg_exch_date%sg_period%minute
01536         ila_smioc_send(31 + il_index_i) =             &
01537            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01538            sg_exch_date%sg_period%hour
01539         ila_smioc_send(32 + il_index_i) =             &
01540            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01541            sg_exch_date%sg_period%day
01542         ila_smioc_send(33 + il_index_i) =             &
01543            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01544            sg_exch_date%sg_period%month
01545         ila_smioc_send(34 + il_index_i) =             &
01546            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01547            sg_exch_date%sg_period%year
01548 
01549         ! PSMILe_src_local_trans
01550         ila_smioc_send(35 + il_index_i) =             &
01551            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01552            sg_src_local_trans%ig_scatter
01553         DO ib_ter = 1, 4
01554           ila_smioc_send(35 + ib_ter + il_index_i) =             &
01555              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01556              sg_src_local_trans%ig_reduc_type(ib_ter)
01557           ila_smioc_send(39 + ib_ter + il_index_i) =             &
01558              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01559              sg_src_local_trans%ig_reduc_order(ib_ter)
01560         END DO
01561 
01562         ! PSMILe_interp
01563         ila_smioc_send(44 + il_index_i) =             &
01564            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01565            sg_interp%ig_interp_type
01566         DO ib_ter = 1, 3
01567           ila_smioc_send(44 + ib_ter + il_index_i) =             &
01568              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01569              sg_interp%iga_interp_meth(ib_ter)
01570           ila_smioc_send(47 + ib_ter + il_index_i) =             &
01571              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01572              sg_interp%iga_arg1(ib_ter)
01573           ila_smioc_send(50 + ib_ter + il_index_i) =             &
01574              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01575              sg_interp%iga_arg2(ib_ter)
01576           ila_smioc_send(53 + ib_ter + il_index_i) =             &
01577              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01578              sg_interp%iga_arg3(ib_ter)
01579           ila_smioc_send(56 + ib_ter + il_index_i) =             &
01580              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01581              sg_interp%iga_arg4(ib_ter)
01582           ila_smioc_send(59 + ib_ter + il_index_i) =             &
01583              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01584              sg_interp%iga_arg5(ib_ter)
01585           ila_smioc_send(62 + ib_ter + il_index_i) =             &
01586              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01587              sg_interp%iga_arg6(ib_ter)
01588           ila_smioc_send(65 + ib_ter + il_index_i) =             &
01589              sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01590              sg_interp%iga_arg7(ib_ter)
01591         END DO
01592         
01593         ! PSMILe_file_struct
01594         ila_smioc_send(69 + il_index_i) =             &
01595            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01596            sg_interp%sg_arg10%ig_suffix
01597         ila_smioc_send(70 + il_index_i) =             &
01598            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01599            sg_interp%sg_arg10%ig_file_format
01600         ila_smioc_send(71 + il_index_i) =             &
01601            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01602            sg_interp%sg_arg10%ig_file_set
01603         ila_smioc_send(72 + il_index_i) =             &
01604            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01605            sg_interp%sg_arg10%ig_file_iomode
01606         ila_smioc_send(73 + il_index_i) =             &
01607            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01608            sg_interp%sg_arg10%ig_file_pack
01609           
01610         ! PSMILe_combi_struct
01611         ila_smioc_send(74 + il_index_i) =             &
01612            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01613            sg_combi%sg_ext_mask_file%ig_suffix
01614         ila_smioc_send(75 + il_index_i) =             &
01615            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01616            sg_combi%sg_ext_mask_file%ig_file_format
01617         ila_smioc_send(76 + il_index_i) =             &
01618            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01619            sg_combi%sg_ext_mask_file%ig_file_set
01620         ila_smioc_send(77 + il_index_i) =             &
01621            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01622            sg_combi%sg_ext_mask_file%ig_file_iomode
01623         ila_smioc_send(78 + il_index_i) =             &
01624            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01625            sg_combi%sg_ext_mask_file%ig_file_pack
01626         ila_smioc_send(79 + il_index_i) =             &
01627            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01628            sg_combi%ig_location
01629         ila_smioc_send(80 + il_index_i) =             &
01630            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01631            sg_combi%ig_operand
01632         ila_smioc_send(81 + il_index_i) =             &
01633            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01634            sg_combi%ig_mask_type
01635         ila_smioc_send(82 + il_index_i) =             &
01636            sla_driver_transi(ib)%sga_transi_out(ib_bis)%            &
01637            sg_combi%ig_combi_meth
01638 
01639         il_index_i = il_index_i + 82
01640 
01641       END DO
01642 
01643       cla_smioc_send(1 + il_index_c) = sla_driver_transi(ib)%cg_local_name
01644       cla_smioc_send(2 + il_index_c) = sla_driver_transi(ib)%cg_long_name
01645       cla_smioc_send(3 + il_index_c) = sla_driver_transi(ib)%cg_comp_name
01646       cla_smioc_send(4 + il_index_c) = sla_driver_transi(ib)%cg_units
01647 
01648       il_index_c = il_index_c + 4
01649 
01650       DO ib_bis = 1, ila_comp_nb_stand_name(ib)
01651 
01652         cla_smioc_send(1 + il_index_c) = &
01653            sla_driver_transi(ib)%cga_stand_name(ib_bis)
01654 
01655         il_index_c = il_index_c + 1
01656 
01657       END DO
01658 
01659       DO ib_bis = 1, ila_comp_nb_transi_in(ib)
01660 
01661         cla_smioc_send(1 + il_index_c) =              &
01662            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01663            cg_transi_in_name
01664         cla_smioc_send(2 + il_index_c) =              &
01665            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01666            cg_orig_transi
01667         cla_smioc_send(3 + il_index_c) =              &
01668            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01669            cg_orig_comp_name
01670         cla_smioc_send(4 + il_index_c) =              &
01671            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01672            sg_orig_file%cg_file_name
01673         cla_smioc_send(5 + il_index_c) =              &
01674            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01675            sg_cpl_rst_file%cg_file_name
01676         cla_smioc_send(6 + il_index_c) =              &
01677            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01678            sg_interp%cg_arg9
01679         cla_smioc_send(7 + il_index_c) =              &
01680            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01681            sg_interp%sg_arg10%cg_file_name
01682         cla_smioc_send(8 + il_index_c) =              &
01683            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01684            sg_combi%cg_combi_name
01685         cla_smioc_send(9 + il_index_c) =              &
01686            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01687            sg_combi%cg_ext_mask_name
01688         cla_smioc_send(10 + il_index_c) =              &
01689            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01690            sg_combi%sg_ext_mask_file%cg_file_name
01691         
01692         il_index_c = il_index_c + 10
01693 
01694       END DO
01695 
01696       DO ib_bis = 1, ila_comp_nb_transi_out(ib)
01697 
01698         cla_smioc_send(1 + il_index_c) =              &
01699            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01700            cg_transi_out_name
01701         cla_smioc_send(2 + il_index_c) =              &
01702            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01703            cg_dest_transi
01704         cla_smioc_send(3 + il_index_c) =              &
01705            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01706            cg_dest_comp_name
01707         cla_smioc_send(4 + il_index_c) =              &
01708            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01709            sg_dest_file%cg_file_name
01710         cla_smioc_send(5 + il_index_c) =              &
01711            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01712            sg_cpl_rst_file%cg_file_name
01713         cla_smioc_send(6 + il_index_c) =              &
01714            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01715            sg_interp%cg_arg9
01716         cla_smioc_send(7 + il_index_c) =              &
01717            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01718            sg_interp%sg_arg10%cg_file_name
01719         cla_smioc_send(8 + il_index_c) =              &
01720            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01721            sg_combi%cg_ext_mask_name
01722         cla_smioc_send(9 + il_index_c) =              &
01723            sla_driver_transi(ib)%sga_transi_out(ib_bis)% &
01724            sg_combi%sg_ext_mask_file%cg_file_name
01725 
01726         il_index_c = il_index_c + 9
01727 
01728       END DO
01729 
01730       dla_smioc_send(1 + il_index_d) = sla_driver_transi(ib)%dg_transi_min
01731       dla_smioc_send(2 + il_index_d) = sla_driver_transi(ib)%dg_transi_max
01732       dla_smioc_send(3 + il_index_d) = &
01733          sla_driver_transi(ib)%sg_transi_in%sg_min_period%second
01734       dla_smioc_send(4 + il_index_d) = &
01735          sla_driver_transi(ib)%sg_transi_in%sg_tgt_local_trans%dg_add_scalar
01736       dla_smioc_send(5 + il_index_d) = &
01737          sla_driver_transi(ib)%sg_transi_in%sg_tgt_local_trans%dg_mult_scalar
01738       dla_smioc_send(6 + il_index_d) = &
01739          sla_driver_transi(ib)%sg_transi_in%sg_exch_date%sg_period%second
01740 
01741       il_index_d = il_index_d + 6
01742 
01743       DO ib_bis = 1, ila_comp_nb_transi_in(ib)
01744 
01745         dla_smioc_send(1 + il_index_d) = &
01746            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01747            sg_orig_file%dg_file_scal
01748         dla_smioc_send(2 + il_index_d) = &
01749            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01750            sg_orig_file%dg_file_add
01751         dla_smioc_send(3 + il_index_d) = &
01752            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01753            sg_orig_file%dg_fill_val
01754         dla_smioc_send(4 + il_index_d) = &
01755            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01756            sg_cpl_rst_file%dg_file_scal
01757         dla_smioc_send(5 + il_index_d) = &
01758            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01759            sg_cpl_rst_file%dg_file_add
01760         dla_smioc_send(6 + il_index_d) = &
01761            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01762            sg_cpl_rst_file%dg_file_scal
01763         dla_smioc_send(7 + il_index_d) = &
01764            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01765            sg_interp%dg_arg8
01766         dla_smioc_send(8 + il_index_d) = &
01767            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01768            sg_interp%sg_arg10%dg_file_scal
01769         dla_smioc_send(9 + il_index_d) = &
01770            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01771            sg_interp%sg_arg10%dg_file_add
01772         dla_smioc_send(10 + il_index_d) = &
01773            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01774            sg_interp%sg_arg10%dg_fill_val
01775 
01776         dla_smioc_send(11 + il_index_d) = &
01777            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01778            sg_combi%sg_ext_mask_file%dg_file_scal
01779         dla_smioc_send(12 + il_index_d) = &
01780            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01781            sg_combi%sg_ext_mask_file%dg_file_add
01782         dla_smioc_send(13 + il_index_d) = &
01783            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01784            sg_combi%sg_ext_mask_file%dg_fill_val
01785         dla_smioc_send(14 + il_index_d) = &
01786            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01787            sg_combi%dg_combi_param
01788         dla_smioc_send(15 + il_index_d) = &
01789            sla_driver_transi(ib)%sg_transi_in%sga_in_orig(ib_bis)% &
01790            sg_combi%dg_scalar
01791 
01792         il_index_d = il_index_d + 15
01793 
01794       END DO
01795 
01796       DO ib_bis = 1, ila_comp_nb_transi_out(ib)
01797 
01798         dla_smioc_send(1 + il_index_d) = &
01799            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_dest_file% &
01800            dg_file_scal
01801         dla_smioc_send(2 + il_index_d) = &
01802            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_dest_file% &
01803            dg_file_add
01804         dla_smioc_send(3 + il_index_d) = &
01805            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_dest_file% &
01806            dg_fill_val
01807         dla_smioc_send(4 + il_index_d) = &
01808            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_cpl_rst_file% &
01809            dg_file_scal
01810         dla_smioc_send(5 + il_index_d) = &
01811            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_cpl_rst_file% &
01812            dg_file_add
01813         dla_smioc_send(6 + il_index_d) = &
01814            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_cpl_rst_file% &
01815            dg_fill_val
01816         dla_smioc_send(7 + il_index_d) = &
01817            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_min_period%second
01818         dla_smioc_send(8 + il_index_d) = &
01819            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_exch_date% &
01820            sg_period%second
01821         dla_smioc_send(9 + il_index_d) = &
01822            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_src_local_trans% &
01823            dg_add_scalar
01824         dla_smioc_send(10 + il_index_d) = &
01825            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_src_local_trans% &
01826            dg_mult_scalar
01827         dla_smioc_send(11 + il_index_d) = &
01828            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_interp%dg_arg8
01829         dla_smioc_send(12 + il_index_d) = &
01830            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_interp% &
01831            sg_arg10%dg_file_scal
01832         dla_smioc_send(13 + il_index_d) = &
01833            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_interp% &
01834            sg_arg10%dg_file_add
01835         dla_smioc_send(14 + il_index_d) = &
01836            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_interp% &
01837            sg_arg10%dg_fill_val
01838         dla_smioc_send(15 + il_index_d) = &
01839            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_combi% &
01840            sg_ext_mask_file%dg_file_scal
01841         dla_smioc_send(16 + il_index_d) = &
01842            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_combi% &
01843            sg_ext_mask_file%dg_file_add
01844         dla_smioc_send(17 + il_index_d) = &
01845            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_combi% &
01846            sg_ext_mask_file%dg_fill_val
01847         dla_smioc_send(17 + il_index_d) = &
01848            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_combi% &
01849            dg_combi_param
01850         dla_smioc_send(17 + il_index_d) = &
01851            sla_driver_transi(ib)%sga_transi_out(ib_bis)%sg_combi% &
01852            dg_scalar
01853 
01854         il_index_d = il_index_d + 19
01855 
01856       END DO
01857 
01858     END DO
01859 
01860     ila_tgt_proc(:) = -1    
01861     il_nb_comp_pes = 0
01862 
01863 !   for all processes except driver processes
01864     DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
01865       IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
01866         DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
01867           IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
01868             il_nb_comp_pes = il_nb_comp_pes + 1
01869             ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
01870           END IF
01871         END DO
01872       END IF
01873     END DO
01874 
01875     DO ib = 1, il_nb_comp_pes
01876 
01877       CALL MPI_Send (ila_smioc_send(1), il_smioc_send_size_i, MPI_Integer, &
01878          ila_tgt_proc(ib), 7, comm_drv_trans, id_err)
01879 
01880       CALL MPI_Send (cla_smioc_send(1), il_smioc_send_size_c*max_name, &
01881          MPI_Character, ila_tgt_proc(ib), 8, comm_drv_trans, id_err)
01882 
01883       CALL MPI_Send (dla_smioc_send(1), il_smioc_send_size_d, &
01884          MPI_Double_Precision, ila_tgt_proc(ib), 9, comm_drv_trans, &
01885          id_err)
01886 
01887     END DO
01888 
01889     DEALLOCATE(ila_smioc_send, stat=id_err)
01890     IF (id_err > 0) THEN
01891         ierrp (1) = id_err
01892         id_err = 14
01893 
01894         call psmile_error_common ( id_err, 'ila_smioc_send', &
01895            ierrp, 1, __FILE__, __LINE__ )
01896         RETURN
01897     ENDIF
01898     DEALLOCATE(cla_smioc_send, stat=id_err)
01899     IF (id_err > 0) THEN
01900         ierrp (1) = id_err
01901         id_err = 14
01902 
01903         call psmile_error_common ( id_err, 'cla_smioc_send', &
01904            ierrp, 1, __FILE__, __LINE__ )
01905         RETURN
01906     ENDIF
01907     DEALLOCATE(dla_smioc_send, stat=id_err)    
01908     IF (id_err > 0) THEN
01909         ierrp (1) = id_err
01910         id_err = 14
01911 
01912         call psmile_error_common ( id_err, 'dla_smioc_send', &
01913            ierrp, 1, __FILE__, __LINE__ )
01914         RETURN
01915     ENDIF
01916 
01917     ! 5.8. Deallocate the local arrays
01918     DEALLOCATE (ila_comp_nb_stand_name, stat=id_err)
01919     IF (id_err > 0) THEN
01920         ierrp (1) = id_err
01921         id_err = 14
01922 
01923         call psmile_error_common ( id_err, 'ila_comp_nb_stand_name', &
01924            ierrp, 1, __FILE__, __LINE__ )
01925         RETURN
01926     ENDIF
01927     DEALLOCATE (ila_comp_nb_transi_in, stat=id_err)
01928     IF (id_err > 0) THEN
01929         ierrp (1) = id_err
01930         id_err = 14
01931 
01932         call psmile_error_common ( id_err, 'ila_comp_nb_transi_in', &
01933            ierrp, 1, __FILE__, __LINE__ )
01934         RETURN
01935     ENDIF
01936     DEALLOCATE (ila_comp_nb_transi_out, stat=id_err)
01937     IF (id_err > 0) THEN
01938         ierrp (1) = id_err
01939         id_err = 14
01940 
01941         call psmile_error_common ( id_err, 'ila_comp_nb_transi_out', &
01942            ierrp, 1, __FILE__, __LINE__ )
01943         RETURN
01944     ENDIF
01945     DEALLOCATE (sla_driver_transi, stat=id_err)
01946     IF (id_err > 0) THEN
01947         ierrp (1) = id_err
01948         id_err = 14
01949 
01950         call psmile_error_common ( id_err, 'sla_driver_transi', &
01951            ierrp, 1, __FILE__, __LINE__ )
01952         RETURN
01953     ENDIF
01954 !
01955 !  All transients  (2nd pass)
01956     il_ntr = il_ntr + iga_comp_nb_transi(ib_c)
01957 !
01958 !  XML transients  (1st pass)
01959     il_ntr_xml = il_ntr_xml + iga_xml_comp_nb_transi(ib_c)
01960 #ifdef DEBUG
01961    print *, 'il_ntr_xml   il_ntr = ', il_ntr_xml, il_ntr
01962 #endif
01963 
01964   END DO
01965 !-----------------------------------------------------------------------
01966 #ifdef DEBUGX
01967 !
01968 ! 8. Write the different structures
01969 !
01970   OPEN (file='driver_smioc.debug.000', unit=28, form='formatted')
01971 !
01972 ! 8.1. Write the grid structure
01973   IF (ig_nb_tot_grids .gt. 0) THEN
01974       CALL write_grids_details (ig_nb_tot_grids,  &
01975          sga_smioc_grids, 28, id_err )
01976       IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in write_grids_details'
01977   END IF
01978 
01979 ! 8.2. Write the transient structure
01980   IF (ig_nb_tot_transi .gt. 0) THEN
01981       CALL write_transi_details (ig_nb_tot_transi,  &
01982          sga_smioc_transi, 28, id_err )
01983       IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in write_transi_details'
01984   END IF
01985 !
01986   CLOSE (unit=28)
01987 !
01988 #endif
01989 !
01990 !-----------------------------------------------------------------------
01991 !
01992 ! 6. Set the corresponding target or source component id 
01993 !
01994 ! 6.1. Allocate the arrays used to tranfer the following attributions of infos
01995 !
01996 ! Calculate the maximum size of the local arrays
01997   il_orig_index = 0
01998   il_dest_index = 0
01999   DO ib_ntt = 1, ig_nb_tot_transi
02000     DO ib_ntt2 = 1, ig_nb_tot_transi
02001       il_orig_index = il_orig_index + sga_smioc_transi(ib_ntt)%sg_transi_in%ig_nb_in_orig
02002       il_dest_index = il_dest_index + sga_smioc_transi(ib_ntt)%ig_nb_transi_out
02003     ENDDO
02004   ENDDO
02005 
02006 ! Allocate the arrays      
02007   ALLOCATE(ila_orig_comp_id(il_orig_index, 3), stat=id_err)
02008   IF (id_err > 0) THEN
02009       ierrp (1) = id_err
02010       ierrp (2) = il_orig_index
02011       id_err = 13
02012       
02013       call psmile_error_common ( id_err, 'ila_orig_comp_id', &
02014          ierrp, 2, __FILE__, __LINE__ )
02015       RETURN
02016   ENDIF
02017   ALLOCATE(ila_dest_comp_id(il_dest_index, 3), stat=id_err)
02018   IF (id_err > 0) THEN
02019       ierrp (1) = id_err
02020       ierrp (2) = il_dest_index
02021       id_err = 13
02022       
02023       call psmile_error_common ( id_err, 'ila_dest_comp_id', &
02024          ierrp, 2, __FILE__, __LINE__ )
02025       RETURN
02026   ENDIF
02027   ALLOCATE(ila_combi_loc(ig_nb_tot_transi, 2), stat=id_err)
02028   IF (id_err > 0) THEN
02029       ierrp (1) = id_err
02030       ierrp (2) = ig_nb_tot_transi
02031       id_err = 13
02032       
02033       call psmile_error_common ( id_err, 'ila_combi_loc', &
02034          ierrp, 2, __FILE__, __LINE__ )
02035       RETURN
02036   ENDIF
02037 
02038   il_index1 = 0
02039   il_index2 = 0
02040   DO ib_ntt = 1, ig_nb_tot_transi
02041     il_index1 = il_index1 + sga_smioc_transi(ib_ntt)%ig_nb_transi_out
02042     il_index2 = il_index2 + sga_smioc_transi(ib_ntt)%sg_transi_in%ig_nb_in_orig
02043   ENDDO
02044   IF (il_index1 .GT. il_index2) il_index2 = il_index1 
02045 
02046   ALLOCATE(ila_trans_orig_id(il_index2, 3), stat=id_err)
02047   IF (id_err > 0) THEN
02048       ierrp (1) = id_err
02049       ierrp (2) = il_index2
02050       id_err = 13
02051       
02052       call psmile_error_common ( id_err, 'ila_trans_orig_id', &
02053          ierrp, 2, __FILE__, __LINE__ )
02054       RETURN
02055   ENDIF
02056   ALLOCATE(ila_trans_dest_id(il_index2, 3), stat=id_err)
02057   IF (id_err > 0) THEN
02058       ierrp (1) = id_err
02059       ierrp (2) = il_index2
02060       id_err = 13
02061       
02062       call psmile_error_common ( id_err, 'ila_trans_dest_id', &
02063          ierrp, 2, __FILE__, __LINE__ )
02064       RETURN
02065   ENDIF
02066   ALLOCATE(ila_cpl_rst_file(il_index2, 8), stat=id_err)
02067   IF (id_err > 0) THEN
02068       ierrp (1) = id_err
02069       ierrp (2) = il_index2
02070       id_err = 13
02071       
02072       call psmile_error_common ( id_err, 'ila_cpl_rst_file', &
02073          ierrp, 2, __FILE__, __LINE__ )
02074       RETURN
02075   ENDIF
02076   ALLOCATE(dla_cpl_rst_file(il_index2, 3), stat=id_err)
02077   IF (id_err > 0) THEN
02078       ierrp (1) = id_err
02079       ierrp (2) = il_index2
02080       id_err = 13
02081       
02082       call psmile_error_common ( id_err, 'dla_cpl_rst_file', &
02083          ierrp, 2, __FILE__, __LINE__ )
02084       RETURN
02085   ENDIF
02086   ALLOCATE(cla_cpl_rst_file(il_index2, 1), stat=id_err)
02087   IF (id_err > 0) THEN
02088       ierrp (1) = id_err
02089       ierrp (2) = il_index2
02090       id_err = 13
02091       
02092       call psmile_error_common ( id_err, 'cla_cpl_rst_file', &
02093          ierrp, 2, __FILE__, __LINE__ )
02094       RETURN
02095   ENDIF
02096   ALLOCATE(ila_trans_interp(il_index2, 32), stat=id_err)
02097   IF (id_err > 0) THEN
02098       ierrp (1) = id_err
02099       ierrp (2) = il_index2
02100       id_err = 13
02101       
02102       call psmile_error_common ( id_err, 'ila_trans_interp', &
02103          ierrp, 2, __FILE__, __LINE__ )
02104       RETURN
02105   ENDIF
02106   ALLOCATE(dla_trans_interp(il_index2, 4), stat=id_err)
02107   IF (id_err > 0) THEN
02108       ierrp (1) = id_err
02109       ierrp (2) = il_index2
02110       id_err = 13
02111       
02112       call psmile_error_common ( id_err, 'dla_trans_interp', &
02113          ierrp, 2, __FILE__, __LINE__ )
02114       RETURN
02115   ENDIF
02116   ALLOCATE(cla_trans_interp(il_index2, 2), stat=id_err)
02117   IF (id_err > 0) THEN
02118       ierrp (1) = id_err
02119       ierrp (2) = il_index2
02120       id_err = 13
02121       
02122       call psmile_error_common ( id_err, 'cla_trans_interp', &
02123          ierrp, 2, __FILE__, __LINE__ )
02124       RETURN
02125   ENDIF
02126 
02127   ila_orig_comp_id  = -1
02128   ila_dest_comp_id  = -1
02129   ila_combi_loc     = -1
02130   ila_trans_orig_id = -1
02131   ila_trans_dest_id = -1
02132   ila_cpl_rst_file = -1
02133   dla_cpl_rst_file = -1.0
02134   cla_cpl_rst_file = " "
02135   ila_trans_interp = -1
02136 
02137 ! 6.2. Set the orig_comp_id and dest_comp_id
02138   il_orig_index = 0
02139   il_dest_index = 0
02140 
02141   DO ib_ntt = 1, ig_nb_tot_transi
02142     DO ib_ntt2 = 1, ig_nb_tot_transi
02143 
02144       DO ib_nin = 1, sga_smioc_transi(ib_ntt)%sg_transi_in%ig_nb_in_orig
02145         IF (sga_smioc_transi(ib_ntt)%sg_transi_in%sga_in_orig(ib_nin)% &
02146            cg_orig_comp_name .EQ. sga_smioc_transi(ib_ntt2)%cg_comp_name) THEN
02147 
02148             sga_smioc_transi(ib_ntt)%sg_transi_in%sga_in_orig(ib_nin)% &
02149                ig_orig_comp_id = sga_smioc_transi(ib_ntt2)%ig_comp_id 
02150 
02151             il_orig_index = il_orig_index + 1
02152             ila_orig_comp_id(il_orig_index, 1) = ib_ntt
02153             ila_orig_comp_id(il_orig_index, 2) = ib_nin
02154             ila_orig_comp_id(il_orig_index, 3) = &
02155                sga_smioc_transi(ib_ntt2)%ig_comp_id
02156 
02157         ENDIF
02158       ENDDO
02159 
02160       DO ib_nout = 1, sga_smioc_transi(ib_ntt)%ig_nb_transi_out
02161         IF (sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)% &
02162            cg_dest_comp_name .EQ. sga_smioc_transi(ib_ntt2)%cg_comp_name) THEN
02163 
02164             sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)% &
02165                ig_dest_comp_id = sga_smioc_transi(ib_ntt2)%ig_comp_id 
02166 
02167             il_dest_index = il_dest_index + 1
02168             ila_dest_comp_id(il_dest_index, 1) = ib_ntt
02169             ila_dest_comp_id(il_dest_index, 2) = ib_nout
02170             ila_dest_comp_id(il_dest_index, 3) = &
02171                sga_smioc_transi(ib_ntt2)%ig_comp_id
02172 
02173         ENDIF
02174       ENDDO
02175     ENDDO
02176   ENDDO
02177     
02178 
02179 ! 6.3. Define where the combination will take place
02180   il_loc_index = 0
02181 
02182   DO ib_ntt2 = 1, ig_nb_tot_transi
02183 
02184     il_combi = 1
02185     il_source = 1
02186     ll_combi = .false.
02187     ll_source = .false.
02188 
02189     DO ib_nin = 2, sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig
02190 
02191       ! Check if there is a combination for that transient_in
02192       IF (sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)%        &
02193          sg_combi%cg_combi_name .NE. '    ' .AND. sga_smioc_transi(ib_ntt2)% &
02194          sg_transi_in%sga_in_orig(ib_nin)%sg_combi%cg_combi_name .EQ.        &
02195          sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin-1)%       &
02196          sg_combi%cg_combi_name) il_combi = il_combi + 1
02197 
02198       ! Check if the transient implied in combination come from same src comp
02199       IF (sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)%   &
02200          cg_orig_comp_name .EQ. sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02201          sga_in_orig(ib_nin-1)%cg_orig_comp_name) il_source = il_source + 1
02202 
02203     ENDDO
02204 
02205     ! If there is a combination, put ll_combi to true
02206     IF (sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig .GT. 1 .AND.  &
02207        il_combi .EQ. sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig) &
02208        ll_combi = .TRUE.
02209 
02210     ! If the comb implies transients coming all from same src, ll_source = true
02211     IF (sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig .GT. 1 .AND.   &
02212        il_source .EQ. sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig) &
02213        ll_source = .TRUE.
02214 
02215     IF (ll_combi) THEN
02216 
02217         il_loc_index = il_loc_index + 1
02218         ila_combi_loc(il_loc_index,1) = ib_ntt2
02219 
02220         IF (ll_source) THEN
02221             sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(:)% &
02222                sg_combi%ig_location = PSMILe_source
02223             ila_combi_loc(il_loc_index,2) = PSMILe_source
02224         ELSE
02225             sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(:)% &
02226                sg_combi%ig_location = PSMILe_target
02227             ila_combi_loc(il_loc_index,2) = PSMILe_target
02228         ENDIF
02229     ENDIF
02230   ENDDO
02231 
02232 ! 6.2 Set transient out coupling restart files, interpolation, conservation 
02233 !    and combination, and corresponding transient in or out id 
02234   il_trans_dest_index = 0
02235   il_trans_orig_index = 0
02236   il_cpl_rst_file_index = 0
02237   il_trans_interp_index = 0
02238   
02239   DO ib_ntt = 1, ig_nb_tot_transi
02240     DO ib_nout = 1, sga_smioc_transi(ib_ntt)%ig_nb_transi_out
02241 
02242       DO ib_ntt2 = 1, ig_nb_tot_transi
02243         DO ib_nin = 1, sga_smioc_transi(ib_ntt2)%sg_transi_in%ig_nb_in_orig
02244 
02245 #ifdef DEBUG
02246 ! Check coherency between transi_in and transi_out information
02247           IF (TRIM(sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%          &
02248              cg_transi_out_name) .EQ. trim(sga_smioc_transi(ib_ntt2)%         &
02249              sg_transi_in%sga_in_orig(ib_nin)%cg_orig_transi) .AND.           &
02250              trim(sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02251              cg_transi_in_name) .NE. trim(sga_smioc_transi(ib_ntt)%           &
02252              sga_transi_out(ib_nout)%cg_dest_transi)) THEN
02253               PRINT *, '| | |  Incoherency in corresponding source and target XML info'
02254               PRINT *, '| | |  for transient ', sga_smioc_transi(ib_ntt)%     &
02255                  sga_transi_out(ib_nout)%cg_dest_transi
02256               CALL PSMILe_abort
02257           ENDIF
02258           IF (TRIM(sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%          &
02259              cg_transi_out_name) .NE. trim(sga_smioc_transi(ib_ntt2)%         &
02260              sg_transi_in%sga_in_orig(ib_nin)%cg_orig_transi) .AND.           &
02261              trim(sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02262              cg_transi_in_name) .EQ. trim(sga_smioc_transi(ib_ntt)%           &
02263              sga_transi_out(ib_nout)%cg_dest_transi)) THEN
02264               PRINT *, '| | |  Incoherency in corresponding source and target XML info'
02265               PRINT *, '| | |  for transient ', sga_smioc_transi(ib_ntt2)%    &
02266                  sg_transi_in%sga_in_orig(ib_nin)%cg_orig_transi
02267               CALL PSMILe_abort
02268           ENDIF
02269 #endif
02270           IF (trim(sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%          &
02271              cg_transi_out_name) .EQ. trim(sga_smioc_transi(ib_ntt2)%         &
02272              sg_transi_in%sga_in_orig(ib_nin)%cg_orig_transi) .AND.           &
02273              trim(sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02274              cg_transi_in_name) .EQ. trim(sga_smioc_transi(ib_ntt)%           &
02275              sga_transi_out(ib_nout)%cg_dest_transi)) THEN
02276 
02277               ! Corresponding global ids
02278               sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%  &
02279                  ig_dest_transi_id = sga_smioc_transi(ib_ntt2)%  &
02280                  sg_transi_in%sga_in_orig(ib_nin)%ig_transi_in_id
02281 
02282               il_trans_dest_index = il_trans_dest_index + 1
02283 #ifdef DEBUG
02284               IF (il_trans_dest_index .GT. il_index2) THEN
02285                   PRINT *, '| | |  Arrays with too small allocation'
02286                   PRINT *, '| | |  in prismdrv_init_smioc_struct.F90'
02287                   CALL PSMILe_abort
02288               ENDIF
02289 #endif
02290               ila_trans_dest_id(il_trans_dest_index,1) = ib_ntt
02291               ila_trans_dest_id(il_trans_dest_index,2) = ib_nout
02292               ila_trans_dest_id(il_trans_dest_index,3) =           &
02293                  sga_smioc_transi(ib_ntt2)%                        &
02294                  sg_transi_in%sga_in_orig(ib_nin)%ig_transi_in_id
02295 
02296               sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)%  &
02297                  ig_orig_transi_id = sga_smioc_transi(ib_ntt)%             &
02298                  sga_transi_out(ib_nout)%ig_transi_out_id
02299 
02300               il_trans_orig_index = il_trans_orig_index + 1
02301               ila_trans_orig_id(il_trans_orig_index,1) = ib_ntt2
02302               ila_trans_orig_id(il_trans_orig_index,2) = ib_nin
02303               ila_trans_orig_id(il_trans_orig_index,3) =   &
02304                  sga_smioc_transi(ib_ntt)%                 &
02305                  sga_transi_out(ib_nout)%ig_transi_out_id
02306 
02307               ! Coupling restart file
02308               sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%  &
02309                  sg_cpl_rst_file = sga_smioc_transi(ib_ntt2)%    &
02310                  sg_transi_in%sga_in_orig(ib_nin)%sg_cpl_rst_file
02311 
02312               il_cpl_rst_file_index = il_cpl_rst_file_index + 1
02313               ila_cpl_rst_file(il_cpl_rst_file_index,1) = ib_ntt
02314               ila_cpl_rst_file(il_cpl_rst_file_index,2) = ib_nout
02315               ila_cpl_rst_file(il_cpl_rst_file_index,3) = &
02316                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02317                  sga_in_orig(ib_nin)%sg_cpl_rst_file%ig_suffix
02318               ila_cpl_rst_file(il_cpl_rst_file_index,4) = &
02319                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02320                  sga_in_orig(ib_nin)%sg_cpl_rst_file%ig_file_format
02321               ila_cpl_rst_file(il_cpl_rst_file_index,5) = &
02322                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02323                  sga_in_orig(ib_nin)%sg_cpl_rst_file%ig_file_set 
02324               ila_cpl_rst_file(il_cpl_rst_file_index,6) = &
02325                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02326                  sga_in_orig(ib_nin)%sg_cpl_rst_file%ig_file_iomode
02327               ila_cpl_rst_file(il_cpl_rst_file_index,7) = &
02328                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02329                  sga_in_orig(ib_nin)%sg_cpl_rst_file%ig_file_pack
02330 
02331               dla_cpl_rst_file(il_cpl_rst_file_index,1) = &
02332                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02333                  sga_in_orig(ib_nin)%sg_cpl_rst_file%dg_file_scal
02334               dla_cpl_rst_file(il_cpl_rst_file_index,2) = &
02335                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02336                  sga_in_orig(ib_nin)%sg_cpl_rst_file%dg_file_add
02337               dla_cpl_rst_file(il_cpl_rst_file_index,3) = &
02338                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02339                  sga_in_orig(ib_nin)%sg_cpl_rst_file%dg_fill_val
02340 
02341               cla_cpl_rst_file(il_cpl_rst_file_index,1) = &
02342                  sga_smioc_transi(ib_ntt2)%sg_transi_in%  &
02343                  sga_in_orig(ib_nin)%sg_cpl_rst_file%cg_file_name
02344 
02345               ! Interpolation
02346               print *,' transfer de sg_interp de in vers out '
02347               IF (sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)% &
02348                  ig_dest_type .EQ. PSMILe_comp) THEN
02349 
02350                   sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%      &
02351                      sg_interp = sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02352                      sga_in_orig(ib_nin)%sg_interp
02353               print *,' ib_ntt ib_nout  ib_ntt2 ib_nin = ',ib_ntt,ib_nout,ib_ntt2,ib_nin 
02354 
02355                   il_trans_interp_index = il_trans_interp_index + 1
02356               print *,' il_trans_interp_index = ',il_trans_interp_index
02357               print *,' il_trans_dest_index = ',il_trans_dest_index
02358 
02359                   ila_trans_interp(il_trans_dest_index,1) = ib_ntt
02360                   ila_trans_interp(il_trans_dest_index,2) = ib_nout
02361                   ila_trans_interp(il_trans_dest_index,3) = &
02362                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02363                      sga_in_orig(ib_nin)%sg_interp%ig_interp_type 
02364                   ila_trans_interp(il_trans_dest_index,4:6) = &
02365                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02366                      sga_in_orig(ib_nin)%sg_interp%iga_arg1(1:3)
02367                   ila_trans_interp(il_trans_dest_index,7:9) = &
02368                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02369                      sga_in_orig(ib_nin)%sg_interp%iga_arg2(1:3)
02370                   ila_trans_interp(il_trans_dest_index,10:12) = &
02371                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02372                      sga_in_orig(ib_nin)%sg_interp%iga_arg3(1:3)
02373                   ila_trans_interp(il_trans_dest_index,13:15) = &
02374                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02375                      sga_in_orig(ib_nin)%sg_interp%iga_arg4(1:3)
02376                   ila_trans_interp(il_trans_dest_index,16:18) = &
02377                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02378                      sga_in_orig(ib_nin)%sg_interp%iga_arg5(1:3)
02379                   ila_trans_interp(il_trans_dest_index,19:21) = &
02380                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02381                      sga_in_orig(ib_nin)%sg_interp%iga_arg6(1:3)
02382                   ila_trans_interp(il_trans_dest_index,22:24) = &
02383                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02384                      sga_in_orig(ib_nin)%sg_interp%iga_arg7(1:3)
02385                   ila_trans_interp(il_trans_dest_index,25:27) = &
02386                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02387                      sga_in_orig(ib_nin)%sg_interp%iga_interp_meth(1:3)
02388 !JL sg_arg10 integer
02389                   ila_trans_interp(il_trans_dest_index,28) = &
02390                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02391                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%ig_suffix
02392                   ila_trans_interp(il_trans_dest_index,29) = &
02393                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02394                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%ig_file_format
02395                   ila_trans_interp(il_trans_dest_index,30) = &
02396                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02397                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%ig_file_set
02398                   ila_trans_interp(il_trans_dest_index,31) = &
02399                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02400                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%ig_file_iomode
02401                   ila_trans_interp(il_trans_dest_index,32) = &
02402                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02403                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%ig_file_pack
02404     
02405 
02406                   dla_trans_interp(il_trans_dest_index,1) = &
02407                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02408                      sga_in_orig(ib_nin)%sg_interp%dg_arg8 
02409 !JL sg_arg10 double precision
02410                   dla_trans_interp(il_trans_dest_index,2) = &
02411                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02412                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%dg_file_scal 
02413                   dla_trans_interp(il_trans_dest_index,3) = &
02414                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02415                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%dg_file_add 
02416                   dla_trans_interp(il_trans_dest_index,4) = &
02417                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02418                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%dg_fill_val 
02419 
02420 
02421                   cla_trans_interp(il_trans_dest_index,1) = &
02422                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02423                      sga_in_orig(ib_nin)%sg_interp%cg_arg9
02424 !JL sg_arg10 character
02425                   cla_trans_interp(il_trans_dest_index,2) = &
02426                      sga_smioc_transi(ib_ntt2)%sg_transi_in% &
02427                      sga_in_orig(ib_nin)%sg_interp%sg_arg10%cg_file_name
02428 
02429               END IF
02430 
02431               ! Conservation
02432               sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%ig_conserv =  &
02433                  sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02434                  ig_conserv 
02435 
02436               ila_cpl_rst_file(il_cpl_rst_file_index,8) =                    &
02437                  sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02438                  ig_conserv 
02439 
02440               ! Combination
02441               IF (sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02442                  sg_combi%ig_location == PSMILe_source) &
02443                  sga_smioc_transi(ib_ntt)%sga_transi_out(ib_nout)%sg_combi = &
02444                  sga_smioc_transi(ib_ntt2)%sg_transi_in%sga_in_orig(ib_nin)% &
02445                  sg_combi               
02446 
02447           ENDIF
02448 
02449         ENDDO
02450       ENDDO
02451 
02452     ENDDO
02453   ENDDO
02454 
02455   ila_dim_size(1) = il_orig_index
02456   ila_dim_size(2) = il_dest_index
02457   ila_dim_size(3) = il_loc_index
02458   ila_dim_size(4) = il_trans_orig_index
02459   ila_dim_size(5) = il_trans_dest_index
02460   ila_dim_size(6) = il_cpl_rst_file_index
02461   ila_dim_size(7) = il_trans_interp_index
02462 #ifdef VERBOSE
02463   PRINT *, '| | | '
02464   PRINT *, '| | |  Dimensions for post-treatment  ', ila_dim_size
02465   PRINT *, '| | |  Post-treatment  '
02466   call psmile_flushstd    
02467 #endif
02468   DO ib_c = 1, ig_nb_tot_comps
02469 
02470     ila_tgt_proc(:) = -1    
02471     il_nb_comp_pes = 0
02472 
02473 !   for all processes except driver processes
02474     DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
02475       IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
02476         DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
02477           IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
02478             il_nb_comp_pes = il_nb_comp_pes + 1
02479             ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
02480           END IF
02481         END DO
02482       END IF
02483     END DO
02484 
02485     DO ib = 1, il_nb_comp_pes
02486 
02487       CALL MPI_Send (ila_dim_size, 7, MPI_Integer, ila_tgt_proc(ib), 11, comm_drv_trans, id_err)
02488 
02489       IF (il_orig_index .gt. 0) THEN
02490           CALL MPI_Send (ila_orig_comp_id(1:il_orig_index,1:3), &
02491              il_orig_index*3, MPI_Integer, ila_tgt_proc(ib), 12, comm_drv_trans, id_err)
02492       END IF
02493 
02494       IF (il_dest_index .gt. 0) THEN
02495           CALL MPI_Send (ila_dest_comp_id(1:il_dest_index,1:3), &
02496              il_dest_index*3, MPI_Integer, ila_tgt_proc(ib), 13, comm_drv_trans, id_err)
02497       END IF
02498 
02499       IF (il_loc_index .gt. 0) THEN
02500           CALL MPI_Send (ila_combi_loc(1:il_loc_index,1:2), il_loc_index*2, &
02501              MPI_Integer, ila_tgt_proc(ib), 14, comm_drv_trans, id_err)
02502       END IF
02503 
02504       IF (il_trans_orig_index .gt. 0) THEN
02505           CALL MPI_Send (ila_trans_orig_id(1:il_trans_orig_index,1:3), &
02506              il_trans_orig_index*3, MPI_Integer, ila_tgt_proc(ib), 15, comm_drv_trans, id_err)
02507       END IF
02508 
02509       IF (il_trans_dest_index .gt. 0) THEN
02510           CALL MPI_Send (ila_trans_dest_id(1:il_trans_dest_index,1:3), &
02511              il_trans_dest_index*3, MPI_Integer, ila_tgt_proc(ib), 16, comm_drv_trans, id_err)
02512       END IF
02513 
02514       IF (il_cpl_rst_file_index .gt. 0) THEN
02515           CALL MPI_Send (ila_cpl_rst_file(1:il_cpl_rst_file_index,1:8), &
02516              il_cpl_rst_file_index*8, MPI_Integer, ila_tgt_proc(ib), 17, comm_drv_trans, id_err)
02517           CALL MPI_Send (dla_cpl_rst_file(1:il_cpl_rst_file_index,1:3), &
02518              il_cpl_rst_file_index*3, MPI_Double_Precision, ila_tgt_proc(ib), 18,      &
02519              comm_drv_trans, id_err)
02520           CALL MPI_Send (cla_cpl_rst_file(1:il_cpl_rst_file_index,1), &
02521              il_cpl_rst_file_index*max_name, MPI_Character, ila_tgt_proc(ib), 19, &
02522              comm_drv_trans, id_err)
02523       END IF
02524 
02525       IF (il_trans_interp_index .gt. 0) THEN
02526           CALL MPI_Send (ila_trans_interp(1:il_trans_interp_index,1:32),    &
02527              il_trans_interp_index*32, MPI_Integer, ila_tgt_proc(ib), 20, comm_drv_trans, &
02528              id_err)
02529           CALL MPI_Send (dla_trans_interp(1:il_trans_interp_index,1:4), &
02530              il_trans_interp_index*4, MPI_Double_Precision, ila_tgt_proc(ib), 21,     &
02531              comm_drv_trans, id_err)
02532           CALL MPI_Send (cla_trans_interp(1:il_trans_interp_index,1:2), &
02533              il_trans_interp_index*max_name*2, MPI_Character, ila_tgt_proc(ib), 22,   &
02534              comm_drv_trans, id_err)
02535       END IF
02536 
02537     END DO
02538 
02539   END DO
02540 
02541   IF (il_orig_index .gt. 0) THEN
02542       DEALLOCATE(ila_orig_comp_id, stat=id_err)
02543       IF (id_err > 0) THEN
02544           ierrp (1) = id_err
02545           id_err = 14
02546           
02547           call psmile_error_common ( id_err, 'ila_orig_comp_id', &
02548              ierrp, 1, __FILE__, __LINE__ )
02549           RETURN
02550       ENDIF
02551   END IF
02552   IF (il_dest_index .gt. 0) THEN
02553       DEALLOCATE(ila_dest_comp_id, stat=id_err)
02554       IF (id_err > 0) THEN
02555           ierrp (1) = id_err
02556           id_err = 14
02557           
02558           call psmile_error_common ( id_err, 'ila_dest_comp_id', &
02559              ierrp, 1, __FILE__, __LINE__ )
02560           RETURN
02561       ENDIF
02562   END IF
02563   IF (il_loc_index .gt. 0) THEN
02564       DEALLOCATE(ila_combi_loc, stat=id_err)
02565       IF (id_err > 0) THEN
02566           ierrp (1) = id_err
02567           id_err = 14
02568           
02569           call psmile_error_common ( id_err, 'ila_combi_loc', &
02570              ierrp, 1, __FILE__, __LINE__ )
02571           RETURN
02572       ENDIF
02573   END IF
02574   IF (il_trans_orig_index .gt. 0) THEN
02575       DEALLOCATE(ila_trans_orig_id, stat=id_err)
02576       IF (id_err > 0) THEN
02577           ierrp (1) = id_err
02578           id_err = 14
02579           
02580           call psmile_error_common ( id_err, 'ila_trans_orig_id', &
02581              ierrp, 1, __FILE__, __LINE__ )
02582           RETURN
02583       ENDIF
02584       DEALLOCATE(ila_combi_loc, stat=id_err)
02585       IF (id_err > 0) THEN
02586           ierrp (1) = id_err
02587           id_err = 14
02588           
02589           call psmile_error_common ( id_err, 'ila_combi_loc', &
02590              ierrp, 1, __FILE__, __LINE__ )
02591           RETURN
02592       ENDIF
02593   END IF
02594   IF (il_trans_dest_index .gt. 0) THEN
02595       DEALLOCATE(ila_trans_dest_id, stat=id_err)
02596       IF (id_err > 0) THEN
02597           ierrp (1) = id_err
02598           id_err = 14
02599           
02600           call psmile_error_common ( id_err, 'ila_trans_dest_id', &
02601              ierrp, 1, __FILE__, __LINE__ )
02602           RETURN
02603       ENDIF
02604   END IF
02605   IF (il_cpl_rst_file_index .gt. 0) THEN
02606       DEALLOCATE(ila_cpl_rst_file, dla_cpl_rst_file, cla_cpl_rst_file, stat=id_err)
02607       IF (id_err > 0) THEN
02608           ierrp (1) = id_err
02609           id_err = 14
02610           
02611           call psmile_error_common ( id_err, 'ila_cpl_rst_file', &
02612              ierrp, 1, __FILE__, __LINE__ )
02613           RETURN
02614       ENDIF
02615   END IF
02616   IF (il_trans_interp_index .gt. 0) THEN
02617       DEALLOCATE(ila_trans_interp, dla_trans_interp, cla_trans_interp, stat=id_err)
02618       IF (id_err > 0) THEN
02619           ierrp (1) = id_err
02620           id_err = 14
02621           
02622           call psmile_error_common ( id_err, 'ila_trans_interp', &
02623              ierrp, 1, __FILE__, __LINE__ )
02624           RETURN
02625       ENDIF
02626   END IF
02627 !
02628 #ifdef VERBOSE
02629   PRINT *, '| | | '
02630   PRINT *, '| | |  Got transient details  '
02631   call psmile_flushstd    
02632 #endif
02633 !
02634 !-----------------------------------------------------------------------
02635 !
02636 ! 7. get the persistents details
02637 !
02638 #ifdef VERBOSE
02639   PRINT *, '| | | '
02640   PRINT *, '| | | Get persistent details  '
02641   call psmile_flushstd    
02642 #endif
02643 ! 7.1. Set the counter    
02644   il_npe = 0 
02645   
02646   DO ib_c = 1, ig_nb_tot_comps
02647   
02648     IF (iga_comp_nb_persis(ib_c) .gt. 0) THEN
02649 
02650 ! 7.2. allocate the local structure
02651         ALLOCATE (sla_driver_persis(iga_comp_nb_persis(ib_c)), stat=id_err)
02652         IF (id_err > 0) THEN
02653             ierrp (1) = id_err
02654             ierrp (2) = iga_comp_nb_persis(ib_c)
02655             id_err = 13
02656         
02657             call psmile_error_common ( id_err, 'sla_driver_persis', &
02658                ierrp, 2, __FILE__, __LINE__ )
02659             RETURN
02660         ENDIF
02661   
02662 ! 7.3. fill the local structure for a smioc
02663         CALL init_persis (iga_comp_nb_persis(ib_c), &
02664            sla_driver_persis,  &
02665            id_err )
02666         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in init_persis'
02667    
02668         CALL get_persis_details (iga_comp_id_doc_XML(ib_c),   &
02669            iga_comp_nb_persis(ib_c), &
02670            sla_driver_persis,        &
02671            id_err )
02672         IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in get_persis_details'
02673   
02674 ! 3.5. send the structure to the component
02675         ALLOCATE(ila_smioc_send(4*iga_comp_nb_persis(ib_c)), stat=id_err)
02676         IF (id_err > 0) THEN
02677             ierrp (1) = id_err
02678             ierrp (2) = 4*iga_comp_nb_persis(ib_c)
02679             id_err = 13
02680         
02681             call psmile_error_common ( id_err, 'ila_smioc_send', &
02682                ierrp, 2, __FILE__, __LINE__ )
02683             RETURN
02684         ENDIF
02685         ALLOCATE(cla_smioc_send(5*iga_comp_nb_persis(ib_c)), stat=id_err)
02686         IF (id_err > 0) THEN
02687             ierrp (1) = id_err
02688             ierrp (2) = 5*iga_comp_nb_persis(ib_c)
02689             id_err = 13
02690         
02691             call psmile_error_common ( id_err, 'cla_smioc_send', &
02692                ierrp, 2, __FILE__, __LINE__ )
02693             RETURN
02694         ENDIF
02695         ALLOCATE(rla_smioc_send(3*iga_comp_nb_persis(ib_c)), stat=id_err)
02696         IF (id_err > 0) THEN
02697             ierrp (1) = id_err
02698             ierrp (2) = 3*iga_comp_nb_persis(ib_c)
02699             id_err = 13
02700         
02701             call psmile_error_common ( id_err, 'rla_smioc_send', &
02702                ierrp, 2, __FILE__, __LINE__ )
02703             RETURN
02704         ENDIF
02705 
02706         DO ib = 1, iga_comp_nb_persis(ib_c)
02707           
02708           ila_smioc_send(1 + (ib-1)*4) = sla_driver_persis(ib)%ig_comp_id
02709           ila_smioc_send(2 + (ib-1)*4) = sla_driver_persis(ib)%ig_persis_id
02710           ila_smioc_send(3 + (ib-1)*4) = sla_driver_persis(ib)%ig_persis_type
02711           ila_smioc_send(4 + (ib-1)*4) = sla_driver_persis(ib)%ig_datatype 
02712 
02713           cla_smioc_send(1 + (ib-1)*5) = sla_driver_persis(ib)%cg_local_name
02714           cla_smioc_send(2 + (ib-1)*5) = sla_driver_persis(ib)%cg_stand_name
02715           cla_smioc_send(3 + (ib-1)*5) = sla_driver_persis(ib)%cg_long_name
02716           cla_smioc_send(4 + (ib-1)*5) = sla_driver_persis(ib)%cg_comp_name
02717           cla_smioc_send(5 + (ib-1)*5) = sla_driver_persis(ib)%cg_units
02718 
02719           rla_smioc_send(1 + (ib-1)*3) = sla_driver_persis(ib)%rg_persis_min
02720           rla_smioc_send(2 + (ib-1)*3) = sla_driver_persis(ib)%rg_persis_max
02721           rla_smioc_send(3 + (ib-1)*3) = sla_driver_persis(ib)%rg_persis
02722 
02723         END DO
02724 
02725 
02726         ila_tgt_proc(:) = -1    
02727         il_nb_comp_pes = 0
02728 !       for all processes except driver processes
02729         DO ib = 0, ig_nb_tot_pes + (ig_driver_nb_pes-1)
02730           IF ((ib < PRISMdrv_root) .OR. ((PRISMdrv_root + ig_driver_nb_pes) <= ib)) THEN
02731            DO ib_ter = 1, Drv_Procs(ib+1)%comps_per_rank
02732               IF (Drv_Procs(ib+1)%global_comp_id(ib_ter) .eq. ib_c) THEN
02733                  il_nb_comp_pes = il_nb_comp_pes + 1
02734                  ila_tgt_proc(il_nb_comp_pes) = Drv_Procs(ib+1)%global_rank(ib_ter)
02735               END IF
02736            END DO
02737           END IF
02738         END DO
02739 
02740         DO ib = 1, il_nb_comp_pes
02741           
02742           CALL MPI_Send (ila_smioc_send, 4*iga_comp_nb_persis(ib_c), &
02743              MPI_Integer, ila_tgt_proc(ib), 30, comm_drv_trans, id_err)
02744 
02745           CALL MPI_Send (cla_smioc_send, max_name*5*iga_comp_nb_persis(ib_c), &
02746              MPI_Character, ila_tgt_proc(ib), 31, comm_drv_trans, id_err)
02747 
02748           CALL MPI_Send (rla_smioc_send, 3*iga_comp_nb_persis(ib_c), &
02749              MPI_Real, ila_tgt_proc(ib), 32, comm_drv_trans, id_err)
02750 #ifdef VERBOSE
02751           CALL PRISMDrv_Get_smioc_file_name(ib_c, cla_file_name, &
02752              il_length, id_err)
02753           PRINT *, '| | | The transfer of smioc information from file ', &
02754              TRIM(cla_file_name), ' to pes ',ila_tgt_proc(ib), ' ends.'
02755 #endif
02756         END DO
02757 
02758         DEALLOCATE(ila_smioc_send, stat=id_err)
02759         IF (id_err > 0) THEN
02760             ierrp (1) = id_err
02761             id_err = 14
02762           
02763             call psmile_error_common ( id_err, 'ila_smioc_send', &
02764                ierrp, 1, __FILE__, __LINE__ )
02765             RETURN
02766         ENDIF
02767         DEALLOCATE(cla_smioc_send, stat=id_err)
02768         IF (id_err > 0) THEN
02769             ierrp (1) = id_err
02770             id_err = 14
02771           
02772             call psmile_error_common ( id_err, 'cla_smioc_send', &
02773                ierrp, 1, __FILE__, __LINE__ )
02774             RETURN
02775         ENDIF
02776         DEALLOCATE(rla_smioc_send, stat=id_err)
02777         IF (id_err > 0) THEN
02778             ierrp (1) = id_err
02779             id_err = 14
02780           
02781             call psmile_error_common ( id_err, 'rla_smioc_send', &
02782                ierrp, 1, __FILE__, __LINE__ )
02783             RETURN
02784         ENDIF
02785 
02786 ! 7.4. set the component id and the persistent id 
02787         sla_driver_persis(:)%ig_comp_id = ib_c
02788         DO ib_p = 1, iga_comp_nb_persis(ib_c)
02789           ib_a = il_npe+ib_p
02790           sla_driver_persis(ib_p)%ig_persis_id = ib_a 
02791         ENDDO
02792   
02793 ! 7.5. Set the global structure with the local structure
02794         sga_smioc_persis(il_npe+1:il_npe+iga_comp_nb_persis(ib_c)) = &
02795            sla_driver_persis(:)
02796   
02797         il_npe = il_npe + iga_comp_nb_persis(ib_c)
02798   
02799 ! 7.6 Deallocate the local structure
02800         DEALLOCATE(sla_driver_persis, stat=id_err)
02801         IF (id_err > 0) THEN
02802             ierrp (1) = id_err
02803             id_err = 14
02804           
02805             call psmile_error_common ( id_err, 'sla_driver_persis', &
02806                ierrp, 1, __FILE__, __LINE__ )
02807             RETURN
02808         ENDIF
02809 
02810     END IF
02811 
02812   END DO
02813 #ifdef VERBOSE
02814   PRINT *, '| | | '
02815   PRINT *, '| | | The total number of persistents : ', il_npe
02816   call psmile_flushstd    
02817 #endif
02818 !
02819 !-----------------------------------------------------------------------
02820 !
02821 ! 8. Close all SMIOC files
02822 !
02823   DO ib_c = 1, ig_nb_tot_comps
02824      ierrp (1)  = sasa_c_close  (iga_comp_id_doc_XML(ib_c))
02825   END DO
02826 !
02827 !-----------------------------------------------------------------------
02828 #ifdef DEBUG
02829 !
02830 ! 9. Write the different structures
02831 !
02832   OPEN (file='driver_smioc.debug.000', unit=28, form='formatted')
02833 !
02834 ! 9.1. Write the grid structure
02835   IF (ig_nb_tot_grids .gt. 0) THEN
02836       CALL write_grids_details (ig_nb_tot_grids,  &
02837          sga_smioc_grids, 28, id_err )
02838       IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in write_grids_details'
02839   END IF
02840   
02841 ! 9.2. Write the transient structure
02842   IF (ig_nb_tot_transi .gt. 0) THEN
02843       CALL write_transi_details (ig_nb_tot_transi,  &
02844          sga_smioc_transi, 28, id_err )
02845       IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in write_transi_details'
02846   END IF
02847 
02848 ! 9.3. Write the persistent structure
02849   IF (ig_nb_tot_persis .gt. 0) THEN
02850       CALL write_persis_details (ig_nb_tot_persis,  &
02851          sga_smioc_persis, 28, id_err )
02852       IF (id_err .ne. 0) PRINT *, '| | |WARNING: Pb in write_persis_details'
02853   END IF
02854 !
02855   CLOSE (unit=28)
02856 !
02857 #endif
02858 !
02859 !
02860 #ifdef VERBOSE
02861   PRINT *, '| | | '
02862   PRINT *, '| | Quit PRISMDrv_init_smioc_struct'
02863   PRINT *, '| |'
02864   call psmile_flushstd
02865 #endif
02866 END SUBROUTINE PRISMDrv_init_smioc_struct
02867 
02868 
02869 
02870 

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1