Index: LMDZ6/trunk/libf/phylmd/mo_simple_plumes.F90
===================================================================
--- LMDZ6/trunk/libf/phylmd/mo_simple_plumes.F90	(revision 3294)
+++ LMDZ6/trunk/libf/phylmd/mo_simple_plumes.F90	(revision 3295)
@@ -36,4 +36,5 @@
   LOGICAL, SAVE ::                             &
        sp_initialized = .FALSE.                  !< parameter determining whether input needs to be read
+!$OMP THREADPRIVATE(sp_initialized)
 
   REAL ::                                      &
@@ -57,4 +58,6 @@
        year_weight    (nyears,nplumes)        ,& !< Yearly weight for plume
        ann_cycle      (nfeatures,ntimes,nplumes) !< annual cycle for plume feature
+!$OMP THREADPRIVATE(plume_lat,plume_lon,beta_a,beta_b,aod_spmx,aod_fmbg,asy550,ssa550,angstrom)
+!$OMP THREADPRIVATE(sig_lon_E,sig_lon_W,sig_lat_E,sig_lat_W,theta,ftr_weight,year_weight,ann_cycle)
 
   PUBLIC sp_aop_profile
@@ -68,4 +71,7 @@
   SUBROUTINE sp_setup
     !
+    USE mod_phys_lmdz_mpi_data, ONLY: is_mpi_root
+    USE mod_phys_lmdz_omp_data, ONLY: is_omp_root
+    !
     ! ---------- 
     !
@@ -73,86 +79,109 @@
     !
     ! ---------- 
