From b32fc9c8abbc4f001a4756c17b93caab4536bd32 Mon Sep 17 00:00:00 2001 From: ESCOBAR Juan <escj@nuwa.aerologie.net> Date: Sat, 23 Mar 2013 23:13:29 +0100 Subject: [PATCH] Juan 23/03/2012: add contrav_gpu for futur utilisation --- MNH/contrav.f90 | 182 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 173 insertions(+), 9 deletions(-) diff --git a/MNH/contrav.f90 b/MNH/contrav.f90 index 45ec90482..3aa636585 100644 --- a/MNH/contrav.f90 +++ b/MNH/contrav.f90 @@ -8,9 +8,9 @@ MODULE MODI_CONTRAV ! #################### ! -INTERFACE +INTERFACE CONTRAV ! - SUBROUTINE CONTRAV(PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + SUBROUTINE CONTRAV_CPU (PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & PRUCT,PRVCT,PRWCT ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUT ! Cartesian comp along x REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Cartesian comp along y @@ -24,8 +24,26 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar ! -END SUBROUTINE CONTRAV +END SUBROUTINE CONTRAV_CPU ! + SUBROUTINE CONTRAV_ACC (IACC,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PRUCT,PRVCT,PRWCT ) +INTEGER :: IACC +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUT ! Cartesian comp along x +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Cartesian comp along y +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar +!$acc reflected (pdxx,pdyy,pdzz,pdzx,pdzy,prut,prvt,prwt,PRUCT,PRVCT,PRWCT) +! +END SUBROUTINE CONTRAV_ACC + END INTERFACE ! END MODULE MODI_CONTRAV @@ -33,7 +51,7 @@ END MODULE MODI_CONTRAV ! ! ! ############################################################## - SUBROUTINE CONTRAV(PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + SUBROUTINE CONTRAV_CPU(PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & PRUCT,PRVCT,PRWCT ) ! ############################################################## ! @@ -140,8 +158,6 @@ IJE=SIZE(PDXX,2)-1 IKB=1+JPVEXT IKE=SIZE(PDXX,3) - JPVEXT ! -!$acc data copyin (pdxx,pdyy,pdzz,pdzx,pdzy,prut,prvt,prwt) local (z1,z2) copy (PRUCT,PRVCT,PRWCT) -!$acc kernels PRUCT(:,:,:) = PRUT(:,:,:) / PDXX(:,:,:) PRVCT(:,:,:) = PRVT(:,:,:) / PDYY(:,:,:) @@ -172,12 +188,160 @@ ELSE END IF ! - PRWCT(:,:,1) = - PRWCT(:,:,3) ! Mirror hypothesis +! +!----------------------------------------------------------------------- +! +END SUBROUTINE CONTRAV_CPU +! +! +! ############################################################## + SUBROUTINE CONTRAV_ACC(IACC,PRUT,PRVT,PRWT,PDXX,PDYY,PDZZ,PDZX,PDZY, & + PRUCT,PRVCT,PRWCT ) +! ############################################################## +! +!!**** *CONTRAV * - computes the contravariant components from the +!! cartesian components +!! +!! PURPOSE +!! ------- +! This routine computes the contravariant components of vector +! defined by its cartesian components (U,V,W) , using the following +! formulae: +! UC = U / DXX +! VC = V / DYY +! ( ----------x ----------y ) +! ( ---z ---z ) +! 1 ( U V ) +! WC = --- ( W - DZX * --- - DZY * --- ) +! DZZ ( DXX DYY ) +! +! +! In the no-topography case, WC = W / DZZ +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the averages. The metric +!! coefficients PDXX, PDYY, PDZX, PDZY, PDZZ are dummy arguments +!! +!! +!! EXTERNAL +!! -------- +!! MXF, MYF, MZM : Shuman functions (mean operators) +!! +!! Module MODI_SHUMAN : Interface for Shuman functions +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! Module MODD_CONF : contains configuration variable +!! LFLAT : Logical for topography +!! = .TRUE. if Zs = 0 (Flat terrain) +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (subroutine CONTRAV) +!! +!! +!! AUTHOR +!! ------ +!! J.L. Redelsperger * CNRM * +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 27/07/94 +!! Corrections 3/08/94 (by J.P. Lafore) +!! Corrections 17/10/94 (by J.P. Lafore) WC modified for w-advection +!---------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CONF +USE MODD_PARAMETERS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +INTEGER :: IACC +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRUT ! Cartesian comp along x +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Cartesian comp along y +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRWT ! Cartesian comp along z +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! Metric coefficients +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRUCT ! Contrav comp along x-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRVCT ! Contrav comp along y-bar +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWCT ! Contrav comp along z-bar +!$acc reflected (pdxx,pdyy,pdzz,pdzx,pdzy,prut,prvt,prwt,PRUCT,PRVCT,PRWCT) +! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3)):: Z1,Z2 +INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE +! +!----------------------------------------------------------------------- +! +!* 1. Compute the contravariant components +! ------------------------------------ +! +IIB=2 +IJB=2 +IIE=SIZE(PDXX,1)-1 +IJE=SIZE(PDXX,2)-1 +! +IKB=1+JPVEXT +IKE=SIZE(PDXX,3) - JPVEXT +! +!$acc data local (z1,z2 ) +!$acc kernels +! +PRUCT(:,:,:) = PRUT(:,:,:) / PDXX(:,:,:) +PRVCT(:,:,:) = PRVT(:,:,:) / PDYY(:,:,:) + +IF (LFLAT) THEN + + PRWCT(:,:,:) = PRWT(:,:,:) / PDZZ(:,:,:) + +ELSE + Z1(IIB:IIE,:,IKB:IKE+1)= & + (PRUCT(IIB:IIE,:,IKB:IKE+1)+PRUCT(IIB:IIE,:,IKB-1:IKE) ) & + *PDZX(IIB:IIE,:,IKB:IKE+1) *0.25 & + +(PRUCT(IIB+1:IIE+1,:,IKB:IKE+1)+PRUCT(IIB+1:IIE+1,:,IKB-1:IKE) ) & + *PDZX(IIB+1:IIE+1,:,IKB:IKE+1) *0.25 + + Z2(:,IJB:IJE,IKB:IKE+1)= & + (PRVCT(:,IJB:IJE,IKB:IKE+1)+PRVCT(:,IJB:IJE,IKB-1:IKE) ) & + *PDZY(:,IJB:IJE,IKB:IKE+1) *0.25 & + +(PRVCT(:,IJB+1:IJE+1,IKB:IKE+1)+PRVCT(:,IJB+1:IJE+1,IKB-1:IKE) ) & + *PDZY(:,IJB+1:IJE+1,IKB:IKE+1) *0.25 + + PRWCT=0. + PRWCT(IIB:IIE,IJB:IJE,IKB:IKE+1) = & + ( PRWT(IIB:IIE,IJB:IJE,IKB:IKE+1) & + - Z1(IIB:IIE,IJB:IJE,IKB:IKE+1) & + - Z2(IIB:IIE,IJB:IJE,IKB:IKE+1) & + ) / PDZZ(IIB:IIE,IJB:IJE,IKB:IKE+1) + +END IF +! +PRWCT(:,:,1) = - PRWCT(:,:,3) ! Mirror hypothesis !$acc end kernels -!$acc end data +!$acc end data ! !----------------------------------------------------------------------- ! -END SUBROUTINE CONTRAV +END SUBROUTINE CONTRAV_ACC -- GitLab