prismdrv_init.F90

Go to the documentation of this file.
00001 !------------------------------------------------------------------------
00002 ! Copyright 2006-2010, CERFACS, Toulouse, France.
00003 ! All rights reserved. Use is subject to OASIS4 license terms.
00004 !-----------------------------------------------------------------------
00005 !BOP
00006 !
00007 ! !ROUTINE: PRISMDrv_Init
00008 !
00009 ! !INTERFACE
00010 subroutine prismdrv_init(id_err)
00011 
00012 !
00013 ! !USES:
00014 !
00015   USE PRISMDrv, dummy_interface => PRISMDrv_Init
00016 !
00017 
00018   IMPLICIT NONE
00019 !
00020 ! !PARAMETERS:
00021 !
00022 
00023 !
00024 ! ! RETURN VALUE
00025 !
00026   INTEGER, INTENT (Out)               :: id_err   ! error value
00027 
00028 ! !DESCRIPTION
00029 ! Subroutine "PRISMDrv_Init" initializes the MPI context of the driver 
00030 ! application and open the dedicated local output files
00031 !
00032 ! !REVISED HISTORY
00033 !   Date      Programmer   Description
00034 ! ----------  ----------   -----------
00035 ! 03/10/2002  D. Declat    Creation
00036 !
00037 ! EOP
00038 !----------------------------------------------------------------------
00039 ! $Id: prismdrv_init.F90 2791 2010-12-01 16:37:57Z hanke $
00040 ! $Author: hanke $
00041 !----------------------------------------------------------------------
00042 !
00043 ! Local declarations
00044 !
00045   CHARACTER(LEN=len_cvs_string), SAVE  :: mycvs = 
00046      '$Id: prismdrv_init.F90 2791 2010-12-01 16:37:57Z hanke $'
00047 
00048   LOGICAL                             :: ll_flag
00049 
00050   INTEGER, PARAMETER                  :: nerrp=2
00051   INTEGER                             :: ierrp(nerrp)
00052 
00053   INTEGER                             :: il_length, il_ndibuf
00054   INTEGER, DIMENSION(:), ALLOCATABLE  :: ila_ibuf  
00055 
00056   INTEGER                             :: il_pos = 0
00057 
00058 ! ---------------------------------------------------------------------
00059 !
00060 !
00061 ! 0. Initialisation of constants (see also subroutine prism_init)
00062 !
00063       real_pi = atan (1.0) * 4.0
00064       real_pi2 = 2.0 * real_pi
00065       real_pih = real_pi * 0.5
00066       real_deg2rad = real_pi / 180.0
00067 !
00068       dble_pi = atan (1.0d0) * 4.0d0
00069       dble_pi2 = 2.0d0 * dble_pi
00070       dble_pih = dble_pi * 0.5d0
00071       dble_deg2rad = dble_pi / 180.0d0
00072 !
00073 ! 0.1 Initialisation of variables contained in PRISMDrv module
00074 !
00075       ig_nbtot_ranksets = 0 
00076       sga_experiment_start_date%second = 0.0d0
00077       sga_experiment_start_date%minute = 0
00078       sga_experiment_start_date%hour   = 0
00079       sga_experiment_start_date%day    = 0
00080       sga_experiment_start_date%month  = 0
00081       sga_experiment_start_date%year   = 0
00082       sga_experiment_end_date%second = 0.0d0
00083       sga_experiment_end_date%minute = 0
00084       sga_experiment_end_date%hour   = 0
00085       sga_experiment_end_date%day    = 0
00086       sga_experiment_end_date%month  = 0
00087       sga_experiment_end_date%year   = 0
00088       sga_run_start_date%second = 0.0d0
00089       sga_run_start_date%minute = 0
00090       sga_run_start_date%hour   = 0
00091       sga_run_start_date%day    = 0
00092       sga_run_start_date%month  = 0
00093       sga_run_start_date%year   = 0
00094       sga_run_end_date%second = 0.0d0
00095       sga_run_end_date%minute = 0
00096       sga_run_end_date%hour   = 0
00097       sga_run_end_date%day    = 0
00098       sga_run_end_date%month  = 0
00099       sga_run_end_date%year   = 0
00100 !
00101       ig_driver_nb_pes  = 0
00102       ig_nb_appl        = 0
00103       ig_nb_tot_pes     = 0    
00104       ig_nb_tot_hosts   = 0   
00105       ig_nb_tot_comps   = 0   
00106       ig_nb_tot_args    = 0  
00107 !
00108       ig_nb_tot_unitsets= 0 
00109       ig_nb_tot_grids   = 0 
00110       ig_nb_tot_transi  = 0 
00111       ig_nb_tot_persis  = 0 
00112 !
00113       ig_MPI            = 0
00114       comm_drv_global   = 0    
00115       comm_drv_local    = 0   
00116       comm_drv_psmile   = 0   
00117       driver_rank       = -1
00118       comm_drv_trans    = 0
00119 !
00120       Number_of_Grids_drv       = 0       
00121       Number_of_Epios_allocated = 0 
00122       Number_of_comms           = 0      
00123       Number_of_Interps         = 0      
00124       Number_of_Transfs         = 0 
00125       Number_of_Exchanges       = 0 
00126 !
00127 !
00128 ! 1. Initialize MPI
00129 !
00130   CALL MPI_Initialized ( ll_flag, id_err )
00131 
00132   IF (.NOT. ll_flag) THEN
00133         
00134       CALL MPI_Init (id_err)
00135 
00136       IF ( id_err /= MPI_SUCCESS ) THEN
00137           ierrp (1) = id_err
00138 !          CALL PSMILe_Error_Common ( PRISM_Error_MPI, 'MPI_Init', &
00139 !             ierrp, 1, __FILE__, __LINE__ )
00140           RETURN
00141       ENDIF
00142 
00143   ENDIF
00144 
00145   Appl%name = 'driver'
00146 
00147   CALL MPI_COMM_RANK ( MPI_COMM_WORLD, Appl%rank, id_err )
00148   
00149   IF ( id_err /= MPI_SUCCESS ) THEN
00150       ierrp (1) = id_err
00151       call psmile_error_common ( PRISM_Error_MPI, 'MPI_Comm_rank', &
00152          ierrp, 1, __FILE__, __LINE__ )
00153       RETURN
00154   ENDIF
00155 
00156 ! determine PRISMdrv_root
00157   CALL MPI_ALLREDUCE(Appl%rank, PRISMdrv_root, 1, MPI_Integer, MPI_MIN, MPI_COMM_WORLD, id_err)
00158 
00159   IF ( id_err /= MPI_SUCCESS ) THEN
00160       ierrp (1) = id_err
00161       call psmile_error_common ( PRISM_Error_MPI, 'MPI_Allreduce', &
00162          ierrp, 1, __FILE__, __LINE__ )
00163       RETURN
00164   ENDIF
00165 
00166 !
00167 ! 2. Open local output files
00168 !
00169   il_length = 6
00170   length_of_integer = BIT_SIZE (datatypes2mpi (1)) / 8
00171   il_ndibuf = il_length / length_of_integer + 1
00172 
00173   ALLOCATE (ila_ibuf(1:il_ndibuf), STAT = id_err)
00174   IF ( id_err > 0 ) THEN
00175       ierrp (1) = id_err
00176       ierrp (2) = il_ndibuf
00177       call psmile_error_common ( PRISM_Error_Alloc, 'ila_ibuf', &
00178          ierrp, 2, __FILE__, __LINE__ )
00179       RETURN
00180   ENDIF
00181 
00182 #ifdef NAG_COMPILER
00183          call psmile_redirstdout ( 'driver', il_length, &
00184                                    1,  Appl%rank, Appl%size, id_err)
00185 #else
00186   call psmile_char2buf(ila_ibuf, il_ndibuf, il_pos, 'driver')
00187   call psmile_redirstdout(ila_ibuf, il_length, 1, Appl%rank, Appl%size, id_err)
00188 #endif
00189 !
00190 #ifdef VERBOSE
00191   PRINT *, '|'
00192   PRINT *, '| Enter PRISMDrv_Init'
00193 
00194   PRINT *, '| Quit PRISMDrv_Init'
00195   PRINT *, '|'
00196   call psmile_flushstd
00197 #endif
00198 END SUBROUTINE PRISMDrv_Init
00199 
00200 

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1