-    !    
-    iret = nf90_open("MACv2.0-SP_v1.nc", NF90_NOWRITE, ncid)
-    IF (iret /= NF90_NOERR) STOP 'NetCDF File not opened'
-    !
-    ! read dimensions and make sure file conforms to expected size
-    !
-    iret = nf90_inq_dimid(ncid, "plume_number"  , DimId)
-    iret = nf90_inquire_dimension(ncid, DimId, len = xdmy)
-    IF (xdmy /= nplumes) STOP 'NetCDF improperly dimensioned -- plume_number'
-
-    iret = nf90_inq_dimid(ncid, "plume_feature", DimId)
-    iret = nf90_inquire_dimension(ncid, DimId, len = xdmy)
-    IF (xdmy /= nfeatures) STOP 'NetCDF improperly dimensioned -- plume_feature'
-
-    iret = nf90_inq_dimid(ncid, "year_fr"   , DimId)
-    iret = nf90_inquire_dimension(ncid, DimID, len = xdmy)
-    IF (xdmy /= ntimes) STOP 'NetCDF improperly dimensioned -- year_fr'
-
-    iret = nf90_inq_dimid(ncid, "years"   , DimId)
-    iret = nf90_inquire_dimension(ncid, DimID, len = xdmy)
-    IF (xdmy /= nyears) STOP 'NetCDF improperly dimensioned -- years'
-    !
-    ! read variables that define the simple plume climatology
-    !
-    iret = nf90_inq_varid(ncid, "plume_lat", VarId)
-    iret = nf90_get_var(ncid, VarID, plume_lat(:), start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lat'
-    iret = nf90_inq_varid(ncid, "plume_lon", VarId)
-    iret = nf90_get_var(ncid, VarID, plume_lon(:), start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lon'
-    iret = nf90_inq_varid(ncid, "beta_a"   , VarId)
-    iret = nf90_get_var(ncid, VarID, beta_a(:)   , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading beta_a'
-    iret = nf90_inq_varid(ncid, "beta_b"   , VarId)
-    iret = nf90_get_var(ncid, VarID, beta_b(:)   , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading beta_b'
-    iret = nf90_inq_varid(ncid, "aod_spmx" , VarId)
-    iret = nf90_get_var(ncid, VarID, aod_spmx(:)  , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading aod_spmx'
-    iret = nf90_inq_varid(ncid, "aod_fmbg" , VarId)
-    iret = nf90_get_var(ncid, VarID, aod_fmbg(:)  , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading aod_fmbg'
-    iret = nf90_inq_varid(ncid, "ssa550"   , VarId)
-    iret = nf90_get_var(ncid, VarID, ssa550(:)  , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading ssa550'
-    iret = nf90_inq_varid(ncid, "asy550"   , VarId)
-    iret = nf90_get_var(ncid, VarID, asy550(:)  , start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading asy550'
-    iret = nf90_inq_varid(ncid, "angstrom" , VarId)
-    iret = nf90_get_var(ncid, VarID, angstrom(:), start=(/1/),count=(/nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading angstrom'
-
-    iret = nf90_inq_varid(ncid, "sig_lat_W"     , VarId)
-    iret = nf90_get_var(ncid, VarID, sig_lat_W(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lat_W'
-    iret = nf90_inq_varid(ncid, "sig_lat_E"     , VarId)
-    iret = nf90_get_var(ncid, VarID, sig_lat_E(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lat_E'
-    iret = nf90_inq_varid(ncid, "sig_lon_E"     , VarId)
-    iret = nf90_get_var(ncid, VarID, sig_lon_E(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lon_E'
-    iret = nf90_inq_varid(ncid, "sig_lon_W"     , VarId)
-    iret = nf90_get_var(ncid, VarID, sig_lon_W(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lon_W'
-    iret = nf90_inq_varid(ncid, "theta"         , VarId)
-    iret = nf90_get_var(ncid, VarID, theta(:,:)        , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading theta'
-    iret = nf90_inq_varid(ncid, "ftr_weight"    , VarId)
-    iret = nf90_get_var(ncid, VarID, ftr_weight(:,:)   , start=(/1,1/),count=(/nfeatures,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lat'
-    iret = nf90_inq_varid(ncid, "year_weight"   , VarId)
-    iret = nf90_get_var(ncid, VarID, year_weight(:,:)  , start=(/1,1/),count=(/nyears,nplumes   /))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading year_weight'
-    iret = nf90_inq_varid(ncid, "ann_cycle"     , VarId)
-    iret = nf90_get_var(ncid, VarID, ann_cycle(:,:,:)  , start=(/1,1,1/),count=(/nfeatures,ntimes,nplumes/))
-    IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading ann_cycle'
-
-    iret = nf90_close(ncid)
-
+    !--only one processor reads the input data
+    IF (is_mpi_root.AND.is_omp_root) THEN
+       !    
+       iret = nf90_open("MACv2.0-SP_v1.nc", NF90_NOWRITE, ncid)
+       IF (iret /= NF90_NOERR) STOP 'NetCDF File not opened'
+       !
+       ! read dimensions and make sure file conforms to expected size
+       !
+       iret = nf90_inq_dimid(ncid, "plume_number"  , DimId)
+       iret = nf90_inquire_dimension(ncid, DimId, len = xdmy)
+       IF (xdmy /= nplumes) STOP 'NetCDF improperly dimensioned -- plume_number'
+       !
+       iret = nf90_inq_dimid(ncid, "plume_feature", DimId)
+       iret = nf90_inquire_dimension(ncid, DimId, len = xdmy)
+       IF (xdmy /= nfeatures) STOP 'NetCDF improperly dimensioned -- plume_feature'
+       !
+       iret = nf90_inq_dimid(ncid, "year_fr"   , DimId)
+       iret = nf90_inquire_dimension(ncid, DimID, len = xdmy)
+       IF (xdmy /= ntimes) STOP 'NetCDF improperly dimensioned -- year_fr'
+       !
+       iret = nf90_inq_dimid(ncid, "years"   , DimId)
+       iret = nf90_inquire_dimension(ncid, DimID, len = xdmy)
+       IF (xdmy /= nyears) STOP 'NetCDF improperly dimensioned -- years'
+       !
+       ! read variables that define the simple plume climatology
+       !
+       iret = nf90_inq_varid(ncid, "plume_lat", VarId)
+       iret = nf90_get_var(ncid, VarID, plume_lat(:), start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lat'
+       iret = nf90_inq_varid(ncid, "plume_lon", VarId)
+       iret = nf90_get_var(ncid, VarID, plume_lon(:), start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lon'
+       iret = nf90_inq_varid(ncid, "beta_a"   , VarId)
+       iret = nf90_get_var(ncid, VarID, beta_a(:)   , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading beta_a'
+       iret = nf90_inq_varid(ncid, "beta_b"   , VarId)
+       iret = nf90_get_var(ncid, VarID, beta_b(:)   , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading beta_b'
+       iret = nf90_inq_varid(ncid, "aod_spmx" , VarId)
+       iret = nf90_get_var(ncid, VarID, aod_spmx(:)  , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading aod_spmx'
+       iret = nf90_inq_varid(ncid, "aod_fmbg" , VarId)
+       iret = nf90_get_var(ncid, VarID, aod_fmbg(:)  , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading aod_fmbg'
+       iret = nf90_inq_varid(ncid, "ssa550"   , VarId)
+       iret = nf90_get_var(ncid, VarID, ssa550(:)  , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading ssa550'
+       iret = nf90_inq_varid(ncid, "asy550"   , VarId)
+       iret = nf90_get_var(ncid, VarID, asy550(:)  , start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading asy550'
+       iret = nf90_inq_varid(ncid, "angstrom" , VarId)
+       iret = nf90_get_var(ncid, VarID, angstrom(:), start=(/1/),count=(/nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading angstrom'
+       !
+       iret = nf90_inq_varid(ncid, "sig_lat_W"     , VarId)
+       iret = nf90_get_var(ncid, VarID, sig_lat_W(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lat_W'
+       iret = nf90_inq_varid(ncid, "sig_lat_E"     , VarId)
+       iret = nf90_get_var(ncid, VarID, sig_lat_E(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lat_E'
+       iret = nf90_inq_varid(ncid, "sig_lon_E"     , VarId)
+       iret = nf90_get_var(ncid, VarID, sig_lon_E(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lon_E'
+       iret = nf90_inq_varid(ncid, "sig_lon_W"     , VarId)
+       iret = nf90_get_var(ncid, VarID, sig_lon_W(:,:)    , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading sig_lon_W'
+       iret = nf90_inq_varid(ncid, "theta"         , VarId)
+       iret = nf90_get_var(ncid, VarID, theta(:,:)        , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading theta'
+       iret = nf90_inq_varid(ncid, "ftr_weight"    , VarId)
+       iret = nf90_get_var(ncid, VarID, ftr_weight(:,:)   , start=(/1,1/),count=(/nfeatures,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading plume_lat'
+       iret = nf90_inq_varid(ncid, "year_weight"   , VarId)
+       iret = nf90_get_var(ncid, VarID, year_weight(:,:)  , start=(/1,1/),count=(/nyears,nplumes   /))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading year_weight'
+       iret = nf90_inq_varid(ncid, "ann_cycle"     , VarId)
+       iret = nf90_get_var(ncid, VarID, ann_cycle(:,:,:)  , start=(/1,1,1/),count=(/nfeatures,ntimes,nplumes/))
+       IF (iret /= NF90_NOERR) STOP 'NetCDF Error reading ann_cycle'
+       !
+       iret = nf90_close(ncid)
+       !
+    ENDIF !--root processor
+    !
+    CALL bcast(plume_lat)
+    CALL bcast(plume_lon)
+    CALL bcast(beta_a)
+    CALL bcast(beta_b)
+    CALL bcast(aod_spmx)
+    CALL bcast(aod_fmbg)
+    CALL bcast(asy550)
+    CALL bcast(ssa550)
+    CALL bcast(angstrom)
+    CALL bcast(sig_lon_E)
+    CALL bcast(sig_lon_W)
+    CALL bcast(sig_lat_E)
+    CALL bcast(sig_lat_W)
+    CALL bcast(theta)
+    CALL bcast(ftr_weight)
+    CALL bcast(year_weight)
+    CALL bcast(ann_cycle)
+    !
     sp_initialized = .TRUE.
-
+    !
     RETURN
+    !
   END SUBROUTINE sp_setup
   !
