SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
local_slope_param.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 SUBROUTINE local_slope_param(JPINDX1,JPINDX2)
6 
7 !! 03/14 : M Lafaysse, modifs for optimization and parallelization
8 
9 USE modd_slope_effect, ONLY: xzsl,xzs_xy,xslopang,xslopazi,xsurf_triangle,&
10  xzs_thread,xzs_xy_thread,xslopang_thread,xslopazi_thread,xsurf_triangle_thread,&
11  xxhat,xyhat,xxhat_thread,xyhat_thread,nnxloc,nnyloc,nixloc,niyloc,&
12  lrevertgrid,nix,niy,nindx1_x,nindx2_x,nindx1_y,nindx2_y
13 
14 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm, nsize, nindex, nsize_task
15 
16 IMPLICIT NONE
17 
18 INTEGER,INTENT(IN)::jpindx1,jpindx2
19 INTEGER,SAVE::nindx1_mpi_omp,nindx2_mpi_omp,iminmpi
20 INTEGER::jj
21 
22 
23 ! Il faut déterminer la position de début du thread MPI par rapport au ZZS1D_FULL de init_slope_param :
24 !$OMP SINGLE
25 IF (nproc>1) THEN
26  DO jj=1,SIZE(nindex)
27  IF(nindex(jj)==nrank) THEN
28  iminmpi=jj
29  EXIT
30  ENDIF
31  END DO
32 ELSE
33  iminmpi=1
34 END IF
35 !$OMP END SINGLE
36 
37 nindx1_mpi_omp=iminmpi+jpindx1-1
38 nindx2_mpi_omp=iminmpi+jpindx2-1
39 
40 
41 IF (lrevertgrid) THEN
42  nindx1_x=mod(nindx1_mpi_omp-1,nix)+1
43  nindx2_x=mod(nindx2_mpi_omp-1,nix)+3
44  nindx1_y=niy-(nindx2_mpi_omp-1)/nix
45  nindx2_y=niy-(nindx1_mpi_omp-1)/nix+2
46 ELSE
47  nindx1_x=mod(nindx1_mpi_omp-1,nix)+1
48  nindx2_x=mod(nindx2_mpi_omp-1,nix)+3
49  nindx1_y=(nindx1_mpi_omp-1)/nix+1
50  nindx2_y=(nindx2_mpi_omp-1)/nix+3
51 ENDIF
52 
53 nnxloc=nindx2_x-nindx1_x+1
54 nnyloc=nindx2_y-nindx1_y+1
55 nixloc=nnxloc-2
56 niyloc=nnyloc-2
57 
58 ALLOCATE(xzs_thread(nnxloc,nnyloc))
59 ALLOCATE(xzs_xy_thread(nnxloc,nnyloc))
60 ALLOCATE(xslopang_thread(nnxloc,nnyloc,4))
61 ALLOCATE(xslopazi_thread(nnxloc,nnyloc,4))
62 ALLOCATE(xsurf_triangle_thread(nnxloc,nnyloc,4))
63 
64 ALLOCATE(xxhat_thread(nnxloc))
65 ALLOCATE(xyhat_thread(nnyloc))
66 
67 
68 xxhat_thread(:)=xxhat(nindx1_x:nindx2_x)
69 xyhat_thread(:)=xyhat(nindx1_y:nindx2_y)
70 
71 xzs_thread=xzsl(nindx1_x:nindx2_x,nindx1_y:nindx2_y)
72 xzs_xy_thread=xzs_xy(nindx1_x:nindx2_x,nindx1_y:nindx2_y)
73 xslopang_thread=xslopang(nindx1_x:nindx2_x,nindx1_y:nindx2_y,:)
74 xslopazi_thread=xslopazi(nindx1_x:nindx2_x,nindx1_y:nindx2_y,:)
75 xsurf_triangle_thread=xsurf_triangle(nindx1_x:nindx2_x,nindx1_y:nindx2_y,:)
76 
77 
78 END SUBROUTINE local_slope_param
subroutine local_slope_param(JPINDX1, JPINDX2)