Ignore:
Timestamp:
Mar 14, 2019, 10:34:31 AM (6 years ago)
Author:
Laurent Fairhead
Message:

Further modifications for DYNAMICO/LMDZ convergence. These are based
on Yann's LMDZ6_V2 sources. Compiles on irene and converges with revision 3459
in a bucket configuration
YM/LF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/cpl_mod.F90

    r3448 r3465  
    9797  !$OMP THREADPRIVATE(cpl_atm_co22D)
    9898
     99!!!!!!!!!! variable for calving
     100  INTEGER, PARAMETER :: nb_zone_calving = 3
     101  REAL,ALLOCATABLE, DIMENSION(:,:,:),SAVE :: area_calving
     102  !$OMP THREADPRIVATE(area_calving)
     103  REAL,ALLOCATABLE, DIMENSION(:,:),SAVE :: cell_area2D
     104  !$OMP THREADPRIVATE(cell_area2D)
     105  INTEGER, SAVE :: ind_calving(nb_zone_calving)
     106  !$OMP THREADPRIVATE(ind_calving)
     107
     108  LOGICAL,SAVE :: cpl_old_calving
     109  !$OMP THREADPRIVATE(cpl_old_calving)
     110 
    99111CONTAINS
    100112!
     
    105117    USE surface_data
    106118    USE indice_sol_mod
    107     USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid1dTo2d_glo
     119    USE mod_grid_phy_lmdz, ONLY : nbp_lon, nbp_lat, grid1dTo2d_glo, klon_glo, grid_type, unstructured, regular_lonlat
    108120    USE time_phylmdz_mod, ONLY: annee_ref, day_ini, itau_phy, itaufin_phy
    109121    USE print_control_mod, ONLY: lunout
     122    USE geometry_mod, ONLY : longitude_deg, latitude_deg, ind_cell_glo, cell_area
     123    USE ioipsl_getin_p_mod, ONLY: getin_p
    110124
    111125! Input arguments
     
    127141    CHARACTER(len = 80)               :: abort_message
    128142    CHARACTER(len=80)                 :: clintocplnam, clfromcplnam
     143    REAL, DIMENSION(klon_mpi)         :: rlon_mpi, rlat_mpi, cell_area_mpi
     144    INTEGER, DIMENSION(klon_mpi)           :: ind_cell_glo_mpi
     145    REAL, DIMENSION(nbp_lon,jj_nb)         :: lon2D, lat2D
     146    INTEGER :: mask_calving(nbp_lon,jj_nb,nb_zone_calving)
     147    REAL :: pos
     148
     149!***************************************
     150! Use old calving or not (default no)
     151    cpl_old_calving=.FALSE.
     152    CALL getin_p("cpl_old_calving",cpl_old_calving)
     153
    129154
    130155!*************************************************************************************
     
    208233    ENDIF
    209234
     235! calving initialization
     236    ALLOCATE(area_calving(nbp_lon, jj_nb, nb_zone_calving), stat = error)
     237    sum_error = sum_error + error
     238    ALLOCATE(cell_area2D(nbp_lon, jj_nb), stat = error)   
     239    sum_error = sum_error + error
     240
     241
     242    CALL gather_omp(longitude_deg,rlon_mpi)
     243    CALL gather_omp(latitude_deg,rlat_mpi)
     244    CALL gather_omp(ind_cell_glo,ind_cell_glo_mpi)
     245    CALL gather_omp(cell_area,cell_area_mpi)
     246     
     247    IF (is_omp_master) THEN
     248      CALL Grid1DTo2D_mpi(rlon_mpi,lon2D)
     249      CALL Grid1DTo2D_mpi(rlat_mpi,lat2D)
     250      CALL Grid1DTo2D_mpi(cell_area_mpi,cell_area2D)
     251      mask_calving(:,:,:) = 0
     252      WHERE ( lat2D >= 40) mask_calving(:,:,1) = 1
     253      WHERE ( lat2D < 40 .AND. lat2D > -50) mask_calving(:,:,2) = 1
     254      WHERE ( lat2D <= -50) mask_calving(:,:,3) = 1
     255   
     256   
     257      DO i=1,nb_zone_calving
     258        area_calving(:,:,i)=mask_calving(:,:,i)*cell_area2D(:,:)
     259        pos=1
     260        IF (i>1) pos = 1 + ((nbp_lon*nbp_lat-1)*(i-1))/(nb_zone_calving-1)
     261     
     262        ind_calving(i)=0
     263        IF (grid_type==unstructured) THEN
     264
     265          DO ig=1,klon_mpi
     266            IF (ind_cell_glo_mpi(ig)==pos) ind_calving(i)=ig
     267          ENDDO
     268
     269        ELSE IF (grid_type==regular_lonlat) THEN
     270          IF ((ij_begin<=pos .AND. ij_end>=pos) .OR. (ij_begin<=pos .AND. is_south_pole_dyn )) THEN
     271            ind_calving(i)=pos-(jj_begin-1)*nbp_lon
     272          ENDIF
     273        ENDIF
     274     
     275      ENDDO
     276    ENDIF
     277   
     278           
    210279    IF (sum_error /= 0) THEN
    211280       abort_message='Pb allocation variables couplees'
     
    10861155! Local variables
    10871156!*************************************************************************************
    1088     INTEGER                                              :: error, sum_error, j
     1157    INTEGER                                              :: error, sum_error, i,j,k
    10891158    INTEGER                                              :: itau_w
    10901159    INTEGER                                              :: time_sec
     
    11031172! Table with all fields to send to coupler
    11041173    REAL, DIMENSION(nbp_lon, jj_nb, maxsend)                 :: tab_flds
    1105     REAL, DIMENSION(klon_mpi)                            :: rlon_mpi, rlat_mpi
    1106 
     1174    REAL, DIMENSION(klon_mpi)                                :: rlon_mpi, rlat_mpi
     1175    REAL  :: calving(nb_zone_calving)
     1176    REAL  :: calving_glo(nb_zone_calving)
     1177   
    11071178#ifdef CPP_MPI
    11081179    INCLUDE 'mpif.h'
     
    11311202   
    11321203    IF (version_ocean=='nemo') THEN
    1133        tab_flds(:,:,ids_liqrun) = cpl_rriv2D(:,:) + cpl_rcoa2D(:,:)
     1204       tab_flds(:,:,ids_liqrun) = (cpl_rriv2D(:,:) + cpl_rcoa2D(:,:))
    11341205       IF (carbon_cycle_cpl) tab_flds(:,:,ids_atmco2)=cpl_atm_co22D(:,:)
    11351206    ELSE IF (version_ocean=='opa8') THEN
     
    11581229!*************************************************************************************     
    11591230    IF (is_omp_root) THEN
     1231
     1232      IF (cpl_old_calving) THEN   ! use old calving
    11601233
    11611234      DO j = 1, jj_nb
     
    11901263         ENDIF
    11911264      ENDIF
     1265      tab_flds(:,:,ids_calvin) = tmp_calv(:,:)
     1266
     1267      ENDIF
     1268
     1269      DO k=1,nb_zone_calving
     1270        calving(k)=0
     1271        DO j = 1, jj_nb
     1272          calving(k)= calving(k)+DOT_PRODUCT(cpl_rlic2D(:,j)*area_calving(:,j,k),pctsrf2D(:,j,is_lic))
     1273        ENDDO
     1274      ENDDO
    11921275     
    1193       tab_flds(:,:,ids_calvin) = tmp_calv(:,:)
     1276      CALL MPI_ALLREDUCE(calving, calving_glo, nb_zone_calving, MPI_REAL_LMDZ, MPI_SUM, COMM_LMDZ_PHY, error)
     1277     
     1278      tab_flds(:,:,ids_calvin) = 0
     1279      DO k=1,nb_zone_calving
     1280        IF (ind_calving(k)>0 ) THEN
     1281          j=(ind_calving(k)-1)/nbp_lon + 1
     1282          i=MOD(ind_calving(k)-1,nbp_lon)+1
     1283          tab_flds(i,j,ids_calvin) = calving_glo(k)
     1284        ENDIF
     1285      ENDDO
    11941286
    11951287!*************************************************************************************
Note: See TracChangeset for help on using the changeset viewer.